์Šคํ”„๋ง

์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋Š” MVC ํŒจํ„ด ์ด์ •๋ฆฌ (RequestMapping, addAttribute)

JANNNNNN 2024. 4. 2. 13:47

๐ŸคจMVCํŒจํ„ด์ด๋ž€?

MVC(Mode-View-Controller)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค!

Controller (์ปจํŠธ๋กค๋Ÿฌ):

  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘๊ฐ„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ์˜ค๋ฉด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Controller๊ฐ€ ์ด๋ฅผ ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค. Controller๋Š” ์š”์ฒญ์„ ๋ถ„์„ํ•˜๊ณ , ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Service๋‚˜ Repository ๋“ฑ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ„์™€๊ฐ™์ด ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ๋ทฐ๋กœ ๋ณด๋‚ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@RequestMapping

  • Spring MVC์—์„œ ํŠน์ • URL์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋ฉ”์†Œ๋“œ์— ๋ถ€์—ฌํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
  • ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ฃผ๋กœ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, URL ํŒจํ„ด์ด๋‚˜ HTTP ์š”์ฒญ ๋ฉ”์†Œ๋“œ(get,post,delete ...) ๋“ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

model.addAttribute()

  • Spring MVC์—์„œ ์ปจํŠธ๋กค๋Ÿฌ(Controller)์—์„œ ๋ทฐ(View)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์ด ์†์„ฑ์€ ๋ทฐ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ฃผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•  ์ •๋ณด๋ฅผ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Service

  • Controller์—์„œ Service๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ  Controller๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Service๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • Service๋Š” ํ•ด๋‹น ์š”์ฒญ์— ํ•„์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Repository์™€ ํ˜‘๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Repository

  • Service๋Š” Repository๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
  • Repository๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ถ”์ƒํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • JPA๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— JPA๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โฉRepository๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•œ ํ›„, Service๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, Controller์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Controller๋Š” ์ด๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ตํ•˜์—ฌ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Model (๋ชจ๋ธ):

  • ๋ชจ๋ธ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

View (๋ทฐ):

  • ๋ทฐ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • HTML, CSS, JavaScript ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๋ชจ๋ธ์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ˜’MVCํŒจํ„ด์„ ์™œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋‚˜์š”?

1. ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” MVCํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•ด์ ธ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2. ๋˜ํ•œ, ๊ฐ ๋ถ€๋ถ„์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

3. ๊ฐ ๋ถ€๋ถ„์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ํ…Œ์ŠคํŠธ ํ•  ๋•Œ์—๋„ ๋ถ„๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

4. ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๋™์‹œ์— ํ˜‘์—…ํ•ด ๊ฐœ๋ฐœํ•˜๊ธฐ์— ์ข‹์Šต๋‹ˆ๋‹ค.


์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ๊นŒ์š”?

1. Model

public class User {
    private Long id;
    private String username;
    private String email;
    // ๊ธฐํƒ€ ํ•„์š”ํ•œ ์†์„ฑ๋“ค...

    // ์ƒ์„ฑ์ž, getter, setter ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋Š” ์ƒ๋žตํ•˜์˜€์Šต๋‹ˆ๋‹ค.
}

2. Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/profile")
    public String showUserProfile(Model model) {
        // ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
        User user = userService.getUserProfile();
        // View๋กœ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ ์„ค์ •
        model.addAttribute("user", user);
        // View ์ด๋ฆ„ ๋ฐ˜ํ™˜
        return "userProfilePage";
    }
}

(Model model)์„ ์“ฐ๋Š” ์ด์œ 

โฉController ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Model model์„ ์„ ์–ธํ•˜๋ฉด, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ž๋™์œผ๋กœ Model ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด Model ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ทฐ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, Model model์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ Model์— ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋ฅผ ๋ทฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2-1. Service

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User getUserProfile() {
        // ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒ
        return userRepository.findById(1L).orElse(null);
    }
}

2-2. Repository

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // ์ถ”๊ฐ€์ ์ธ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
}

 

3. View(userProfilePage.jsp) - Thymeleaf

<!DOCTYPE html>
<html>
<head>
    <title>User Profile</title>
</head>
<body>
    <h1>User Profile</h1>
    <p>User ID: ${user.id}</p>
    <p>Username: ${user.username}</p>
    <p>Email: ${user.email}</p>
</body>
</html>

model.attribute๋กœ user๋ฅผ view์— ์ „๋‹ฌํ•œ ๋•๋ถ„์— user.id, username, email๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ!