Loading...
2022. 6. 26. 15:50

[Spring] OSIV로 알아보는 Spring Transaction 헤짚기

Spring boot에는 spring.jpa.open-in-view라고 하는 옵션이 있습니다. 이 옵션은 JPA의 OSIV 기능을 ON/OFF 할 수 있는 옵션인데요. 이 옵션이 무엇인지 알아보도록 하겠습니다. OSIV 먼저 이 옵션은 JPA의 OSIV 기능의 사용 유무를 나타내는데, OSIV란, 영속성 컨텍스트를 View까지 열어두는 기능입니다. 영속성 컨텍스트가 무엇인지 잘 모르시겠다면 아래 글을 참고해보세요. 2020.06.23 - [Programming/Spring] - [Spring] JPA의 영속성 컨텍스트와 생명주기 [Spring] JPA의 영속성 컨텍스트와 생명주기 Spring Framework를 이용하여 웹 애플리케이션이나 서버 애플리케이션을 개발할 때 사용하는 DB 라이브러리가 있습니다..

2022. 5. 16. 22:06

[Spring] Spring Advice로 커스텀 어드바이스 만들기

이번 포스트부터는 Spring AOP 컴포넌트를 이용하여 실제 Advice를 만들어보고, 위빙하는 시간을 가져보겠습니다. Advice Interface Advice에 대해 다시 복습해보자면 Advice는 특정 조인포인트 즉, 메서드가 호출되는 시점에 실행할 코드를 정의한 것입니다. ProxyFactory 클래스에서 addAdvice 메서드를 이용해 어드바이스를 직접 추가하는 방법과 Advisor 구현체를 addAdvice에 전달하여 간접적으로 추가하는 방법이 있었죠. 두 방법에 차이가 있다면 어드바이스와 달리 Advisor는 관련 PointCut과 함께 어드바이스를 전달한다는 점이 있습니다. PointCut은 실제 어드바이스를 언제 실행할지를 정하는 AOP 용어로 어드바이스를 실행할 지점을 상세하게 지정..

2022. 5. 15. 22:37

[Spring] Spring AOP - Spring에서는 AOP를 어떻게 이용할까?

앞서 우리는 AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)에 대한 기본과 개념에 대해 알아봤습니다. 만약 읽어보지 못했다면 이 글을 읽기 전 반드시 읽어보시길 권장드립니다. 2022.05.14 - [Programming/Spring] - [Spring] AOP (Aspect-Oriented Programming) 기본과 개념 [Spring] AOP (Aspect-Oriented Programming) 기본과 개념 Spring에는 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)이라는 핵심 기능을 제공합니다. 음? OOP(객체 지향 프로그래밍)라는 것은 들어봤는데, AOP는 무엇일까요? AOP vs OOP ? 관점 지향 프로그래밍 blog..

2022. 5. 14. 20:21

[Spring] AOP (Aspect-Oriented Programming) 기본과 개념

Spring에는 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)이라는 핵심 기능을 제공합니다. 음? OOP(객체 지향 프로그래밍)라는 것은 들어봤는데, AOP는 무엇일까요? AOP vs OOP ? 관점 지향 프로그래밍(AOP)은 애플리케이션에서 코드가 중복되고 강력하게 결합되어 다른 로직과 분리할 수 없는 애플리케이션 로직들을 별도의 관심사로 분리하여 모듈회 하는 프로그래밍 방법입니다. 우리는 보통 이러한 로직을 만났을 때 코드를 복제하여 의존성을 만들게 되는데, AOP는 이러한 의존성 없이도 동작하게 해줍니다. 대표적으로 logging 코드들이 여기에 해당합니다. 그렇다면 AOP와 OOP는 서로 경쟁하는 관계인가요? 그것은 아닙니다. 왜냐하면 우리는 OOP만을 가지고 ..

2022. 5. 5. 20:30

[Spring Data] @Transactional 어노테이션으로 보는 Spring의 트랜잭션 이야기

Spring을 한 번 쯤 사용해보셨다면 Transactional 어노테이션에 대해 알고계실 것입니다. 그런데 무작정 썼을 땐 DB랑 연결하고 객체 데이터를 영속할 때 이거 쓰면 돼. 라고 생각하시는 분들이 계셨을 것입니다. 하지만 실제로 이 어노테이션을 사용했을 때와 그렇지 않았을 때 왜 이런 차이가 발생하는지에 대해 한 번 쯤 궁금증을 가져보신 분들이 계신다면 이 글을 차분히 읽어 보셨으면 좋겠습니다. Transaction 트랜잭션에 대해서는 다른 글에서도 충분히 언급되어 있는 내용이지만 여기서 한 번 더 설명을 드리면, 데이터베이스의 트랜잭션을 이야기하며 DBMS 혹은 그 유사한 시스템에서 발생하는 연산들의 상호작용 단위입니다. 좀 더 쉽게 설명을 해보면, 우리는 데이터 하나를 영속하거나 변경하기 위..

