📌스프링부트 프로젝트 구조
1) src/main/java 디렉터리 : 자바 파일을 저장하는 공간
- com.mysite.app 패키지
- 컨트롤러는 URL 요청을 처리하고 폼은 사용자의 입력을 검증한다
- DTO, 엔티티, 서비스 파일은 데이터 베이스를 처리하기 위해 필요한 파일이다
- 패키지구조
* controller 패키지 :
웹 요청을 처리하는 컨트롤러 클래스들이 위치함
@RestController, @Controller 어노테이션이 붙은 클래스들
*Service 패키지 :
비즈니스 로직을 처리하는 서비스 클래스들이 위치함
@Service 어노테이션을 사용하여 서비스 계층을 구성하며 컨트롤러와 데이터 접근 계층(Repository) 사이에서 중간역할을 함
*repository 패키지 :
데이터베이스와 상호작용하는 레포지토리 인터페이스들이 위치함
@Repository 어노테이션을 사용하며 MyBatis, JPA 기술을 사용하여 데이터 처리함
*domain or model :
도메인 객체나 엔티티 클래스들이 위치함
데이터베이스 테이블과 매핑되는 엔티티 클래스를 정의하거나 DTO(Data Transfer Object)를 포함할 수 있음
*config 패키지 :
스프링부트 어플리케이션의 설정과 관련된 클래스들이 위치함
@Configuration 어노테이션을 사용하여 설정 클래스를 정의함
2) src/main/resource 디렉터리 : 자바 파일을 제외한 HTML, CSS, 자바스크립트, 환경 파일등을 저장하는 공간
- 템플릿 파일은 자바 코드를 삽입할 수 있는 HTML 형식의 파일을 저장
- static 디렉터리 : css, js, img 파일 등을 저장
3) src/test/java 디렉터리 : 프로젝트에서 작성한 파일을 테스트하는 코드를 저장하는 공간
4) build.gradle 파일
- 그레이들(Gradle)이 사용하는 환경 파일
📌의존성주입(DI)
의존성 주입이란 객체가 필요로 하는 의존 객체(Dependency)를 외부에서 주입해주는 방식이다.
클래스 내부에서 직접 객체를 생성하는 대신, 외부에서 생성한 객체를 전달받아 사용함으로써 객체간의
결합을 느슨하게 만들어 준다.
📌의존성주입의 종류
1)필드 주입(권장하지 않음)
- 생성자나 setter를 사용해서 주입을 받는 것이 아니기 때문에 스프링의 도움 없이는 주입이 불가능하여 테스트에서 사용하기 불편하다.
- final 키워드 사용이 불가능하여 불변성을 보장받지 못한다.
- 순환참조 시 예외가 발생하지 않는다
2)생성자 주입(제일 권장하는 방법)
- 생정자에 @Autowired를 사용하면 된다
- spring 4.x.x 이상은 생성자가 한 개만 있으면 자동으로 @Autowired가 붙는다.
- 만약 private 필드를 초기화할 때 setter가 없다고 가정하면 생성자를 통해서만 필드를 초기화해야한다.
- 객체를 하나 생성할 때는 반드시 생성자가 한 번만 실행되고 이후에는 수정할 수가 없다.
- 생성자 주입을 하게 되면 주입된 객체의 불변성이 보장된다.
* 생성자 주입을 사용해야 순환 참조 문제를 파악하기 쉽고, 단위 테스트도 용이하다.
3)Setter 주입
- setter를 사용하여 주입하는 방법
- setter에 @Autowired를 사용하면 된다
- 특정 필드의 setter를 사용하지 않아도 해당 클래스 객체를 만들 수 있어서 NullPointException이 발생할 수 있다.
- setter를 이용하여 언제든지 수정이 가능하게 되므로 불변성이 보장되지 않는다. (객체의 주소가 변경될 가능성이 열려있다는 의미)
📌순환참조
- 다른 클래스가 서로 필드를 주입할 경우 발생하는 문제이다. 서로가 주입을 하면서 무한 반복으로 주입을 하게 된다.
- 서로가 주입을 한다는 것 자체가 문제이므로 정상적인 실행이 되어서는 안된다.
그러나 필드 주입을 하는 경우 실행 단계에서 오류가 발생하지 않고 나중에 해당 객체를 사용할 때 오류가 발생하여
큰 문제가 발생하게 된다.
- 생성자 주입을 사용했을 경우 서버 실행에서 오류발생하여 순환 참조 문제를 빠르게 파악할 수 있다
'개발 > Spring Boot' 카테고리의 다른 글
Spring Boot [5] (1) | 2024.10.22 |
---|---|
Spring Boot [4] (0) | 2024.10.21 |
Spring Boot [3] (2) | 2024.10.20 |
Spring Boot [1] (0) | 2024.10.15 |