[Spring boot] Springboot 02_설정, Annotation
in etc on Spring boot
Spring boot 02
Spring boot Annotation
자동설정, Rest Api
- 자동설정
- 스프링 부트는 두 단계로 나눠서 읽어(등록)들인다.
- (1) componentScan을 사용
- (2) EnableAutoConfiguration
- Spring boot 자동설정 Annotation
- @SpringBootApplication
- @ComponentScan + @EnableAutoConfiguration
(1) @ComponentScan
@ComponentScan은 ComponentScan 어노테이션이 달린 class의 package 부터
하위 패키지 까지 훑고, 아래의 어노테이션을 전부 bean으로 등록한다.
@Component (@Congiguration @Repository @Service @Contontroller @RestController)
(2) @EnableAutoCongiguration
Spring.factories를 찾고
org.springframework.book.autoconfigure.EnableAutoConfiguration의
모든 key값을 보고, 그 것에 해당하는 class를 보고(configuration)
해당하는 class가 엄청많은데 ConditionalOn~~~ 조건에 맞는 것만 bean으로 등록
(3) @SpringBootApplication
위의 두가지(1),(2) 스캔과정을 @SpringBootApplication 선언 하나로 모든 작업을 함.
우선순위 정책
- 우선순위 정책은 여러가지가 있다. 먼저 위와 같은 상황을 생각하면,
- ComponentScan이 먼저 실행되고, EnableAutoconfiguration 이 실행되면서,
- ComponentScan으로 특정 클래스에 set한 값이 EnableAutoconfiguration 에 의해서 다른 값으로 덮어쓰여질 수 있다.
- .properties 우선순위(외부 설정)
- 먼저, application.properties는 Spring boot가 구동될 때, 자동으로 읽어들인다.
- 외부설정의 우선순위는 17가지가 있고 각기 중복되는 것이 있다면 override가 일어나서 우선순위가 높은 것에 설정된 것이 실행된다.
- application.properties에서 여러가지 작성기법이 존재하는데,
- serverport 의 랜덤값을 주고 싶으면, 0
- 변수 매핑을 사용하려면 {key}값으로 활용.
- random은 int long uuid 등 여러가지를 지원함.
- 그리고 이러한 외부 설정파일이 많은 경우에 .class로 만들어서 관리가 가능함.
예를 들어서
application.properties
application-dev.properties 라는 두가지 properties가 있고, 안에 동일한 값이 명시되어 있을 때,
application-dev.properties가 우선순위가 높다.
이유는, JAR 안에 기본적으로 들어가 있는 application보다 JAR 밖에 만들어 놓은 application-dev.properties가 우선순위가 높기 때문
- 위의 예시에서 application-{dev}.properties 에서 dev를 Annotation을 통해서 사용할 수 있는데 그 것이 @profile 이다.
Profile
- @profile(“String”)
- 구분을 주고 특정한 @Bean을 구분해서 사용할 수 있음.
<예시>
// TestCongiguration.class
@Profile("test")
@Configuration
public class TestConfiguration
// application.properties
spring.profiles.active=test
- Rest Api
스프링 REST 지원
- http Method(= 데이터 처리방식, SQL)
- Post(= Create,Insert), Get(= Read,Select), Put(= Update, Update), Delete(= Delete,Delete)
- @GetMapping, @PostMapping @PutMapping, @PatchMapping, @DeleteMapping (스프링 4.3)
Restful Api
- Get : /users/12 : 식별자가 12인 유저를 반환(select)
- Post: /users : 유저를 생성
- Put : /users/12 : 12번 사용자의 {“name”:aaa} name을 aaa로 수정
- /users : {“name”:aaa} 유저 모두의 이름을 aaa로 수정
- Delete: /users/12 : 12번 사용자의 데이터를 삭제
- /users : 사용자의 데이터 모두를 삭제
스프링 Rest Api 처리 방식
- @Controller (웹 MVC 처리)
- @GetMapping(“/경로”), @PostMapping(“/경로”): 일반적인 웹 처리에서는 @Controller 레벨에서 경로에 따른 요청을 처리하고, 알맞은 view를 return한다. post의 경우에는 body에 값을 포함하고 있다.
- @Controller + @ResponseBody
- 메소드에 @ResponseBody를 사용해서 객체를 Json 형태로 응답할 수 있음. (Json 형태로 변환하는 viewresolver가 처리)
- @RestController(@Controller + @ResponseBody)
- @RestController는 @ResponseBody를 사용하지 않고, 객체를 Json 형태로 응답할 수 있음. (Json 형태로 변환하는 viewresolver가 처리)
- RequestParam
- 쿼리 스트링으로 처리
- (도메인/selectByAddress?address=gangnam)로 전달에서 address=gangnam 값을 받을 수 있음.
@GetMapping("/selectByAddress")
public ResponseEntity<List> getSelectByAddress(@RequestParam("address") String address) {
...생략...
}
- Pathvariable
@GetMapping("/selectByIdx/{key}")
public ResponseEntity<T> getByKey(@PathVariable Integer key) {
...생략...
}
- RequestBody
- 아래 예시의 경우 body 값으로 Test 객체를 받음
// test 객체 -> Json 형태로 return
@PostMapping("/test")
public Test testJson1(@RequestBody Test test){
....생략...
}