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 캐싱): 기본적으로 스프링에서 템플릿은 최초 사용시에만 한번 파싱되고, 해당 결과는 향후 사용을 위해 캐시에 저장되어 있어 성능을 조금이나마 개선 시켰다