4 min read

[Spring ๊ณต๋ถ€] ๊น€์˜ํ•œ๋‹˜์˜ ์ž…๋ฌธ ๊ฐ•์˜ - 2

Table of Contents

Spring Boot๋ฅผ ์ฒ˜์Œ ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด์„œ ์ž‘์„ฑํ•œ ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ค๊ฐœ๋… ๋ฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋ฐœ๊ฒฌํ•˜์‹ ๋‹ค๋ฉด ๊ฐ€๊ฐ์—†์ด ๋Œ“๊ธ€์„ ํ†ตํ•ด์„œ ์•Œ๋ ค์ฃผ์„ธ์š”! ํ™•์ธํ•˜๋Š” ๋Œ€๋กœ ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด์„œ ๊ณ ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

์ด๋ฒˆ Spring Boot ์Šคํ„ฐ๋””๋Š” ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ์˜ ๊น€์˜ํ•œ๋‹˜๊ป˜์„œ ์ธํ”„๋Ÿฐ์— ์˜ฌ๋ ค์ฃผ์‹œ๋Š” ์ž๋ฐ” ์Šคํ”„๋ง ์™„์ „ ์ •๋ณต ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. ๊ทธ ์‹œ๋ฆฌ์ฆˆ์˜ ๊ฐ€์žฅ ์ฒซ ๊ฐ•์˜์ธ ์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ๋“ค์–ด๋ณด๊ณ  ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

ํ•ด๋‹น ๊ฐ•์˜๋Š” ๋‚ด๊ฐ€ ๋А๋ผ๊ธฐ์— ํฌ๊ฒŒ ๋‹ค์Œ์˜ ์ปจํ…์ธ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.

  • Spring ๊ธฐ์ดˆ ๊ธฐ๋Šฅ ์จ๋ณด๊ธฐ
  • Spring Bean๊ณผ ์˜์กด ๊ด€๊ณ„
  • ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ ๊ตฌํ˜„ํ•˜๊ธฐ
    • Controller - Service - Repository ํŒจํ„ด ์ ์šฉ
    • Spring MVC ์ ์šฉ
  • ์œ„์˜ ์˜ˆ์ œ์— ๋‹ค์–‘ํ•œ DB ์ ‘๊ทผ ๊ธฐ์ˆ  ์ ์šฉ
    • JDBC
    • JDBC Template
    • JPA
    • Spring Data JPA
  • ์œ„์˜ ์˜ˆ์ œ์— ๊ฐ„๋‹จํ•œ AOP ์ ์šฉ

์ด ํฌ์ŠคํŠธ์—์„œ๋Š” ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ ๊ตฌํ˜„ํ•˜๊ธฐ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

Spring Bean๊ณผ ์˜์กด ๊ด€๊ณ„

Spring Bean

Spring Bean์€ Spring IoC ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ Spring Bean์„ ๋งŒ๋“ค๋ฉด ๊ทธ๊ฒƒ์„ Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•ด์ฃผ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ํ•„์š”๋กœ ํ•  ๋•Œ ์ง์ ‘ new ํ‚ค์›Œ๋“œ๋กœ ๋งŒ๋“ค์–ด์„œ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Spring์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด SampleController ๋ผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ SampleService ๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด Spring์—์„œ๋Š” SampleController ์—์„œ new SampleService(); ๋ฅผ ํ†ตํ•ด ์ง์ ‘ SampleService ๋ฅผ ๋งŒ๋“ค์–ด ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

@Controller
public class SampleController {
    private final SampleService sampleService;

    @Autowired
    public SampleController(SampleService sampleService) {
        this.sampleService = sampleService;
    }
}

