🍃 Spring

로그인부터 Board 목록까지의 흐름과 관련된 질문과 답변

보배 진 2026. 1. 22. 09:56

 

https://bobaejin.tistory.com/260

 

로그인부터 Board 목록까지 출력 흐름 정리해보기

index.jsp 로그인 폼에서 시작해서, 사용자가 로그인 버튼을 누를 때 서버에서 어떤 흐름으로 처리되는지 단계별로 정리 사용자 로그인 시작 아이디 비밀번호 ▪ 사용자가 아이디와 비밀번호를 입

bobaejin.tistory.com

위에서 정리한 코드 질문을 만들고 답변을 해보겠습니다

 

 

 

JSP 위치 관련

Q. JSP 페이지를 웹앱 하위에 두었는데 이제 WEB-INF에 두는 이유는 무엇일까요?
A. 사용자가 URL로 직접 접근하지 못하도록 은닉/보호하기 위해서입니다. 이제는 반드시 View Resolver를 통해서만 접근 가능합니다.

 

 

 

JSTL 라이브러리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Q. JSTL 라이브러리를 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>만

작성하면 안 돌아가는 이유는?
A. JSTL 의존성이 없으면 JSP가 JSTL 태그를 해석할 수 없습니다.

따라서 pom.xml에 JSTL 관련 DI(의존성 주입)를 추가해야 합니다.

 

 

 

로그인 폼

<form action="login" method="POST">
    <table border="1">
        <tr>
            <td>아이디</td>
            <td><input type="text" name="mid" required></td>
        </tr>
        <tr>
            <td>비밀번호</td>
            <td><input type="password" name="mpw" required></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="로그인"></td>
        </tr>
    </table>
</form>

Q. 로그인 폼에서 POST를 GET으로 바꾸고 싶다면?
A. Controller의 매핑을 @PostMapping("/login")에서 @GetMapping("/login")으로 변경하면 GET 요청도 처리 가능합니다.

 

Q. 로그인 폼에서 input name을 memberId로 바꿨다면?
A. DTO 필드명도 mid → memberId로 변경해야 정상적으로 데이터가 바인딩됩니다.

  + DTO는 자바 객체이므로 DB 테이블 컬럼과 일치하지 않아도 됩니다.

 

용어:

DTO = Java 타입

VO = 테이블과 유사한 객체

 

 

 

Controller DI

@Controller // <bean id="login" class="com.example.controller.member.LoginController" />
public class TestController {
	
	@Autowired
	private MemberService memberService;
	@Autowired
	private BoardService boardService;
    
    [ 생략 ]

Q.  멤버변수로 service가 추가되면 뭘 해야 하냐

A. 1. DI(의존 주입)을 해야 한다 @Autowired

     2. DI(의존 주입)을 할 객체를 만들어야 한다 @Service

 

 

 

세션 vs 모델

session.setAttribute("이름", 객체);
model.addAttribute("datas", boardService.getBoardList(null));

Q. 둘의 차이는 무엇인가요?
A.

Session: 브라우저 단위 생명주기, 페이지를 이동해도 유지됨 → 로그인 정보, 장바구니 저장에 적합

Model: 요청 단위 생명주기, 다음 페이지로만 전달 → 검색 결과, 일회성 데이터 적합

 

 

 

 

return "VR" vs redirect

 return "index";
 retirn "redirect:index"

Q. 두 코드의 차이는 무엇인가요?

 

A. VR의 개입이 있느냐 없느냐의 차이인데

return "index"; → View Resolver(VR)를 거쳐 JSP 반환

return "redirect:index"; → 새로운 GET 요청을 발생시킴, 클라이언트 URL이 바뀜

 

 

 

어노테이션 역할

new 역할을 하는 어노테이션에 대해 말해보세요

@Component 

@Controller → Controller 역할 (사용자 요청 처리)

@Service → Service 역할 (비즈니스 로직)

@Repository → DAO 역할 (DB 접근)

 

 

Controller 로그인 흐름

package com.example.demo;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
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.RequestParam;

import com.example.biz.board.BoardDTO;
import com.example.biz.board.BoardService;
import com.example.biz.member.MemberDTO;
import com.example.biz.member.MemberService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;

@Controller // <bean id="login" class="com.example.controller.member.LoginController" />
public class TestController {
	
	@Autowired
	private MemberService memberService;
	@Autowired
	private BoardService boardService;
	
	@GetMapping("/index") // HM
	public String test() {
		 System.out.println("로그인 화면");
		return "index"; // /WEB-INF/views/ + index + .jsp => VR
	}
	
	@PostMapping("/login") // POST 방식으로 /login 요청이 오면 실행
	public String login(MemberDTO memberDTO, Model model) {
		System.out.println("[로그] TestController의 login 시작");
		
        if(memberService.getMember(memberDTO) != null) {
			// 로그인 성공 → board 목록 가져오기
    		System.out.println("[로그] login 성공");
            
            model.addAttribute("datas", boardService.getBoardList(null));
            System.out.println("[로그] login 끝");
            return "main";
		}
        return "redirect:index"; // ==> 새로운 GET 요청
	}
}
@PostMapping("/login")
public String login(MemberDTO memberDTO, Model model) {
    if(memberService.getMember(memberDTO) != null) {
        model.addAttribute("datas", boardService.getBoardList(null));
        return "main";
    }
    return "redirect:index";
}

 

Q. 로그인 버튼을 눌렀을 때 서버 동작 순서
A.

  1. 사용자가 로그인 버튼 클릭 → /login 요청 발생
  2. HandlerMapping이 @PostMapping("/login") 메서드 호출
  3. login() 수행 → MemberDTO로 파라미터 바인딩
  4. 로그인 성공 시 Board 목록 조회 → model.addAttribute에 저장
  5. return "main" → VR 적용, JSP 반환
  6. 로그인 실패 시 return "redirect:index" → 새 GET 요청, 로그인 화면으로 이동