스프링 MVC 설정을 어노테이션 기반으로 처리한다는 의미와 스프링 MVC의 여러 객체들을 자동으로 스프링의 빈(bean)으로 등록하게 하는 기능
@Component
@Controller
@Service
@Repository
)을 확인한 후 Bean 인스턴스로 생성한다.@Autowired
와 @Qualifier Annotation
을 인식할 수 있다.
HTTP(HyperText Transfer Protocol) 통신이란,
브라우저와 서버가 통신하기 위한 여러 프로토콜 가운데 한 종류로 웹 브라우저와 웹 서버 사이에 HTML(하이퍼텍스트) 문서를 주고받는 데 사용되는 통신 프로토콜입니다.
HTTP의 통신 방식은 기본적으로 '요청과 응답(request, response)'으로 이루어져 있는데요. 클라이언트가 요청(HttpRequest)을 서버에 보내면 서버는 클라이언트에게 응답(HttpResponse)하는 구조입니다.
HttpRequest의 구성 요소: start line, headers, body
HttpResponse의 구성 요소: status line, headers, body
body
란 ?
클라이언트에서 서버에 JSON 형식의 requestBody로 요청 데이터를 전송했을 때,
Java에서는 해당 JSON 형식의 데이터를 받기 위해서 JSON -> Java Object로의 변환이 필요
마찬가지로 요청된 데이터를 처리 후,
서버에서 클라이언트로 다시 응답 데이터 responseBody를 보낼 때도 Java Object에서 JSON 또는 XML 같은 형식으로의 변환이 필요
이러한 과정을 해당 어노테이션들이 처리
HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity 클래스이다. ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 따라서 HttpStatus, HttpHeaders, HttpBody를 포함한다.
예제 1.
@RestController
@RequestMapping("/test/*")
public class TestController1 {
@RequestMapping("/listMembers")
public ResponseEntity<List<MemberVO>> listMembers() {
List<MemberVO> list = new ArrayList<MemberVO>();
for (int i = 0; i < 5; i++) {
MemberVO vo = new MemberVO();
vo.setId("kang" + i);
vo.setPwd("1233" + i);
vo.setName("sangeun" + i);
vo.setEmail("house1021@naver.com" + i);
list.add(vo);
}
// 데이터는 View에 출력되지만 F12했을때 상태코드 500을 확인 할 수 있음
return new ResponseEntity<List<MemberVO>>(list, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
예제 1에 추가된 부분 (스크립트로 message를 추가)
<annotation-driven>
<message-converters>
<beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:value>text/html;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>
</message-converters>
</annotation-driven>
@RequestMapping(value ="/rest2")
public ResponseEntity rest2() {
HttpHeaders responseHeaders = new HttpHeaders();
// responseHeaders.add("Content-Type", "test/html charset=utf-8");
String message = "<script>";
message += "alert('새 회원을 등록합니다.');";
message += "location.href='/pro29/test/listMembers';";
message += "</script>";
return new ResponseEntity(message,responseHeaders,HttpStatus.CREATED);
}
- @SpringBootConfiguration
- @ComponentScan
- @EnableAutoConfiguration
스프링 부트 어플리케이션은 Bean을 2번 등록한다. 처음에 ComponentScan으로 등록하고, 그 후에 EnableAutoConfiguration으로 추가적인 Bean들을 읽어서 등록한다.
클래스가 Spring Boot 애플리케이션 @Configuration을 제공함을 나타냅니다.
@Component어노테이션 및 streotype(@Service, @Repository, @Controller.)어노테이션이 부여된 Class들을자동으로 Scan하여 Bean으로 등록해주는 역할을 하는 어노테이션
부트가 아닌 스프링에서 이전 xml파일에<context:component-scan base-package="패키지 경로"/>를 이용해 지정해주었던 것을 Java파일을 이용하여 bean을 scan하기 위해서 생겨났습니다.
ComponentScan의 범위
@ComponentScan 어노테이션은 Scan범위를 지정할 수 있습니다.
@Configuration@ComponentScan(basePackages = "com.keesun.spring")
public class ApplicationConfig {}
@ComponentScan( basePackages = {"com.green", "com.hi"})
//2개를 지정할 수도 있음
basePackages의 경우 괄호안에 직접 패키지경로를 직접 적어주어 스캔할 위치를 지정할 수 있습니다. 이 경우 typesafe하지 않기 때문에 조금만 철자가 잘못되더라도 scan을 못하는 오류가 나타날 수 있습니다.
2. basePackageClasses
@Configuration@ComponentScan(basePackageClasses = Application.class)
public class ApplicationConfig {}
basePackageClasses의 경우에는 괄호안에 적힌 Class가 위치한 곳에서부터 모든 어노테이션이 부여된 Class를 빈으로 등록해줍니다. Class를 통해 기입하기 때문에 훨씬 Typesafe한 방법입니다.
Spring 애플리케이션 컨텍스트의 자동 구성을 활성화하여 필요할 것 같은 Bean을 추측하고 구성합니다. 자동 구성 클래스는 일반적으로 클래스 경로와 정의한 Bean을 기반으로 적용됩니다.