๋ณด๋ฉด, SampleService ๋ฅผ ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์•„์„œ ๊ทธ๊ฒƒ์„ ์ธ์Šคํ„ด์Šค์— ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ € SampleService ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜(์ด๋ฅผ ํ…Œ๋ฉด main ํ•จ์ˆ˜)๋Š” ์–ด๋”” ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ๋‹ค. ๋†€๋ž๊ฒŒ๋„, ํ•„์š”๊ฐ€ ์—†๋‹ค! ์ƒ์„ฑ์ž ์œ„์— @Autowired ๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ๋‘๋ฉด Spring์ด ๊ตฌ๋™๋˜๋ฉด์„œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„์„œ ๋„ฃ์–ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์„ DI(Dependency Injection), ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์„œ ๋„ฃ์–ด์ค€๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹น์—ฐํžˆ Spring ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ์ฒด๊ฐ€ ๋“ฑ๋ก์ด ๋˜์–ด์žˆ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ, ์ฃผ์ž…๋ฐ›๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ Spring Bean์ด์–ด์•ผ ํ•œ๋‹ค. ์ด Spring Bean์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์—” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด ๊ด€๊ณ„ ์„ค์ •
  • SpringConfig๋กœ ์ง์ ‘ ๋“ฑ๋ก

ํ•˜๋‚˜์”ฉ ๊ฐ„๋žตํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด ๊ด€๊ณ„ ์„ค์ •

Spring์ด ๊ตฌ๋™๋  ๋•Œ, ์ปดํฌ๋„ŒํŠธ๋ผ๋Š” ๊ฒƒ๋“ค์„ ์ฐพ์œผ๋ฉด์„œ ์ด๊ฒƒ๋“ค์„ Spring Bean์œผ๋กœ ์ž๋™ ๋“ฑ๋กํ•œ๋‹ค. ์ฆ‰, Spring Bean์œผ๋กœ ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ฒƒ์ด ์ปดํฌ๋„ŒํŠธ๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•ด๋‘๋ฉด ๋œ๋‹ค.

๋ช…์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ฃผ ๊ฐ„๋‹จํ•œ๋ฐ, ๊ทธ๋ƒฅ ํด๋ž˜์Šค ์•ž์— @Component ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด ๋œ๋‹ค. @Controller ๊ฐ€ ์ž๋™์œผ๋กœ Spring Bean์œผ๋กœ ๋“ฑ๋ก๋˜๋Š” ์ด์œ ๋„, @Controller ๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์— @Component ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

@Controller , @Service , @Repository ์ด 3๊ฐœ์˜ ์–ด๋…ธํ…Œ์ด์…˜์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์—๋Š” ๋ชจ๋‘ @Component ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ € ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด ์žˆ์œผ๋ฉด ์ž๋™์œผ๋กœ Spring Bean์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.

์ฐธ๊ณ ๋กœ, Spring์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์— Spring Bean์„ ๋“ฑ๋กํ•  ๋•Œ, ๊ธฐ๋ณธ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•ด์„œ ๋Œ๋ ค์“ด๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ Spring Bean์ด๋ฉด ๋ชจ๋‘ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์ด๋‹ค. ์„ค์ •์„ ํ†ตํ•ด์„œ ์‹ฑ๊ธ€ํ†ค์ด ์•„๋‹ˆ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ •๋ง ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

SpringConfig๋กœ ์ง์ ‘ ๋“ฑ๋ก

<์ด๋ฆ„>SpringBootApplication ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ์— SpringConfig ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด, ์Šคํ”„๋ง์ด ๊ตฌ๋™๋  ๋•Œ ์ด ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•˜์—ฌ ์„ค์ •์„ ์ ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด SampleService ๋ฅผ Spring Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ์œผ๋ฉด, SpringConfig ํด๋ž˜์Šค์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

@Configuration
public class SpringConfig {
    @Bean
    public SampleService sampleService() {
        return new SampleService();
    }
}

๋ญ˜ ์จ์•ผ๋˜์ง€?

์œ„์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘, ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์€ ๋ฐฉ์•ˆ์ธ์ง€ ๊ณ ๋ฏผ์ด ๋“ค์—ˆ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” ์ฃผ๋กœ ์ •ํ˜•ํ™”๋œ, ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ œ๊ณต๋˜๋Š” Controller, Service, Repository์—๋Š” ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •ํ˜•ํ™” ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์œ ์ง€ํ•˜๊ณ  ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—๋Š” ์„ค์ •์„ ํ†ตํ•ด์„œ ์ง์ ‘ Spring Bean์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ํŽธ์ด ํด๋ž˜์Šค๋“ค์— ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์˜€๋‹ค ๋–ผ์—ˆ๋‹ค ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋‹ค์Œ์€

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“  ๊ฐ•์˜ ๋‚ด์šฉ์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋.