Conversation
| dependencies { | ||
| implementation(project(":shared:shared-common")) | ||
| implementation(project(":shared:shared-config")) | ||
| implementation("org.springframework.boot:spring-boot-starter-web") |
There was a problem hiding this comment.
spring-boot-starter-web은 Spring Boot 프로젝트에서 웹 애플리케이션을 빠르게 개발하기 위한 필수 의존성 모음입니다. 주로 REST API나 MVC 웹 애플리케이션을 개발할 때 사용됩니다.
이 스타터를 프로젝트에 추가하면, 스프링 부트가 클래스패스에 있는 라이브러리들을 분석해서 자동 설정해 줍니다. 예를 들어, DispatcherServlet과 같은 웹 MVC 설정이나 톰캣 서버 설정 등을 알아서 해줘서 개발자는 비즈니스 로직에만 집중할 수 있게 됩니다.
실제로 spring-boot-starter-web는 여러 라이브러리를 포함한 스타터이며, 주요 구성은 다음과 같습니다.
spring-web: 기본적인 웹 기능을 지원합니다. HTTP, REST를 지원합니다.spring-webmvc: Spring MVC 프레임워크입니다. 컨트롤러, 뷰 등을 지원합니다.spring-boot-starter: 공통적인 의존성으로 로그 등이 포함됩니다.spring-boot-starter-json: JSON 직렬화/역직렬화를 지원합니다.spring-boot-starter-tomcat: spring-boot-starter-web에서 기본 내장 웹서버입니다.
| import org.springframework.boot.SpringApplication; | ||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
|
|
||
| @SpringBootApplication |
There was a problem hiding this comment.
@SpringBootApplication은 Spring Boot 애플리케이션의 시작 클래스에 붙이는 대표 어노테이션으로, 세 가지 기능을 합친 복합 어노테이션입니다.
@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan@SpringBootConfiguration에는 @configuration이 포함되며, 해당 클래스가 스프링 설정 클래스임을 의미합니다. 컨텍스트에 추가 빈을 등록하거나 추가 구성 클래스를 가져올 수 있습니다.@EnableAutoConfiguration는 Spring Boot의 자동 설정을 활성화하며, 클래스패스에 있는 라이브러리와 설정을 기반으로 자동 설정을 수행합니다.@ComponentScan: 현재 패키지를 포함한 하위 패키지를 스캔하여@Component,@Service,@Repository,@Controller등이 붙은 클래스를 자동으로 빈으로 등록합니다.
동작 순서를 간단히 요약하면 다음과 같습니다.
- 어노테이션이 적용된 클래스가 있는 패키지 및 하위 패키지를 스캔합니다. 이때 @service, @repository, @controller와 다른 Spring 컴포넌트를 찾습니다.
- 자동 설정을 실행합니다. 클래스 패스를 스캔하고 애플리케이션에 정의된 의존성과 속정을 기반으로 빈을 자동으로 구성합니다. 예를 들어, 데이터 소스에 대한 의존성을 포함하면 Spring Boot가 자동으로 데이터 소스 빈을 구성합니다.
- 설정 클래스 적용합니다. 수동 Bean 정의와 자동 구성 Bean이 합쳐져서
ApplicationContext를 완성하게 됩니다. - SpringApplication.run() 호출 시 내장 서버(톰캣 등)까지 자동 실행됩니다.
이 구조를 보고 프로젝트 코드를 보면 상이한 점이 있습니다.
구조가 너무 첫 술에 배부르려는 것 같습니다. 우리는 범위가 좁은 마일스톤을 여러개 나누고 빠르게 정복하는 것이 시간을 더 효율적으로 사용하는게 아닐까 싶습니다. |
최종적인 모듈 구성 변경 형태는 다음과 같습니다. |
아직 조금 과한느낌이 있지만, 이렇게 줄어든것만 해도 큰 수확이라 생각합니다. |
|
LGTM merge 하시고 다음 단계 진행하시면 될것 같습니다. |
관련 이슈
Close #7, #13
작업 내용 요약
프로젝트 구조 (멀티모듈 구조)
의존성 흐름
단방향 의존성 계층 구조
실행 흐름 예시
예: app-api-price
멀티모듈 설계 목적
비즈니스 로직, 외부 연동, 실행 환경을 명확히 분리하여 유지보수성 향상
각 실행 모듈(app-*)은 개별적으로 Docker화 및 스케일 가능
응답 포맷, 예외 처리, 로깅 등을 shared-common에서 통합 관리
기술 스택
참고자료