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.
- 사용자가 로그인 버튼 클릭 → /login 요청 발생
- HandlerMapping이 @PostMapping("/login") 메서드 호출
- login() 수행 → MemberDTO로 파라미터 바인딩
- 로그인 성공 시 Board 목록 조회 → model.addAttribute에 저장
- return "main" → VR 적용, JSP 반환
- 로그인 실패 시 return "redirect:index" → 새 GET 요청, 로그인 화면으로 이동
'🍃 Spring' 카테고리의 다른 글
| 애스팩트 설정 : throwing / around (0) | 2026.01.23 |
|---|---|
| 스프링 AOP와 🐌 용어 정리 🐌 그리고 공통 관심사 호출해보기 (0) | 2026.01.23 |
| Controller에 Service가 생기면서 시작되는 2-Layer 아키텍처 정리 (0) | 2026.01.19 |
| Command 객체 생성 방식으로 DAO를 new하면 안 좋은 이유 (0) | 2026.01.19 |
| 왜 Spring Boot는 가벼운가? MVC 구조 변화로 이해하기 (JSP/서블릿 MVC → Spring MVC → Spring Boot) (0) | 2026.01.19 |