Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240710 Controller를 이해해보자! 본문

개발Article

[TIL]20240710 Controller를 이해해보자!

최밤빵 2024. 7. 12. 02:00

Controller라는걸 이해하기위해서, 그냥 이름그대로 쉽게 생각하면 되겠지 하다가도, 과제를 하면서 GPT를 계속 사용하다보니 코드가 어떻게 생겼는지는 알겠는데 컨트롤러가 하는 일을 나중에 설명할 수 있을까..? 란 생각이 들어서 정리를 하게 됐다. 이렇게 치면 서비스, 레포지토리 등등 많은걸 정리해야 할 것 같지만.. 모르는내용을 잘 흘려버리는 나는 이런 기록이 꼭 필요하기때문에 굳이굳이 컨트롤러 부터 정리를 하기로 했다. 

▶ 컨트롤러(Controller)란? 

→ 스프링에서 컨트롤러는 MVC(Model-View-Controller) 패턴의 중요한 구성 요소 중 하나로, 사용자 요청을 받아 처리하고 응답을 생성하는 역할을 담당한다. 컨트롤러는 애플리케이션의 프레젠테이션 레이어에 해당하고, 요청을 적절한 비즈니스 로직으로 전달하고 처리된 결과를 View로 반환한다. 

 

▶ 컨트롤러의 역할 

 

1. 사용자 요청 처리 : 컨트롤러는 클라이언트(브라우조 또는 REST 클라이언트)로부터 들어오는 HTTP 요청을 수신한다. 각 요청은 URL 경로와 매핑되고, 해당 경로에 맞는 컨트롤러의 메서드가 호출된다. 

2. 비즈니스 로직 수행 요청 : 컨트롤러는 요청을 직접 처리하지 않고, 요청에 맞는 비즈니스 로직을 수행하기 위해 서비스(Service)계층을 호출한다. 이로 인해 컨트롤러는 비즈니스 로직으로 부터 분리되어 유지보수와 테스트가 용이해진다. 

3. 모델 데이터 준비 : 서비스 계층을 통해 가져온 데이터는 Model에 담긴다. 모델은 뷰에 전달 될 데이터를 포함하는 객체로, 컨트롤러는 이 모델을 사용해 뷰에 데이터를 전달한다. 

4. 적절한 View반환 : 컨트롤러는 데이터와 함께 어떤 뷰를 렌더링 할 지 결정한다. 이때, 논리적인 뷰 이름을 반환하면 DispatcherServlet이 ViewResolver를 통해 실제 뷰를 결정하고 렌더링 한다. 

 

▶ 스프링 컨트롤러의 구성 요소 

 

@Controller 어노테이션: 이 어노테이션은 클래스가 컨트롤러임을 명시하고, 해당 클래스가 클라이언트 요청을 처리하도록 스프링에게 알려준다. 

@RequestMapping 어노테이션: 메서드 또는 클래스 레벨에서 사용되고, 특정 URL 패턴과 HTTP 메서드(GET, POST 등)에 대해 요청을 처리할 메서드를 매핑한다. 

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등: HTTP 메서드에 특화된 요청 매핑 어노테이션으로, RESTful API 설계에 자주 사용된다. 

@RequestParam, @PathVariable 어노테이션: 요청 매개변수를 메서드의 매개변수로 바인딩하거나 URL 경로의 변수를 추출할 때 사용된다. 

@RequestBody 어노테이션: 요청 본문을 Java 객체로 변환할 때 사용되고, 주로 JSON 형식의 데이터를 처리하는 데 사용된다. 

 

▶ 예시 표로 컨트롤러 코드 짜보기 

회원 관리 API 표

(강의자료에 있는 예시로 컨트롤러 코드 작성해보기) 

로그인 페이지 GET /user/login login 페이지
로그아웃 처리 GET /user/logout "/" 으로 redirect
회원 가입 페이지 GET /user/signup signup 페이지
회원 가입 처리 POST /user/signup "/" 으로 redirect

→ 회원 관리 기능을 위한 API를 구현하기 위해 Spring Boot의 컨트롤러를 작성하기.

각 API는 적절한 HTTP 메서드와 URL을 사용해서 설계되어있고, 클라이언트가 서버와 상호작용할 수 있도록 되어있다. 주요 기능으로는 로그인, 로그아웃, 회원 가입 페이지 표시 및 회원가입 처리가 있다. 

 

