Springboot

Springboot

백셀건전지 2021. 8. 24. 13:31

Maven, Gradle 차이

  • 필요한 라이브러리를 땡겨 오고, 빌드 라이프 사이클을 관리해주는 툴
  • 과거에는 Maven 사용하였으나, 요즘은 gradle 사용

 

Springboot group

  • 보통 Group에 기업명 적어줌

 

Artifact

  • 빌드 하고 나오는 결과물 이름

 

Dependencies

  • Spring boot에서 사용할 라이브러리 목록

 

프로젝트 보면 테스트용 코드를 보관하는 test 폴더가 따로 있음. 이는 요즘 개발 트렌드에서는 테스트가 그만큼 중요하다.

 

resources파일은 실제 코드가 아닌 xml파일 등과 같은 것들이 보관되어 있음

java 파일을 제외한 나머지

 

build.gradle

  • dependencies: 라이브러리 정의
  • repositories: 라이브러리를 다운받아오는 경로

 

gradle

  • 라이브러리 간의 의존관계를 관리해줌. 하나의 라이브러리 받으면 의존적인 라이브러리 자동으로 다운

 

스프링 부트 라이브러리

  • 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
      • logback, slf4j

테스트 라이브러리

  • spring-boot-starter-test
    • junit: 테스트 프레임워크
    • mockito: 목 라이브러리
    • assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
    • spring-test: 스프링 통합 테스트 지원

 

controller

  • 웹 애플리케이션에서 첫 진입점
  • 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버( viewResolver )가 화면을 찾아서 처리한다.
    • 스프링 부트 템플릿엔진 기본 viewName 매핑
    • resources:templates/ +{ViewName}+ .html

빌드

./gradlew clean build

  • clean 명령어는 build 폴더 삭제함. 완전히 삭제 후 다시 build 하는 명령어
  • build해서 생기는 jar 파일은 build/libs 하위에 있고, java -jar 명령어로 실행하면 서버 실행됨

MVC 패턴

  • 스프링 부트는 controller가 우선순위를 가지고 들어온 url에 관련된 controller 검색. 없으면 정적 컨텐츠 찾음 
  • view: 화면을 그리는 데 모든 역량을 집중
  • controller: 비즈니스 로직
  • model: 화면에 필요한 것들을 담아서 반환

 

API 방식

  • @ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않음
  • 객체를 넘기면 HttpMessageConverter가 동작하여 객체면 JsonConverter, 문자열이면 StringConverter로 변환하여 응답
  • 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)
  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

 

테스트케이스 작성

  • @AfterEach : 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다. 이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다. @AfterEach 를 사용하면 각 테스트가 종료될 때 마다 이 기능을 실행한다. 여기서는 메모리 DB에 저장된 데이터를 삭제한다.
  • 테스트는 각각 독립적으로 실행되어야 한다. 테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.
  • @BeforeEach : 각 테스트 실행 전에 호출된다. 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계도 새로 맺어준다.

컴포넌트 스캔과 자동 의존관계 설정

  • 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.

컴포넌트 스캔 원리

  • @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
  • @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
  • @Component 를 포함하는 @Controller, @Service, @Repository도 스프링 빈으로 자동 등록된다.
  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.