JSP/Servlet → Spring Boot 이관 중 배운 점
Spring Boot로 코드를 이관하면서 궁금하거나 헷갈리는 점들을 여럿 찾아봤는데 그걸 정리해서 올려보려고 한다.
1. Maven 프로젝트는 무엇이고, pom.xml은 뭐고, pom.xml에 json-simple 의존성은 왜 추가해야 하는가?
Maven 프로젝트 :
자바에서 외부 라이브러리를 자동으로 관리해주는 도구. 예전 중간 프로젝트 때는 수동으로 .jar 파일을 다운로드 해서 /lib 폴더에 넣었는데 Maven은 이걸 자동으로 해준다.
즉, pom.xml에
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
처럼 작성하면, Maven이 알아서 인터넷에서 json-sample을 받아서 프로젝트에 설치해준다.
json-simple 의존성을 추가해야 하는 이유는
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject) parser.parse(...);
다음 기능이 json-simple이라는 외부 라이브러리에서 제공하는 기능이기 때문이다. Maven 프로젝트이기 때문에 반드시 pom.xml에 적어줘야 찾을 수 있다.
(이래놓고 map으로 변환해줘야해서 map으로 싹 고쳤다...)
2. @ResponseBody가 무엇인가?
Spring에서 컨트롤러 메서드의 리턴값을 "그대로 응답 바디에 실어서 보내라” 라는 뜻이다. @ResponseBody를 달지 않으면 Spring이 VIEW로(jsp 등) 응답을 보내려고 하기 때문에 404 에러가 발생한다. 문자열이나 JSON 응답을 보낼 땐 반드시 해당 어노테이션을 작성하도록 하자.
+) 페이지 반환이 없는 경우 @RestController를 사용해주면 @ResponseBody가 있는 것처럼 작동한다.
다만, 페이지 반환이 있을 경우에는 절대 사용하면 안 된다.
+) 오늘자 수업 내용
@RestController
@Controller + @ResponseBody
이 2개를 합쳐놓은 컨트롤러를 말함.
Spring REST API
즉시 JSON 형태의 데이터를 반환해줄 수 있게 된다.
다만, 해당 컨트롤러 내에 페이지 반환이 하나라도 있다면 @RestController 하나로 뭉뚱그려 사용할 수 없다.
return “main”; 의 경우 ViewResolver가 페이지 이동을 시켜줘야 하는데 RS를 사용하면 main을 전달해야하는 문자열(데이터)로 인식해서 그냥 화면에 main 문자열만 그대로 뜨게 됨.
3. @Primary와 @Qualifier 차이
1) @Primary는 같은 타입의 빈을 사용할 시 한 객체에게 우선순위를 부여한다.
@Bean 으로 생성하는 객체들 중 같은 클래스(타입)인 빈이 있다면, 스프링은 어느 것을 빈으로 생성하여야 하는지 알 수 없기 때문에 컨테이너를 띄우지 못하고 NoUniqueBeanDefinitionException 이라는 예외를 던진다.
그렇기에 찾고자하는 객체에 @Primary를 붙여준다.
2) @Qualifier는 @Component가 객체의 자료형을 참고하기 때문에 같은 타입을 사용하는 빈이 있을 경우 객체의 이름까지 참고하여 해당하는 빈을 찾는다.