[Spring] @Transactional: 트랜잭션 전파 처리과정
·
Spring/Spring 기초 지식
스프링은 어떻게 트랜잭션 전파를 처리하는지 알아보자 📌 서론 스프링 프레임워크에서 @Transactional 애노테이션을 사용할 때, 기본적인 전파 수준(propagation level)은 Propagation.REQUIRED다. 이 전파 수준은 현재 진행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여하고, 없으면 새로운 트랜잭션을 시작하는 것이다. 즉, 메서드가 트랜잭션 내에서 실행되도록 보장해 준다. 그런데 이렇게만 알고 넘기기엔 답답한 마음이 들었다. 스프링은 내부에서 어떻게 이 전파 수준을 추출하고 해석해서 동작시키는지 정말 궁금했고 그 내용을 공부했다. 이번 포스트를 통해 그 내용을 공유한다. 이번 포스트는 정말 헷갈리고 어려울 수 있다. 쉽게 이해하기 위해 직접 코드를 따라가 보는 것이 좋다고 ..
[Spring] 톰캣과 스프링: 웹 요청의 라이프사이클 이해하기
·
Spring/Spring 기초 지식
톰캣과 스프링의 웹 요청 처리방법을 이해해 보자 📌 서론 스프링은 복잡한 저수준의 소켓 통신과 스트림 처리를 추상화하여, 개발자가 고수준의 비즈니스 로직에 집중할 수 있도록 설계되었다. 이번 포스트를 통해 스프링 프레임워크와 서블릿 컨테이너(예: Tomcat)가 HTTP 요청을 어떻게 처리하는지, 그리고 이 과정에서 각각의 역할이 무엇인지 상세히 살펴보자 1. 스프링의 http 요청과 관련된 용어 이해하기 서블릿 컨테이너 스프링 애플리케이션은 일반적으로 서블릿 컨테이너(예: Tomcat, Jetty) 내에서 실행된다. 이러한 컨테이너는 저수준의 네트워크 통신을 처리하고, HTTP 요청을 서블릿 API로 변환해 애플리케이션에 전달하는 역할을 한다. DispatcherServlet DispatcherServ..
주니어 개발자의 결합도(Coupling) 이해하기: 스프링에서 결합도 관리하기
·
Spring/Spring 기초 지식
결합도(Coupling)는 (클래스, 모듈, 함수 등) 간의 상호 의존성의 정도를 나타낸다. 📖 서론 개발 분야에서 "결합도(Coupling)"는 소프트웨어의 다양한 구성 요소 간의 상호 의존성의 정도를 나타내는 중요한 개념이다. 이는 소프트웨어 구조의 효율성과 유지보수의 용이성을 결정하는 핵심 요소 중 하나로, 소프트웨어 코드 간의 의존 관계의 정도를 나타낸다. 코드 사이에 강한 결합이 있으면, 한 부분이 바뀌었을 때 다른 부분에도 영향을 많이 준다. 그래서 우리는 보통 낮은 결합도를 유지하려고 한다. 낮은 결합도가 좋은 이유는 몇 가지가 있다. 1. 유지보수의 용이성: 낮은 결합도는 한 컴포넌트의 변경이 다른 컴포넌트에 미치는 영향을 줄여, 유지보수를 용이하게 해 준다. 2. 재사용성의 증가: 각 컴..
[Spring] RuntimeException의 메시지
·
Spring/Spring 기초 지식
이번 포스트에서는 RuntimeException의 예외 메시지를 가져오는 getMessage()에 대해서 자세히 알아보자📌 서론테스트 코드를 작성하다 발생했던 문제를 해결하며 이 내용을 정리했다. 예외 처리 메시지를 가져오는 과정에서 문제가 있었기에 RuntimeException의 예외 메시지를 가져오는 과정을 정리해봤고 그 내용을 정리했다. 1. 테스트 코드에서 발생한 문제 파악하기테스트 코드를 작성했다.테스트 코드를 작성하고 실행했는데 코드 중간에 작성된 assertEquals(expectedMessage, exception.getMessage())에서 오류가 발생했다. 테스트 코드 호출 결과테스트 결과를 보면 기대값이 존재하는데 Actual이 null인 오류가 발생했다고 나온다.  오류 분석 - ..
Gradle: Implementation과 RuntimeOnly의 차이점 및 활용 방법
·
Spring/Spring 기초 지식
SpringBoot 프로젝트의 build.gradle 파일에서 'implementation'과 'runtimeOnly' 설정의 차이점과 사용법을 알아보자 📌 서론Gradle의 빌드 스크립트인 build.gradle에서 의존성을 관리할 때 runtimeOnly와 implementation은 자주 사용되는 구성이야. 각각의 키워드가 어떤 목적으로 사용되는지, 그리고 차이점은 무엇인지 알아보자.글의 이해를 위해 가장 먼저 스프링의 "모듈"을 알아보자 1. 스프링 부트의 모듈 이해하기1-1. 메인 모듈 (Main Module)애플리케이션의 핵심 기능을 담당한다. 주요 비즈니스 로직, 데이터베이스 연결, 웹 컨트롤러 등을 포함한다.프로젝트의 src 폴더 내에 위치한 Java 패키지들, application.pr..
Spring Boot 생성자 주입 알아보기1: @ComponentScan 동작원리
·
Spring/Spring 기초 지식
이번 포스트에서는 내가 궁금해서 알아본 생성자 주입이 이루어지는 과정에 대해서 설명할 것이다. 📌 서론 이번 포스트는 총 2편으로 나뉜다. 지금부터 설명할 1편에서는 @ComponentScan이 빈 등록을 어떻게 하는지 알아보고 2편에서는 이 등록된 빈을 활용하여 생성자 주입을 진행하는 것을 상세히 알아본다. 이번 포스트의 내용은 스프링에서 가장 중요하게 사용되는 Bean을 등록하는 과정을 상세하게 설명하도록 하겠다. 1. 생성자 주입과 컴포넌트 스캔 간략하게 알아보기 1-1 생성자 주입 과정 알아보기 1. SpringApplication.run() 스프링 부트 애플리케이션을 시작하는 주요 진입점이다. 이 메서드가 호출되면 내부적으로 여러 설정과 초기화 작업이 진행된다. 2. ApplicationCont..
SpringBoot: 리소스 관리하기 (resource)
·
Spring/Spring 기초 지식
스프링 부트는 내부적으로 리소스를 어떻게 로딩할까? 📌 서론 길을 걸어가던 도중 스프링, 스프링부트에서는 어떻게 application.yml이나 js, css 같은 파일들을 읽어 들여서 사용하는지에 대한 궁금증이 생겼다. 그래서 당장 조사를 했고 이를 정리해 봤다. 지금부터 그 내용을 공유한다. 1. 리소스 로딩의 중요성과 기본 개념 스프링 어플리케이션의 성능과 개발 효율성 향상을 위해서는 다양한 외부 리소스(파일, 이미지 등)를 효율적으로 로딩하는 것이 중요하다. Resource 인터페이스는 다양한 리소스 유형에 대해 일관된 API를 제공하며, 리소스 존재 여부 확인, 파일/URL 접근 등 다양한 기능을 제공한다. 리소스 로딩의 중요성 스프링 어플리케이션에서 리소스 로딩은 핵심적인 부분이다. 외부 리소..
Spring Boot 3 및 Spring Batch 5에서 배치 테이블 자동 생성 문제 해결하기
·
Spring/Spring 기초 지식
SpringBoot3에서 배치를 사용할 때 왜 테이블을 자동으로 만들어 주지 않을지 알아보고 이것을 해결해 보자 1. 배치를 사용할 때 자동으로 테이블을 생성해 주지 않는 문제1-1. 테이블이 생성되지 않는 원인 파악하기Spring Boot 3에서 Spring Batch를 사용할 때 'application.yml'에 batch.jdbc.initialize-schema: ALWAYS와 job.enabled: true를 설정했는데도 불구하고 자동으로 DB 테이블이 생성되지 않는 문제가 있다. 이 문제의 원인은 Spring Boot 3에서 일부 자동 구성 변경 사항 때문이다.batch: jdbc: initialize-schema: ALWAYS job: enabled: true 원인1: 자동 구성..