Loading...
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. 4. 24. 17:49

[FastAPI] 14. SQLAlchemy의 One-to-Many, Many-to-Many, Self referential relationship

지난 포스트에서는 단순 Column 데이터와 그리고, 단일 외래키 하나의 관계 데이터를 Pydantic으로 매핑하여 Serialize/Deserialize 하는 것에 대해 알아봤습니다. 이번 포스트에서는 Many-to-Many, One-to-Many 형태의 Foreign Key가 걸려 있는 관계형 데이터를 Join해서 가져올 떄 어떻게 Pydantic 모델과 매핑할 수 있는지에 대해 알아보겠습니다. DB에서 단순하게 접근 지난 포스트에서 사용한 ERD를 그대로 사용해보겠습니다. Category와 Post가 있고, Post는 category_id를 외래키로 사용하고 있습니다. 따라서 카테고리의 데이터를 category 테이블이 가지고 있는건데, 우리가 이 정보를 모두 데이터베이스로 가져오려면 어떻게 해야 ..

2022. 4. 16. 18:06

[Algorithm] 1일 1알고리즘으로 1일 1커밋에 도전하기

코딩테스트를 준비하고 계시거나, 알고리즘 대회를 준비하고 계시는 분들이라면 1일 1알고리즘에 대해 어색하지 않을 것입니다. 그런데, 1일 1커밋을 도전하시는 분들이라면, 나는 오늘 무엇으로 커밋을 해야할까? 라는 고민을 하시게 될텐데요. 매일 알고리즘 풀이는 어렵더라도 가끔 오늘 커밋은 뭐하지? 라는 생각이 들 때가 있다면 1일 1알고리즘 풀이를 해보시는 건 어떨까요? 풀 때마다 일일이 소스 코드를 Git에 올리는건 귀찮아... 예전에 저는 코딩테스트 플랫폼(프로그래머스, 구름, 백준 등)에서 문제를 풀어본 후, 맞은 소스 코드를 별도의 레포지터리를 구성해서 커밋을 했던적이 있습니다. 처음에는 할만했지만 시간이 지날수록 문제를 적고, 어떻게 풀었는지를 일일이 기록하는 것이 늘 귀찮은 일이었고, 결국 언제..

2022. 3. 8. 16:20

[Java] String, StringBuffer, StringBuilder 총정리

