SpringBoot의 가장 큰 특징은 패키지에 어노테이션으로 빈을 추가해두면 이 빈들을 설정된 컨텍스트 어디에서나 호출, 사용할 수 있다는 점이다.
큰 흐름은 다음과 같다.
스프링 부트는 스프링과 다르게 어노테이션을 저장하는 컨텍스트를 따로 지정할 필요 없이 프로젝트를 생성할 때 만들어진 패키지만 스캔하여 어노테이션을 찾아 컨텍스트에 등록(IoC, Inversion of Controll)한다.
즉, 다른 패키지를 임의로 만들어 어노테이션을 지정해서 어노테이션을 지정해도 스프링부트는 컨텍스트에 저장하지 않는다(메인 패키지의 하위 패키지는 스캔한다.).
이렇게 등록하는 방법은 클래스를 선언할 때 5개의 어노테이션 중 하나를 지정하면 된다.
- @Controller : MVC 모델에서 라우팅 역할을 해줄 클래스에 지정
- @Service : 특정 역할을 수행하는 클래스에 지정
- @Repository : 데이터베이스에 접근하는 역할을 수행하는 클래스에 지정
- @Config : 옵션을 설정하는 클래스에 지정
- @Component : 앞서 네 가지의 역할을 제외한 클래스에 지정
이렇게 다섯 가지의 어노테이션이 있다.
등록하는 방식은 간단하다.
- Test.java
package com.mary.demo;
import org.springframework.stereotype.Component;
@Component
public class Test {
int num=10;
}
이렇게 컴포넌트 어노테이션을 지정하면 컴포넌트에 다음과 같이 저장된다.
이제 호출해보자. 호출은 DI(Dependency Injection)에 의해 이루어진다. 컨텍스트에 등록된 클래스는 스프링 컨텍스트에 의존성이 생기므로, 이 의존성을 이용해 다른 변수에 주입을 한다.
- Index.java
@Autowired
Test t;
// http://localhost:8080/
@GetMapping({ "", "/" })
public @ResponseBody String index() {
return "Hello"; // ViewResolver
// ResponseBody를 붙이지 않으면 Hello 이름의 파일을 찾으러 감.
}
이 때 @ResponseBody 어노테이션이 빠지면 Hello 이름의 파일을 찾는다.
@GetMapping({ "", "/" })
public String index() {
return "Hello"; // ViewResolver
// ResponseBody를 붙이지 않으면 Hello 이름의 파일을 찾으러 감.
}
이름 @GetMapping 인걸로 미뤄볼 때 알 수 있을 것이다. Post로 자료를 전송하려면 @POSTMAPPING 어노테이션울, put은 @PutMapping 등, 앞의 어노테이션을 바꿔서 만든다.
postman으로 시험해보자.
@PostMapping({ "/form/model" })
public @ResponseBody String formModel(User user) {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getEmail());
return "form"; // ViewResolver
// ResponseBody를 붙이지 않으면 Hello 이름의 파일을 찾으러 감.
}
모델 역시 전송 가능하다.
@PostMapping({ "/form/model" })
public @ResponseBody String formModel(User user) {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getEmail());
return "form"; // ViewResolver
// ResponseBody를 붙이지 않으면 Hello 이름의 파일을 찾으러 감.
}
같은 url이라도 get과 post 방식이 다르다.
단, get 방식이라면 url에 쿼리 스트링을 붙여주어야 한다.
@GetMapping({ "/form/model" })
public @ResponseBody String user(User user) {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getEmail());
return "form"; // ViewResolver
// ResponseBody를 붙이지 않으면 Hello 이름의 파일을 찾으러 감.
}
JSON방식도 가능한데, 이 때 주의할 점은 스프링이 기본적으로 key-value 방식으로 지원하기 때문에 이를 parse 해줘야 한다는 점이다. 이를 도와주는 것이 jackson 라이브러리다.
jackson 라이브러리는 @RequestBody로 전송된 데이터만 인식하고, 이 데이터가 JSON 형태를 가지고 있을 경우 key-vaule형태로 파싱해준다.
@PostMapping({ "/json/model" })
public @ResponseBody User jsonModel(@RequestBody User user) {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getEmail());
return user; // ViewResolver
// ResponseBody를 붙이지 않으면 Hello 이름의 파일을 찾으러 감.
//jackson은 object가 리턴 될 때만 동작함.
}
'SpringBoot' 카테고리의 다른 글
스프링부트에서 jsp 파일 만들기 (0) | 2020.07.13 |
---|---|
스프링부트 viewresolver와 Mustache (0) | 2020.07.13 |
Maven의 라이브러리가 올바르게 동작하지 않은 경우 (0) | 2020.07.10 |
의존성 관리도구(Maven)에 라이브러리 추가하기 (0) | 2020.07.10 |
SpringBoot 시작하기 (0) | 2020.07.10 |