6. Spring 게시판 무작정 따라하기

db 에서 조회된 자료는 주로 model 을 사용하여 접근하게 된다. 이때 model, request 와 session 의 차이는 무엇일까
HootJem's avatar
Aug 19, 2024
6. Spring 게시판 무작정 따라하기
💡
Spring 에서의 요청 처리 흐름과 h2(Database) 에서 요청한 데이터를 화면에 뿌리는 것 까지.

1. DispatcherServlet의 역할

Spring에서 클라이언트로부터 요청이 들어오면, Apache나 Tomcat 같은 웹 서버가 이를 먼저 처리한다. 이 요청은 DispatcherServlet으로 전달된다. DispatcherServlet은 Spring 애플리케이션의 중앙 제어 지점으로, 어떤 컨트롤러가 이 요청을 처리해야 할지 결정한다.
@GetMapping("/board") public String list(HttpServletRequest request) { System.out.println(request.getRemoteAddr()); // 클라이언트의 IP 주소 출력 System.out.println(request.getRequestURI()); // 요청된 URI 출력 return "board/list"; }
이 코드는 /board 경로로 들어온 요청을 처리하는 간단한 컨트롤러. 여기서 HttpServletRequest 객체를 사용하여 클라이언트의 IP 주소와 요청 URI를 출력할 수 있다.
 

2. 컨트롤러, 레포지토리, 엔티티 매니저의 연계

컨트롤러는 클라이언트의 요청을 받아 비즈니스 로직을 처리하고, 데이터베이스와 상호작용하여 필요한 데이터를 가져온다. Spring에서 데이터베이스와의 상호작용은 주로 레포지토리(Repository)와 엔티티 매니저(Entity Manager)를 통해 이루어진다.
@GetMapping("/board") public String list(Model model) { List<Board> boardList = boardRepository.findAll(); model.addAttribute("models", boardList); return "board/list"; }
위의 코드에서 boardRepository.findAll()을 통해 데이터베이스에서 게시판의 모든 항목을 가져온다. 그 후, model 객체에 데이터를 추가하여 뷰에 전달한다. Model 객체는 사실상 request 객체와 같은 역할을 하며, 데이터를 담아 뷰에 전달하는 데 사용된다.
 

3. Mustache 템플릿 엔진을 통한 화면 출력

Mustache은 템플릿 엔진으로 request 객체에 저장된 데이터를 화면에 출력하는 데 사용된다.
  • List.mustache (원본)
{{>layout/header}} <div class="container p-5"> <div class="card mb-3"> <div class="card-body"> <h4 class="card-title mb-3">제목1</h4> <a href="/board/1" class="btn btn-primary">상세보기</a> </div> </div> </div> {{>layout/footer}}
  • 변경
{{>layout/header}} <div class="container p-5"> {{#models}} <div class="card mb-3"> <div class="card-body"> <h4 class="card-title mb-3">{{title}}</h4> <a href="/board/{{id}}" class="btn btn-primary">상세보기</a> </div> </div> {{/models}} </div> {{>layout/footer}}
위의 Mustache 템플릿은 models 리스트에 있는 각 게시판 항목의 제목과 링크를 동적으로 생성하여 화면에 출력한다.

4. Session과 Request의 차이

  • Request: request 객체는 클라이언트의 요청이 있을 때마다 새로 생성되며, 요청이 끝나면 사라지는 데이터들을 담는다. 예를 들어, 한 번의 요청-응답 사이클에서만 필요한 데이터를 request 객체에 저장한다. (stateless 한 서버.)
  • Session: session 객체는 클라이언트가 브라우저를 닫기 전까지 또는 명시적으로 로그아웃할 때까지 유지된다. 로그인 정보와 같이 여러 요청에 걸쳐 유지되어야 하는 데이터를 저장하는 데 사용된다. (statePull 한 서버.)
 
// 리퀘스트를 사용한 세션 접근 @GetMapping("/board") public String list(HttpServletRequest request) { HttpSession session = request.getSession(); return "board/list"; } // 바로 접근 하는 것도 가능 @GetMapping("/board") public String list(HttpSession session) { return "board/list"; }
이 코드는 HttpServletRequest 객체를 통해 세션에 접근하는 예제로, 세션은 서버 쪽에 데이터를 저장하여 클라이언트의 상태를 유지할 수 있도록 한다.

5. Mustache의 Request와 Session 접근 설정

Mustache는 기본적으로 requestsession 객체에 접근할 수 없도록 설정되어 있다. 이를 활성화하려면 아래와 같은 설정이 필요하다.
spring.mustache.servlet.expose-request-attributes=true spring.mustache.servlet.expose-session-attributes=true
 
리스트 조회 완료 굿👍
리스트 조회 완료 굿👍

정리

  • Model과 Request 객체 화면을 그릴 때, 동적 요소를 채워 넣기 위해 request 객체에 저장된 model에 접근한다. 이때, Model 객체와 request에 직접 접근하는 것은 같은 결과를 가져온다. Model은 사실상 request 객체와 비슷한 역할을 하며, 데이터를 전달하는 데 사용된다.
  • Session과 Request의 차이: sessionrequest의 가장 큰 차이는 데이터의 유지 시간.
    • request 객체는 일회성 요청에 사용된다. 예를 들어, 요청-응답 사이클이 끝나면 더 이상 저장할 필요가 없는 데이터는 request 객체에 담는다.
    • session 객체는 클라이언트의 상태를 유지하기 위해 사용되며, 브라우저를 닫기 전까지 또는 명시적으로 세션이 종료될 때까지 데이터를 유지한다. 예를 들어, 로그인 정보처럼 여러 요청에 걸쳐 필요한 데이터는 session에 저장한다.
  • Session과 HttpServletRequest:
    • session은 큰 서랍장의 서랍과 같다. 필요한 데이터를 IoC 컨테이너에 넣어두고, 필요할 때마다 꺼내서 사용할 수 있어 편리하다.
    • HttpServletRequest는 일시적으로 사용하는 가방과 같다. 이 객체는 싱글톤이 아니기 때문에, 각 요청마다 새로 생성되며, IoC 컨테이너에 넣을 수 없다.
  • Model 객체의 이해: Model은 기본적으로 request 객체와 같은 역할을 한다. 이는 데이터를 전달하여 뷰에 표시하는 데 사용되며, 두 객체 간의 결과는 동일하다.
 

Share article

[HootJem] 개발 기록 블로그