λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

μŠ€ν”„λ§μ—μ„œ BootStrapμ μš©ν•˜κΈ°

by 5566 2023. 8. 13.

1. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ μ†Œκ°œ

μŠ€ν”„λ§(Spring)은 μžλ°” 기반의 μ˜€ν”ˆ μ†ŒμŠ€ ν”„λ ˆμž„μ›Œν¬λ‘œ, κΈ°μ—… 및 κΈ°κ΄€μ—μ„œ μ•ˆμ •μ μ΄κ³  μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— 널리 μ‚¬μš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ μœ„ν•œ λ‹€μ–‘ν•œ λͺ¨λ“ˆκ³Ό κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ κ°œλ°œμžκ°€ 효율적이고 ν’λΆ€ν•œ ν™˜κ²½μ—μ„œ κ°œλ°œν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ 핡심적인 νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1.1. μ œμ–΄ μ—­μ „ (Inversion of Control, IoC)

μŠ€ν”„λ§μ€ μ œμ–΄ μ—­μ „ (IoC) μ»¨ν…Œμ΄λ„ˆλ₯Ό μ΄μš©ν•˜μ—¬ 객체의 생성과 μ˜μ‘΄μ„± 관리λ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€. κ°œλ°œμžλŠ” ν”„λ‘œκ·Έλž¨μ˜ 흐름을 μ œμ–΄ν•˜λŠ” 것이 μ•„λ‹Œ, ν”„λ ˆμž„μ›Œν¬κ°€ μ •ν•œ κ·œμΉ™μ— 따라 κ°œλ°œν•˜λ©΄ λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 객체 κ°„μ˜ 결합도λ₯Ό 쀄이고 μœ μ—°ν•œ 개발 ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

1.2. μ˜μ‘΄μ„± μ£Όμž… (Dependency Injection, DI)

μŠ€ν”„λ§μ€ μ˜μ‘΄μ„± μ£Όμž… (DI)을 톡해 객체 κ°„μ˜ 의쑴 관계λ₯Ό μ„€μ •ν•˜λŠ” 방식을 μ§€μ›ν•©λ‹ˆλ‹€. κ°œλ°œμžλŠ” κ°μ²΄κ°„μ˜ 의쑴 관계λ₯Ό μ½”λ“œμ—μ„œ λͺ…μ‹œν•˜μ§€ μ•Šκ³ , μ„€μ • νŒŒμΌμ΄λ‚˜ μ• λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•˜μ—¬ μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬κ°€ μ˜μ‘΄μ„±μ„ μžλ™μœΌλ‘œ μ£Όμž…ν•΄μ€λ‹ˆλ‹€. 이λ₯Ό 톡해 μœ μ—°ν•œ λͺ¨λ“ˆν™”와 ν…ŒμŠ€νŠΈμ˜ μš©μ΄μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

1.3. 관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ° (Aspect-Oriented Programming, AOP)

μŠ€ν”„λ§μ€ 관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ° (AOP)을 μ§€μ›ν•˜μ—¬ λͺ¨λ“ˆμ„±μ„ κ°•ν™”ν•˜κ³  λ°˜λ³΅λ˜λŠ” μ½”λ“œλ₯Ό μ€„μ—¬μ€λ‹ˆλ‹€. AOPλ₯Ό μ΄μš©ν•˜μ—¬ λ‘œκΉ…, νŠΈλžœμž­μ…˜ 처리, λ³΄μ•ˆ λ“±κ³Ό 같은 μ—¬λŸ¬ 개의 λͺ¨λ“ˆμ„ ν•œ κ³³μ—μ„œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

1.4. ν¬ν„°λΈ”ν•œ μ½”λ“œμ™€ ν…ŒμŠ€νŠΈ μš©μ΄μ„±

μŠ€ν”„λ§μ€ μžλ°” 기반으둜 λ™μž‘ν•˜λ©°, ν‘œμ€€ μžλ°” 언어와 κΈ°μˆ μ„ μ‚¬μš©ν•˜λ―€λ‘œ μ½”λ“œμ˜ ν¬ν„°λΉŒλ¦¬ν‹°κ°€ λ†’μŠ΅λ‹ˆλ‹€. λ˜ν•œ μŠ€ν”„λ§μ€ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈλ₯Ό μ§€μ›ν•˜μ—¬ 개발 및 μœ μ§€λ³΄μˆ˜ λ‹¨κ³„μ—μ„œ ν’ˆμ§ˆ 관리λ₯Ό μ›ν™œν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λŠ” λ‹€μ–‘ν•œ λͺ¨λ“ˆκ³Ό 라이브러리λ₯Ό μ œκ³΅ν•˜μ—¬ 개발 생산성을 높이고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ 보닀 효율적으둜 ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈλŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ λ„κ΅¬λ‘œ, λ‹€μŒ ν•­λͺ©μ—μ„œ μžμ„Ένžˆ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

