Spring 20

Java 리플렉션과 스프링 DI 동작 원리 정리 : 직접 만들어보며 이해하기

스프링의 @Autowired는 어떻게 동작할까?이 궁금증에서 시작된 리플렉션 탐험기.단순 사용법을 익히는 것이 아니라, 직접 DI 컨테이너를 만들어 프레임워크 내부 원리를 깊이 이해해보자.리플렉션 기초리플렉션이란?리플렉션은 런타임에 클래스의 메타데이터 (필드, 메서드, 생성자 등) 에 접근할 수 있게 해주는 Java API이다. Class API를 통해 클래스의 정보를 동적으로 분석하고 조작할 수 있다. 런타임의 객체정보를 컴파일 타입에 접근할 수 있다. Java Platform SE 8 - Class Documentation Class 문서를 살펴보면, 메서드를 살펴보면 메서드를 통해 필드, 또는 상위 클래스 , 클래스가 구현하고 있는 인터페이스 ,메소드 목록들에 접근할 수 있다는 사실을 알 수 있다...

Spring 2025.09.27

프록시와 내부 호출 문제 (@Transactional self-invocation)

스프링에서 @Transactional을 사용하다 보면 내부 호출(self) 때문에 트랜잭션이 적용되지 않는 문제가 발생한다. "self-invocation does not lead to an actual transaction at runtime"(자기 자신 안에서 자기 자신의 트랜잭션 메서드를 호출하면 실제 트랜잭션이 동작하지 않는다)문제의 원인: Spring AOP의 프록시 방식Spring은 프록시 방식의 AOP를 사용한다. 이는 다음과 같은 특징이 있다.AOP를 적용하려면 항상 프록시를 통해서 대상 객체를 호출해야 한다.프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체 호출프록시를 거치지 않고 대상 객체를 직접 호출하면 AOP가 적용되지 않음 정상적인 경우외부 호출 → 프록시 객체 → 어드바이..

Spring 2025.09.21

로그인 처리1 - 쿠키, 세션

패키지 구조 설계 package 구조hello.logindomainitemmemberloginwebitemmemberlogin도메인 = 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야하는 핵심 비즈니스 업무 영역을 말함. 향후 web 을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다.이렇게 하려면 web 은 domain을 알고 있지만 domain 은 web 을 모르도록 설계해야한다. 이것을 web 은 domain을 의존하지만 domain 은 web 을 의존하지 않는다고 표현한다. 예를 들어 web 패키지를 모두 삭제해도 domain 에는 전혀 영향이 없도록 의존관계를 설계하는 것을 중요하다. 반대로 이야기하면 domain 은 web 을 참조하면 안된다.로그인 처리하기 - ..

Spring 2025.08.16

Spring 외부 설정값 주입 방법 총정리 : Environment, @Value, @ConfigurationProperties 비교

스프링 부트를 사용하면 application.yml 또는 application.properties 파일에 설정값을 정의하고, 이를 코드에 주입받을 수 있다.이번 포스팅은 설정을 주입하는 주요 3가지 방법을 정리하고, 그 특징과 장단점을 비교한다. 외부 설정 사용 - Environment다음과 같은 외부 설정들은 스프링이 제공하는 Environment를 통해서 일관된 방식으로 조회할 수 있다. 외부 설정의 종류설정 데이터 (application.properties)OS 환경변수자바 시스템 속성커맨드 라인 옵션 인수다양한 외부 설정 읽기스프링은 Environment는 물론이고 Environment를 활용해서 더 편리하게 외부 설정을 읽는 방법들을 제공한다. 스프링이 지원하는 다양한 외부 설정 조회 방법En..

Spring 2025.06.11

외부설정과 프로필

외부 설정이 필요한 이유애플리케이션을 개발하다 보면 운영 환경과 개발 환경이 서로 다른 설정값을 요구하는 경우가 많다.개발 환경: 개발 서버, 개발 DB 사용운영 환경: 운영 서버, 운영 DB 사용각각의 환경에 따라서 서로 다른 설정값이 존재한다.예를 들어 DB 접속 URL만 해도 환경에 따라 다를 수 있다. 개발: dev.db.com운영: prod.db.com 잘못된 접근 방식: 환경별로 빌드 결과물을 나누는 것초기에는각각의 환경에 맞게 애플리케이션을 빌드하는 것이다.개발 환경용 app-dev.jar, 운영 환경용 app-prod.jar 등 환경마다 서로 다른 빌드 결과물 생성환경에 따라 변하는 설정값을 내부에 포함개발 환경에는 dev.db.com 이 필요하므로 이 값을 애플리케이션 코드에 넣은 다음에..