2022. 2. 21. 22:35

[Spring boot] Axon Framework로 시작하는 CQRS 기초

많이 미루어진 Axon Framework에 대해 알아보도록 하겠습니다. 이 포스트를 다루기 전에 아주 오랜 시간 전, MSA의 트랜잭션 이야기 중 이벤트 소싱과 CQRS에 대해 다뤄본 적이 있습니다. 해당 내용을 먼저 숙지하신 다음 진행해보는 것을 권장합니다. 2021.03.21 - [Architecture/MSA] - [MSA] 7. MSA의 트랜잭션 이야기 3 - 이벤트 소싱과 CQRS [MSA] 7. MSA의 트랜잭션 이야기 3 - 이벤트 소싱과 CQRS 이벤트 소싱을 처음 접하게 된 것은 2017 SpringCamp에서였습니다. 당시에는 MSA라는 개념에 대해 잘 알지도 못했고, MSA는 대기업에서나 쓸 수 있고, 적용가능한 엄청나게 큰 아키텍처였다. 라고만 인 blog.neonkid.xyz Ax..

2022. 1. 8. 22:55

[Spring Data] Spring Data JDBC를 이용한 다양한 ID 전략과 수동 ID 전략 구현시 주의점

최근 Kotlin + Spring Boot + Spring Data JDBC 조합으로 해당 기술 스택을 이용해 DDD 개발 방법론에 대해 복습하고 있습니다. 현업에서 Python을 사용하다보니 Spring에 대한 지식이 많이 떨어졌다는 것을 느꼈는데요. 평소 Spring Data JPA라는 ORM을 사용하여 데이터베이스 연결 기반의 서버를 만들었었는데, DDD를 접하게 되면서 Command와 Query 분리에 대한 중요성을 깨닫고 ORM이 아닌 가급적 JDBC와 같은 DB API를 직접 사용하는 경우가 잦게 되었습니다. 이에 따라 JPA가 아닌 Spring Data JDBC를 사용하게 되었습니다. 그런데, 우리가 데이터베이스 연동 작업을 하다보면 각 Row에 해당하는 고유값인 ID를 생성해야 할 때가 있..

2021. 6. 19. 22:35

[Spring Data] Spring Data JDBC를 이용한 DB 연동 (응용편)

지난 글에서 우리는 Spring Data JDBC를 이용해 간단한 쿼리를 조회하고 이를 테스트 코드로 만드는 시간을 가져봤습니다. 이번 글에서는 두 개의 테이블이 서로 관계를 가진 경우에 어떻게 데이터를 가져올 수 있는지에 대해 알아보겠습니다. Entity 이번 글에서 사용할 테이블 구조는 아래와 같습니다. 블로그에서 흔히 볼 수 있는 포스트와 코멘트입니다. 포스트에 블로그의 게시글이 달리면 그 댓글을 달 수 있는 형태로 하나의 글을 조회했을 때 댓글을 같이 부를 수 있는 예시를 담아보도록 하겠습니다. SQL script flyway에 아래의 SQL script를 입력해줍니다. 지난 글에서와는 달리 PRIMARY KEY의 생성 방법이 조금 다른데, CONSTRAINT 쿼리를 이용하면 자신이 직접 해당 키..

2021. 6. 5. 22:36

[Spring Data] Spring Data JDBC를 이용한 DB 연동 (기본편)

Spring Data JDBC는 우리가 일반적으로 알고 있는 Spring JDBC와는 조금 차이가 있습니다. JDBC 템플릿은 쿼리를 직접 입력하고 우리가 이들의 함수 형태를 직접 인터페이스로 구현해야 하기 때문에 손이 많이 갑니다. 따라서 이들을 Spring Data Commons를 바탕으로 재구성한 것이 바로 Spring Data JDBC 입니다. Background of Spring Data JDBC 우리는 이전 글에서 Spring Data Commons가 무엇인지를 알아봤습니다. 스프링에서 데이터를 다루기 위해 기본적으로 구현되어 있는 CRUD의 추상화 레이어를 만든 것이 바로 Spring Data Commons 인데요. 이를 바탕으로 JPA를 넣은 것이 바로 Spring Data JPA입니다. ..

