Skip to main content

02I. ์„œ๋น„์Šค

Less than 1 minuteJavaSpringAWScrashcoursejavajdkjdk8streamspringspringframeworkspringbootawsaws-ec2

02I. ์„œ๋น„์Šค ๊ด€๋ จ


2-09. ์„œ๋น„์Šค

์ ํ”„ ํˆฌ ์Šคํ”„๋ง๋ถ€ํŠธ - WikiDocs

pahkey/sbb3 - 2-09open in new window

์ด์ „ ์žฅ์—์„œ ์งˆ๋ฌธ ๋ชฉ๋ก์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด์ œ ์งˆ๋ฌธ ๋ชฉ๋ก์˜ ์ œ๋ชฉ ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์งˆ๋ฌธ ์ƒ์„ธ ํ™”๋ฉด์ด ๋ณด์ด๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์ž ์‹œ ์ƒ๊ฐํ•  ๊ฒƒ์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” QuestionController์—์„œ QuestionRepository๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ์งˆ๋ฌธ ๋ชฉ๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ทœ๋ชจ์žˆ๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ฐ„์— ์„œ๋น„์Šค(Service)๋ฅผ ๋‘์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์„œ๋น„์Šค๋Š” ์Šคํ”„๋ง์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.


์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

๋ชจ๋“ˆํ™”

์˜ˆ๋ฅผ๋“ค์–ด ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œํ›„ ๊ฐ€๊ณตํ•˜์—ฌ ๋ฆฌํ„ดํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์„œ๋น„์Šค๋กœ ๋งŒ๋“ค์–ด ๋‘๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ตฌํ˜„ํ•˜๋ ค ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ค‘๋ณต์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์„œ๋น„์Šค๋Š” ๋ชจ๋“ˆํ™”๋ฅผ ์œ„ํ•ด์„œ ํ•„์š”ํ•˜๋‹ค.

๋ณด์•ˆ

์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ ์—†์ด ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ณด์•ˆ์ƒ ์•ˆ์ „ํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋–ค ํ•ด์ปค๊ฐ€ ํ•ดํ‚น์„ ํ†ตํ•ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋”๋ผ๋„ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†๊ฒŒ ๋œ๋‹ค.

์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์™€ DTO ๊ฐ์ฒด์˜ ๋ณ€ํ™˜

์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ Question, Answer ํด๋ž˜์Šค๋Š” ์—”ํ‹ฐํ‹ฐ(Entity) ํด๋ž˜์Šค์ด๋‹ค. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ๋งž๋‹ฟ์•„ ์žˆ๋Š” ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ํƒ€์ž„๋ฆฌํ”„ ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์— ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ํƒ€์ž„๋ฆฌํ”„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋Š” ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์š”๊ตฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์ด ๋ณ€๊ฒฝ๋˜์–ด ์—‰๋ง์ด ๋ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Question, Answer ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‚ฌ์šฉํ• ์ˆ˜ ์—†๊ฒŒ๋” ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” Question, Answer ๋Œ€์‹  ์‚ฌ์šฉํ•  DTO(Data Transfer Object) ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  Question, Answer ๋“ฑ์˜ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ DTO ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…๋„ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ DTO ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ์€ ์–ด๋””์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ? ๊ทธ๋ ‡๋‹ค. ๋ฐ”๋กœ ์„œ๋น„์Šค์ด๋‹ค. ์„œ๋น„์Šค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์˜ ์ค‘๊ฐ„์ž์ ์ธ ์ž…์žฅ์—์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์™€ DTO ๊ฐ์ฒด๋ฅผ ์„œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์–‘๋ฐฉํ–ฅ์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


QuestionService

๋‹ค์Œ๊ณผ ๊ฐ™์ด QuestionService๋ฅผ ์ž‘์„ฑํ•˜์ž.

ํŒŒ์ผ๋ช…: /sbb/src/main/java/com/mysite/sbb/question/QuestionService.java

package com.mysite.sbb.question;

import java.util.List;

import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service
public class QuestionService {

    private final QuestionRepository questionRepository;

    public List<Question> getList() {
        return this.questionRepository.findAll();
    }
}

์Šคํ”„๋ง์˜ ์„œ๋น„์Šค๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ํด๋ž˜์Šค๋ช… ์œ„์— @Service ์• ๋„ˆํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด ๋œ๋‹ค. @Controller, @Entity ๋“ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” @Service ์• ๋„ˆํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋Š” ์„œ๋น„์Šค๋กœ ์ธ์‹ํ•œ๋‹ค.

questionRepository ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ๋ฐฉ์‹์œผ๋กœ DI ๊ทœ์น™์— ์˜ํ•ด ์ฃผ์ž…๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์งˆ๋ฌธ ๋ชฉ๋ก์„ ์กฐํšŒํ•˜์—ฌ ๋ฆฌํ„ดํ•˜๋Š” getList ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ด์ „ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๋ถ€๋ถ„์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธด ๊ฒƒ์ด๋‹ค.

QuestionController

๊ทธ๋ฆฌ๊ณ  QuestionController๋Š” ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ ๋Œ€์‹  ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•˜์ž.

ํŒŒ์ผ๋ช…: /sbb/src/main/java/com/mysite/sbb/question/QuestionController.java

// (... ์ƒ๋žต ...)
public class QuestionController {

    private final QuestionService questionService;

    @GetMapping("/question/list")
    public String list(Model model) {
        List<Question> questionList = this.questionService.getList();
        model.addAttribute("questionList", questionList);
        return "question_list";
    }
}



ย 



ย 




questionService ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ๋ฐฉ์‹์œผ๋กœ DI ๊ทœ์น™์— ์˜ํ•ด ์ฃผ์ž…๋œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋กœ http://localhost:8080/question/list ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋ฉด ์ด์ „๊ณผ ๋™์ผํ•œ ํ™”๋ฉด์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ์•ž์œผ๋กœ ์ž‘์„ฑํ•  ์ปจํŠธ๋กค๋Ÿฌ๋“ค๋„ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Controller -> Service -> Repository ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.


์ด์ฐฌํฌ (MarkiiimarK)
Never Stop Learning.