오늘은 Java의 String에 대해서 이야기해보겠습니다. Java에는 문자열을 표현하기 위한 3가지 클래스가 있습니다. String StringBuffer StringBuilder 3개 모두 String을 표현하기 위한 클래스이지만 여러분들이 짚어야할 것이 있는데요. 이 3가지는 모두 문자열을 표기하기 위한 것이지만 각자 구현되는 방법이 전혀 다른 클래스들입니다. See Java Reference 자바 레퍼런스 문서에 나와 있는 세 가지의 클래스는 다음과 같이 설명되어 있습니다 String Strings are constant; their values cannot be changed after they are created. String은 상수이며, 값을 만든 뒤에는 변경할 수 없다 (Immutable..

2022. 2. 25. 15:43

[Python] Python Database API - Python에서는 어떻게 DB와 연결할까?

오늘은 기초적인 지식을 돌아보겠습니다.​ 우리가 서버를 개발하다 보면 자연스레 등장하는 것이 바로 Database입니다. 사용자가 요청한 데이터를 저장하는 데도 데이터베이스를 사용하고, 그 데이터를 액세스하는 데도 데이터베이스를 사용하는데, 이 데이터베이스는 도대체 무엇일까요? What is Database ? 데이터베이스, 현대 컴퓨터 프로그래밍(?)을 공부하다보면 자연스레 등장하는 단어입니다. 데이터베이스란, 컴퓨터 시스템에서 전자적으로 저장되고 액세스되는 조직화 된 데이터 모음을 이야기합니다. 한마디로 현실 세계에 존재하는 숫자, 문자 등의 데이터를 전자적으로(메모리, 디스크) 저장하고, 이를 조직화하여 액세스 하는 것이죠. 그럼 DBMS는 무엇일까요? DBMS는 Database Management..

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. 9. 14:18

[Python] anyio - 한 층 더 강화된 비동기 패러다임

어느덧 실무에서 Python 백엔드 엔지니어로 보낸지 1년이 조금 넘었습니다. 많은 고민과 고난, 그리고 이 자리에 오기까지 수많은 반성과 노력으로 파이썬 백엔드 엔지니어로써의 자리를 잡았던 것 같습니다. 오늘 이야기를 위해 단도직입적으로 말씀드리자면 Python은 Java의 Spring과 달리 동기 처리보다는 비동기 처리가 더 나은 빛의 성능을 보인다는 것입니다. 하지만 파이썬의 비동기 패러다임은 그 역사가 매우 복잡하다고 할 수 있을 정도로 수많은 라이브러리가 있고 그 마저도 쓰기 어려운 부분에 속합니다. Coroutine과 asyncio Python의 동시성 처리는 Thread, Process와 같이 동기적인 방법으로 수행되었습니다. 하지만 Process를 이용한 동시성 처리는 Context swi..

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. 11. 9. 10:48

[FastAPI] 13. SQLAlchemy와 Pydantic을 이용한 관계 데이터 매핑

SQLAlchemy를 사용하다보면 원하지 않을 때 API에서 모든 컬럼에 대한 데이터를 받아와 최적화 하기가 어려울 때가 있습니다. 어떤 API에서는 특정 컬럼에 대한 데이터 혹은 관계 데이터가 필요할 때가 있는데, 그렇지 않은 데이터까지 모두 나오게 되어 오히려 API 로딩 속도를 저하시키고 서버 부하에 원인이 되기도 합니다. SQLAlchemy ORM의 relationship SQLAlchemy ORM에서는 관계된 데이터를 가져오기 위해 relationship을 사용할 수 있습니다. 예를 들어 블로그를 하나 만드려는데, 어떤 카테고리의 글인지를 알기 위해서 아래와 같이 데이터를 설계해 볼 수 있습니다. 카테고리는 하위 카테고리를 가질 수 있고, 하나의 컨텐츠는 카테고리 하나를 가질 수 있다라고 했을 ..

2021. 10. 30. 22:24

[FastAPI] 12. Pytest / UnitTest를 이용한 테스트 코드 작성

이번 포스트에서는 Pytest와 Unit Test를 이용하여 FastAPI에서 작성한 API를 테스트할 수 있는 방법에 대해 알아보겠습니다. Pytest Python 언어에서 지원하는 테스트 프레임워크에는 Pytest가 있습니다. Pytest는 Python에서 간단한 코드에 대해 심플하고 간결한 테스트 코드를 작성할 수 있도록 도와주며 다양한 플러그인들을 활용하여 규모가 크고 복잡한 애플리케이션에 대해서도 테스트를 쉽게 할 수 있도록 도와주는 프레임워크입니다. 주요 특징으로 아래와 같습니다. 테스트 코드 실행에 실패할 경우 자세한 정보 표시 지원 테스트 모듈 및 기능을 자동으로 검색해주는 기능 지원 Session과 같은 수명이 긴 리소스를 매개변수화 해주고, 이를 관리하기 위한 매커니즘 제공 unitte..

2021. 9. 26. 11:47

[FastAPI] 11. Dependency Injector를 이용한 의존성 관리

서버 애플리케이션을 개발하다보면 규모가 커지게 되어 이를 효율적으로 관리할 필요가 생기게 됩니다. 이에 적용하는 것으로 대표적인 아키텍처인 Layered Architecture가 있습니다. Layered Architecture는 서버 애플리케이션을 운용하기 위해 사용하는 현대 대표적인 방법으로, Application, Domain, Infrastructure의 3개로 나눌 수 있는데, 이들을 전부 객체 지향 프로그래밍으로 구현하게 되면 각각의 의존성이 늘어나게 되고, 그 로직이 커지면 이 역시 관리가 힘들어집니다. Python에서는 이러한 의존성 관리를 유연하게 하기 위해 다양한 DI 프레임워크가 존재하는데, 그 중에서도 Dependency Injector를 사용 해보고자 합니다. Dependency I..

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. 12:01

[Web] Dropbox / Adobe Photoshop API로 이미지 배경 지우기

개발 번외 글을 작성하는 건 지극히 오랜만인 거 같네요. 이번 포스트에서는 현재 Beta로 제공되고 있는 Adobe Photoshop API를 이용해서 이미지의 배경을 지우는 간단한 방법에 대해 알아보도록 하겠습니다. Adobe Photoshop API https://github.com/AdobeDocs/photoshop-api-docs AdobeDocs/photoshop-api-docs Adobe Photoshop API. Contribute to AdobeDocs/photoshop-api-docs development by creating an account on GitHub. github.com Adobe API는 현재 공개 베타와 비공개 베타 두 가지로 나눠서 진행 중에 있으며 Photostop ..