Study/SpringBoot 18

Spring에서 Bean 생명주기 개념 정리

스프링 컨테이너와 ApplicationContext란?Spring에서 객체를 관리하는 핵심은 바로 스프링 컨테이너입니다. 이 컨테이너는 객체(Bean)를 생성하고, 의존성을 주입하며, 생명주기를 관리합니다.ApplicationContext는 스프링 컨테이너의 구체적인 구현체이며, BeanFactory를 확장합니다.BeanFactory가 최소 기능만 제공하는 반면, ApplicationContext는 다음을 포함한 다양한 기능을 제공합니다대부분의 스프링 애플리케이션에서는 ApplicationContext를 사용합니다. Bean 생명주기 전체 흐름Spring에서 Bean의 생명주기는 다음과 같은 순서로 진행됩니다.Bean 인스턴스 생성 (생성자 호출)의존성 주입 (필드, 생성자, setter 등)BeanNa..

Study/SpringBoot 2025.05.17

Spring MVC와 Spring Security의 예외 처리 차이점

예외 처리란?먼저 "예외 처리"는 프로그램 실행 중에 문제가 생겼을 때(예: 로그인 실패, 없는 사용자 요청 등), 그 문제를 적절하게 처리해서 사용자에게 이해할 수 있는 응답을 보내는 걸 말한다.Spring MVC의 예외 처리Spring MVC에서는 컨트롤러에서 예외가 터졌을 때 자동으로 예쁘게 처리할 수 있게 도와주는 여러 기능을 제공하는데, 대표적으로@ExceptionHandler@ResponseStatus@ControllerAdvice1. @ExceptionHandler@ExceptionHandler(MyCustomException.class)public ResponseEntity handleMyException(MyCustomException ex) { return ResponseEntit..

Study/SpringBoot 2025.05.05

JPA의 flush()는 언제, 왜 호출될까?

JPA의 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 과정이다. 즉, 영속성 컨텍스트의 변경 내용을 실제 DB에 반영하는 행위이다.주의: flush()는 영속성 컨텍스트를 비우지 않는다. 단지, 쓰기 지연 SQL 저장소에 쌓여 있던 쿼리들을 데이터베이스에 전송할 뿐! 언제 자동으로 flush()가 호출될까?기본적으로 flush()는 다음 시점에 자동 호출된다.1. 트랜잭션이 커밋될 때2. JPQL 쿼리를 실행할 때 1️⃣ 왜 JPQL 실행 시 자동으로 flush()가 일어날까? 예를 들어 하나의 트랜잭션 안에서 다음과 같은 코드가 있다면em.persist(memberA); // 아직 DB에는 반영되지 않음List result = em.createQuery("select m from ..

Study/SpringBoot 2025.04.12

Spring Boot 테스트 코드: 통합 테스트 vs 단위 테스트

통합 테스트는 전체 애플리케이션 컨텍스트를 로드하여 실제 운영 환경과 유사한 조건에서 컴포넌트 간의 상호작용과 전체 시스템의 동작을 검증하는 데 목적이 있으며, 주로 @SpringBootTest, @AutoConfigureMockMvc과 MockMvc를 활용해 테스트한다. 반면, 단위 테스트는 특정 클래스나 메서드를 외부 의존성과 격리된 상태에서 검증하여 기능의 정확성을 빠르고 효율적으로 확인하는 데 초점을 두며, @Mock, @InjectMocks, Mockito 등을 사용해 최소한의 환경에서 테스트를 수행한다.1️⃣ 통합 테스트전체 Spring Boot 애플리케이션 컨텍스트(ioc)를 로드하여, 실제 환경과 유사한 조건에서 컨트롤러의 동작을 검증하는 테스트다. (DB, 서비스, 리포지토리, 시큐리티 ..

Study/SpringBoot 2025.03.27

SpringBoot + JPA: N+1 문제 발생 원인과 해결 방법

N+1 문제 정의한 번의 조회로 주 엔티티 “N개”를 가져왔을 때, 각각의 연관 엔티티를 다시 조회하는 쿼리가 “N번” 추가 실행되어 총 (1 + N)번의 쿼리가 발생하는 현상이다.public void printTeamMembers(EntityManager em) { List teams = em.createQuery("SELECT t FROM Team t", Team.class) .getResultList(); // 1️⃣ 1번 쿼리 (Team 전체 조회) for (Team team : teams) { for (Member member : team.getMembers()) { System.out.println("Mem..

Study/SpringBoot 2025.03.22

Spring Been 객체와 프록시 패턴

빈(Been)은 스프링 IoC/DI 컨테이너의 핵심 관리 대상이며, 주로 의존성 주입 (DI) 을 통해 빈을 프레임워크로부터 주입받아 사용하는 것이 일반적이다.사용 이유객체 관리의 효율성 : 스프링 컨테이너가 빈의 생성, 소멸, 의존성 관리를 자동으로 처리해주므로 개발자는 객체 관리에 대한 부담을 덜고 비즈니스 로직에 집중할 수 있다.컴포넌트 재사용성 및 유지보수성 향상: 빈은 독립적인 단위로 설계되어 재사용성이 높고, 설정과 코드가 분리되어 유지보수가 용이하다.빈의 스코프(Scope)스프링 빈은 생성과 관리의 범위를 지정할 수 있는 스코프가 있다. 스코프에 따라 빈이 생성되고 유지되는 방식이 달라지며, 이를 통해 애플리케이션 요구사항에 맞는 객체 관리를 수행할 수 있다.Singleton (기본 스코프)..

Study/SpringBoot 2025.03.10

Spring Boot 주요 모듈 및 MVC 아키텍처

1. Spring Boot 주요 모듈Spring Boot는 Java 플랫폼을 위한 경량(Lightweight) 및 유연한 애플리케이션 프레임워크다. 기존의 J2EE 솔루션(EJB 등)보다 가벼우면서도 다양한 기능을 제공하여, 필요한 모듈만 선택적으로 사용할 수 있는 장점이 있다. 주요 모듈Core Container스프링의 핵심 모듈이며, IoC(Inversion of Control) 컨테이너(BeanFactory, ApplicationContext)를 제공하여 빈(Bean)의 생명주기를 관리한다.객체의 생성, 의존성 관리, 생명주기 관리를 담당한다.AOP(Aspect-Oriented Programming)횡단 관심사(Cross-cutting concerns)를 분리하여 핵심 로직과 분리해 재사용성을 높인..

Study/SpringBoot 2025.03.06

Spring Boot의 AOP 활용

AOP가 필요한 상황소프트웨어 개발 과정에서 특정 기능을 모든 메소드에 반복적으로 적용해야 하는 상황이 발생할 때가 있다. 예를 들어, 모든 메소드의 호출 시간을 측정하고 싶다면 어떻게 해야 할까? 아래는 호출 시간을 측정하는 코드를 메소드에 직접 추가한 예제다:public Long join(Member member) { long start = System.currentTimeMillis(); try { validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } finally { long finish = System.c..

Study/SpringBoot 2024.12.06

스프링 빈과 의존관계

스프링 프레임워크는 객체 간의 의존 관계를 효과적으로 관리하기 위해 스프링 빈과 의존관계 주입(DI: Dependency Injection) 개념을 제공한다. 이를 설정하는 방법은 크게 두 가지로 나뉜다. 1. 컴포넌트 스캔과 자동 의존관계 설정, 2. 자바 코드로 직접 스프링 빈 등록 1. 컴포넌트 스캔과 자동 의존관계 설정1-1. 의존성 주입 (DI)스프링은 생성자에 @Autowired 애노테이션이 붙어 있으면, 해당 객체의 의존 관계를 스프링 컨테이너에서 찾아 자동으로 주입합니다. 이처럼 객체 간의 의존 관계를 외부에서 주입하는 방식을 DI(Dependency Injection, 의존성 주입)라고 한다.@Componentpublic class MemberService { private fina..

Study/SpringBoot 2024.11.23

스프링 DB 접근 기술 개요

목차순수 JDBC스프링 JdbcTemplateJPA (Java Persistence API)스프링 데이터 JPA순수 JDBC JDBC(Java Database Connectivity)는 자바 표준 API로, 데이터베이스에 접근하는 기본적인 방법을 제공한다.특징낮은 수준의 데이터베이스 작업을 직접 처리높은 자유도와 유연성 제공하지만, 반복적인 코드가 많아 생산성이 떨어지고 유지보수가 어렵다. 따라서 실무에서는 잘 사용되지 않는다.  스프링 JdbcTemplate 스프링 JdbcTemplate은 순수 JDBC의 단점을 보완한다.장점반복적인 코드 제거예외 처리와 자원 관리를 자동화JdbcTemplate을 사용하면 SQL은 직접 작성하지만, 자원 관리나 결과 매핑과 같은 반복 작업을 최소화할 수 있다.  JPA..

Study/SpringBoot 2024.11.14