| μΌ | μ | ν | μ | λͺ© | κΈ | ν |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- μ»΄ν¨ν° ꡬ쑰
- LinkedList
- actuator
- κ°λ°μ
- array
- λ°±μλμ€μΏ¨
- λ°±μλ곡λΆ
- spring
- SpringSecurity
- νλ‘κ·Έλλ¨Έμ€
- TestCode
- μ°κ΄κ΄κ³
- queue
- ν΅μ¬κ°μ΄λ
- restTemplate
- μ€νλ§λΆνΈ
- error
- μλ²
- μ λ‘λ² μ΄μ€
- JWT
- Java
- λ°±μ€
- SpringBoot
- QueryDSL
- λ°±μλ
- μλ£κ΅¬μ‘°
- spring boot
- JPA
- ORM
- μ»΄ν¨ν° 곡ν
- Today
- Total
be_better
[Springboot] μ€νλ§ λΆνΈλ? λ³Έλ¬Έ
λͺ©μ°¨
π μ€νλ§ νλ μμν¬
μ€νλ§ νλ μμν¬(Spring Framework)λ μλ°(Java) κΈ°λ°μ μ ν리μΌμ΄μ νλ μμν¬μ΄λ€.
μ€νλ§μ λͺ©μ μ λ°λΌ λ€μν νλ‘μ νΈλ₯Ό μ 곡νλλ°, κ·Έμ€ νλκ° μ€νλ§ λΆνΈ(Spring Boot)μ΄λ€.
μ€νλ§ νλ μμν¬λ μλ°μμ κ°μ₯ λ§μ΄ μ¬μ©νλ νλ μμν¬λ‘, μν°νλΌμ΄μ¦κΈ κ°λ°μ νΈλ¦¬νκ² λ§λ€μ΄μ£Όλ 'μ€νμμ€ κ²½λκΈ μ ν리μΌμ΄μ νλ μμν¬'λ‘ λΆλ¦°λ€.
μν°νλΌμ΄μ¦κΈ κ°λ°μ΄λ?
λ€μ΄λ²λ μΉ΄μΉ΄μ€ κ°μ λκ·λͺ¨ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ νκ²½μ μν°νλΌμ΄μ¦ νκ²½μ΄λΌκ³ λΆλ₯Έλ€.
μ€νλ§μ ν΅μ¬κ°μΉλ κ°λ°μκ° λΉμ¦λμ€ λ‘μ§ κ΅¬νμλ§ μ§μ€ν μ μκ²λ νλ κ²
μ μ΄ μμ (IoC)
μΌλ°μ μΈ μλ° κ°λ°μ κ²½μ° κ°μ²΄λ₯Ό μμ±νκ³ μ¬μ©νλ μΌλ ¨μ μμ μ κ°λ°μκ° μ§μ μ μ΄νλ ꡬ쑰λ₯Ό κ°λλ€.
@RestController
public class NoDIController {
private MyService service = new MyService();
@GetMapping("/no-di/hello")
public String getHello() {
return service.getHello();
}
}
μ μ΄ μμ (IoC; Inversion of Control)μ νΉμ§μΌλ‘ νλ μ€νλ§μ κΈ°μ‘΄ μλ° κ°λ° λ°©μκ³Ό λ€λ₯΄κ² λμνλ€.
μ¬μ©ν κ°μ²΄λ₯Ό μ§μ μμ±νμ§ μκ³ κ°μ²΄μ μλͺ μ£ΌκΈ° κ΄λ¦¬λ₯Ό μΈλΆμ μμνκ² λκ³ μ΄λ‘μΈν΄
μμ‘΄μ± μ£Όμ (DI; Dependency Injection), κ΄μ μ§ν₯ νλ‘κ·Έλ¨(AOP; Aspect-Oriented Programming) μ΄ κ°λ₯ν΄μ§λ€.
'μΈλΆ' λ μ€νλ§ μ»¨ν μ΄λ(Spring Container) λλ IoC 컨ν μ΄λ(IoC Container)λ₯Ό μλ―Ένλ€.
μμ‘΄μ± μ£Όμ (DI)
μμ‘΄μ± μ£Όμ μ΄λ μΈλΆ 컨ν μ΄λκ° μμ±ν κ°μ²΄λ₯Ό μ£Όμ λ°μ μ¬μ©νλ λ°©μμ μλ―Ένλ€.
μ€νλ§μμ μμ‘΄μ±μ μ£Όμ λ°λ λ°©λ²μ μΈ κ°μ§κ° μκ³ , @Autowired λΌλ μ΄λ Έν μ΄μ μ ν΅ν΄ μμ‘΄μ±μ μ£Όμ ν μ μλ€.
μμ±μλ₯Ό ν΅ν μμ‘΄μ± μ£Όμ
@RestController
public class DIController {
MyService myService;
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}
@GetMapping("/di/hello")
public String getHello() {
return myService.getHello();
}
}
νλ κ°μ²΄ μ μΈμ ν΅ν μμ‘΄μ± μ£Όμ
@RestController
public class FieldInjectionController {
@Autowired
private MyService myService;
}
setter λ©μλλ₯Ό ν΅ν μμ‘΄μ± μ£Όμ
@RestController
public class SetterInjectionController {
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
}
λ€λ₯Έ λ°©μκ³Όλ λ€λ₯΄κ² μμ±μλ₯Ό ν΅ν΄ μμ‘΄μ±μ μ£Όμ λ°λ λ°©μμ λ νΌλ°μ€ κ°μ²΄ μμ΄λ κ°μ²΄λ₯Ό μ΄κΈ°νν μ μκ² μ€κ³ν μ μκΈ° λλ¬Έμ μ μΌ κΆμ₯νλ μμ‘΄μ± μ£Όμ λ°©μμ΄λ€.
κ΄μ μ§ν₯ νλ‘κ·Έλλ°(AOP)
κ΄μ μ§ν₯ νλ‘κ·Έλλ°μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP)λ₯Ό λμ± μ μ¬μ©νλλ‘ λλ κ°λ μΌλ‘ λ³Έλ€.
AOPλ κ΄μ μ κΈ°μ€μΌλ‘ λ¬Άμ΄ κ°λ°νλ λ°©μμ΄λ€. κ΄μ (aspect)λ μ΄λ€ κΈ°λ₯μ ꡬνν λ 'ν΅μ¬ κΈ°λ₯'κ³Ό 'λΆκ° κΈ°λ₯'μΌλ‘ ꡬλΆν΄ κ°κ°μ νλμ κ΄μ μΌλ‘ 보λ κ²μ μλ―Ένλ€.
ν΅μ¬ κΈ°λ₯μ λΉμ¦λμ€ λ‘μ§μ΄ μ²λ¦¬νλ €λ λͺ©μ κΈ°λ₯μ λ§νλ€.
λ€μλ§ν΄ ν΄λΌμ΄μΈνΈλ‘λΆν° μμ²μ λ°μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ³ , μμ²ν λ°μ΄ν°λ₯Ό 보μ¬μ£Όλ λ©μΈ κΈ°λ₯μ μλ―Ένλ€.
λΆκ° κΈ°λ₯μ λΉμ¦λμ€ λ‘μ§ μ¬μ΄μ λ‘κΉ μ²λ¦¬λ₯Ό νκ±°λ νΈλμμ μ μ²λ¦¬νλ κΈ°λ₯ λ±μ λ»νλ€.
κΈ°μ‘΄ OOP λ°©μμμλ κ°μ²΄λ§λ€ ν΅μ¬κΈ°λ₯, λΆκ°κΈ°λ₯ μ½λλ₯Ό μμ±νλ€.
μ΄λ¬ν λ°©μμμλ λΆκ°κΈ°λ₯μ΄ μλ‘ λ€λ₯Έ ν΅μ¬κΈ°λ₯λ€μμ λμΌν κΈ°λ₯μ μνν νλ₯ μ΄ λλ€.
AOP λ°©μμμλ ν΅μ¬ κΈ°λ₯, λΆκ° κΈ°λ₯μ κ°κ°μ κ΄μ μΌλ‘ 보기 λλ¬Έμ λΆλ¦¬λμ΄μλ€.
λμΌν κΈ°λ₯μ νλ λΆκ° κΈ°λ₯μ λ°λ‘ κ΄λ¦¬ν΄ ν΅μ¬ κΈ°λ₯μ΄ μνλκΈ° μ λλ νμ μνλκΈ°λ§ νλ©΄ λλ€.
AOPλ₯Ό ꡬννλ λ°©μμλ ν¬κ² μΈ κ°μ§κ° μλ€.
- μ»΄νμΌ κ³Όμ μ μ½μ νλ λ°©μ
- λ°μ΄νΈμ½λλ₯Ό λ©λͺ¨λ¦¬μ λ‘λνλ κ³Όμ μ μ½μ νλ λ°©μ
- νλ½μ ν¨ν΄μ μ΄μ©ν λ°©μ (μ€νλ§μ΄ μ±νν λ°©μ)
μ€νλ§ νλ μμν¬μ λ€μν λͺ¨λ
μ€νλ§ νλ μμν¬λ κΈ°λ₯λ³λ‘ ꡬλΆλ μ½ 20μ¬ κ°μ λͺ¨λλ‘ κ΅¬μ±λμ΄ μλ€.
λͺ¨λ λͺ¨λμ μ¬μ©ν νμλ μκ³ μ ν리μΌμ΄μ κ°λ°μ νμν λͺ¨λλ§ μ νν΄μ μ¬μ©νκ²λ μ€κ³λμ΄μλλ°
μ΄λ₯Ό κ²½λ 컨ν μ΄λ μ€κ³λΌκ³ λΆλ₯Έλ€.
π μ€νλ§ νλ μμν¬ vs. μ€νλ§ λΆνΈ
μ€νλ§ νλ μμν¬λ κΈ°μ‘΄ κ°λ° λ°©μμ λ¬Έμ μ νκ³λ₯Ό 극볡νκΈ° μν΄ λ€μν κΈ°λ₯μ μ 곡νκ³ νμν λͺ¨λλ€μ μΆκ°ν΄ μ¬μ©νκ² νμ§λ§ κ·Έλ§νΌ μ€μ μ΄ λ³΅μ‘ν νΈμ΄λ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ³λμ 볡μ‘ν μ€μ μ νμ§ μμλ μ¬μ©ν μ μλ μ€νλ§ λΆνΈκ° λ±μ₯νλ€.
μμ‘΄μ± κ΄λ¦¬
μ€νλ§ νλ μμν¬μμλ κ° λͺ¨λμ μμ‘΄μ±μ μ§μ μ€μ ν΄μΌνκ³ , νΈνλλ λ²μ μ λͺ μν΄μΌνκ³ , μ°κ΄λ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ λ²μ κΉμ§λ κ³ λ €νλ©° μ¬μ©ν΄μΌ νμλ€.
μ€νλ§ λΆνΈμμλ μμ κ°μ λΆνΈν¨μ ν΄μνκΈ° μν΄ 'spring-boot-starter'λΌλ μμ‘΄μ±μ μ 곡νλ€.
κ° λΌμ΄λΈλ¬λ¦¬μ κΈ°λ₯κ³Ό κ΄λ ¨ν΄μ μμ£Ό μ¬μ©λκ³ μλ‘ νΈνλλ λ²μ μ λͺ¨λ μ‘°ν© μΈνΈλ₯Ό μ 곡νλ€.
λ§μ΄ μ¬μ©λλ spring-boot-starter λΌμ΄λΈλ¬λ¦¬μλ λ€μκ³Ό κ°μ κ²λ€μ΄ μλ€.
- spring-boot-starter-web: μ€νλ§ MVCλ₯Ό μ¬μ©νλ RESTful μ ν리μΌμ΄μ
μ λ§λ€κΈ° μν μμ‘΄μ±.
κΈ°λ³ΈμΌλ‘ λ΄μ₯ ν°μΊ£(Tomcat)μ΄ ν¬ν¨λΌ μμ΄ jar νμμΌλ‘ μ€ν κ°λ₯ - spring-boot-starter-test: JUnit Jupiter, Mockito λ±μ ν μ€νΈμ© λΌμ΄λΈλ¬λ¦¬ ν¬ν¨
- spring-boot-starter-jdbc: HikariCP 컀λ₯μ νμ νμ©ν JDBC κΈ°λ₯ μ 곡
- spring-boot-starter-security: μ€νλ§ μν리ν°(μΈμ¦, κΆν, μΈκ° λ±) κΈ°λ₯ μ 곡
- spring-boot-starter-data-jpa: νμ΄λ²λ€μ΄νΈλ₯Ό νμ©ν JPA κΈ°λ₯ μ 곡
- spring-boot-starter-cache: μ€νλ§ νλ μμν¬μ μΊμ κΈ°λ₯ μ 곡
μλ μ€μ (Auto Configuration)
μλ μ€μ μ μ ν리μΌμ΄μ μ μΆκ°λ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€ννλ λ° νμν νκ²½ μ€μ μ μμμ μ°Ύμμ€λ€.
μ€νλ§ λΆνΈ νλ‘μ νΈλ₯Ό μμ±νλ©΄ λ©μΈ μ ν리μΌμ΄μ μ½λλ₯Ό μλμΌλ‘ λ§λ€μ΄μ£Όλλ°
μ΄λ @SpringBootApplication μ΄λΌλ μ΄λ Έν μ΄μ μ λΆμ¬μ€λ€.
@SpringBootApplication μ΄λ Έν μ΄μ μ @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan μΈ κ°μ μ΄λ Έν μ΄μ μ ν©μ³λμ ꡬμ±μ΄λ€.
μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ΄ μ€νλλ©΄ @ComponentScan μ΄ @Component μλ¦¬μ¦ μ΄λ Έν μ΄μ μ΄ λΆμ ν΄λμ€λ₯Ό λ°κ²¬ν΄ λΉ(bean)μ λ±λ‘νλ€. @EnableAutoConfiguration μ΄λ Έν μ΄μ μ ν΅ν΄ 'spring-boot-autoconfigure' ν¨ν€μ§ μμ spring.factories νμΌμ μΆκ°ν΄ λ€μν μλ μ€μ μ΄ μ μ©λλ€.
spring.factories νμΌμ μ΄λ©΄ λ€μν Auto Configure νλͺ©λ€μ΄ μ‘΄μ¬νλλ° κ° νμΌμ μ€μ λ @Conditionalμ 쑰건μ μΆ©μ‘±ν κ²½μ° λΉμ λ±λ‘λκ³ μ ν리μΌμ΄μ μ μλ λ°μλλ€.
Component μ리μ¦μλ
· @Controller
· @RestController
· @Service
· @Repository
· @Configuration
μ΄ ν¬ν¨λμ΄ μλ€.
λ΄μ₯ WAS
μ€νλ§ λΆνΈμ κ° μΉ μ΄ν리μΌμ΄μ μλ λ΄μ₯ WAS(Web Application Server)κ° μ‘΄μ¬νλ€.
μΉ μ ν리μΌμ΄μ μ κ°λ°ν λ κ°μ₯ κΈ°λ³Έμ΄ λλ μμ‘΄μ±μΈ 'spring-boot-starter-web' μμ ν°μΊ£μ λ΄μ₯νλ€.
μ€νλ§ λΆνΈμ μλ μ€μ κΈ°λ₯μ ν°μΊ£μλ μ μ©λλ―λ‘ νΉλ³ν μ€μ μμ΄ ν°μΊ£ μ€ν κ°λ₯
λͺ¨λν°λ§
μλΉμ€ μ΄μ λ¨κ³μμλ ν΄λΉ μμ€ν μ΄ μ¬μ©νλ μ€λ λ, λ©λͺ¨λ¦¬, μΈμ λ±μ μ£Όμ μμλ€μ λͺ¨λν°λ§ ν΄μΌνλλ° μ€νλ§ λΆνΈ μ‘μΆμμ΄ν°(Spring Boot Actuator)λΌλ μ체 λͺ¨λν°λ§ λκ΅¬κ° μλ€.
'Springboot > μ΄λ‘ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Springboot] λ°μ΄ν°λ² μ΄μ€ μ°λ - ORM, JPA (0) | 2023.11.05 |
|---|---|
| [Springboot] APIλ₯Ό μμ±νλ λ€μν λ°©λ² (0) | 2023.10.29 |
| [Springboot] μ€νλ§ λΆνΈ μ ν리μΌμ΄μ κ°λ°νκΈ° (0) | 2023.10.29 |
| [Springboot] κ°λ° νκ²½ κ΅¬μ± (0) | 2023.10.22 |
| [Springboot] κ°λ°μ μμ μλ©΄ μ’μ κΈ°μ΄ μ§μ (0) | 2023.10.22 |