Dev Study 24

[Java & SpringBoot] Spring REST API설계 방법 - ResponseEntity build하기

Spring MVC에서 REST API로 전환할 때 가장 먼저 마주치는 질문은 단순하다. "뷰 이름 대신 뭘 반환하지?" 이 글은 ResponseEntity와 REST 설계 원칙을 중심으로, 컨트롤러 코드가 어떻게 달라지는지 직접 확인한다. REST가 아닌 기존 MVC 컨트롤러전통적인 Spring MVC 컨트롤러는 서버가 화면까지 만들어서 보내주는 방식이다.// 기존 MVC 방식@Controllerpublic class ArticleController { @GetMapping("/articles") public String list(Model model) { model.addAttribute("articles", articleService.getAll()); retur..

Dev Study/Backend 2026.05.31

[Java & SpringBoot] Spring Boot + MyBatis 동작 원리 — @MapperScan과 namespace가 연결되는 방법

Spring Boot와 MyBatis를 연동할 때, DAO 인터페이스에는 구현체가 없는데도 메서드를 호출하면 SQL이 실행된다. 이 글에서는 그 연결이 언제, 어떻게 체결되는지를 설정 파일부터 요청 흐름까지 끝까지 추적한다. 구현체도 없는 인터페이스가 왜 동작하는가JDBC로 게시글 목록을 가져오는 코드를 먼저 보자.Connection conn = DriverManager.getConnection(url, user, pw);PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM post");ResultSet rs = pstmt.executeQuery();List list = new ArrayList();while (rs.next()) { Pos..

Dev Study/Backend 2026.05.25

[Java & SpringBoot] DispatcherServlet의 ViewResolver 체인 — BeanNameViewResolver로 커스텀 View 처리하기