2. μŠ€ν”„λ§ λΆ€νŠΈμ™€μ˜ 차이점

μŠ€ν”„λ§ λΆ€νŠΈ(Spring Boot)λŠ” μŠ€ν”„λ§(Spring) ν”„λ ˆμž„μ›Œν¬λ₯Ό 더 κ°„νŽΈν•˜κ³  νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈλŠ” λ‹€μŒκ³Ό 같은 차이점을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

2.1. μžλ™ μ„€μ • (Auto Configuration)

μŠ€ν”„λ§ λΆ€νŠΈλŠ” μžλ™ 섀정을 톡해 κ°œλ°œμžκ°€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— ν•„μš”ν•œ λ§Žμ€ 세뢀적인 섀정을 μƒλž΅ν•  수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€. μžλ™ 섀정은 클래슀 패슀 λ‚΄μ˜ 라이브러리λ₯Ό μŠ€μΊ”ν•˜μ—¬ ν•΄λ‹Ή λΌμ΄λΈŒλŸ¬λ¦¬μ— μ‘΄μž¬ν•˜λŠ” 기본적인 섀정을 μžλ™μœΌλ‘œ μ μš©ν•΄μ€λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉ λ₯΄κ²Œ μ‹œμž‘ν•  수 있고, λ³΅μž‘ν•œ 섀정을 쀄여 생산성을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

2.2. λ‚΄μž₯ μ„œλ²„ (Embedded Server)

μŠ€ν”„λ§ λΆ€νŠΈλŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ λ³„λ„μ˜ μ™ΈλΆ€ μ„œλ²„λ₯Ό ν•„μš”λ‘œν•˜μ§€ μ•Šκ³ , 자체적으둜 λ‚΄μž₯ μ„œλ²„λ₯Ό μ΄μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄μž₯ μ„œλ²„λŠ” μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆμΈ Tomcat, Jetty, Undertow 등을 μžλ™μœΌλ‘œ μ„€μ •ν•˜κ³ , ν•΄λ‹Ή μ„œλ²„λ₯Ό μ‹œμž‘ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 배포 및 싀행이 κ°„νŽΈν•΄μ§€κ³ , 개발 ν™˜κ²½μ˜ 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2.3. μ˜μ‘΄μ„± 관리 (Dependency Management)

μŠ€ν”„λ§ λΆ€νŠΈλŠ” μ˜μ‘΄μ„± 관리λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬ κ°œλ°œμžκ°€ λ³„λ„μ˜ μ„€μ • 없이 ν•„μš”ν•œ 라이브러리λ₯Ό κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈλŠ” 기본적으둜 Maven λ˜λŠ” Gradleκ³Ό 같은 λΉŒλ“œ 도ꡬ와 ν•¨κ»˜ μ‚¬μš©λ˜λ©°, μ˜μ‘΄μ„±μ„ μ„ μ–Έν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μž‘μ—…μ„ μ΅œμ†Œν™”ν•˜μ—¬ 개발 생산성을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.

2.4. λͺ¨λ‹ˆν„°λ§ 및 관리 κΈ°λŠ₯

μŠ€ν”„λ§ λΆ€νŠΈλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” κΈ°λŠ₯듀을 μ œκ³΅ν•©λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό ν™•μΈν•˜κ±°λ‚˜ 둜그λ₯Ό ν™•μΈν•˜λŠ” κΈ°λŠ₯, 앑좔에이터(Actuator)λ₯Ό ν†΅ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœ 및 μ„±λŠ₯ 데이터λ₯Ό μˆ˜μ§‘ν•˜λŠ” κΈ°λŠ₯ 등을 μ§€μ›ν•˜μ—¬ κ°œλ°œμžκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 보닀 효율적으둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ§ λΆ€νŠΈλŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό λ”μš± νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” λ„κ΅¬λ‘œ, 개발 생산성과 μœ μ§€ λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ ν•­λͺ©μ—μ„œλŠ” μŠ€ν”„λ§ λΆ€νŠΈμ˜ ν™˜κ²½ μ„€μ • 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