1. 로그인 페이지 (GET /user/login):

로그인 페이지를 표시하기 위한 앤드포인트로, 클라이언트가 이 URL로 접근하면 로그인 화면을 렌더링 한다. 

2. 로그아웃 처리 (GET /user/logout):

사용자가 로그아웃 할 때 호출되는 앤드포인트로, 세션을 무효화 하고 루트("/")페이지로 리다이렉트 한다. 

3. 회원 가입 페이지 (GET /user/signup)

회원 가입 페이지를 렌더링하기 위한 앤드포인트로, 사용자가 접근 시 가입을 위한 양식이 포함된 페이지가 표시된다.

4. 회원 가입 처리 (POST /user/signup):

사용자가 회원 가입 양식을 제출할 때 호출되는 앤드포인트로, 입력된 데이터를 서버에서 처리하고 회원 가입이 완료되면 루트("/")페이지로 리다이렉트 한다. 

→ 이 방식으로 컨트롤러를 구성함으로써 RESTful API의 원칙을 따르고 있고, 추후 기능 추가나 유지보수시에도 이러한 구조를 유지하여 일관된 API설계를 할 수 있을 거다. 

 

▷ 예시코드 : UserController

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

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

    // 로그인 페이지 표시
    @GetMapping("/login")
    public ModelAndView showLoginPage() {
        return new ModelAndView("login");  // "login"은 login.jsp 또는 login.html 뷰 이름을 의미
    }

    // 로그아웃 처리
    @GetMapping("/logout")
    public String logout() {
        // 로그아웃 로직 처리 (예: 세션 무효화)
        return "redirect:/";  // 루트("/")로 리다이렉트
    }

    // 회원 가입 페이지 표시
    @GetMapping("/signup")
    public ModelAndView showSignupPage() {
        return new ModelAndView("signup");  // "signup"은 signup.jsp 또는 signup.html 뷰 이름을 의미
    }

    // 회원 가입 처리
    @PostMapping("/signup")
    public String processSignup() {
        // 회원 가입 로직 처리 (예: 사용자 데이터 저장)
        return "redirect:/";  // 회원 가입 후 루트("/")로 리다이렉트
    }
}

@Controller: Spring MVC에서 이 클래스를 컨트롤러로 사용하겠다는 의미.

@RequestMapping("/user"): 이 클래스 내의 모든 메서드의 URL이 /user로 시작하도록 지정한다. 

@GetMapping과 @PostMapping: 각각 GET 요청과 POST 요청을 처리하는 메서드를 지정한다. 

ModelAndView: 뷰와 모델을 동시에 반환할 수 있는 객체로, 여기서는 특정 페이지를 렌더링하기 위한 논리적 뷰 이름을 반환한다. 

redirect:/: 지정된 URL로 리다이렉트한다. 예를 들어, 로그아웃 후에는 루트("/") 페이지로 리다이렉트한다. 

 

😵‍💫오늘의 회고 

트러블 슈팅을 위해서 과제하다가 막히는 부분들을 스샷부터 찍어야하는데 그걸 자꾸 잊는다. 초반엔 에러자체를 보는법을 몰라서 무조건 사진을 찍어두고 봤는데, 지금은 그러기전에 오류해결하느라 많은 시간을 쏟아놓고도 나중에 개발일지를 쓰면서 아!!!! 그거 쓸걸 하면서 후회만 하고있다. 대부분 내가 중괄호나 대소문자를 구분하지 못해서 생기는 오류가 많고, 그래도 해결하고나서 도파민만 터질게아니라 해결하는걸 기록하면 좋을텐데... ㅠㅠㅠ 이걸 기록해야지 하는것보다 에러 해결하려고 하는 마음이 더 앞서는 것 같다. 이렇게 공부하고 정리하는 것도 좋지만 해결하는 과정을 적었다면 다신 그런 실수를 안 할 수 있을거같은데 왜 자꾸 까먹는지 모르겠네

'개발Article' 카테고리의 다른 글

[TIL]20240712 Entity  (0) 2024.07.12
[TIL]20240711 Dto 사용의 중요성  (0) 2024.07.12
[TIL]20240709 DispatcherServlet..?  (0) 2024.07.11
[TIL]20240708 MVC패턴  (0) 2024.07.09
[WIL]20240707 Spring은 너무 팍팍해...  (0) 2024.07.07