Spring MVC에서 DispatcherServlet과 ViewResolver가 어떻게 View를 결정하는지 이해하면, JSP 렌더링을 넘어 바이너리 응답까지 자유롭게 제어할 수 있다. 이 글에서는 BeanNameViewResolver와 커스텀 AbstractView 구현을 통해 그 흐름을 끝까지 따라가본다. 평범해 보이는 리턴값, 그 뒤에서 무슨 일이 벌어지는가Spring MVC 컨트롤러를 처음 배울 때 가장 당연하게 받아들이는 패턴이 있다.@GetMapping("/upload")public String uploadForm() { return "uploadForm"; // 그냥 JSP 이름이겠지?}리턴한 문자열이 JSP 파일 이름으로 연결된다는 건 알겠다. 그런데 이런 코드를 보면 어떻게 생각하..

Dev Study/Backend 2026.05.25

[Java & SpringBoot] Filter vs Interceptor 요청 흐름 위치 차이와 로그인 인터셉터 실전 구현

컨트롤러마다 로그인 확인 코드를 붙이던 시절Spring Filter와 Interceptor를 이해하면 컨트롤러에서 반복되는 인증 코드를 제거할 수 있다. 요청이 컨트롤러에 닿기 전에 가로채서 처리하는 두 가지 메커니즘의 차이와 실전 활용법을 정리한다.로그인이 필요한 페이지가 늘어날수록 아래 코드가 컨트롤러마다 반복된다.@GetMapping("/mypage")public String mypage(HttpSession session) { if (session.getAttribute("loginUser") == null) { return "redirect:/login"; } return "mypage";}@GetMapping("/orders")public String orders(..

Dev Study/Backend 2026.05.24

[Java & SpringBoot] Spring Boot Auto-configuration — web.xml이 사라지고 빈 160개 이상 빈 자동 등록

설정 파일이 세 개였던 시절Spring MVC로 웹 애플리케이션을 만들려면 최소 세 개의 설정 파일이 필요했다. web.xml, root-context.xml, servlet-context.xml. 각각 서블릿 등록, 빈 스캔, ViewResolver 설정을 담당했다. 프로젝트를 시작할 때마다 이 세 파일을 손으로 작성해야 했고, 빠뜨린 설정 하나가 런타임 오류로 이어졌다.Spring Boot는 이 반복을 없앴다. @SpringBootApplication 어노테이션 하나와 main() 메서드 하나로 서버가 뜬다. 설정 파일은 application.properties 하나만 남는데, 그마저도 ViewResolver 경로만 직접 쓰면 된다.Insight: Spring Boot의 핵심은 "합리적인 기본값(Co..

Dev Study/Backend 2026.05.24

[Java & SpringBoot] DispatcherServlet이 바꾼 것 — web.xml 구조, ViewResolver 동작, 파라미터 처리 3가지 방식

URL마다 클래스 하나 — Servlet 시절의 고통Spring MVC와 DispatcherServlet이 왜 등장했는지 이해하려면, 그 이전 방식이 얼마나 불편했는지부터 봐야 한다.// Bad Code: Servlet 시절 — URL마다 클래스 하나public class LoginServlet extends HttpServlet { protected void doGet(...) { ... }}public class RegistServlet extends HttpServlet { protected void doGet(...) { ... }}public class BoardListServlet extends HttpServlet { protected void doGet(...) { ... ..

Dev Study/Backend 2026.05.24

[Java & SpringBoot]AOP 완전 정리 — 프록시 패턴, @Aspect, @Around, Pointcut 범위 설정

모든 메서드가 공유하는 코드 — 중복의 시작AOP(관점지향 프로그래밍)와 횡단 관심사(Cross-cutting Concern)를 이해하려면, 먼저 중복이 어디서 시작되는지 봐야 한다. 아래 두 클래스를 비교해보자.// Bad Code: 핵심 로직 한 줄을 위해 나머지가 전부 중복public class Engineer { public void execute() { System.out.println("장비를 준비한다."); // 중복 try { System.out.println("열심히 작업한다."); // 핵심 로직 System.out.println("결과를 커밋한다."); // 중복 } catch (TaskExcepti..

Dev Study/Backend 2026.05.24

[Java & SpringBoot] DI 의존성 주입 정리 — XML, Annotation, JavaConfig 비교 및 생성자 주입 권장 이유

new 한 줄이 만드는 함정: 강한 결합도의존성 주입(DI)과 제어의 역전(IoC)을 이해하려면, 먼저 잘못된 코드에서 출발해야 한다. 아래 코드에서 Developer는 작업할 장비가 필요하다. 그래서 스스로 만든다.// Bad Code: 강한 결합도 — Developer가 DesktopPC를 직접 만든다public class Developer { private DesktopPC pc; public Developer() { this.pc = new DesktopPC(); // 직접 생성 } public void develop() { System.out.println(pc.getSpec() + "으로 작업 시작"); }}문제는 new DesktopPC()..

Dev Study/Backend 2026.05.24

[Java] EL, JSTL, MVC 패턴 완전 정리 - JSP 게시판 구현의 설계 원칙

JSP 스크립틀릿의 지옥: 왜 우리는 EL과 JSTL을 배워야 하는가JSP를 처음 배우면 누구나 이런 코드를 작성하게 된다.// Bad Code: JSP 스크립틀릿으로 목록을 출력하는 방식 list = (List) request.getAttribute("list"); if (list != null) { for (Board b : list) { out.print("" + b.getTitle() + ""); } }%>HTML 안에 자바 코드가 침투해 있고, null 체크를 빠뜨리면 즉시 NullPointerException이 터진다. 퍼블리셔(디자이너)와 협업하는 순간 이 파일을 건드릴 수 있는 사람은 자바 개발자밖에 없게 된다. 이 고통을 해결하기 위..

Dev Study/Backend 2026.04.28

[Java & BackEnd] Forward와 redirect의 차이, Web의 기억력 Cookie & Session

도입: 웹은 당신을 기억하지 못한다우리가 매일 사용하는 웹 브라우저는 HTTP 프로토콜을 기반으로 통신한다. HTTP의 가장 치명적인 특징은 무상태(Stateless)라는 점이다. 서버는 클라이언트가 요청을 보낼 때만 응답할 뿐, 응답이 끝나면 클라이언트를 매몰차게 잊어버린다.만약 무상태 그대로 웹을 운영한다면, 사용자는 페이지를 이동할 때마다 매번 아이디와 비밀번호를 입력해야만 한다. 이 기억 상실증을 치료하기 위해 웹 개발자들은 '상태 유지 기술'을 만들어냈는데, 그 핵심이 바로 Cookie, Session, 그리고 Scope 메커니즘이다.Insight: 무상태(Stateless)는 서버의 부하를 줄여주는 훌륭한 특성이지만, 비즈니스를 영위하기 위해서는 반드시 상태를 강제로 기억하게 만드는 추가적인 ..

Dev Study/Backend 2026.04.25