Annotation(어노테이션)

강상은·2023년 12월 3일
0

JAVA

목록 보기
5/7

1.annotation-driven

1.1 mvc:annotation-driven

스프링 MVC 설정을 어노테이션 기반으로 처리한다는 의미와 스프링 MVC의 여러 객체들을 자동으로 스프링의 빈(bean)으로 등록하게 하는 기능

  • Spring MVC 컴포넌트들을 디폴트 설정을 통해 활성화한다.
  • Spring MVC @Controller에 요청을 보내기 위해 필요한 HandlerMapping과 HandlerAdapter를 Bean으로 등록한다.
    • HandlerMapping : HTTP 요청정보를 이용해서 컨트롤러를 찾아주는 기능
    • HandlerAdapter : HandlerMapping을 통해 찾은 컨트롤러를 직접 실행하는 기능을 수행
  • Bean을 생성하기 위해 xml 파일에 context:component-scan을 명시하면 이 태그를 포함하지 않아도 MVC 어플리케이션을 작동한다.

1.2 context:component-scan

  • 특정 패키지 내의 클래스를 스캔하고 Annotation(@Component @Controller @Service @Repository)을 확인한 후 Bean 인스턴스로 생성한다.
  • 이를 이용하면 @Autowired와 @Qualifier Annotation을 인식할 수 있다.
  • context:component-scan을 선언했다면 context:annotation-config를 선언할 필요가 없다.

1.3 context:annotation-config

  • ApplicationContext 안에 이미 등록된 Bean들의 Annotation을 활성화하기 위해 사용된다.
  • Component-scan과의 차이점은 이 설정은 Bean을 등록하는 작업을 수행하지 않는다는 것이다.

2. HTTP 어노테이션


HTTP(HyperText Transfer Protocol) 통신이란,

브라우저와 서버가 통신하기 위한 여러 프로토콜 가운데 한 종류로 웹 브라우저와 웹 서버 사이에 HTML(하이퍼텍스트) 문서를 주고받는 데 사용되는 통신 프로토콜입니다.

HTTP의 통신 방식은 기본적으로 '요청과 응답(request, response)'으로 이루어져 있는데요. 클라이언트가 요청(HttpRequest)을 서버에 보내면 서버는 클라이언트에게 응답(HttpResponse)하는 구조입니다.

2.1 HttpRequest, HttpResponse 구조

HttpRequest의 구성 요소: start line, headers, body

HttpResponse의 구성 요소: status line, headers, body

body란 ?

  • 클라이언트와 서버 간의 HTTP 통신에서 요청과 응답을 보낼 때, 필요한 데이터를 담아서 보내는 공간
    • 이때 요청하는 요청 본문을 requestBody, 응답하는 응답 본문을 responseBody라고 하는데요.
  • 데이터 형식은 가장 대표적으로 사용되는 것이 JSON이며xml 형식도 사용된다.

클라이언트에서 서버에 JSON 형식의 requestBody로 요청 데이터를 전송했을 때,
Java에서는 해당 JSON 형식의 데이터를 받기 위해서 JSON -> Java Object로의 변환이 필요

마찬가지로 요청된 데이터를 처리 후,
서버에서 클라이언트로 다시 응답 데이터 responseBody를 보낼 때도 Java Object에서 JSON 또는 XML 같은 형식으로의 변환이 필요
이러한 과정을 해당 어노테이션들이 처리

2.2 ResponseEntity, RequestEntity

HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntityResponseEntity 클래스이다. 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를 추가)

  • 한글 인코딩 시
  • restcontroller 한글넣는법 servlet-context.xml 에 상단에 자동완성으로 추가되어있는 부분 삭제하고 그 자리에 추가
<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);
		
	}

3. 메인 클래스에 붙어 있는 @SpringBootApplication은 크게 3가지가 합쳐진 것이라고 생각할 수 있다.

  1. @SpringBootConfiguration
  1. @ComponentScan
  1. @EnableAutoConfiguration

스프링 부트 어플리케이션은 Bean을 2번 등록한다. 처음에 ComponentScan으로 등록하고, 그 후에 EnableAutoConfiguration으로 추가적인 Bean들을 읽어서 등록한다.

3.1 @SpringBootConfiguration

클래스가 Spring Boot 애플리케이션 @Configuration을 제공함을 나타냅니다.

3.2 @ComponentScan

@Component어노테이션 및 streotype(@Service, @Repository, @Controller.)어노테이션이 부여된 Class들을자동으로 Scan하여 Bean으로 등록해주는 역할을 하는 어노테이션

부트가 아닌 스프링에서 이전 xml파일에<context:component-scan base-package="패키지 경로"/>를 이용해 지정해주었던 것을 Java파일을 이용하여 bean을 scan하기 위해서 생겨났습니다.

ComponentScan의 범위

@ComponentScan 어노테이션은 Scan범위를 지정할 수 있습니다.

  1. basePackages
@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한 방법입니다.

3.3 @EnableAutoConfiguration

Spring 애플리케이션 컨텍스트의 자동 구성을 활성화하여 필요할 것 같은 Bean을 추측하고 구성합니다. 자동 구성 클래스는 일반적으로 클래스 경로와 정의한 Bean을 기반으로 적용됩니다.

0개의 댓글

관련 채용 정보