2021. 5. 29. 20:13

[Spring Data] Spring Data module

스프링을 사용하다보면 이런 의문점이 있습니다. JPA는 JPA인데, Spring Data JPA는 무엇이며, JDBC는 JDBC인데, Spring Data JDBC는 무엇인가? JPA를 사용하는 것과 Spring Data JPA를 사용하는 것은 분명히 다른점이 있습니다. 일목요연하게 말하자면 Spring Data JPA를 몰라도 JPA를 배우는 데 큰 지장은 없지만 JPA를 모르는 상태에서 Spring Data JPA로 넘어오는 것은 마치 이론 없이 라이브러리를 쓰는 것과 동일합니다. 이처럼 Spring Data가 앞에 부튼 디펜던시들은 무언가 Spring에 최적화 되어 있는 느낌입니다. 그렇다면 Spring에서 제공하는 Spring Data Pattern은 어떤 것일까요? Spring Data Spri..

2021. 5. 16. 10:25

[Spring boot] Spring 테스트 방법과 @SpringBootTest

서버 애플리케이션에서는 테스트 코드를 어떻게 구현해야 할까요? 제가 처음 서버 애플리케이션을 개발하고 나서 테스트 코드를 구현했을 때 가장 큰 의문점이 들었던 유형이었습니다. 클라이언트 개발로 안드로이드 개발을 진행했을 때는 Unit Test와 Instrument Test 두 가지를 진행했고, 각각 DB I/O 테스트와 UI/UX 동작 테스트를 진행한 것이었습니다. 그렇다면 서버 애플리케이션은 어떨까요? 대표적인 Spring boot를 이번 포스트에서 다뤄볼텐데, Spring boot에서는 JUnit 이라는 테스트 도구와 Mockito라는 Mock 객체 생성 라이브러리를 이용하여 테스트를 진행할 수 있고, 테스트 방법에 따라서 3가지로 분류할 수 있습니다. Spring boot의 테스트 분류 https:..

2021. 3. 27. 14:24

[Spring boot] Axon Framework 맛보기

이번 포스트부터 Spring을 이용한 CQRS에 대해 적어보도록 하겠습니다. 몇 파트가 지난 포스트에서 우리는 MSA의 트랜잭션 이야기 중 이벤트 소싱과 CQRS에 대해 이야기 하였습니다. 2021.03.21 - [Architecture/MSA] - [MSA] 7. MSA의 트랜잭션 이야기 3 - 이벤트 소싱과 CQRS [MSA] 7. MSA의 트랜잭션 이야기 3 - 이벤트 소싱과 CQRS 이벤트 소싱을 처음 접하게 된 것은 2017 SpringCamp에서였습니다. 당시에는 MSA라는 개념에 대해 잘 알지도 못했고, MSA는 대기업에서나 쓸 수 있고, 적용가능한 엄청나게 큰 아키텍처였다. 라고만 인 blog.neonkid.xyz CQRS와 이벤트 소싱에 대한 개념은 제대로 이해되었지만 이에 대한 구현을 ..

2020. 8. 26. 13:00

[Spring] Jib(지브)를 이용한 Docker 이미지 만들기

https://blog.neonkid.xyz/228 [Spring boot] 애플리케이션을 Docker 이미지로 만들기 Old & New Spring boot로 개발한 서버를 운영하기 위해서는 인스턴스에 서버 애플리케이션을 배포해야 합니다. 애플리케이션을 배포하는 방법에는 WAS로 배포하는 방법도 있지만 Docker 컨테이너 이미지를 만�� blog.neonkid.xyz 위 포스트에서 두 가지 방법을 이용해 Spring boot 애플리케이션을 Docker 이미지로 만들 수 있었습니다. 그러나 Dockerfile을 직접 작성하기에는 스크립트를 작성하기 어려운 분들한테는 러닝 커브가 부담이었다는 것이 다소 아쉬웠던 부분이었는데요. Google Jib 위와 같이 보통 Docker 이미지를 만들고자 한다면, 프..

2020. 8. 25. 21:43

