resource : 자바코드파일을 제외한 나머지를 여기에다 넣음 (xml, properties, html 등)
build.gradle : 빌드 작업에 필요한 기본 설정, 동작 등을 정의한 파일
gitignore : 깃관리 해주는 곳(필요한 코드들만 올릴 수 있음)
✅ 스링부트 라이브러리
💡 spring-boot-devtools 라이브러리를 추가하면 'html' 파일을 컴파일만해주면 서버 재시작없이 View 파일 변경이 가능하다!
✅ 테스트 라이브러리
1. spring-boot-starter-test
- junit : 테스트 프레임워크
- mockito : 목 라이브러리
- assertj : 테스트 코드를 편하게 작성하게 도와주는 라이브러리
- spring-test : 스프링 통합 테스트 지원
컨트롤러 클래스 위에 어노테이션 @Controller
필수로 적어줘야함
컨트롤러가 리턴값으로 문자를 반환하면 뷰리졸버(viewResolver)
가 화면을 찾아서 처리한다
-> 스프링부트 템플릿엔진이 기본 viewName을 매핑
템플릿 엔진
: 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어
HTML 문서에서 필요한 곳만 자바
코드를 적용해서 동적으로 변경할 수 있음
ex) -> jsp, php
정적 컨텐츠 이미지
1. hello-static.html 주소의 요청을 보낸다
2. 스프링에서 해당 주소를 먼저컨트롤러
에서 찾는다
3.컨트롤러
에서 찾지못하면veiwResolver
가 resources: static 밑에서 찾아서 있으면 해당 페이지를 그대로 반환한다
동적 컨텐츠 이미지
ResponseBody
사용원리
- http(통신프로토콜)의 head와 body중 body부분에 데이터를 직접 넣어주겠다는 의미의 어노테이션
viewResolver
대신에HttpMessageConverter
가 동작함- 기본 문자 반환일경우 ->
StringConverter
가 동작해서 문자로 반환됨- 기본 객체로 반환일경우 ->
JsonConverter
가 동작해서 json 형태로 반환됨- 객체를 Json으로 바꿔주는 유명한 라이브러리 ->
Jackson
,Gson
- 스프링에는 기본적으로
Jackson
이 탑재되어 있음
✅ 스프링 빈을 등록하는 방법 2가지
(1) : 컴포넌트 스캔과 자동의 의존관계 설정
(2) : 자바 코드로 직접 스프링 빈 등록하기
(1) : 컴포넌트 스캔
= @Component
를 포함하는 어노테이션들은 자동으로 스프링 빈으로 등록됨
-> ex) @Controller
, @Service
, @Repository
밑에 코드는 memberService와 memberRepository가 스프링 컨테이너에 스프링 빈으로 등록되었음
기본적으로 스프링 컨테이너에 스프링 빈을 등록할 때, 싱글톤으로 등록한다
@Autowired
= 의존성 주입(Dependency Injection)
의 종류 중 하나임 -> 연결시켜줄 때 사용
의존성 주입에는 3가지 방식 -> 생성자 주입
, 필드 주입
, setter 주입
생성자 주입
만 쓰는 것을 권장!
@Controller
public class MemberController {
private final MemberService memberService;
// 생성자 주입
@Autowired // 생성자로 MemberController가 생성이 될 때,
//스프링 빈에 등록되어있는 memberService의 객체를 가져다 넣어줌
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Service // 스프링이 올라갈 때, 스프링컨테이너에서 service부분을 등록해줌
public class MemberService {
private final MemberRepository memberRepository;
// 생성자 주입
@Autowired // 생성자로 MemberService가 생성이 될 때,
//스프링 빈에 등록되어있는 memberRepository 객체를 가져다 넣어줌
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Repository // 스프링이 올라갈 때, 스프링컨테이너에서 repository 부분을 등록해줌
public class MemoryMemberRepository implements MemberRepository{
~~~~~~~~~~~~~~~~~~~
}
(2) : 위에 방식과 다르게 @Configuration
, @Bean
을 사용해서 진행
MemberService, MemberRepository 클래스에서 Service
Repository
Autowired
를 제거해야한다
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired // 생성자로 MemberController가 생성이 될 때,
//스프링 빈에 등록되어있는 memberService의 객체를 가져다 넣어줌
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Configuration
public class SpringConfig {
@Bean // memberSerivce가 스프링빈으로 등록
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean // memberRepository가 스프링빈으로 등록
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
AOP
공통관심사항과 핵심관심사항을 분리하는 것