단일 책임 원칙(SRP) - 한 클래스는 오직 하나의 액터만을 위한 책임을 가져야 한다.
·
Spring/Spring 기초 지식
안녕하세요! 개발자 stark입니다. 이번 포스팅은 SOLID 원칙 중 첫 번째인 단일 책임 원칙(Single Responsibility Principle, SRP)에 대한 내용입니다. 굉장히 흔한 지식이지만 로버트 마틴이 작성한 SRP 관련 글을 읽던 중 "각 소프트웨어 모듈은 변경의 이유가 하나여야 한다."라는 다소 추상적인 개념을 보게 되었고 제가 이걸 조금이라도 더 쉽게 이해하고 싶다는 생각이 들어 정리하며 작성하게 되었습니다. 참고로 SRP를 '클래스가 한 가지의 일만 해야 한다.'라고 착각하는 경우가 많습니다. 저도 이런 생각을 했던 적이 있었는데 실무에서 코드를 작성하다 보면 잘못된 이해 때문에 오히려 코드를 복잡하게 작성하고 있었다는 것을 알게 되었습니다. 잘못된 이해를 가지고 코드를 작성..
스프링 시큐리티에서 SecurityContext를 비동기 스레드에 전파하는 방법
·
Spring/Spring Security
시작하며안녕하세요. 개발자 Stark입니다.오늘은 스프링 시큐리티를 사용할 때 http 메인 호출 내부에서 비동기 메서드를 호출했을 때(한 호출에서 부모-자식 스레드가 함께 동작하는 경우)에 스프링 시큐리티에서는 SecurityContextHolder(ThreadLocal)의 데이터를 어떻게 처리하는지와 이 데이터를 비동기 스레드에 전달 가능한지에 대해 함께 알아봅시다. 저의 경우 업무를 하다 보니 일반 스레드풀을 사용하는 메서드 내부에서 비동기 메서드를 호출하게 되는 경우가 있었는데 이때 유저의 정보가 그대로 전달되어야만 했습니다. 근데 비동기 스레드의 기본 설정 스레드풀인 SimpleTaskExecutor와 일반 스레드에서 사용하는  ThreadPool은 각각 다른 스레드풀이기에 ThreadLocal..
스프링 컨테이너: 빈 탄생과 프록시 객체 등록과정
·
Spring/Spring 기초 지식
시작하며안녕하세요. 개발자 Stark입니다. 2025년 첫 글입니다. 모두 새해 복 많이 받으세요~이번 포스팅은 정말 길게 준비하고 있던 Spring 트랜잭션 시리즈의 시작을 알리는 글입니다. 한 달간 천천히 시간이 날 때마다 디버깅을 하면서 내부 동작을 분석하고 정리만 진행하고 있었는데 신년이 되었으니 새로운 시작을 알리기 위해 제가 선택한 첫 시리즈는 바로 프레임워크 분석이며 "스프링은 어떻게 @Transactional을 사용한 클래스나 메서드를 빈으로 등록하면서 Proxy 객체로 만들까?"입니다. 이를 위해 가장 기초가 되는 스프링 컨텍스트의 빈 등록 과정부터 시작해서 실제 트랜잭션 인터셉터의 동작까지 이번 시리즈를 통해 모든 것을 상세히 분석하고 정리할 예정입니다. 이번 포스팅에서는 스프링의 복..
스프링 Enum 바인딩: 커스텀 Converter로 대소문자 문제 해결
·
Spring/Spring에서 Java 활용하기
안녕하세요 개발자 stark입니다! 오늘은 Enum을 우아하게 사용하는 방법을 소개드리고자 합니다. 스프링 MVC에서 @RequestParam이나 @PathVariable로 enum을 받을 때는 스프링 내부에서 StringToEnumConverter가 동작하게 됩니다. 그리고 이 Converter는 문자열과 enum 상수가 정확히 일치해야만 매핑됩니다. 그러나 개발을 하다 보면 소문자를 허용해야 할 수도 있고, 잘못 들어온 값에 대해 일관된 에러 메시지를 내려줄 필요도 있습니다. 이를 해결하기 위해 아래와 같이 커스텀 컨버터 + 전역 예외 처리를 구성하면, 원하는 대로 Enum을 바인딩하고 에러 응답을 깔끔하게 제어할 수 있습니다.  저도 이것을 잘 몰랐는데 제가 enum을 대문자로만 받도록 로직을 구성..
[Spring] 의존성과 결합도 제대로 알기
·
Spring/Spring에서 Java 활용하기
안녕하세요. 스프링 백엔드 개발자 stark입니다!백엔드 업무를 하면서 개발자들끼리 코드 구조에 대한 대화를 하다 보면 의존성과 결합도라는 용어를 정말 많이 사용합니다. 개발에서 얘기하는 의존성 그리고 결합도는 뭘 의미하는 걸까요? 이 궁금증을 해소하기 위해 이번 포스팅에서는 의존성과 결합도에 대해 가볍게 알아보고 의존성 주입(DI: Dependency Injection)을 통해 어떻게  높은 의존성을 풀어나가는지 알아봅시다.  의존성이란 무엇인가?의존성은 쉽게 말해 한 클래스가 다른 클래스의 기능에 의존한다는 것을 의미합니다. 예를 들어, OrderService 클래스가 주문 처리를 위해 PaymentService의 기능(메서드)을 필요로 한다면, OrderService 클래스는 PaymentServi..
[Spring] 왜 @Transactional 내부에서 호출한 @Transactional은 안 먹힐까?
·
Spring/Spring 기초 지식
안녕하세요. 트랜잭션이 흥미로운 개발자 stark입니다!최근 트랜잭션에 대해서 공부하다 보니 좀 더 궁금한 것들이 있어서 포스팅을 작성하게 되었습니다. 이번 포스팅에서는 같은 클래스 내에서 메서드를 호출할 때 프록시 기반 트랜잭션이 동작하지 않는 문제를 다뤄봤습니다. Spring에서 트랜잭션 관리는 데이터의 무결성을 보장하는 중요한 기법입니다. 잘못된 트랜잭션 관리로 인해 발생할 수 있는 데이터 손실이나 오류를 방지하기 위해서는 트랜잭션의 동작 방식을 제대로 이해해야 합니다. 특히 같은 클래스 내에서의 메서드 호출 시 트랜잭션이 의도한 대로 동작하지 않는 경우가 있어 이를 이해하고 적절히 대응하는 것이 중요합니다.  프록시 기반 트랜잭션이란?Spring에서 트랜잭션 관리를 위해 @Transactional..
[Spring] @TransactionalEventListener(AFTER_COMMIT)에서 업데이트가 반영되지 않는 문제 해결
·
Spring/JPA
안녕하세요. 매일 성장하는 개발자 stark입니다!저는 실무에서 스프링 내부 이벤트를 발행할 때 @TransactionalEventListener(AFTER_COMMIT)를 정말 많이 사용합니다. 근데 after_commit 내부에서 트랜잭션을 사용해서 업데이트 처리를 해야 하는데 제대로 동작하지 않는 문제가 발생했습니다.분명 트랜잭션도 제대로 걸어줬는데 왜 업데이트가 안되는지 이 상황이 도저히 이해가 되지 않았고 저는 이해되지 않은 채로 넘어가는 것이 싫어서 정말 오랜 시간 동안 그 이유를 찾아 헤매었습니다. 조금 오래 걸렸지만 결국은 답을 얻었고 그 과정을 정리해 봤습니다.  문제 상황 이해하기게시글 저장 API를 호출하면 게시글을 저장하고, 그 과정에서 이벤트를 발행합니다. 이 이벤트는 @Tran..
[Java] Enum NPE 문제 빠르게 해결하기 (feat. equals, switch, AttributeConverter)
·
Spring/Spring에서 Java 활용하기
안녕하세요. 기록이 즐거운 개발자 stark입니다!이번 포스팅은 제가 직접 겪은 Enum 오류와 그 해결 과정을 기록해 두고자 작성했습니다. 스프링 프로젝트에서는 DB에 저장되는 타입을 문자열(String)이 아닌 Enum으로 관리하는 것을 권장합니다. Enum을 사용하면 임의의 값이 DB에 저장되는 것을 방지할 수 있으며, 코드 내에서 타입을 쉽게 검색해 빠르게 확인할 수 있는 장점이 있기 때문입니다. 하지만, Enum을 사용한다고 해서 문제가 없는 것은 아닙니다. 프로젝트를 진행하면서 예상치 못한 문제에 직면할 수 있습니다. 제가 겪은 문제 상황은 다음과 같습니다. 비즈니스 로직에서 Enum을 사용해 DB에 저장된 특정 타입 값을 확인하고, 일치할 경우 데이터를 처리하는 로직을 작성했습니다. 그러나,..