3. μŠ€ν”„λ§ λΆ€νŠΈ ν™˜κ²½ μ„€μ • 방법

μŠ€ν”„λ§ λΆ€νŠΈ(Spring Boot)λŠ” κ°„νŽΈν•œ ν™˜κ²½ 섀정을 μ œκ³΅ν•˜μ—¬ κ°œλ°œμžκ°€ λΉ λ₯΄κ²Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ성할 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈμ˜ ν™˜κ²½ μ„€μ • 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

3.1. μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈ 생성

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜λ €λ©΄ λ¨Όμ € μŠ€ν”„λ§ λΆ€νŠΈ μ‹œμž‘ νŽ˜μ΄μ§€(https://start.spring.io)에 μ ‘μ†ν•˜μ—¬ ν”„λ‘œμ νŠΈμ˜ κΈ°λ³Έ 섀정을 μž…λ ₯ν•©λ‹ˆλ‹€. 그리고 μƒμ„±λœ ν”„λ‘œμ νŠΈλ₯Ό λ‹€μš΄λ‘œλ“œ λ°›μ•„ 압좕을 ν•΄μ œν•œ ν›„, IDE(톡합 개발 ν™˜κ²½)에 importν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό μ˜€ν”ˆν•©λ‹ˆλ‹€.

3.2. application.properties λ˜λŠ” application.yml 파일 μ„€μ •

μŠ€ν”„λ§ λΆ€νŠΈλŠ” 기본적인 μ„€μ • 정보λ₯Ό application.properties λ˜λŠ” application.yml νŒŒμΌμ— μž‘μ„±ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€. 이 νŒŒμΌμ€ ν”„λ‘œμ νŠΈμ˜ 루트 디렉토리에 μœ„μΉ˜ν•˜λ©°, ν”„λ‘œνΌν‹°(key-value) ν˜•νƒœλ‘œ μ„€μ • 정보λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ„œλ²„ 포트λ₯Ό 8080으둜 μ„€μ •ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 정보λ₯Ό μž‘μ„±ν•˜λ €λ©΄ application.properties νŒŒμΌμ— λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234

λ˜λŠ” application.yml νŒŒμΌμ„ μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 1234

3.3. μ• λ„ˆν…Œμ΄μ…˜μ„ ν†΅ν•œ μ„€μ •

μŠ€ν”„λ§ λΆ€νŠΈλŠ” μ• λ„ˆν…Œμ΄μ…˜μ„ μ΄μš©ν•˜μ—¬ νŠΉμ • κΈ°λŠ₯ λ˜λŠ” 섀정을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  λ•Œ, @SpringBootApplication μ• λ„ˆν…Œμ΄μ…˜μ„ 메인 ν΄λž˜μŠ€μ— μΆ”κ°€ν•˜λ©΄ μŠ€ν”„λ§ λΆ€νŠΈμ˜ 기본적인 섀정을 μžλ™μœΌλ‘œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

이 외에도 @EnableAutoConfiguration, @ComponentScan, @Configuration λ“± λ‹€μ–‘ν•œ μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 섀정을 μΆ”κ°€ν•˜κ±°λ‚˜ μ˜€λ²„λΌμ΄λ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ§ λΆ€νŠΈμ˜ ν™˜κ²½ μ„€μ • 방법은 λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ 제곡되며, κ°œλ°œμžλŠ” μžμ‹ μ˜ 상황에 맞게 μ„€μ • 방법을 선택할 수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈμ˜ μžμ„Έν•œ ν™˜κ²½ μ„€μ • 방법에 λŒ€ν•΄μ„œλŠ” 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜λ©΄ 도움이 λ©λ‹ˆλ‹€.

4. μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈ ꡬ쑰

μŠ€ν”„λ§ λΆ€νŠΈ(Spring Boot) ν”„λ‘œμ νŠΈμ˜ κ΅¬μ‘°λŠ” 일반적인 μŠ€ν”„λ§(Spring) ν”„λ‘œμ νŠΈμ™€ μœ μ‚¬ν•˜μ§€λ§Œ, λͺ‡ 가지 차이점이 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ˜ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

4.1. μ†ŒμŠ€ 파일 (src/main/java)

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ˜ μ†ŒμŠ€ νŒŒμΌμ€ 일반적인 μžλ°” ν”„λ‘œμ νŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ src/main/java 디렉토리에 μœ„μΉ˜ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 디렉토리 μ•„λž˜μ—λŠ” νŒ¨ν‚€μ§€ ꡬ쑰에 맞좰 μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 주둜 컨트둀러, μ„œλΉ„μŠ€, 리포지토리 λ“±μ˜ ν΄λž˜μŠ€λ“€μ΄ μœ„μΉ˜ν•©λ‹ˆλ‹€.

4.2. λ¦¬μ†ŒμŠ€ 파일 (src/main/resources)

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ˜ λ¦¬μ†ŒμŠ€ νŒŒμΌμ€ src/main/resources 디렉토리에 μœ„μΉ˜ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 디렉토리 μ•„λž˜μ—λŠ” ν”„λ‘œνΌν‹° 파일, XML 파일, ν…œν”Œλ¦Ώ 파일, 정적 λ¦¬μ†ŒμŠ€ 파일 등을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

주둜 application.properties ν˜Ήμ€ application.yml 파일이 μœ„μΉ˜ν•˜λ©°, 이 νŒŒμΌμ—λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„€μ • 정보가 μž‘μ„±λ©λ‹ˆλ‹€. λ˜ν•œ, μŠ€ν”„λ§ λΆ€νŠΈμ˜ μžλ™ 섀정을 μ΄μš©ν•˜μ—¬ 라이브러리의 μ„€μ • 정보λ₯Ό μž‘μ„±ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

4.3. ν…ŒμŠ€νŠΈ 파일 (src/test/java)

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ˜ ν…ŒμŠ€νŠΈ νŒŒμΌμ€ src/test/java 디렉토리에 μœ„μΉ˜ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 디렉토리 μ•„λž˜μ—λŠ” ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€λ“€μ΄ μœ„μΉ˜ν•˜λ©°, 주둜 λ‹¨μœ„ ν…ŒμŠ€νŠΈ λ˜λŠ” 톡합 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€λ“€μ€ 일반적인 μžλ°” ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€μ™€ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈλŠ” JUnit, Mockito와 같은 ν…ŒμŠ€νŠΈ 도ꡬλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것을 μ§€μ›ν•©λ‹ˆλ‹€.

4.4. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ 파일

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ νŒŒμΌμ„ μ œκ³΅ν•©λ‹ˆλ‹€. 일반적으둜 main λ©”μ„œλ“œλ₯Ό 가진 클래슀λ₯Ό μ‹€ν–‰ν•˜λ©΄ μŠ€ν”„λ§ λΆ€νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 main λ©”μ„œλ“œκ°€ μžˆλŠ” 클래슀λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

4.5. 기타 파일과 디렉토리

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ˜ κ΅¬μ‘°μ—λŠ” 기타 파일과 디렉토리듀도 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

  • pom.xml λ˜λŠ” build.gradle: ν”„λ‘œμ νŠΈμ˜ λΉŒλ“œ μ„€μ • 파일
  • .gitignore : Git으둜 κ΄€λ¦¬ν•˜μ§€ μ•Šμ„ 파일/디렉토리λ₯Ό μ§€μ •ν•˜λŠ” 파일
  • src/main/resources/static : μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 정적 λ¦¬μ†ŒμŠ€ 파일 μœ„μΉ˜
  • src/main/resources/templates : ν…œν”Œλ¦Ώ 파일 μœ„μΉ˜ (주둜 μ›Ή νŽ˜μ΄μ§€ λͺ…λ Ή κ°€λŠ₯ν•œ 동적 데이터 생성 μ‹œ μ‚¬μš©)

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ˜ κ΅¬μ‘°λŠ” 개발자의 ν•„μš”μ— 따라 쑰정될 수 μžˆμŠ΅λ‹ˆλ‹€. 전체 ꡬ쑰에 λŒ€ν•œ κ°€μ΄λ“œλΌμΈμ€ μ—†μ§€λ§Œ, μŠ€ν”„λ§ λΆ€νŠΈμ˜ ꢌμž₯ ꡬ쑰 및 κ΄€λ‘€λ₯Ό λ”°λ₯΄λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μœ μ§€ λ³΄μˆ˜μ„±κ³Ό 가독성을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

5. μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ΄μš©ν•œ 개발 μ‹€μŠ΅

이번 μ‹€μŠ΅μ—μ„œλŠ” μŠ€ν”„λ§ λΆ€νŠΈ(Spring Boot)λ₯Ό μ΄μš©ν•˜μ—¬ κ°„λ‹¨ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λŠ” 과정을 μ•ˆλ‚΄ν•©λ‹ˆλ‹€. μ•„λž˜μ˜ 단계λ₯Ό 따라 μ§„ν–‰ν•΄λ³΄μ„Έμš”.

5.1. ν”„λ‘œμ νŠΈ 생성

λ¨Όμ €, μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈ μ‹œμž‘ νŽ˜μ΄μ§€(https://start.spring.io)에 μ ‘μ†ν•˜μ—¬ ν”„λ‘œμ νŠΈμ˜ κΈ°λ³Έ 섀정을 μž…λ ₯ν•˜κ³  μƒμ„±λœ ν”„λ‘œμ νŠΈλ₯Ό λ‹€μš΄λ‘œλ“œ λ°›μ•„ 압좕을 ν•΄μ œν•©λ‹ˆλ‹€.

5.2. 컨트둀러 μž‘μ„±

λ‹€μŒμœΌλ‘œ, μ›Ή μš”μ²­μ„ μ²˜λ¦¬ν•  컨트둀러λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ˜ μ†ŒμŠ€ 파일(src/main/java)μ—μ„œ μ μ ˆν•œ νŒ¨ν‚€μ§€λ₯Ό μƒμ„±ν•œ ν›„, κ·Έ μ•„λž˜μ— 컨트둀러 클래슀λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

@RestController
public class HelloWorldController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

μœ„μ˜ μ½”λ“œλŠ” /hello 경둜둜 GET μš”μ²­μ΄ λ“€μ–΄μ˜¬ 경우 "Hello, World!"λΌλŠ” λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μ»¨νŠΈλ‘€λŸ¬μž…λ‹ˆλ‹€.

5.3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰

ν”„λ‘œμ νŠΈμ˜ 메인 클래슀λ₯Ό μ—΄κ³ , main λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈκ°€ λ‚΄μž₯ μ„œλ²„λ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λ―€λ‘œ λ”°λ‘œ μ„œλ²„ 섀정을 ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

5.4. ν…ŒμŠ€νŠΈ

μ‹€ν–‰λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ /hello 경둜둜 GET μš”μ²­μ„ λ³΄λ‚΄λ³΄μ„Έμš”. κ°€μž₯ κ°„λ‹¨ν•œ 방법은 μ›Ή λΈŒλΌμš°μ €μ—μ„œ ν•΄λ‹Ή κ²½λ‘œμ— μ ‘μ†ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

http://localhost:8080/hello

μ •μƒμ μœΌλ‘œ μš”μ²­μ΄ 처리되면 "Hello, World!"λΌλŠ” λ¬Έμžμ—΄μ΄ μ‘λ‹΅μœΌλ‘œ λ‚˜νƒ€λ‚  κ²ƒμž…λ‹ˆλ‹€.

5.5. μΆ”κ°€ κΈ°λŠ₯ 개발

μœ„μ˜ μ˜ˆμ œλŠ” κ°„λ‹¨ν•œ κΈ°λŠ₯λ§Œμ„ λ‹€λ£¨μ—ˆμ§€λ§Œ, μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ΄μš©ν•˜λ©΄ λ‹€μ–‘ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°, λ³΄μ•ˆ μ„€μ •, API 생성 등을 μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό 톡해 κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μΆ”κ°€ κΈ°λŠ₯을 κ°œλ°œν•˜κΈ° μœ„ν•΄μ„œλŠ” κ΄€λ ¨λœ μ˜μ‘΄μ„±μ„ pom.xml νŒŒμΌμ— μΆ”κ°€ν•˜κ³ , ν•΄λ‹Ή κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ‹€μŠ΅μ΄ μ™„λ£Œλ˜μ—ˆλ‹€λ©΄, κ°œλ°œν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ νŒ¨ν‚€μ§•ν•˜κ³  배포할 수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈλŠ” JAR 파일둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ νŒ¨ν‚€μ§•ν•˜λ©°, java -jar λͺ…령을 톡해 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ μ‹€μŠ΅μ„ 톡해 μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ΄μš©ν•œ κ°„λ‹¨ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λŠ” 과정을 μ§„ν–‰ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈ 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜λ©΄ 더 λ‹€μ–‘ν•œ κΈ°λŠ₯을 κ°œλ°œν•  수 μžˆλŠ” 방법을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€