๐ŸƒSpring? Spring boot? ๋‚ด๊ฐ€ ์•„๋Š” ์Šคํ”„๋ง์€ ๋ด„๋ฟ์ธ๋ฐ..

์†์ •๋ฏผยท2024๋…„ 1์›” 19์ผ

์Šคํ”„๋ง์ด๋ž€?

java๊ธฐ๋ฐ˜์˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๋ณด์•ˆ(๋กœ๊ทธ์ธ๊ด€๋ จ), REST API ๊ฐœ๋ฐœ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์„ ์ด์šฉํ•ด ์ œ๊ณตํ•œ๋‹ค.
๋ž˜ํผ๋Ÿฐ์Šค ๊ฐ์ฒด ์—†์ด๋Š” ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์Šคํ”„๋ง์€ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์Šคํ”„๋ง ๋ถ€ํŠธ(Spring Boot)์ด๋‹ค.

๐Ÿ’ก ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๊ฐœ๋ฐœ์ด๋ž€?
๊ธฐ์—… ํ™˜๊ฒฝ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฐœ๋ฐœ์„ ๋œปํ•œ๋‹ค. ๋„ค์ด๋ฒ„๋‚˜ ์นด์นด์˜คํ†ก ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ™˜๊ฒฝ์„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์ด๋ผ ํ•œ๋‹ค.

ํ•ต์‹ฌ ๊ฐ€์น˜

"์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜๋Š” ๊ฒƒ"

์ œ์–ด ์—ญ์ „(IoC)

์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด ์ด์šฉ ๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ์™ธ๋ถ€์— ์œ„์ž„ํ•œ๋‹ค.
'์™ธ๋ถ€'๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ(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();
    }
}

์˜์กด์„ฑ ์ฃผ์ž…(DI)

  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…(๊ถŒ์žฅ)
@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)

๊ฐ„๋‹จํ•˜๊ฒŒ AOP๋Š” OOP(๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ฅผ ๋”์šฑ ์ž˜ ์‚ฌ์šฉํ•˜๋„๋ก ๋•๋Š” ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

OOP ํŠน์ง•

  • ์ถ”์ƒํ™”(abstraction)
  • ์บก์Аํ™”(encapsulation)
  • ์ƒ์†(inheritance)
  • ๋‹คํ˜•์„ฑ(polycorphism)

AOP๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹
  • ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋Š” ๊ณผ์ •์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹
  • ํ”„๋ฝ์‹œ ํŒจํ„ด์„ ์ด์šฉํ•œ ๋ฐฉ์‹

๊ทธ๋ž˜์„œ Spring Boot๋Š” ๋ญํ•˜๋Š” ์•ค๋ฐ..

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ฐ ๋ชจ๋“ˆ์˜ ์˜์กด์„ฑ๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฒ„์ „์„ ๋ช…์‹œํ•ด์•ผ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” '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

๋‚ด์žฅ WAS(Web Application Server)


์Šคํ”„๋ง ๋ถ€ํŠธ์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ tomcat์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด localhost:8080 url๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

profile
์ฝ”๋ฆฐ์ด์˜ ์„ฑ์žฅ๊ต์‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€