프로젝트 기본 구조 이해하기

🏁 학습할 내용
- Directory & File
- resources
- static
- templates
- application.properties
- build.gradle.kts
- resources
- Annotation
- @SpringBootApplication
🗂️ Directory & File
🎨 Resources
소스코드를 제외한, HTML, CSS, JS, 환경파일들을 저장하는 공간
🍨 Static
.css js, 이미지 파일등을 정의
📝 templates
템플릿 파일을 저장하는 곳으로, 템플릿은 코틀린으로 HTML을 생성해서
브라우저에 전달할 떄 사용되는 파일이다.
SSR(서버 사이드 렌더링)의 핵심이 된다.
📒 application.properties
프로젝트의 환경 변수, db 설정등을 저장한다.
하지만 여기서 같은 동작을 .yml or .yaml 파일로도 대신할 수 있다.
요즘은 yml or .yaml을 선호한다는데 코드로 한번 살펴보자.
// application.properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
// application.yml or application.yaml
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 1234
jpa:
show-sql: true
hibernate:
ddl-auto: update
🧱 구조적인 장점 요약
| 기능 | properties | yml |
| 중첩 구조 표현 | spring.datasource.url=... 처럼 길어짐 | 계층 구조로 깔끔하게 표현 |
| 주석 | # 사용 | # 사용 (동일) |
| 리스트 표현 | 불편 (a[0]=x, a[1]=y) | 자연스러움 (- 리스트 사용) |
| 환경별 구분 | 여러 파일로 분리 | 한 파일 내에 섹션(---)으로 구분 가능 |
⚠️ 중요한 점은, 반드시 한 파일만 사용해야 안전하며, .properties가 우선순위가 높다
🫛Bean이란
🎁스프링 컨테이너와 관계
먼저 Bean과 밀접한 관계가 있는 객체가 스프링 컨테이너다.
스프링 컨테이너는 애플리케이션의 구성 요소를 생성하고 관리하는 역할을 담당한다.
이러면, 개발자는 직접 객체를 생성하고 관리하는 부담이 줄어든다.
또한, 빈을 관리하는 주체가 바로 스프링 컨테이너다.
여기서 관리라는 의미는, 생성, 의존성 관계 주입, 생명주기등을 의미한다.
스프링 컨테이너에 의해 생명주기, 의존성 주입등의 기능을 사용하기 위해선
반드시 해당 빈은 스프링 컨테이너에 등록이 되야한다.
🧩역할
- 객체 생성 및 관리
- 빈은 개발자가 직접 객체를 생성할 필요 없이, 스프링 컨테이너에 등록만 하면, 알아서 만들어줌
- 의존성 관리
- 마찬가지로, 컨테이너에 등록되어 있으면, 스프링은 각 객체의 의존성을 알아서 해결
- 객체 생명 주기 관리
- 빈의 생명주기 크게, 생성, 의존성 주입, 사용, 소멸의 단계로 구분되며 스프링 컨테이너에 의해 관리됨
이런 역할을 전문 용어로 제어역전(Ioc)이라고 하며,
코드의 의존성을 줄이고, 유지보수성을 높이며, 또한 테스트도 용이하다는 큰 장점이 있음
💡제어역전(IoC)
개발자는 구체적인 내용만 작성하고, 생성 흐름처리, 유지보수같은 부가적인 내용을 시스템에게 맡겨
제어의 흐름이 개발자가 아닌 시스템에서 주도 한다는 의미
📌등록
위 설명에서 가장 많이 나온 얘기가, Bean은 반드시 스프링 컨테이너에 등록해야 한다
라는 내용인 것 같다.
등록하는 방법은 정말 간단하다. (너무 오래된 방식은 제외)
바로 @Bean 어노테이션을 사용하는 것, 그런데 사실 @Bean을 자체적으로 쓰는 일은 많이 없다.
- @Component
- @Service
- @Repository
- @Controller
직접 쓸 때는 다음과 같이 @Configuration 어노테이션과 함께 쓸 수 있다.
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
🌀SpringBootApplication
🧩 역할
@SpringBootApplication은 3가지 애너테이션의 조합
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
...
}
🧱구성요소
🔥@SpringBootConfiguration
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
- @Configuration을 확장한 것
- 하나 이상의 @Bean 메서드를 포함하는 설정 클래스
🤖 @EnableAutoConfiguration
...
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String[] excludeName() default {};
}
- Spring Boot의 자동 설정 기능을 담당
- 클래스패스에 있는 라이브러리와 빈을 기반으로 관련 설정을 자동으로 적용
🖨️ @ComponentScan
public @interface ComponentScan {
...
}
- @Component 어노테이션이 붙어있는 객체들을 스프링 빈으로 등록한다.
- @Service, @Repository, @Controller, @RestController 모두 내부적으로 @Component가 붙어있음
출처
스프링 컨테이너와 빈의 이해
스프링 컨테이너와 스프링 빈의 기본 개념, 역할, 생명 주기 및 의존성 주입(DI)에 대해 설명합니다.
f-lab.kr