분류 전체보기 135

스프링 데이터 JPA는 인터페이스만 정의했는데 어떻게 동작할까?

인터페이스만 정의했는데 어떻게 동작하지? 다이나믹 프록시의 핵심 클래스는 java.lang.reflect.Proxy이다.import org.springframework.data.jpa.repository.JpaRepository;public interface BookRepository extends JpaRepository {} 인터페이스만 정의했을 뿐인데, save(), findById() 같은 메서드가 마법처럼 동작한다. 여기서 일어나는 일:BookRepository 의 객체가 만들어짐그 객체가 스프링 빈으로 등록됨빈 등록 작업도 spring-data-jpa가 자동으로 처리도대체 이 인터페이스를 어떻게 인스턴스로 만들어준 걸까? 실제로 동작하는지 확인해보기 테스트 코드package hello.diex..

JAVA 00:24:46

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

Git처럼 SVN에서도 target/ 디렉토리를 무시하려면?

# 1. target 디렉토리를 SVN 추적 대상에서 제거하되, 실제 파일은 삭제하지 않음 svn delete --keep-local target/ # 2. 현재 디렉토리에 svn:ignore 속성을 설정하여, target 디렉토리를 앞으로 무시하도록 지정 svn propset svn:ignore target . # 3. 위의 변경 사항(삭제 + 무시 속성 추가)을 커밋 svn commit -m "Ignore target directory" 확인 # 현재 디렉토리에 설정된 SVN 속성 목록을 조회 # (예: svn:ignore, svn:externals 등 설정 여부 확인 가능) svn proplist # 현재 디렉토리에 설정된 svn:ignore 속성의 실제 값을 확인 # 출력이 'target'이면, ..

카테고리 없음 2025.08.07

외부 연동 방식 변경과 어댑터 패턴 적용

외부 연동 방식 변경과 어댑터 패턴 적용최근 회사에서 외부 시스템과의 연동 방식이 변경되었다.기존에는 DB를 직접 조회해서 데이터를 받아오는 방식이었지만, 변경 이후에는 REST API를 통해 외부 데이터를 호출하도록 요구사항이 바뀌었다.이런 구조 변경은 일반적으로 기존 코드에 많은 영향을 줄 수 있다.하지만 나는 이 상황에서 기존 비즈니스 로직을 전혀 수정하지 않고도 외부 연동 방식만 바꿔치기할 수 있도록 어댑터 패턴(Adapter Pattern) 을 적용해보았다.어댑터 패턴이란?어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스를 함께 동작하게 해주는 구조 패턴이다. 기존 인터페이스를 클라이언트가 기대하는 형태로 변환해줌으로써, 서로 다른 클래스들이 함께 동작할 수 있도록 도와준다.실생활 예를 들면..

JAVA 2025.08.03

MongoDB vs MySQL 쿼리 비교하기

MySQL과 MongoDB는 데이터를 조작하는 방식에서 근본적인 차이를 보인다.MySQL 은 전통적인 SQL 쿼리 언어를 사용하는 반면, MongoDB는 API 호출 방식의 접근법을 취한다.이 글에서 실제 개발에서 자주 사용되는 쿼리를 비교하며 각각의 특징과 장단점을 살펴본다.1. 데이터 삽입 (INSERT)MySQL 방식INSERT INTO users(id, name, department) VALUES(1001, '김철수', '컴퓨터'); MongoDB 방식db.users.insertOne({ id: 1001, name: "김철수", department: "컴퓨터"}); 핵심 차이점MySQL : 구조화된 쿼리 언어전통적인 SQL 문법 사용테이블과 컬럼 구조가 명확히 정의됨INSERT, VALUES..

mongoDB 2025.07.07

2-1 텍스트 어드벤처 _2

클래스를 안전하게 변경하기 위해서는 테스트 코드가 중요하다. 리팩토링이 무서운 당신에게: 테스트로 안전하게 코드 개선하기"이 코드를 건들리면 뭔가 망가질 것 같은데.." 혹시 이런 생각을 해본적이 있나요?리팩토링에 대한 두려움을 극복하고, 테스트를 통해 안전하게 코드를 개선하는 방법을 알아보자. 리펙토링, 왜 무서울까?리펙토링(Refactoring)은 프로그램의 기능은 그대로 유지하면서 이해하고 내부 구조만 개선하는 작업이다. 쉽게 말해:기능은 동일코드는 더 깔끔하고 이해하기 쉽게유지보수성 향상 그런데 왜 많은 개발자들이 리팩토링을 두려워할까?답은 간단하다. 내부 구조를 바꾸다 보니 버그가 생길 가능성이 높기 때문이다.리팩토링의 든든한 안전장치 : 테스트그렇다면 어떻게 안전하게 리팩토링 할 수 있을까..

객체지향 2025.06.27

자바 람바(Lambda), 왜 써야할까? 코드 리펙토링으로 이해하는 매개변수화

자바 개발을 하다보면 비슷한 코드가 반복되거나, 코드 블럭을 파라미터처럼 전달하고 싶을 때가 있다.자바 8 에서 등장한 람다(Lambda)는 바로 이런 상황에서 빛을 발한다.이 글에서는 람다가 왜 필요한지, 그리고 어떻게 코드가 리펙토링 되는지를 예제를 통해 설명한다. 리팩토링의 핵심: 변하지 않는 것과 변하는 것을 분리하라 프로그래밍에서 중복을 제거하고, 좋은 코드를 유지하는 핵심은 변하는 부분과 변하지 않는 부분을 분리하는 것이다.변하지 않는 부분은 그대로 유지하고 변하는 부분을 어떻게 해결할 것 인가에 집중하면 된다. [1단계] 값 매개변수화 (Value Parameterization)리펙토링 전package lambda.start;public class Ex0Main { public stat..

카테고리 없음 2025.06.21

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

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

Spring 2025.06.11