본문 바로가기
반응형

Develop/Spring+JPA59

[Java] 스프링 부트를 제거해서 생긴 일 😄 개요 깃허브 프로필에 블로그 최신 포스트를 업데이트 시켜주는 간단한 토이 프로젝트를 만들었다. (현재 이 프로젝트는 최소한의 기능만 만들고 업데이트를 중단하고 있다. 나중에 회사 적응이 끝나고 시간적으로 여유가 난다면.. 다시 개선할 예정이다.) 처음에는 Spring Boot를 이용하다가 최대한 간소화 시키기 위해 제거했다. 그 과정 중에서 겪은 오류에 대해서 정리해보려 한다. 자바만으로도 당연히 되겠지, 라고 생각했던 기능 중 알고보니 스프링/스프링 부트가 담당했던 기능! 을 기억해두기 위한 포스팅이다. 👿 jar 파일에서 클래스를 못 찾는다? GitHub Action 스크립트를 작성할 때 jar 파일을 생성하고, 이 jar 파일을 실행하는 형식으로 만들었다. Spring을 적용했을 때는 무사히 동.. 2023. 2. 5.
[Spring/AOP] JDK Dynamic Proxy vs CGLIB Proxy 목차 JDK Dynamic Proxy vs CGLIB Proxy JDK Dynamic Proxy CGLIB Proxy JDK Dynamic Proxy vs CGLIB Proxy Spring AOP와 proxy Spring에서 사용하는 proxy Spring Boot에서 사용하는 proxy 왜 진작 CGLIB을 이용하지 않았을까? 1. JDK Dynamic Proxy vs CGLIB Proxy 💣 Spring에서는 프록시를 이용해 AOP를 지원한다. (AOP를 모른다면 이 링크를 참고하자. Spring의 대표적인 AOP인 @Transactional과 AOP에 대한 간략한 설명을 담았다.) JDK Dynamic Proxy, CGLIB 두 가지 방식을 사용하는데 왜 프록시 종류가 2가지나 있는지, 언제 어떤 .. 2022. 11. 23.
[JPA] @Query와 @Transactional을 꼭 같이 써야하나요?🤔 😄 서론 지난 번에 deleteAll과 관련해 N+1 문제가 발생했었다. 그 과정에 @Query를 이용해 직접 JPQL을 작성하여 해결했는데 (🔗관련 글 링크) 한가지 의문이 생겼다. 해당 문제를 해결하기 위해 다양한 문서들을 찾아보았는데 많은 예제에서 JPQL을 사용할 때 @Transactional 어노테이션을 붙이고 있었다. 안 붙여도 잘 동작하는데 왜 그랬을까? 원인을 찾아보기 시작했다. 😏 Repository 구현체와 트랜잭션 우리가 JPA를 사용해서 ***Repository 클래스를 만들 때 일반적으로 Repository나 JpaRepository를 확장한다. public interface ReminderRepository extends Repository { // ... } Custom Rep.. 2022. 11. 17.
[Spring] @Transactional이 동작하지 않는다?😨 부제: 동일한 bean에서는 @Transactional 적용이 되지 않는다. 핵심 내용 바로가기 😎 문제 상황 줍줍은 자꾸만 사라지는 슬랙 메시지를 백업해주는 서비스입니다. 최근 줍줍에서는 신규 이용자들의 유입을 위해 '워크스페이스 등록'이라는 기능을 추가했습니다. 해당 기능의 확장으로 기존에는 특정 워크스페이스에 초대된 사용자들만 서비스를 이용할 수 있었지만 이제는 누구든지 워크스페이스를 등록하고 이용할 수 있게 되었습니다. 해당 기능을 추가하며 팀 내에서 워크스페이스 등록하면 바로 로그인이 되게 만들 것이냐, 로그인 과정을 따로 거치게 만들 것이냐에 대한 논의가 있었는데요. 기존에는 첫 회원가입 시 위 사진과 같은 절차로 로그인을 진행하고 있었습니다. 사실상 사용자는 같은 슬랙 인증을 2번 진행하고 .. 2022. 10. 27.
[Spring Boot] 기본 Logging Framework는 진짜 'Logback'일까? 😮 내 프로젝트에 Log4j 가 있다? 현재 Spring Boot 2.7.1 버전을 사용하고 있다. 로깅 프레임워크에 대한 글을 작성하다가 라이브러리 의존성을 찾아보게 되었다. 그런데 예상 외의 의존성이 발견되었다. (아래 사진 참고) Spring Boot의 디폴트 로깅 프레임워크는 Logback이라고 알고 있는데 저 log4j는 뭘까? 혹시나 버전 업이 되면서 추가된걸까? 라는 의문에 다른 버전도 살펴봤다. 하지만 1.0.0 때부터 이미 존재해왔다. 😎 Spring Boot의 디폴트 Logging Framework 여지껏 log4j2를 적용하려면 spring-boot-starter-logging를 exclude하고 spring-boot-starter-logging-log4j2를 추가해야한다고 알고 있었.. 2022. 10. 13.
[Spring] Local Transaction vs Global Transaction ✨ 트랜잭션 DB 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 한꺼번에 모두 수행되어야 할 일련의 연산들 트랜잭션은 데이터베이스, 메시지 큐 등 다양한 자원에서 다양한 로직을 수행한다. 때로는 여러가지 작업이 한 트랜잭션에서 일어나기를 원할 수도 있다. Java에는 자원에 접근하고 수행하는 여러 방법들을 지원한다. 각 자원마다 따로 로컬 트랜잭션을 수행할 수도 있고 여러 자원들이 한 글로벌 트랜잭션에 참여할 수도 있다. 이 문장이 어떤 의미인지는 앞으로의 글을 읽으며 천천히 이해해보자. 🌏 Local Transaction 로컬 트랜잭션을 한번 알아보기 위해 여러 자원들 중에서도 우리에게 친숙한 JDBC를 이용해서 살펴보자. JDBC는 Java Database Connectivity의.. 2022. 10. 9.
[Spring] 내 테스트에만 stub 적용하기 😈 🐹 서론 🐹 요즘 🐹줍줍🐹의 백엔드 팀에서는 큰 기능을 도입하기 앞서 테스트 코드 리팩터링에 한참 열을 올리고 있습니다. 오늘은 이 테스트 리팩터링을 하다 겪은 일에 대해 포스팅하려 합니다. 이번 리팩터링을 진행하면서 모킹을 제거하는 부분이 있었는데요. 줍줍은 Slack이라는 외부 서비스에 크나큰 의존을 갖고 있습니다. Slack 라이브러리에 대한 의존성을 갖고 있었고 해당 라이브러리를 호출하는 부분은 모킹 처리를 해두었습니다. 인수 테스트를 뜯어 고치면서 생각한 것은 모킹 작업이 계속 반복되고 지루한 작업으로 차지하고 있었습니다. 그래서 이 모킹 작업을 계속 반복할 바에는 스텁용 객체를 하나 생성해서 사용하는 것이 훨씬 편하겠다고 판단하여 모킹을 제거하기 시작했습니다. 🐹 리팩터링 시작 🐹 1. 외부 .. 2022. 10. 3.
[Spring] DispatcherServlet 1. DispatcherSevlet이란? 🌺 🌱 Dispatcher란? dispatch: 보내다 dispatcher: (열차, 버스 등이 정시 출발하도록 관리하는) 운행 관리원 🌱 Servlet이란? 웹 서버 내에서 실행되는 작은 Java 프로그램 일반적으로 HTTP를 통해 웹 클라이언트의 요청을 수신 & 응답 🌱 DispatcherServlet이란? dispatcher + servlet 단어의 조합에서 추측해보면 클라이언트의 요청 수신/응답을 관리하는 작은 Java 프로그램 정도로 추측할 수 있을 것 같다. 스프링의 웹 MVC 프레임워크는 요청 기반(request-driven)이다. 컨트롤러에게 요청을 보내고(dispatch) 웹 애플리케이션 개발에 용이한 기능 등을 제공하는 중앙 서블릿이 존재한다. .. 2022. 9. 28.
[토비의 스프링] Chapter 1. 오브젝트와 의존관계 토비의 스프링을 SQ3R 방식을 도입해 읽는 시도를 하고 있습니다. 목차만 보고 궁금한 점들을 작성한 뒤, 책을 읽고 답변을 정리합니다. ❓ 관심사를 분리해야 하는 이유 👉 요구사항은 끊임없이 변경되고 발전한다. 모든 관심사들이 한 곳에 응집되어 있다면 해당 오브젝트는 끊임없이 변화해야 한다. 추가로 해당 오브젝트를 의존하고 있는 다른 오브젝트에까지 영향이 갈 수 있다. 이 변화의 폭을 최소화하기 위해서 관심사를 최대한 분리해야 한다. ➕ 오브젝트끼리 의존을 제거하면 되지 않을까요? 👉 불필요한 코드의 중복이 많아질 수 있다. 예를 들어 UserDao, BoardDao, CommentDao에서 DB 연동과 관련된 설정이 필요하다고 가정해보자. 모든 Dao에서 DB 연동 코드를 작성할 것인가? DB 연동 .. 2022. 9. 10.
반응형