본문 바로가기

Java/Spring

[Spring Boot] Hello World Bean

728x90
반응형

 

 

 

지난 시간에 우리는 Spring Boot 프로젝트의 첫 번째 클래스로서 HelloWorldController를 만들고 "Hello World!"라는 문자열을 반환하는 API를 만듦.

 

https://developing-move.tistory.com/241

 

 

 

이제 우리가 개발할 두 번째 API는 단순히 문자열을 반환하는 것이 아니라 Bean을 반환시켜 주는 method를 만들 것. 반환할 Bean의 이름은 HelloWorldBean이라고 지정할 것이며 Java Bean 클래스 또한 작성하려 함.

 

 

우리는 현재의 Spring Boot 프로젝트를 생성하는 과정에서 Lombok이라는 라이브러리를 추가함. Lombok을 추가하면 만들고자 하는 클래스에 대해 어떠한 property를 등록했을 때 getter(), setter()뿐만 아니라 property를 초기화할 수 있는 생성자, 그리고 equals()와 toString()과 같은 Java의 기본 Object 클래스의 메서드들들 자동으로 생성해 주는 기능이 있어 개발 시간을 훨씬 더 단축시킬 수 있음. 물론 Eclipse나 IntelliJ에도 코드 자동 생성 기능이 있기는 하지만 클래스를 생성할 때 Lombok에 포함되어 있는 @Data를 사용하게 되면 간단하게 프로젝트에 필요한 클래스를 사용할 수 있으니 사용해 보길 권장함.

 

Lombok에 대한 자세한 내용은 아래 글 참조.

https://developing-move.tistory.com/6

 

Lombok: 코드 다이어트 라이브러리

▶ Lombok Java에서 Model(DTO, VO, Domain)을 만들 때 field에 대한 toString(), Getter()/Setter(), 생성자 등 반복적으로 만드는 코드를 어노테이션을 통해 줄여주는 라이브러리. ▶ Annotation @ToString : 모든 필드를

developing-move.tistory.com

 

 

 


 

 

 

@RestController
public class HelloWorldController{
    // GET
    // URI: /hello-world
    // @RequestMapping(method=RequestMethod.GET, path="/hello-world")
    @GetMapping(path="/hello-world")
    public String helloWorld(){
        return "Hello World!";
    }
    
    @GetMapping(path="/hello-world-bean")
    public HelloWorldBean helloWorldBean(){
        return new HelloWorldBean("Hello World!");
    }
  
}

 

이전 강의에서 만들었던 HelloworldController의 helloWorld() 아래에 helloWorldBean()이라는 메서드를 새로 만듦. 그리고 반환 자료형을 HelloWorldBean이라고 명시하고 return 값 또한 new HelloWorldBean()이라고 선언한 후 매개변수를 하나 전달함. 현재 기준으로 HelloWorldBean은 아직 생성되지 않은 클래스이므로 오류가 발생함. 그럼 이제 HelloWorldBean 클래스를 생성해 주겠음.

 

 

@Data
public class HelloWorldBean{
    private final String message;
  
    public HelloWorldBean(String message){
        this.message = message;
    }
}

 

HelloWorldBean이라는 클래스를 생성하고 message라는 이름의 프로퍼티를 하나 등록했으며 생성자 내에서 이 message라는 프로퍼티를 초기화 하도록 함. 그리고 상단의 클래스 위에 @Data라는 어노테이션을 추가하면 위 코드상에는 보이지 않지만 setter()와 getter()가 자동으로 만들어짐. 단, 위 코드에서는 message가 final로 선언되어 있기 때문에 setter()는 생성되지 않는다는 점에 유의.

 

또한 생성자를 자동으로 만들어줄 수 있는 어노테이션도 소개하려 함. @AllArgsConstructor를 추가하면 해당 클래스가 현재 가지고 있는 프로퍼티들을 모두 사용하고 있는 생성자를 추가해 달라는 의미. 하지만 위 코드에서 추가할 경우 이미 생성자를 가지고 있기 때문에 충돌이 나서 오류가 발생함. 따라서 만들어 놓은 생성자를 지우고 이 어노테이션을 추가하도록 함.

 

@Data
@AllArgsconstructor
public class HelloWorldBean{
    private final String message;
}

 

이제 우리는 Lombok의 기능 중 @Data 를 통해 setter()와 getter() 를 완성했고 @AllArgsConstructor를 생성자까지 완성함.

 

 

 

 

@RestController
public class HelloWorldController{
    // GET
    // URI: /hello-world
    // @RequestMapping(method=RequestMethod.GET, path="/hello-world")
    @GetMapping(path="/hello-world")
    public String helloWorld(){
        return "Hello World!";
    }
    
    @GetMapping(path="/hello-world-bean")
    public HelloWorldBean helloWorldBean(){
        return new HelloWorldBean("Hello World!");
    }
  
}

 

다시 HelloworldController로 돌아가서 메시지의 반환 값에 대해 이야기해 보려 함. 일단 이번에 만든 helloWorldBean()에서 반환시키고자 하는 메시지의 값은 기존의 helloWorld()와 마찬가지로 문자 형태로 되어 있지만 helloWorld()에서는 텍스트를 직접 반환시켰던 반면 helloWorldBean()에서는 Bean 타입으로 전달되도록 하고 있음. 만약 Bean 타입으로 전달하게 되면 Spring Boot에서는 이것을 자동으로 ResponseBody로 변환시켜 주기 때문에 Json 형태로 데이터가 나타날 것임. 이처럼 Json이 기본 포맷이며 만약 XML 데이터 포맷으로 변경하고 싶다면 Spring Boot에 있는 설정 작업을 변경해 줌으로써 XML 문서로 바꿔서 실행해 볼 수 있음.

 

 

이제 프로젝트를 실행해 /hello-world-bean 경로로 접속하면 아래와 같은 Json 형식의 데이터가 출력됨. 어떻게 보면 클라이언트 입장에서 받아들이는 값은 "Hello World!"로 동일할지 몰라도 이전에는 단순한 문자열 데이터, 지금의 경우에는 객체 형태로 그 객체가 가지고 있는 구조, 즉 어떠한 필드 값에 어떠한 value가 들어 있는지 key와 value가 쌍으로 되어 있는 구조로 전달된다는 점이 두드러지는 차이임.

{
  "message": "Hello World!"
}

 

 

 

출처

본 포스트는 인프런 이도원 강사님의 "Spring Boot 3.x 를 이용한 RESTful Web Services 개발" 강의를 참고해 직접 작성 및 정리한 글입니다.

 

 

 

 

 

 

728x90
반응형