java๊ธฐ๋ฐ์ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์ํด ๋ง๋ค์ด์ง ํ๋ ์์ํฌ์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ, ๋ณด์(๋ก๊ทธ์ธ๊ด๋ จ), REST API ๊ฐ๋ฐ ๋ฑ์ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์๋ฐ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๊ธฐ ์ํ ๋ค์ํ ๊ธฐ๋ฅ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
๋ฐฉ์์ ์ด์ฉํด ์ ๊ณตํ๋ค.
๋ํผ๋ฐ์ค ๊ฐ์ฒด ์์ด๋ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ์ ์๊ฒ ์ค๊ณํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์คํ๋ง์ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ค์ํ ํ๋ก์ ํธ๋ฅผ ์ ๊ณตํ๋๋ฐ ๊ทธ ์ค ํ๋๊ฐ ์คํ๋ง ๋ถํธ(Spring Boot)์ด๋ค.
๐ก ์ํฐํ๋ผ์ด์ฆ๊ธ ๊ฐ๋ฐ์ด๋?
๊ธฐ์ ํ๊ฒฝ์ ๋์์ผ๋ก ํ๋ ๊ฐ๋ฐ์ ๋ปํ๋ค. ๋ค์ด๋ฒ๋ ์นด์นด์คํก ๊ฐ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ํ๊ฒฝ์ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์ด๋ผ ํ๋ค.
"์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์ํ ๊ธฐ๋ฐ์ ์ ๊ณตํด์ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ์๋ง ์ง์คํ ์ ์๊ฒ๋ ํ๋ ๊ฒ"
์ผ๋ฐ์ ์ธ ์๋ฐ ๊ฐ๋ฐ์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด ์ด์ฉ ๋ฐฉ์๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ๊ฐ์ฒด์ ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ๋ฅผ ์ธ๋ถ์ ์์ํ๋ค.
'์ธ๋ถ'๋ ์คํ๋ง ์ปจํ
์ด๋(Spring Container) ๋๋ IoC ์ปจํ
์ด๋๋ฅผ ์๋ฏธํ๋ค. ๊ฐ์ฒด์ ๊ด๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ ๋งก๊ฒจ ์ ์ด๊ถ์ด ๋์ด๊ฐ ๊ฒ์ ์ ์ด ์ญ์ ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ ์ด ์ญ์ ์ ํตํด ์์กด์ฑ ์ฃผ์
(DI: Dependency Injection), ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(AOP: Aspect-Oriented Programming) ๋ฑ์ด ๊ฐ๋ฅํด์ง๋ค.
// ์ผ๋ฐ์ ์ธ ์๋ฐ ์ฝ๋์์์ ๊ฐ์ฒด ์ฌ์ฉ๋ฒ
@RestController
public class NoDIController {
private Myservice service = new MyServiceImpl();
@GetMapping("/no-di/hello")
public String getHello() {
return service.getHello();
}
}
@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;
}
@RestController
public class SetterInjectionController{
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
}
๊ฐ๋จํ๊ฒ AOP๋ OOP(๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ)๋ฅผ ๋์ฑ ์ ์ฌ์ฉํ๋๋ก ๋๋ ๊ฐ๋ ์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ์ข๋ค.
OOP ํน์ง
- ์ถ์ํ(abstraction)
- ์บก์ํ(encapsulation)
- ์์(inheritance)
- ๋คํ์ฑ(polycorphism)
AOP๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- ์ปดํ์ผ ๊ณผ์ ์์ ์ฝ์ ํ๋ ๋ฐฉ์
- ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๊ณผ์ ์ ์ฝ์ ํ๋ ๋ฐฉ์
- ํ๋ฝ์ ํจํด์ ์ด์ฉํ ๋ฐฉ์
์คํ๋ง ํ๋ ์์ํฌ์์๋ ๊ฐ๋ฐ์ ํ์ํ ๊ฐ ๋ชจ๋์ ์์กด์ฑ๊ณผ ํธํ๋๋ ๋ฒ์ ์ ๋ช ์ํด์ผ ์ ์ ๋์ํ๋ค. ์คํ๋ง ๋ถํธ์์๋ '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: ์คํ๋ง ํ๋ ์์ํฌ์ ์บ์ ๊ธฐ๋ฅ ์ง์
์คํ๋ง ๋ถํธ์ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ณด๋ฉด @SpringBootApplication์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค. ์ด๋ @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan ์ ํฌํจํ ์ฌ๋ฌ ์ด๋ ธํ ์ด์ ์ ํฉ์ณ๋์ ๊ตฌ์ฑ์ด๋ค.
@Component ์๋ฆฌ์ฆ ์ด๋ ธํ ์ด์
'์๋ฆฌ์ฆ' : @Component๊ฐ ํฌ๊ดํ๋ ์ด๋ ธํ ์ด์ ๋ค์ ํต์นญ
- @Controller
- @RestController
- @Service
- @Repository
- @Configuration
์คํ๋ง ๋ถํธ์๋ ๋ํ์ ์ผ๋ก tomcat์ด ๋ด์ฅ๋์ด ์๋ค. ๋ฐ๋ผ์ ๋ฐ๋ก ์ค์ ํ์ง ์์๋ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด localhost:8080 url๋ก ํ ์คํธ๋ฅผ ์งํํด๋ณผ ์ ์๋ค.