๐ Spring Boot ์๋ ์ค์ (Auto-configuration) ์๋ฆฌ ์ดํดํ๊ธฐ ๐ง

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ Spring Boot์ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋์ธ ์๋ ์ค์ (Auto-configuration)์ ๋ํด ๊น์ด ํํค์ณ๋ณผ ๊ฑฐ์์. ์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด ์ฌ๋ฌ๋ถ๋ Spring Boot ๋ง์คํฐ๊ฐ ๋ ์ ์์ ๊ฑฐ์์! ใ ใ ใ ์, ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
์ฐธ๊ณ : ์ด ๊ธ์ '์ฌ๋ฅ๋ท'์ '์ง์์ธ์ ์ฒ' ๋ฉ๋ด์ ๋ฑ๋ก๋ ์์ ์ด์์. ์ฌ๋ฅ๋ท์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฑฐ๋ํ๋ ํ๋ซํผ์ธ๋ฐ, ์ฌ๋ฌ๋ถ์ Spring Boot ์ค๋ ฅ๋ ์ถฉ๋ถํ ์ฌ๋ฅ์ด ๋ ์ ์๋ต๋๋ค! ๐
๐ค Spring Boot ์๋ ์ค์ ์ด ๋ญ๊ธธ๋?
Spring Boot์ ์๋ ์ค์ ... ๋ญ๊ฐ ์์ด ๋ณด์ด๋ ์ด๋ฆ์ด์ฃ ? ใ ใ ใ ์ฌ์ค ์ด ๊ธฐ๋ฅ์ Spring Boot์ ํต์ฌ ์ค์ ํต์ฌ์ด์์! ์๋ ์ค์ ๋๋ถ์ ์ฐ๋ฆฌ๋ ๋ณต์กํ ์ค์ ์์ด๋ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ต๋๋ค. ๐
์๋ ์ค์ ์ด ์๋ ์์ ์ ์์ํด๋ณผ๊น์? XML ํ์ผ์ ๋น์ ์ผ์ผ์ด ๋ฑ๋กํ๊ณ , ํ๋กํผํฐ ํ์ผ์ ๋ง๋ค์ด ์ค์ ํ๊ณ ... ์, ์๊ฐ๋ง ํด๋ ๋จธ๋ฆฌ๊ฐ ์ํ์! ๐ฑ ํ์ง๋ง Spring Boot๋ ์ด๋ฐ ๊ณ ํต์์ ์ฐ๋ฆฌ๋ฅผ ํด๋ฐฉ์์ผ์คฌ์ด์.
TMI: Spring Boot๊ฐ ์๋ ์์ , ๊ฐ๋ฐ์๋ค์ ์ค์ ํ์ผ ๋๋ฌธ์ ๋จธ๋ฆฌ๊ฐ ๋น ์ง ์ง๊ฒฝ์ด์๋ค๊ณ ํด์. ์ง๊ธ ์๊ฐํ๋ฉด ์์๋ง ๋์ค๋ค์. ใ ใ ใ
๐ญ ์๋ ์ค์ ์ ๋ง๋ฒ, ์ด๋ป๊ฒ ์ด๋ค์ง๋ ๊ฑธ๊น?
์๋ ์ค์ ์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ค๋ฉด, ๋จผ์ Spring Boot์ ์ฒ ํ์ ์์์ผ ํด์. Spring Boot๋ "๊ด๋ก์ ์ค์ (Convention over Configuration)"์ด๋ผ๋ ๊ฐ๋ ์ ๋ฐ๋ฅด๊ณ ์์ด์. ์ฝ๊ฒ ๋งํด, "๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ด๋ ๊ฒ ํ๋ฉด ๋ผ!"๋ผ๊ณ ๋ฏธ๋ฆฌ ์ ํด๋์ ๊ฑฐ์ฃ .
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ๋ถ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ ๋ค๊ณ ํด๋ณผ๊น์? Spring Boot๋ ์๋์ผ๋ก Tomcat ์๋ฒ๋ฅผ ์ค์ ํด์ค์. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์? JPA์ Hibernate๋ ์์์ ์ค์ ํด์ค๋๋ค. ์์ ๊ฐ์ด๋ ์๋์์? ๐
์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด Spring Boot๊ฐ ์ผ๋ง๋ ๋ง์ ๊ฒ์ ์๋์ผ๋ก ์ค์ ํด์ฃผ๋์ง ํ๋์ ์ ์ ์์ฃ ? ์น, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ณด์, ๋ก๊น ๋ฑ ๋ค์ํ ์์ญ์ Spring Boot๊ฐ ์์์ ์ฑ๊ฒจ์ค๋๋ค. ์์ ๋ง๋ฅ ํด๊ฒฐ์ฌ ์๋์์? ใ ใ ใ
๐ต๏ธโโ๏ธ ์๋ ์ค์ ์ ๋น๋ฐ์ ํํค์ณ๋ณด์!
์, ์ด์ ์๋ ์ค์ ์ ๋น๋ฐ์ ํํค์ณ๋ณผ ์๊ฐ์ด์์! Spring Boot์ ์๋ ์ค์ ์ ํฌ๊ฒ ์ธ ๊ฐ์ง ์์๋ก ์ด๋ฃจ์ด์ ธ ์์ด์.
- @EnableAutoConfiguration: ์๋ ์ค์ ์ ์์์
- @Conditional: ์กฐ๊ฑด๋ถ ์ค์ ์ ๋ง๋ฒ์ฌ
- spring.factories: ์๋ ์ค์ ์ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ ํ์ผ
์ด ์ธ ๊ฐ์ง๋ง ์ ๋๋ก ์ดํดํ๋ฉด, ์ฌ๋ฌ๋ถ๋ Spring Boot ์๋ ์ค์ ์ ๋ฌ์ธ์ด ๋ ์ ์์ด์! ๐
1. @EnableAutoConfiguration: ์๋ ์ค์ ์ ์์์ ๐ฆ
@EnableAutoConfiguration์ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ์์์ ์ด์์. ์ด ์ด๋ ธํ ์ด์ ์ @SpringBootApplication ์์ ํฌํจ๋์ด ์์ฃ . ์ฌ๋ฌ๋ถ์ด main ๋ฉ์๋์ @SpringBootApplication์ ๋ถ์ผ ๋๋ง๋ค, ์๋์ผ๋ก @EnableAutoConfiguration๋ ํจ๊ป ์ ์ฉ๋๋ ๊ฑฐ์์.
@SpringBootApplication
public class MyAwesomeApplication {
public static void main(String[] args) {
SpringApplication.run(MyAwesomeApplication.class, args);
}
}
์ด ์ฝ๋๋ง ๋ด๋ Spring Boot๊ฐ ์ผ๋ง๋ ๊ฐ๋จํ์ง ์ ์ ์์ฃ ? ใ ใ ใ ์ด๊ฒ ๋ฐ๋ก Spring Boot์ ๋งค๋ ฅ์ด์์! ๐
2. @Conditional: ์กฐ๊ฑด๋ถ ์ค์ ์ ๋ง๋ฒ์ฌ ๐งโโ๏ธ
@Conditional์ Spring Boot์ ์๋ ์ค์ ์์ ์ ๋ง ์ค์ํ ์ญํ ์ ํด์. ์ด ์ด๋ ธํ ์ด์ ์ "์ด๋ฐ ์กฐ๊ฑด์ผ ๋๋ง ์ด ์ค์ ์ ์ ์ฉํด!"๋ผ๊ณ ๋งํด์ฃผ๋ ๊ฑฐ์ฃ . ์์ ๋๋ํ์ง ์๋์?
์๋ฅผ ๋ค์ด, @ConditionalOnClass๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ์์ด์. ์ด ์ด๋ ธํ ์ด์ ์ "ํน์ ํด๋์ค๊ฐ ํด๋์คํจ์ค์ ์์ ๋๋ง ์ด ์ค์ ์ ์ ์ฉํด!"๋ผ๊ณ ๋งํด์ฃผ๋ ๊ฑฐ์์.
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
// ๋ฐ์ดํฐ์์ค ๊ด๋ จ ์ค์
}
์ด ์ฝ๋๋ DataSource ํด๋์ค๊ฐ ํด๋์คํจ์ค์ ์์ ๋๋ง ๋ฐ์ดํฐ์์ค ๊ด๋ จ ์ค์ ์ ์ ์ฉํ๋ค๋ ๋ป์ด์์. ์์ ์ค๋งํธํ์ฃ ? ๐
3. spring.factories: ์๋ ์ค์ ์ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ ํ์ผ ๐
spring.factories ํ์ผ์ ์๋ ์ค์ ์ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ ์์ฃผ ์ค์ํ ํ์ผ์ด์์. ์ด ํ์ผ์ META-INF/spring.factories ๊ฒฝ๋ก์ ์์นํด ์์ด์.
์ด ํ์ผ ์์๋ ์๋ ์ค์ ํด๋์ค๋ค์ ๋ชฉ๋ก์ด ์์ด์. Spring Boot๋ ์ด ํ์ผ์ ์ฝ์ด์ ์ด๋ค ์๋ ์ค์ ์ ์ ์ฉํ ์ง ๊ฒฐ์ ํ๋ ๊ฑฐ์ฃ .
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
์ด๋ฐ ์์ผ๋ก ์๋ ์ค์ ํด๋์ค๋ค์ด ๋์ด๋์ด ์์ด์. ์์ ๋ฐฉ๋ํ์ฃ ? ใ ใ ใ
๐ญ ์๋ ์ค์ ์ ๋์ ์๋ฆฌ
์, ์ด์ ์๋ ์ค์ ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ธํ ์์๋ณผ๊น์? ๋ง์น ์ฐ๊ทน์ ๋ณด๋ ๊ฒ์ฒ๋ผ ์์ํด๋ณด์ธ์! ๐ญ
- 1๋ง: ์ ํ๋ฆฌ์ผ์ด์
์์ ๐
- Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ฉ๋๋ค.
- @SpringBootApplication ์ด๋ ธํ ์ด์ ์ด ์ฒ๋ฆฌ๋๊ธฐ ์์ํด์.
- 2๋ง: @EnableAutoConfiguration ๋ฑ์ฅ ๐ญ
- @EnableAutoConfiguration์ด ํ์ฑํ๋ฉ๋๋ค.
- ์ด ์ด๋ ธํ ์ด์ ์ AutoConfigurationImportSelector๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
- 3๋ง: ์๋ ์ค์ ํ๋ณด ํ์ ๐ต๏ธโโ๏ธ
- AutoConfigurationImportSelector๊ฐ ํด๋์คํจ์ค์์ META-INF/spring.factories ํ์ผ์ ์ฐพ์ต๋๋ค.
- ์ด ํ์ผ์์ EnableAutoConfiguration ํค์ ํด๋นํ๋ ์ค์ ํด๋์ค๋ค์ ๋ชจ๋ ๋ถ๋ฌ์ต๋๋ค.
- 4๋ง: ์กฐ๊ฑด ํ์ธ ๐ง
- ๊ฐ ์๋ ์ค์ ํด๋์ค์ ๋ถ์ @Conditional ์ด๋ ธํ ์ด์ ์ ํ์ธํฉ๋๋ค.
- ์กฐ๊ฑด์ด ๋ง๋ ์ค์ ๋ง ์ ์ฉํ๊ณ , ๋ง์ง ์๋ ์ค์ ์ ๋ฌด์ํฉ๋๋ค.
- 5๋ง: ์๋ ์ค์ ์ ์ฉ ๐
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ค์ ๋ค์ด Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ๋ฑ๋ก๋ฉ๋๋ค.
- ์ด๋ ๊ฒ ๋ฑ๋ก๋ ์ค์ ๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉ๋๋ ๊ฑฐ์ฃ !
์~ ์ ๋ง ๋ณต์กํด ๋ณด์ด์ง๋ง, Spring Boot๊ฐ ์ด ๋ชจ๋ ๊ณผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋๊น ์ฐ๋ฆฌ๋ ํธํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ ๊ฑฐ์์! ๐
์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด Spring Boot์ ์๋ ์ค์ ๊ณผ์ ์ด ํ๋์ ๋ค์ด์ค์ฃ ? ์์๋ถํฐ ์ ์ฉ๊น์ง, ๋ง์น assembly line์ฒ๋ผ ์์ฐจ์ ์ผ๋ก ์งํ๋๋ ๋ชจ์ต์ด ์ ๋ง ๋ฉ์์ด์! ๐
๐ ์๋ ์ค์ ์ดํด๋ณด๊ธฐ: ์ค์ ์์ ๋ก ์์๋ณด์!
์, ์ด์ ์ค์ ์์ ๋ฅผ ํตํด ์๋ ์ค์ ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ธํ ์ดํด๋ณผ๊น์? ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์๋ก ๋ค์ด๋ณผ๊ฒ์. ๐๏ธ
1. ์์กด์ฑ ์ถ๊ฐ
๋จผ์ , ํ๋ก์ ํธ์ pom.xml
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ์์กด์ฑ์ ์ถ๊ฐํด์.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
์ด๋ ๊ฒ ํ๋ฉด JPA์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ๋ก์ ํธ์ ์ถ๊ฐ๋ผ์. Spring Boot๊ฐ ์ด๊ฑธ ๋ณด๊ณ "์ํ! ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ด ํ์ํ๊ตฌ๋!"๋ผ๊ณ ์๊ฐํ๋ ๊ฑฐ์ฃ . ใ ใ ใ
2. ์๋ ์ค์ ํด๋์ค ์ดํด๋ณด๊ธฐ
Spring Boot๋ DataSourceAutoConfiguration
ํด๋์ค๋ฅผ ํตํด ๋ฐ์ดํฐ์์ค๋ฅผ ์๋์ผ๋ก ์ค์ ํด์. ์ด ํด๋์ค์ ์ผ๋ถ๋ฅผ ์ดํด๋ณผ๊น์?
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class,
DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSourceInitializer dataSourceInitializer(DataSourceProperties properties,
ApplicationContext applicationContext) {
// ...
}
// ...
}
์ฐ์~ ๋ญ๊ฐ ๋ณต์กํด ๋ณด์ด์ฃ ? ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ํ๋์ฉ ๋ฏ์ด๋ณผ๊ฒ์! ๐
- @Configuration: ์ด ํด๋์ค๊ฐ ์ค์ ํด๋์ค๋ผ๋ ๊ฑธ ๋ํ๋ด์.
- @ConditionalOnClass: DataSource์ EmbeddedDatabaseType ํด๋์ค๊ฐ ํด๋์คํจ์ค์ ์์ ๋๋ง ์ด ์ค์ ์ ์ ์ฉํด์.
- @EnableConfigurationProperties: DataSourceProperties๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค์.
- @Import: ๋ค๋ฅธ ์ค์ ํด๋์ค๋ค์ ๊ฐ์ ธ์์.
- @Bean: ๋ฐ์ดํฐ์์ค ์ด๊ธฐํ๋ฅผ ์ํ ๋น์ ์์ฑํด์.
- @ConditionalOnMissingBean: ์ด๋ฏธ DataSourceInitializer ํ์ ์ ๋น์ด ์์ ๋๋ง ์ด ๋น์ ์์ฑํด์.
์ด๋ ๊ฒ Spring Boot๋ ์กฐ๊ฑด์ ์ฒดํฌํ๊ณ , ํ์ํ ๋น๋ค์ ์์ฑํ๋ ๊ฑฐ์์. ์์ ๋๋ํ์ฃ ? ๐จโ๐ฌ
3. ํ๋กํผํฐ ์ค์
์๋ ์ค์ ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ์ค์ ์ ๋ณ๊ฒฝํ ์๋ ์์ด์. application.properties
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ์ ์ถ๊ฐํ ์ ์์ฃ .
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
์ด๋ ๊ฒ ํ๋ฉด Spring Boot๋ ์ด ์ค์ ๊ฐ์ ์ฝ์ด์ ๋ฐ์ดํฐ์์ค๋ฅผ ๊ตฌ์ฑํด์. ์ฐ๋ฆฌ๊ฐ ์ง์ ์ค์ ํ์ง ์์๋ ๋๋๊น ์ ๋ง ํธํ์ฃ ? ๐
4. ์๋ ์ค์ ๋์ ํ์ธ
์, ์ด์ ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด๋ณผ๊น์? ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ์ํฐํฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณผ๊ฒ์.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
// getters and setters
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
๊ทธ๋ฆฌ๊ณ ๋ฉ์ธ ํด๋์ค์์ ์ด๋ฅผ ์ฌ์ฉํด๋ณผ๊ฒ์.
@SpringBootApplication
public class MyAwesomeApplication implements CommandLineRunner {
@Autowired
private UserRepository userRepository;
public static void main(String[] args) {
SpringApplication.run(MyAwesomeApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
User user = new User();
user.setName("Spring Boot Fan");
userRepository.save(user);
System.out.println("User saved: " + userRepository.findAll());
}
}
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, Spring Boot๊ฐ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค์ ํ๊ณ , JPA๋ฅผ ์ด๊ธฐํํ๊ณ , ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ํฐํฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค์. ์์ ์ ๊ธฐํ์ง ์๋์? ๐
๊ฟํ: ์ฌ๋ฅ๋ท์์ Spring Boot ๊ด๋ จ ๊ฐ์๋ฅผ ์ฐพ์๋ณด์ธ์! ์ค์ ํ๋ก์ ํธ ๊ฒฝํ์ด ์๋ ์ ๋ฌธ๊ฐ๋ค์ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด ๋ ๋น ๋ฅด๊ฒ ์ค๋ ฅ์ ํฅ์์ํฌ ์ ์์ด์. ๐
๐ค ์๋ ์ค์ , ์ด๊ฒ ๋ค ์ข๊ธฐ๋ง ํ ๊ฑธ๊น?
์๋ ์ค์ ์ด ์ ๋ง ํธ๋ฆฌํ๋ค๋ ๊ฑด ์๊ฒ ์ด์. ํ์ง๋ง "์ด๊ฒ ๋ค ์ข๊ธฐ๋ง ํ ๊ฑธ๊น?" ํ๋ ์๋ฌธ์ด ๋ค ์ ์์ฃ . ์๋ ์ค์ ์ ์ฅ๋จ์ ์ ํ๋ฒ ์ดํด๋ณผ๊น์?
์ฅ์ ๐
- ๋น ๋ฅธ ๊ฐ๋ฐ: ๋ณต์กํ ์ค์ ์์ด ๋ฐ๋ก ๊ฐ๋ฐ์ ์์ํ ์ ์์ด์.
- ํ์คํ: ๋ชจ๋ ํ๋ก์ ํธ๊ฐ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋์ด ์ ์ง๋ณด์๊ฐ ์ฌ์์ ธ์.
- ํธ๋ฆฌ์ฑ: ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์์ด์.
- ์ ์ฐ์ฑ: ํ์ํ๋ค๋ฉด ์ธ์ ๋ ์ค์ ์ ์ค๋ฒ๋ผ์ด๋ํ ์ ์์ด์.
๋จ์ ๐
- ๋ธ๋๋ฐ์ค: ๋ด๋ถ ๋์์ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ด์.
- ์ ์ด๋ ฅ ์์ค: ๋๋ก๋ ์ํ๋ ๋๋ก ์ ํํ ์ ์ดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ด์.
- ์ฑ๋ฅ: ๋ถํ์ํ ์ค์ ์ด ํฌํจ๋ ์ ์์ด ์ฝ๊ฐ์ ์ฑ๋ฅ ์ ํ๊ฐ ์์ ์ ์์ด์.
- ํ์ต ๊ณก์ : ์๋ ์ค์ ์ ์์ ํ ์ดํดํ๊ณ ํ์ฉํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ด์.
ํ์ง๋ง ์ด๋ฐ ๋จ์ ๋ค๋ Spring Boot๋ฅผ ๊น์ด ์ดํดํ๊ณ ์ ํ์ฉํ๋ฉด ์ถฉ๋ถํ ๊ทน๋ณตํ ์ ์์ด์. ๊ทธ๋ฌ๋๊น ๊ฑฑ์ ๋ง์ธ์! ๐
๐ ๏ธ ์๋ ์ค์ ์ปค์คํฐ๋ง์ด์งํ๊ธฐ
๋๋ก๋ Spring Boot์ ์๋ ์ค์ ๋ง์ผ๋ก๋ ๋ถ์กฑํ ๋๊ฐ ์์ด์. ๊ทธ๋ด ๋๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๊ฑฑ์ ๋ง์ธ์! Spring Boot๋ ์๋ ์ค์ ์ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์. ๐จโ๐ง
1. ํ๋กํผํฐ ํ์ผ ์ฌ์ฉํ๊ธฐ
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ application.properties
๋๋ application.yml
ํ์ผ์ ์ฌ์ฉํ๋ ๊ฑฐ์์. ์๋ฅผ ๋ค์ด, ์๋ฒ ํฌํธ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด:
server.port=8081
์ด๋ ๊ฒ ํ๋ฉด ์๋ฒ๊ฐ 8081 ํฌํธ์์ ์คํ๋ผ์. ์์ ์ฝ์ฃ ? ใ ใ ใ
2. ํ๋กํ์ผ ์ฌ์ฉํ๊ธฐ
๋ค๋ฅธ ํ๊ฒฝ(๊ฐ๋ฐ, ํ ์คํธ, ์ด์ ๋ฑ)์ ๋ฐ๋ผ ๋ค๋ฅธ ์ค์ ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ํ๋กํ์ผ์ ํ์ฉํ ์ ์์ด์.
spring.profiles.active=dev
---
spring.config.activate.on-profile=dev
server.port=8080
---
spring.config.activate.on-profile=prod
server.port=80
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ฐ ํ๊ฒฝ์์๋ 8080 ํฌํธ๋ฅผ, ์ด์ ํ๊ฒฝ์์๋ 80 ํฌํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ผ์. ์์ ์ค๋งํธํ์ฃ ? ๐
3. ์๋ฐ ์ค์ ํด๋์ค ๋ง๋ค๊ธฐ
์ข ๋ ๋ณต์กํ ์ค์ ์ด ํ์ํ๋ค๋ฉด ์๋ฐ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ด์.
@Configuration
public class MyConfiguration {
@Bean
@ConditionalOnMissingBean
public MyCustomBean myCustomBean() {
return new MyCustomBean();
}
}
์ด๋ ๊ฒ ํ๋ฉด MyCustomBean์ด๋ผ๋ ๋น์ด ์๋์ผ๋ก ์์ฑ๋ผ์. ๋ฌผ๋ก ์ด๋ฏธ ์๋ค๋ฉด ์์ฑ๋์ง ์๊ฒ ์ฃ ? ๋๋ํด! ๐
4. ์๋ ์ค์ ํด๋์ค ๋ง๋ค๊ธฐ
์ ๋ง ๋๋จํ ๊ฑธ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, ์์ ์๋ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค ์๋ ์์ด์.
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
@Autowired
private MyProperties properties;
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyServiceImpl(properties.getConfig());
}
}
๊ทธ๋ฆฌ๊ณ META-INF/spring.factories
ํ์ผ์ ์ด ํด๋์ค๋ฅผ ๋ฑ๋กํ๋ฉด ๋ผ์.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ๋ถ๋ง์ ์๋ ์ค์ ์ ๋ง๋ค ์ ์์ด์. ์์ ํ๋ก ๊ฐ๋ฐ์ ๋๋ ๋์ง ์๋์? ๐
๐งช ์๋ ์ค์ ํ ์คํธํ๊ธฐ
์๋ ์ค์ ์ ๋ง๋ค์๋ค๋ฉด, ๋น์ฐํ ํ ์คํธ๋ ํด์ผ๊ฒ ์ฃ ? Spring Boot๋ ์๋ ์ค์ ์ ํ ์คํธํ๊ธฐ ์ํ ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํด์. ํ๋ฒ ์ดํด๋ณผ๊น์? ๐ต๏ธโโ๏ธ
1. @SpringBootTest ์ฌ์ฉํ๊ธฐ
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ @SpringBootTest ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฑฐ์์.
@SpringBootTest
class MyServiceTest {
@Autowired
private MyService myService;
@Test
void testMyService() {
assertNotNull(myService);
// ๋ ๋ง์ ํ
์คํธ...
}
}
์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ๋ก๋ํด์ ํ ์คํธํ ์ ์์ด์. ์๋ฒฝํ์ฃ ? ๐
2. @AutoConfigureMockMvc ์ฌ์ฉํ๊ธฐ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ ๋๋ @AutoConfigureMockMvc๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