[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 3 - 국내 포털 인증

지난 포스트에서 기존의 User Entity 혹은 애플리케이션의 User Entity와 연동하여 OAuth2 인증을 사용하는 방법에 대해 다뤄봤습니다. Spring boot Security에서는 기본적으로 Google, Facebook 등의 해외 소셜 로그인 API를 지원하며 우리는 지원해주는 메소드를 잘 이용하여 Key와 Client ID만 넣어주면 쉽게 OAuth2 인증을 구현할 수 있었습니다. 그런데, NAVER, Kakao 등 국내 포털 사이트의 OAuth2 인증을 구현하려면 어떻게 해야 할까요? NAVER, Kakao API를 이용한 OAuth2 인증 Spring boot Security에서는 공교롭게도 국내 포털 OAuth2 인증에 대한 구현체를 제공해주지 않습니다. 따라서 이들 OAuth2 ..

2020. 8. 16. 20:10

[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 2 - User Entity 연동

웹 서비스를 개발하게 된다면, 기본적으로 갖춰져야 할 것은 바로 사용자 인증일 것입니다. 우리 서비스에 가입한 사용자인지를 구분해야 한다는 점과 더불어, 단골인지, 아닌지 등이나 사이트를 관리하는 관리자 등을 구분하는 데 있어, 사용자 인증은 필수적인 요소라고 할 수 있습니다. 그러나 서비스에 있어 가장 번거로운 것은 사용자 등록을 위한 회원 가입일 것입니다. 왜냐하면 사용자가 서비스를 이용하기 위해 자신의 개인 정보를 입력해야 하고, 본인 인증 절차를 거쳐야 하며, 주소와 전화번호 등을 입력함과 더불어, 또 다른 서비스를 이용할 때마다 ID와 비밀번호를 개별적으로 생성하고 관리해야 하기 때문입니다. 이번 포스트에서는 OAuth2 인증을 통해 접속한 사용자들을 저장하는 User Entity를 생성하고, ..

2020. 8. 12. 14:47

[Spring] Argument Resolver를 이용한 유연성 있는 파라미터 처리

서비스를 운영하다보면 다양한 종류의 데이터를 받게 됩니다. 그럴 때마다 Controller 부분에서 이를 전처리하게 되는데, 이렇게 되면 각 Controller에 전처리 해야 하는 코드를 함수화 하거나 Utils 클래스를 만들고, 이를 의존성 주입해서 사용하는 방법이 그나마 코드를 줄일 수 있는 방법입니다. 그러나 Utils를 사용해도 매번 함수를 호출해야 하는 불편함이 있습니다. 그렇게 되면 코드가 중복되고, 이것이 커지면 역시 코드가 난잡해지게 됩니다. Spring에서는 이러한 파라미터를 공통으로 처리할 수 있도록 구현된 인터페이스가 있는데, 그것이 바로 Argument Resolver입니다. Spring Argument Resolver API 엔드포인트로부터 들어온 데이터(파라미터)를 가공하여 필요..

2020. 8. 10. 18:12

[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 1 - Google 계정 인증

지난 포스트에 이어서, 오늘은 새로운 프로젝트를 생성하여 Spring boot Security 디펜던시를 이용해 OAuth2 인증을 구현하는 시간을 가져보고자 합니다. 지난 포스트에서 OAuth2 인증을 구현하기 위해 인증 토큰과 액세스 권한을 얻는 방법에 대해 알아봤습니다. 클라이언트에서 권한 서버를 통해 권한을 확인하고, 부여 받은 ID와 Secret를 이용하여 토큰을 받는 방식이었죠. 이를 토대로 Spring boot security를 이용하여 회원 가입과 인증을 동시에 어떻게 구현할 수 있는지 지금부터 살펴보도록 하겠습니다. 이 포스트는 기본 애플리케이션으로 하여금, OAuth2 로그인부터 User Entity 연동까지 다룰 것이며 이번에 다룰 것은 기본적인 Spring boot security ..

2020. 8. 7. 15:22

[Spring boot] Spring boot Security로 시작해보는 인증

Spring Framework를 이용하여 웹 서비스나 REST API 서비스를 개발하게 되면 가장 필요로 하는 것은 바로 인증일 것입니다. 여기서 말하는 인증이란, 내가 개발한 서비스를 이용하기 위해 식별하고자 하는 사용자 혹은 관리자라고 할 수 있습니다. 일반적으로 Spring을 이용해서 인증 로직을 구현하고자 한다면, JPA를 이용해 사용자 Entity를 만들고, 연동하여 아이디와 패스워드를 동기화 한 후, 권한을 부여하는 방식으로 로직을 구현할 수 있을 것입니다. 그런데, 이를 직접 구현하지 않아도 이미 잘 만들어진 모듈이 있습니다. 그것이 바로 Spring boot Security입니다. 이번 포스트에서는 Spring boot Security를 왜 사용해야 하는지, 사용하기 위해 어떤 개념들을 공..