6. Spring 게시판 무작정 따라하기
db 에서 조회된 자료는 주로 model 을 사용하여 접근하게 된다.
이때 model, request 와 session 의 차이는 무엇일까
Aug 19, 2024
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는 기본적으로
request
와 session
객체에 접근할 수 없도록 설정되어 있다.
이를 활성화하려면 아래와 같은 설정이 필요하다.
spring.mustache.servlet.expose-request-attributes=true
spring.mustache.servlet.expose-session-attributes=true

정리
- Model과 Request 객체
화면을 그릴 때, 동적 요소를 채워 넣기 위해
request
객체에 저장된model
에 접근한다. 이때,Model
객체와request
에 직접 접근하는 것은 같은 결과를 가져온다.Model
은 사실상request
객체와 비슷한 역할을 하며, 데이터를 전달하는 데 사용된다.
- Session과 Request의 차이:
session
과request
의 가장 큰 차이는 데이터의 유지 시간. request
객체는 일회성 요청에 사용된다. 예를 들어, 요청-응답 사이클이 끝나면 더 이상 저장할 필요가 없는 데이터는request
객체에 담는다.session
객체는 클라이언트의 상태를 유지하기 위해 사용되며, 브라우저를 닫기 전까지 또는 명시적으로 세션이 종료될 때까지 데이터를 유지한다. 예를 들어, 로그인 정보처럼 여러 요청에 걸쳐 필요한 데이터는session
에 저장한다.
- Session과 HttpServletRequest:
session
은 큰 서랍장의 서랍과 같다. 필요한 데이터를 IoC 컨테이너에 넣어두고, 필요할 때마다 꺼내서 사용할 수 있어 편리하다.HttpServletRequest
는 일시적으로 사용하는 가방과 같다. 이 객체는 싱글톤이 아니기 때문에, 각 요청마다 새로 생성되며, IoC 컨테이너에 넣을 수 없다.
- Model 객체의 이해:
Model
은 기본적으로request
객체와 같은 역할을 한다. 이는 데이터를 전달하여 뷰에 표시하는 데 사용되며, 두 객체 간의 결과는 동일하다.
스프링부트 게시판 시리즈 v1 - 1. https://inblog.ai/hj/1-spring-게시판-무작정-따라하기-26526 - 2. https://inblog.ai/hj/2-spring-게시판-무작정-따라하기-26560 - 3. https://inblog.ai/hj/3-spring-게시판-무작정-따라하기-26757 - 4. https://inblog.ai/hj/4-spring-게시판-무작정-따라하기-26758 - 5. https://inblog.ai/hj/5-spring-게시판-무작정-따라하기-26934 - 6. https://inblog.ai/hj/6-spring-게시판-무작정-따라하기-26937 - 7. https://inblog.ai/hj/7-spring-게시판-무작정-따라하기-26940 - 8. https://inblog.ai/hj/8-spring-게시판-무작정-따라하기-27065 - 9. https://inblog.ai/hj/9-spring-게시판-무작정-따라하기끝-27066
Share article