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