[MVC-5] 스프링 MVC 기본 기능
·
Spring/MVC
1. 프로젝트 생성 및 구조1.1 스프링 부트 프로젝트 생성스프링 MVC를 학습하기 위한 프로젝트는 스프링 부트 스타터 사이트(https://start.spring.io)를 통해 생성한다. 다음과 같은 설정이 권장된다:1.1.1 프로젝트 기본 설정Project: Gradle ProjectLanguage: JavaSpring Boot: 2.4.x 이상Project Metadata:Group: helloArtifact: springmvcName: springmvcPackage name: hello.springmvcPackaging: Jar (주의)Java: 111.1.2 의존성(Dependencies)Spring WebThymeleafLombok1.1.3 Packaging 선택: Jar vs WarJar 선..
[MVC-4] 스프링 MVC 시작하기: 애노테이션 기반 컨트롤러
·
Spring/MVC
1. 스프링 MVC의 시작1.1 @RequestMapping 애노테이션의 등장 배경 스프링 MVC의 진정한 강점은 애노테이션 기반 컨트롤러의 도입으로 나타났다. 초기 자바 언어에는 애노테이션이 존재하지 않았으며, 스프링 또한 처음부터 이러한 유연한 컨트롤러를 제공하지 않았다. 역사적으로 스프링 프레임워크의 MVC 부분은 상대적으로 약점으로 지적받아 왔고, 많은 개발자들이 Struts와 같은 다른 웹 프레임워크를 MVC 레이어로 사용하기도 했다. 그러나 @RequestMapping 애노테이션 기반 컨트롤러의 등장은 게임 체인저 역할을 했다. 이 기술은 스프링이 웹 MVC 분야에서 압도적인 우위를 차지하는 계기가 되었으며, 오늘날 스프링 MVC는 자바 웹 개발의 사실상 표준(de facto standard..
[MVC-3] Spring MVC 구조 이해
·
Spring/MVC
1. 스프링 MVC 전체 구조1.1 직접 만든 MVC 프레임워크와 스프링 MVC의 비교 지난 시간에 단계적으로 진화시켜 만든 MVC 프레임워크 v5 버전과 스프링 MVC는 구조적으로 매우 유사하다. 이는 스프링 MVC가 웹 애플리케이션 개발에서 검증된 디자인 패턴과 아키텍처를 기반으로 구축되었기 때문이다. 직접 만든 MVC 프레임워크 스프링 MVC 컴포넌트 역할 FrontControllerServletV5DispatcherServlet프론트 컨트롤러 역할handlerMappingMapHandlerMapping요청 URL을 핸들러(컨트롤러)로 매핑MyHandlerAdapterHandlerAdapter다양한 형태의 컨트롤러를 실행할 수 있는 어댑터ModelViewModelAndView모델 데이터와 뷰 정..
[MVC-2] 직접 만드는 MVC 프레임워크
·
Spring/MVC
1. 프론트 컨트롤러(Front Controller) 패턴 소개 과거의 방식은 모든 서블릿이 각자의 로직을 수행하며 공통 처리를 중복으로 수행해야 했다. 프론트 컨트롤러 패턴은 '입구를 하나로' 모아 공통 로직을 통합 관리하는 것이 핵심이다.특징: 서블릿 하나로 모든 클라이언트 요청을 받고, 요청에 맞는 컨트롤러를 찾아 호출한다.스프링과의 관계: 스프링 웹 MVC의 DispatcherServlet이 바로 이 프론트 컨트롤러 패턴으로 구현되어 있다.2. v1: 프론트 컨트롤러 도입 (기본 구조 구축)기존 서블릿 코드를 최대한 유지하면서 프론트 컨트롤러만 도입한 단계이다.ControllerV1 인터페이스public interface ControllerV1 { void process(HttpServlet..
[MVC-1] 서블릿에서 JSP까지: 자바 백엔드 웹 기술의 발전과 한계
·
Spring/MVC
자바 백엔드 기술의 역사는 '비즈니스 로직'과 '뷰(화면) 렌더링'을 어떻게 하면 깔끔하게 분리할 수 있을지에 대한 고민의 역사와 궤를 같이한다. 모든 웹 기술의 뿌리인 서블릿부터 현대적인 MVC 패턴에 이르기까지의 과정과 그 한계를 정리한다.1. 모든 웹 기술의 뿌리, 서블릿(Servlet) 자바에서 동적인 웹 페이지를 생성하기 위해 탄생한 표준 기술이 서블릿이다. 서블릿은 HTTP 요청 메시지를 파싱하여 개발자가 비즈니스 로직에만 집중할 수 있도록 HttpServletRequest와 HttpServletResponse 객체를 제공한다.1.1. 서블릿 방식의 불편함: response.getWriter().write()서블릿만으로 웹 애플리케이션을 개발하면 자바 코드 안에 HTML이 갇혀버리는 현상이 발..
[Basic-8] 빈 생명주기 콜백과 빈 스코프의 활용
·
Spring/Core
데이터베이스 커넥션 풀이나 네트워크 소켓 연결처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 종료 시점에 이를 안전하게 닫는 작업은 매우 중요하다. 스프링이 제공하는 빈 생명주기 콜백과 다양한 빈 스코프를 통해 객체를 효율적으로 관리하는 방법을 알아본다.1. 빈 생명주기 콜백 (Bean Lifecycle Callbacks)스프링 빈은 객체 생성 → 의존관계 주입이라는 라이프사이클을 가진다. 빈은 의존관계 주입이 모두 완료된 후에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 반드시 의존관계 주입이 끝난 후 호출되어야 한다.1.1. 스프링 빈의 이벤트 라이프사이클스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스..
[Basic-7] 의존관계 자동 주입의 전략과 빈 충돌 해결
·
Spring/Core
스프링은 다양한 의존관계 주입 방법을 지원한다. 하지만 실무에서는 특정 방식을 표준으로 사용하며, 여러 개의 빈이 조회될 때 발생하는 충돌을 우아하게 해결하는 것이 중요하다. 이번 글에서는 주입 방식의 종류와 권장되는 선택지, 그리고 빈 충돌 해결 전략을 알아본다.1. 의존관계 주입의 4가지 방법의존관계 주입은 크게 생성자 주입, 수정자(Setter) 주입, 필드 주입, 일반 메서드 주입으로 나뉜다.생성자 주입: 객체 생성 시점에 딱 한 번만 호출되며, 불변성과 필수 의존관계에 사용된다.수정자(Setter) 주입: 선택적이거나 변경 가능성이 있는 의존관계에 사용된다.필드 주입: 코드가 간결하지만 외부에서 변경이 불가능하여 테스트하기 어렵다는 치명적인 단점이 있다. 실무에서는 사용하지 않는 것을 권장한다...
[Basic-6] 컴포넌트 스캔과 자동 의존관계 주입
·
Spring/Core
스프링 빈이 수십, 수백 개로 늘어나면 일일이 @Bean을 통해 설정 정보에 등록하는 과정이 번거로워진다. 이는 설정 정보의 비대화와 누락 문제로 이어진다. 스프링은 이러한 문제를 해결하기 위해 설정 정보 없이도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔(Component Scan) 기능을 제공한다.1. 컴포넌트 스캔과 @Autowired컴포넌트 스캔을 사용하면 빈 등록뿐만 아니라 의존관계 주입까지 자동화할 수 있다.1.1. @ComponentScan설정 클래스에 @ComponentScan 어노테이션을 붙여준다. 기존의 AppConfig와 달리 내부에는 @Bean으로 등록된 클래스가 하나도 존재하지 않는다.@Configuration@ComponentScan( excludeFilters = @Fil..