- 컨트롤러 빈 등록
- 자동 컴포넌트 스캔
- REST 컨트롤러 사용
- 스프링 DevTools
- 롬복 라이브러리 사용
src/main/java에 BoardController 클래스 작성
package com.example.springboottest.controller;
// import...
@RestController
public class BoardController {
public BoardController() {
System.out.println("---------------- BoardController initialized ----------------");
}
@GetMapping("/hello")
public String hello(String name){
return "Hello : " + name;
}
}
@RestController
: REST 방식의 응답을 처리하는 컨트롤러 작성
리턴되는 문자열이 브라우저에 그대로 출력된다
GetMapping("/hello")
GET 방식으로 "/hello" 요청 들어왔을 시 실행되는 메소드
애플리케이션 실행 확인
기존 스프링 프레임워크의 경우, @RestController
어노테이션을 설정하더라도 root-context.xml에 <context:component-scan base-package="com.board.controller" />
이런 식으로 설정해줘야 스프링 컨테이너가 해당 어노테이션이 설정된 컨트롤러를 빈으로 인식한다. 스프링부트에서는 이를 처리하지 않았는데 어떻게 해당 클래스를 스캔하고 빈으로 등록했는지??
💡 SpringbootTestApplication 클래스에 설정된
@SpringBootApplication
어노테이션이 동작한 결과이다!
@SpringBootApplication
의 소스는 아래와 같다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan( // ← 여기~!!
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
// 생략
}
이 클래스의 @ComponentScan
어노테이션이 main()
메소드가 포함된 SpringbootTestApplication 클래스가 속한 패키지를 베이스 패키지로 하여서 빈 등록을 처리한다.
즉 @SpringBootApplication
설정은 아래 XML 설정과 같다.
<context:component-scan base-package="com.example.springboottest" />
이처럼 자동으로 빈이 등록되기 때문에 패키지 이름에 주의해야 한다!
@RestController
는 뷰(JSP)를 별도로 만들지 않는 대신 컨트롤러 메소드가 리턴한 데이터 자체를 클라이언트로 전달한다.
이 때, 클라이언트로 전달되는 데이터는 대부분의 경우 문자열이거나 VO 형태의 자바 객체인데, 자바 객체가 전달되는 경우 자동으로 JSON으로 변환된다.
첨에 한 그 hello 메소드
롬복을 사용하면 자바 파일을 컴파일 할 때 자동으로 생성자, Getter, Setter, toString()과 같은 코드들을 추가해준다.
롬복을 사용하기 위해 현재 프로젝트에 롬복 라이브러리를 추가한다
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
pom.xml에 의존성을 추가 한 후 maven reload 해준다.
package com.example.springboottest.domain;
// import ...
@Data // getter, setter 등 자동 생성
public class BoardVO {
private int seq;
private String title;
private String writer;
private String content;
private Date createDate = new Date();
private int cnt = 0;
}
@GetMapping("/getBoard")
public BoardVO getBoard(){
BoardVO vo = new BoardVO();
vo.setSeq(1);
vo.setTitle("test title");
vo.setContent("test content");
vo.setWriter("tester");
vo.setCreateDate(new Date());
vo.setCnt(0);
return vo;
}
url에 /getBoard 입력 후 확인
JSON으로 변환된 실행 결과가 확인된다.
여러 개의 VO 객체를 배열이나 List와 같은 컬렉션에 저장하여 리턴하는 경우에도 JSON으로 리턴가능하다
BoardController
@GetMapping("/getBoardList")
public List<BoardVO> getBoardList(){
ArrayList<BoardVO> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
BoardVO vo = new BoardVO();
vo.setSeq(i);
vo.setTitle("test title" + i);
vo.setContent("test content" + i);
vo.setWriter("tester" + i);
vo.setCreateDate(new Date());
vo.setCnt(0);
list.add(vo);
}
return list;
}
url에 /getBoardList 입력 후 확인
컨트롤러 수정할 때마다 매번 애플리케이션 재실행하기 넘흐 귀찮음
→ 스프링부트가 제공하는 DevTools 기능을 쓸것임
pom.xml에 라이브러리를 추가한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.7.4</version>
</dependency>
이제 매번 컨트롤러 수정할 때마다 재실행 할 필요 없이 알아서 컨테이너가 수정된 클래스를 반영한다~~