스프링부트를 무턱대고 공부하면 방대한 지식에 좌절할 수 있다. 전체적인 구조가 어떻게 되는지 먼저 베이스로 알고 가야 이해가 잘 될 것이라고 생각한다. 웹 애플리케이션을 개발할 때 가장 중요한 것 중 하나가 "구조를 어떻게 설계할 것인가" 이다. 구조가 잘 설계되지 않으면 유지보수도 어렵고 확장성도 떨어지고 팀 개발 시 충돌이 많이 발생할 수 있다. 스프링부트에서는 계층형 아키텍처를 사용하여 이런 문제를 해결한다. 스프링부트의 4가지 주요 계층을 알아보고 실제 애플리케이션이 어떻게 동작하는지 이해해보자. 스프링부트의 4가지 주요 계층스프링부트의 계층 구조는 다음과 같이 나뉜다.Presentation Layer (프레젠테이션 레이어, Controller)→ 사용자의 요청을 받고 응답을 반환하는 계층Bus..
스프링을 사용하다보면 빈이라는 개념을 자주 접한다. 빈은 스프링 컨테이너가 관리하는 객체로, 기본적으로 싱글톤으로 생성된다. 하지만 모든 빈을 싱글톤으로만 사용할 수는 없다. 요청마다 새로운 객체를 생성하거나 특정 범위 내에서만 유지해야 할 때가 있는데 이때 빈 스코프를 활용한다. 빈 스코프란? 스코프는 빈이 존재할 수 있는 범위를 의미한다. 크게 싱글톤, 프로토타입, 웹 스코프로 구분할 수 있다. 싱글톤 : 스프링 컨테이너 시작 시 생성되고 종료 시 소멸된다. 프로토타입 : 빈을 요청할 때마다 새로운 인스턴스가 생성된다. 생성과 의존성 주입만 관리된다.종료 메서드가 호출되지 않음웹 스코프: HTTP 요청 세션, 서블릿 컨텍스트와 같은 웹 환경에서 유효한 범위이다. @Scope("singleton"..
스프링에서 Bean은 생명주기를 가지고 있다. 이 생명주기 동안 특정 시점에 초기화와 종료 작업을 수행해야 할 경우가 있다. 김영한 강사님의 강의에선 DB 커넥션 풀을 초기화하거나 네트워크 소켓을 연결하는 작업에서 생명주기 초기화와 종료 작업이 필요하다고 한다. 3가지 방법에 대해 공부하고 간단하게 DB 커넥션 풀 초기화와 네트워크 소켓 연결의 예시 코드를 만들어서 이해를 돕도록 해보겠다. 빈의 생명주기 콜백이란? 빈 생명주기 콜백은 스프링 빈이 생성되고 소멸되는 과정에서 특정 시점에 호출되는 메서드를 의미한다. 스프링은 빈이 생성되고 의존관계 주입이 완료된 후 초기화 콜백을 호출하고, 빈이 소멸되기 직전에 소멸 콜백을 호출한다. 안전하게 빈의 초기화와 종료 작업이 가능한 것이다. 빈의 생명주기는..
스프링에서 자동 의존성 주입인 @Autowired를 사용할 때 Bean이 여러 개 존재하면 어떤 빈을 주입해야 할 지 모호해서 오류가 발생할 수 있다. 세 가지 방법이 존재하는데 @Autowired 필드, @Qualifier, @Primary 같은 기능들이 있다. @Primary는 기본적으로 우선순위를 정하는 방식으로 널리 사용됨. @Qualifier는 특정한 빈을 명확하게 지정해야 할 때 자주 사용됨. @Autowired 필드 명 매칭은 자동으로 이름을 맞춰줄 때 활용됨. 자동 주입 충돌 방지와 명확한 의존 관계 설정을 위해서 실무에서 많이 활용되므로 간단하게 공부하는 김에 코드를 통해 예시를 들어보겠다. @Autowired 필드 명 매칭 자동 주입할 때 필드 명과 빈 이름이 같다면 해당 빈을 ..
@Bean?? 개발자가 직접 객체를 생성하여 스프링 컨테이너에 등록할 때 사용하는 어노테이션이다. 설정 클래스의 메서드 위에 보통 붙여서 특정 객체를 빈으로 등록할 때 사용된다. public class AppConfig { @Bean public ServiceA serviceA() { return new ServiceA(); }} 간단히 serviceA() 메서드는 스프링 컨테이너에 ServiceA 객체를 빈으로 등록한다. @Configuration?? 설정 클래스임을 명시하는 어노테이션이다. 내부적으로 CGLIB 프록시가 적용되어서 @Bean 메서드 간의 호출을 감싸주어 싱글톤을 보장한다. CGLIB?? CGLIB(Code Generation Library)는 바이트코드..
스프링의 기본과 MVC에 대해 요즘 집중적으로 공부하고 있다.공부를 하다가 쉽긴 하지만 Controller와 RestController에 대해 더 확실하게 이해하고 넘어가고 싶어서 포스팅을 하게 되었다. @Controller와 @RestController 이 두 어노테이션은 Spring에서 컨트롤러를 지정해주기 위한 어노테이션이다. @Controller는 전통적인 Spring MVC 컨트롤러이고@RestController는 RESTful 웹 서비스의 컨트롤러이다. 근데 이게 무슨 차이일까? @Controller @Controller는 Spring MVC에서 View(HTML)를 반환할 때 사용하는 어노테이션이다. 이 말은 브라우저에서 요청이 들어오면 Thymeleaf 같은 템플릿 엔진을..
오늘은 싱글톤 패턴에 대해서 공부해보겠다. package com.naver.shopping.singleton;import com.naver.shopping.AppConfig;import com.naver.shopping.member.MemberService;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import static org.assertj.core.api.Assertions.assertThat;public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig app..
인프런을 공부하면서 알게 된 것들 정리 스프링 컨테이너 스프링 컨테이너 생성 ApplicationContext는 스프링 컨테이너로, 자바 설정 파일(AppConfig.class)을 사용하여 빈을 등록하고 관리한다. 자바 코드와 XML 설정을 모두 지원한다. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); AppConfig.class는 자바 설정 클래스이다.스프링 컨테이너는 이 클래스를 읽어 빈을 등록한다. 스프링 빈 등록 및 조회 스프링 컨테이너는 빈 이름과 타입을 기준으로 빈을 등록하고 조회한다. 동일한 타입의 빈이 둘 이상 존재하면 이름을 지정해야 하며 부모..