[스프링 인 액션] Ch 1-2

Ericamoyed·2021년 3월 20일
0

스프링인액션

목록 보기
1/3

Ch 1

스프링 시작하기

What is Spring

  • spring application context를 제공, 이것들은 bean이라는 application component들을 생성하고 관리
  • 빈의 상호 연결은 Dependency Injection 패턴을 기반으로 수행
  • 이전까지의 spring 버전에서는 xml 파일을 사용해서 bean이 상호연결되도록 spring application context에 알려주었음
  • 하지만 최신 버전의 spring에서는 자바기반의 configuration이 더 많이 사용
  • @Configuration annotation
    • 해당 class 내에 선언된 method들에는 @Bean annotation이 지정되어 있어 각 메서드에서 반환되는 객체가 application context의 빈으로 추가되어야한다는 것을 포횬
    • 하지만 매번 이렇게 직접 config를 선언하지 않아도됨..
    • 왜냐하면 spring은 Autoconfiguration을 지원하거든!
    • Autoconfiguration이 안되는 경우에만 이렇게 직접 @Configuration을 사용하여 빈을 선언
  • AutoConfiguration
    • autowiring + component scanning
    • component scanning을 사용하여 application의 classpath/에 지정된 컴포넌트를 찾아 application context의 빈으로 생성
    • autowired를 사용하여 dependency가 있는 component를 자동으로 다른 bean에 injection
    • application build 시 필요한 별도의 구성코드를 현격히 줄여준다!

Spring 애플리케이션 초기 설정

  • 스프링 initializr를 사용해서 손쉽게 초기설정 가능
  • mvnw, mvnw.cmd: 메이븐에 각자 컴퓨터에 설치되어 있지 않아도 요걸 통해 프로젝트 빌드 가능
  • pom.xml: 메이븐 빌드 명세
    • 여기에 정의된 스프링 부트 버전에 따라 의존성 관리를 수행함
    • 의존성은 <dependencies> 요소에 정의
    • 스프링 부트에 포함되는 라이브러리들의 버전은 호환이 보장되어 각 라이브러리의 버전을 걱정할 필요가 X
  • Bootstrap of application
    • 제일 먼저 시작되는 부트스트랩 클래스 및 이를 위한 최소한의 스프링 구성 필요
    • class에 @SpringBootApplication 어노테이션을 통해 스프링 부트 애플리케이션임을 표현
      • @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
      • @ComponentScan: 해당 클래스가 컴포넌트 검색에 포함되도록 활성화 하는 어노테이션, 또한 컴포넌트 검색을 해야 한다는 것도 포함한다. (빈 주입 operation이 일어나야하는 대상) @Component, @Controller, @Service와 모두 같은 역할
    • @SpringBootTest: 스프링 부트 기능, 테스트 시작을 JUnit에 알려줌

웹 요청 처리

  • 스프링 MVC: 강력한 웹 프레임워크!
  • @Controller 어노테이션: 단지 컴포넌트 검색 시 컴포넌트로 식별되게 하는 것이 주 목적..
    • 아까 말했듯이, @Component, @Repository, @Service 등도 모두 동일한 기능을 제공해서 요 애들 중에 아무거나 써도 되지만, 굳이 컨트롤러 어노테이션을 선정한 이유는 컴포넌트 역할을 더 잘 설명해주기 때문..
  • Thymeleaf에 대한 이야기가 있지만 pass
  • 뭐 프론트 프레임웤 느낌인데.. 요거 쓸 바에 리액트나 앵귤러/뷰를 쓰지 않을까 ..?

컨트롤러 테스트

  • 컨트롤러도 테스트를 돌릴수 있구나.. 처음 알았다
  • @SpringBootTest 대신 @WebMvcTest 어노테이션 사용
    • 스프링 mvc appl 의 형태로 테스트가 실행되도록 함

애플리케이션 빌드

  • 톰캣에 우리 application 설치 안해도 실행이 가능한 이유?
    • 스프링 부트 appl에 실행에 필요한 모든 것이 포함되어 있거든! 스프링 부트 짱짱!
  • 스프링 부트 DevTools
    • 실제로 쓰지는 않아서 약간 intellij에서 restart server 말고 update resources 동작 느낌으로 읽었음
    • 수정한 프로젝트 코드를 포함하는 클래스 로더만 재로드 하고, 어플리케이션 컨텍스트를 재시작 시킴
    • JVM, 다른 클래스 로더는 그대로 두고.
    • 그 때문에 의존성 수정하더라도 의존성 라이브러리 포함하는 클래스로더는 재로드가 안되기 때문에 아예 어플리케이션 재시작 필요

Summary

  • 빈은 스프링에서 직접 xml/java로 선언할 수 있지만, component scanning 또는 autoconfiguration에서 자동으로 구성되기도 한다.

Ch 2

웹 어플리케이션 개발하기

  • 데이터를 가져오고 처리하는것: 컨트롤러의 일 / 데이터를 html로 나타내는것: 뷰가 하는 일

Lombok이라는 좋은 라이브러리!

  • final 속성 초기화, 속성의 게터/세터 설정, equals(), toString(), ...
  • 위와 같이 매번 클래스마다 해야하는 기본 설정들을 lombok이라는 좋은 라이브러리가 런타임 시에 자동으로 생성해준다.
  • 클래스에 @Data 어노테이션을 쓰기만 하면 됨 (lombok에서 지원해주는 어노테이션임)
  • @Slf4j도 마찬가지로 lombok에서 지원해주는 어노테이션인데 Logger 자동 생성해줌

폼 입력 유효성 검사

  • 이런게 있는줄 몰랐는데 이거 쓰면 확실히 코드 엄청깔끔해지긴 하겠다.. 우리팀도 쓰면 좋겠지만.. 한두개가 아니겠지
  • 스프링은 자바의 빈 유효성 검사를 지원
    • 유효성 검사 API + 이 API를 구현한 Hibernate 컴포넌트
    • 스프링 부트에서는 웹 스타터 의존성으로 자동 추가됨
    • 그냥 클래스 필드 위에다가 @NonNull, @Size, @NotBlack 이런거 걸어주면 됨
    • 어노테이션에 파라미터로 errorMessage 명시도 가능
    • 그리고 controller에서 해당 class input으로 받는 동시에 유효성 check하고 싶으면 파라미터 앞에 @Valid 붙여주면 됨
      • ex) public String sample(@Valid SampleClass sc, Errors errors)
    • aop 형태로 실제 메소드가 수행되기 이전에 valid check 수행하여 에러가 있으면 errors param에 해당 정보들 저장해줌

뷰 컨트롤러로 작업하기

  • 모델 데이터나 사용자 입력을 처리하지 않는 간단한 컨트롤러: WebMvcConfigurer를 implement 하는 WebConfig에 명시함으로써 대체 가능
  • WebMvcConfigurer 인터페이스: 스프링 MVC를 구성하는 메서드를 정의 (인터페이스이지만 정의된 모든 메서드의 기본적인 구현이 제공되어 있음)

기타

  • 템플릿 캐싱(html 캐싱): 기본적으로 스프링에서 템플릿은 최초 사용시에만 한번 파싱되고, 해당 결과는 향후 사용을 위해 캐시에 저장되어 있어 성능을 조금이나마 개선 시켰다
profile
꿈많은 개발자, 일상 기록을 곁들인

0개의 댓글