Spring 2025.06.07

모니터링 메트릭 활용

마이크로미터를 사용해서 메트릭을 직접 등록하는 방법을 알아보자 MeterRegistry마이크로미터 기능을 제공하는 핵심 컴포넌트스프링을 통해서 주입 받아서 사용하고, 이곳을 통해서 카운터, 게이지 등을 등록한다. 카운터단조롭게 증가하는 단일 누적 측정항목단일값보통 하나씩 증가누적이므로 전체 값을 포함(total)프로메테우스에서는 일반적으로 카운터의 이름 마지막에 _tatal 을 붙여서 my_intersetstock_tatol 과 같이 표현함값을 증가하거나 0으로 초기화 하는 것만 가능예 ) HTTP 요청수 메트릭 등록 - 예제 만들기관심 주식 등록 서비스에 카운터 메트릭을 적용해보자!package com.flab.mars.domain.service;import com.flab.mars.db.entity...

Spring 2025.03.25

Spring Boot 애플리케이션 실시간 모니터링: Actuator, Prometheus, Grafana 활용법

서비스 운영에서 실시간 모니터링은 장애 대응의 핵심 요소다. 만약 모니터링 도구가 없다면, 장애 발생 시 원인 분석과 트러블슈팅이 어렵고 시간이 오래 걸릴 수 있다. 이 글에서는 가장 널리 사용되는 Prometheus + Grafana 조합을 활용하여 Spring Boot 애플리케이션을 효과적으로 모니터링하는 방법을 소개한다. 개인 프로젝트를 진행하면서 Spring Boot Actuator를 활용해 Prometheus로 메트릭을 수집하고, 이를 Grafana로 시각화해보았다. 이를 통해 운영 툴을 익히고 데이터 흐름을 파악하는 과정을 정리해보려 한다. 액추에이터:  메트릭을 수집할수 있는 API 엔드포인트 제공 prometheus : 매트릭 같은 시계열  데이터 스키마를 지원하는 데이터 베이스시계열 데이..

Spring 2025.03.19

Spring Boot + Redis 적용기

현재 개인적으로 주식 관련 프로젝트를 진행 중인데, 여러 유저들이 동일한 종목의 정보를 조회할 때 발생하는 API 호출의 중복 문제를 해결하기 위해 Redis를 도입했습니다. 문제점여러 유저가 동일한 종목 정보를 조회하는 경우, 증권사 API를 여러 번 호출해야 하는 상황이 발생할 수 있습니다. 이는 불필요한 트래픽을 유발하고 성능 저하를 초래할 수 있습니다. 이를 해결하기 위해 디스크 기반의 DBMS 에 비해 훨씬 빠른 레디스를 도입해보았다.레디스는 인메모리에 모든 데이터를 저장하기 때문에 훨씬 빠르며 여러가지 자료구조를 지원하고  확장성을 고려하였을때도 여러 기능을 제공한다는 점에서 이점이 있다.동일한 종목 요청시 캐시된 데이터를 반환하도록 api 호출을 최적화해보고 최적화 전 후 성능을 비교해보자 ..

Spring 2025.02.19

[스프링 핵심 원리 - 기본편] 의존관계 자동 주입 1

다양한 의존 관계 주입 방법 의존 관계 주입 4가지생성자 주입수정자 주입(setter 주입)필드 주입일반 메서드 주입 1. 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입받는 방법이다.생성자 호출 시점에 딱 한번만 호출되는 것을 보장한다.불변, 필수 의존 관계에 사용한다.@Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRe..

Spring 2024.11.05

[스프링 핵심 원리 - 기본편] 컴포넌트 스캔 2

탐색 위치와 기본 스캔 대상탐색할 패키지의 시작 위치 선정모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸립니다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있습니다. @ComponentScan( basePackages = "hello.core.member")basePackges : 탐색할 패키지의 시작위치를 지정해 줍니다. 이 패키지를 포함해서 하위 패키지를 모두 탐색합니다.basePackages = {"hello.core", "hello.service"}  이렇게 여러 시작 위치를 지정할 수도 있습니다.basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스..

Spring 2024.10.28