[1. 스프링 입문] 스프링 웹 개발 기초
1. 프로젝트 생성
Spring Web : 웹프로젝트 만들 때 사용하고 아파치톰캣 컨테이너 내장
Thymeleaf : HTML을 화면에 출력하는 템플릿엔진 중 하나
프로젝트 폴더는 다음과 같다.
- idea : 인텔리제이 설정파일
- src : 하위에 main, test이 나뉘어져있음(요새 트렌드)
- src/main/java : 실제 자바 소스
- src/main/resources : 자바파일 제외한 설정 파일 등
- build.gradle : gradle 설정파일
설정파일인 build.gradle 파일을 클릭하면 아래와 같이 구성된다.
- implementation : 항상 적용되는 라이브러리
- testImplementation : 테스트 코드를 수행할 때만 적용되는 라이브러리(jUnit5이 default dependency)
- respositories : gradle이 라이브러리를 다운 받는 원격저장소(default로 mavenCentral. 특정 URL을 넣을 수도 있음)
2. 라이브러리 살펴보기
핵심 라이브러리는 다음과 같다.
스프링부트 라이브러리
- spring-boot-starter-web
- spring-boot-starter-tomcat : 톰캣
- spring-webmvc : 스프링 웹 MVC
- spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(View)
- spring-boot-starter(공통) : 스프링부트 + 스프링코어 + 로깅
- spring-boot
- spring-core
- spring-boot-starter-logging : slf4j는 인터페이스이고 logback은 구현체
- logback, slf4j
- spring-boot
테스트 라이브러리
- spring-boot-starter-test
- junit: 테스트 프레임워크
- mockito: 목 라이브러리
- assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
- spring-test: 스프링 통합 테스트 지원
External Libraries를 클릭해보면 수많은 라이브러리들이 dependencies되어 있다.
Gradle은 사용할 dependencies를 알아서 관리해주기 때문에 필요한 라이브러리들이 있으면 모두 관리가 된다.
gradle을 클릭하면 관리되는 dependencies를 확인할 수 있다.
3. View 환경설정 라이브러리 살펴보기
기본적인 welcome view page를 만들려면 resources/static하위에 index.html을 만들어주면 된다. 기본 localhost:8080으로 접속하면 스프링은 static 하위에 index.html을 먼저 찾는다.
thymeleaf 템플릿엔진으로 만든 view page를 띄우기 위해서 Controller를 만들고 resources/templates 하위에 Controller 메소드의 return명 + .html을 이름으로 만들어주면 된다.
4. 정적 컨텐츠
resources/static 하위에 html파일을 생성하면 동적인 동작은 없는 단순한 html 컨텐츠를 반환해준다. 하위에 hello-static.html을 만들었다면, localhost:8080/hello-static.html로 접근할 수 있다.
그리고 클라이언트가 요청시, 1순위로 컨트롤러에 hello-static.html 관련 컨트롤러 메소드가 있는지 찾는다. 없으면 2순위로 resources: static/hello-static.html을 찾는다.
5. MVC와 템플릿 엔진
MVC : Model(비지니스로직 관리), View(화면), Controller(서버)
@RequestParam의 required는 true가 default이기 때문에 따로 설정을 안 했다면 값이 있어야 한다. hello-mvc @GetMapping("hello-mvc") 컨트롤러를 만들고 localhost:8080/hello-mvc?name=spring으로 요청을 보낸다면 아래와 같은 프로세스로 동작한다.
6. API
정적컨텐츠 방식을 제외한 웹개발 방식은 위에서 설명한 MVC와 템플릿 엔진 방식과 API방식으로 크게 2가지라고 볼 수 있다. 템플릿엔진 방식을 사용하면 데이터를 VIewResolver를 통해 HTML로 내려주지만 API 방식을 사용하면 HttpMessageConverter가 작동하여 String,JSON 등의 형식으로 데이터만 http body에 담아 내려주게 된다.
위의 코드에서 보듯이 API방식을 사용하려면 @ResponseBody 어노테이션을 사용한다.
이 어노테이션을 사용하면 데이터를 http body에 담아 보낸다. 컨트롤러 전체를 API방식으로 사용하려면 컨트롤러에 @RestController 어노테이션을 사용하면 된다.
이 어노테이션을 사용하면 @ResponseBody 어노테이션을 붙이지 않아도 http의 바디부에 데이터를 넣어 보낼 수 있다.
특히 객체(Object)를 API방식으로 리턴할 때 JSON형식으로 리턴한다고 했는데, 기본적으로 MappingJackson2HttpMessageConverter가 작동한다. json형식으로 만들어주는 라이브러리가 몇 개 있는데 그 중 하나가 Jackson이고 구글사의 GSON이 있다. 스프링은 내부적으로 Jackson 라이브러리를 디폴트로 채택하고 있다.
데이터를 XML등으로 return받고 싶으면 http Accept 헤더와 서버의 컨트롤러 반환타입정보를 조합해서 HttpMessageConverter를 바꿀 수 있다.
@ResponseBody 를 사용
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter 가 동작
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음