본문 바로가기
개발자 일지/Spring

[자바, 스프링]인프런 김영한 로드맵1, 스프링 입문 강의 정리1

by 네빌링 2021. 12. 6.
반응형

-인프런 김영한 강사님의 스프링 입문 강의 핵심 위주로 정리한다.
-모든 소스는 깃허브에서 관리한다.(https://github.com/coderahn/Spring-Lecture1)


5개월전에 한 번 듣긴 했었는데 너무 빠르게 듣고 강의 듣기 자체에만 어느새 목적전도가 되어서..제대로 인프런에서 안내하는 로드맵을 따라서 깃허브 코드 관리와 내용 요약을 하려고 한다. 토이 프로젝트도 하면서 머리도 머리인데 손가락 근육(?)으로도 체득이 더 되도록 해보자..

이 정리의 목표는

  • 내가 모르는 것, 기억이 가물가물한 것, 실무에 반드시 알고 있어야 하는 것 들에 대해서 정리
  • 단순히 클론코딩 하듯이 따라하면 남는 게 없다. 따라하면서 다른 방식으로 실행해 보거나 모르는 게 있으면 따로 심화 정리를 간단하게라도 해보자

 

1.강의 소개

스프링 프로젝트 생성 -> 스프링 부트 웹 서버 실행 -> 회원 도메인 개발 -> 웹 MVC 개발 -> DB연동(JDBC, JPA, 스프링데이터 JPA) -> 테스트 케이스 작성 순으로 내용이 진행된다.

2.프로젝트 환경설정


1)프로젝트 생성

강의는 스프링 부트, JAVA11로 진행한다. 스프링 프로젝트 만들기는 start.spring.io(스프링 이니셜라이져)에서 가능하다. STS에서도 만들 수 있긴 한데 이렇게 사용하다보니 이게 확실히 편한 것 같다. 해당 사이트에서는 Maven, Gradle 툴 선택, Boot 버전 선택, Dependencies 등 선택이 가능하다.
요새 Gradle을 많이 쓰기 때문에 Gradle을 선택, Boot는 SNAPSHOT 제외 최신 버전, Dependencies는 Spring Web, Thymeleaf를 선택한다.

  • Spring Web : 웹프로젝트 만들 때 사용하고 아파치톰캣 컨테이너 내장
  • Thymeleaf : HTML을 화면에 출력하는 템플릿엔진 중 하나

인텔리제이 기준으로 Open Project시 build.gradle파일을 Open as project로 열면 프로젝트가 열린다.

프로젝트가 열렸다.


프로젝트 폴더는 다음과 같다.

  • .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을 넣을 수도 있음)

프로젝트 실행은 java/hello/hellospring/HelloSpringApplication.java를 실행하면 main()에서 SpringApplication.run()이 자기 자신(HelloSpringApplication)을 띄워준다.

정상적으로 실행되면 localhost:8080에 들어갈 수 있다. 다음과 같이 White Error페이지가 나오면 설정 성공이다.


추가로 IntelliJ에서 gradle을 통해 실행하면서 느리게 실행될 때가 있다. Setting > gradle에서 Build and run using, Run test using을 모두 IntelliJ IDEA로 바꿔주자.

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


External Libraries를 클릭해보면 수많은 라이브러리들이 dependencies되어 있다. Gradle은 사용할 dependencies를 알아서 관리해주기 때문에 필요한 라이브러리들이 있으면 모두 관리가 된다. gradle을 클릭하면 관리되는 dependencies를 확인할 수 있다.

start.spring.io에서 설정해준 dependency인 starter web이 메인 dependency로 있는 것을 확인할 수 있다. 하위에 보면 이에 필요한 embed 톰캣 등도 알아서 관리가 되고 있는 것을 확인할 수 있다.


3)View 환경설정

기본적인 welcome view page를 만들려면 resources/static하위에 index.html을 만들어주면 된다. 기본 localhost:8080으로 접속하면 스프링은 static 하위에 index.html을 먼저 찾는다.

thymeleaf 템플릿엔진으로 만든 view page를 띄우기 위해서 Controller를 만들고 resources/templates 하위에 Controller 메소드의 return명 + .html을 이름으로 만들어주면 된다.

김영한 개발자님 참고 자료가 흐름을 잘 설명하고 있다. 다음과 같다.

출처 : 인프런 김영한 개발자님 참고자료


4)빌드하고 실행하기

지금까지는 IntelliJ IDE 안에서 실행한 것이다. 실제 실행할 수 있는 파일을 만들어 본다.
윈도우 기준 다음과 같다.

  • cmd창에서 프로젝트 폴더가 있는 곳으로 이동
  • gradlew.bat build를 입력(실패시 gradlew.bat clean 후 다시)
  • 빌드가 되면 프로젝트 폴더 build/libs에 jar파일이 생성되있는 것을 확인
  • build/libs로 이동 후, java -jar 빌드된 파일명 입력

 

 

3.스프링 웹 개발 기초


1)정적 컨텐츠
resources/static 하위에 html파일을 생성하면 동적인 동작은 없는 단순한 html 컨텐츠를 반환해준다. 하위에 hello-static.html을 만들었다면, localhost:8080/hello-static.html로 접근할 수 있다.

그리고 클라이언트가 요청시, 1순위로 컨트롤러에 hello-static.html 관련 컨트롤러 메소드가 있는지 찾는다. 없으면 2순위로 resources: static/hello-static.html을 찾는다.

김영한 개발자님 참고 자료


2)MVC와 템플릿 엔진

@RequestParam의 required는 true가 default이기 때문에 따로 설정을 안 했다면 값이 있어야 한다. hello-mvc @GetMapping("hello-mvc") 컨트롤러를 만들고 localhost:8080/hello-mvc?name=spring으로 요청을 보낸다면 아래와 같은 프로세스로 동작한다.

김영한 개발자님 참고 자료


3)API

정적컨텐츠 방식을 제외한 웹개발 방식은 위에서 설명한 MVC와 템플릿 엔진 방식API방식으로 크게 2가지라고 볼 수 있다. 템플릿엔진 방식을 사용하면 데이터를 VIewResolver를 통해 HTML로 내려주지만 API 방식을 사용하면 HttpMessageConverter가 작동하여 String,JSON 등의 형식으로 데이터만 http body에 담아 내려주게 된다.

API방식(String, Object)


위의 그림에서 보듯이 API방식을 사용하려면 @ResponseBody 어노테이션을 사용한다. 이 어노테이션을 사용하면 데이터를 http body에 담아 보낸다.
컨트롤러 전체를 API방식으로 사용하려면 컨트롤러에 @RestController 어노테이션을 사용하면 된다. 이 어노테이션을 사용하면 @ResponseBody 어노테이션을 붙이지 않아도 http의 바디부에 데이터를 넣어 보낼 수 있다.

특히 객체(Object)를 API방식으로 리턴할 때 JSON형식으로 리턴한다고 했는데, 기본적으로 MappingJackson2HttpMessageConverter가 작동한다. json형식으로 만들어주는 라이브러리가 몇 개 있는데 그 중 하나가 Jackson이고 구글사의 GSON이 있다. 스프링은 내부적으로 Jackson 라이브러리를 디폴트로 채택하고 있다.

데이터를 XML등으로 return받고 싶으면 http Accept 헤더와 서버의 컨트롤러 반환타입정보를 조합해서 HttpMessageConverter를 바꿀 수 있다.

반응형