Spring/튜토리얼

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

Hamp 2025. 10. 25. 23:26
반응형

🏁 학습할 내용

  • Directory & File
    • resources
      • static
      • templates
      • application.properties
    • build.gradle.kts
  •  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가 우선순위가 높다 

 

스프링 기본 키와 default 값


🫛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가 붙어있음

출처

https://f-lab.kr/insight/understanding-spring-container-and-beans?gad_source=1&gad_campaignid=22368870602&gbraid=0AAAAACGgUFeBE0RpLjCqzDMvxSmmZP-7J&gclid=Cj0KCQjw35bIBhDqARIsAGjd-cbWIQbhX3NwobzsbUWgpABn7UqWxY8dbNW0ovxcnPuT7ly7ZccPKgYaAmu6EALw_wcB

 

스프링 컨테이너와 빈의 이해

스프링 컨테이너와 스프링 빈의 기본 개념, 역할, 생명 주기 및 의존성 주입(DI)에 대해 설명합니다.

f-lab.kr

 

반응형