TIL

    @Transactional 사용시 주의점(+ @Async, 같은 Class 내에서 사용하는 경우)

    @Transactional을 사용하면서 마주쳤던 특이사항에 대해 정리한다.1. @Async와 함께 사용하는 경우(ThreadLocal)2. 같은 Class 내에서 사용하는 경우(AOP)로 나뉜다. @Async와 함께 사용하는 경우@Transactional이 붙은 메서드에서 다른 메서드를 호출하는데 그 메서드를 비동기로 호출해야 하는 일이 생겼다. 호출하는 메서드에 @Async를 붙여서 비동기로 호출해주려는데 Exception이 나면 Rollback 되어야 하는 @Transactional annotation이 잘 동작하지 않는다. 왤까?  간단한 코드로 확인해보자.// 예시를 위해 만든 간략한 코드라 실제로 돌아가지는 않음class TestService { private final TestReposi..

    @Transactional 개념, 사용법

    이번 포스팅에선 트랜잭션의 개념과 스프링에서 @Transactional 어노테이션을 통해 트랜잭션 관리를 하는 방법을 알아본다.트랜잭션?트랜잭션은 데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위이다. 예를 들어, A가 B에게 돈을 송금한다고 해보자. A의 계좌에서 돈을 차감하고, B의 계좌에 돈을 추가하는 과정은 하나의 작업의 단위이다. 둘 중 하나가 실패했을 경우 전체가 원상태로 돌아가야(rollback)하고 두 작업이 모두 완료되어야 성공(commit)되어야 한다. 이 작업의 단위를 트랜잭션이라고 한다. 우리는 보통 트랜잭션의 특징을 말할 때 줄여서 ACID라고 말한다.원자성(Atomicity)트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다.일관성(..

    MapStruct (+ ModelMapper, Reflection) 사용법

    MapStruct란 Entity를 DTO로 변환하거나 DTO를 Entity로 변환하려고 할 때 사용하는 객체 매핑 라이브러리다.이 라이브러리가 어떻게 사용되게 되었는지 기존 개발 방식부터 보면서 알아본다.Getter, Setter, Builder 패턴기존에 우리는 객체 매핑을 해줄 때 getter, setter 혹은 builder 패턴을 이용해 매핑 처리를 해줬다.// getter, setter로Member member = new Member();member.setName(memberDto.name());member.setEmail(memberDto.email());// builder 패턴으로return Member.builder() .name(memberDto.name()) .email(memberDt..

    CQRS(Command Query Responsibility Segregation) 패턴

    CQRS 패턴이란?Command Query Responsibility Segregation의 약자로 명령 조회 책임 분리로 해석된다. 조금 더 쉬운 말로 하면 데이터 저장소에 대한 읽기(R) 및 업데이트(CUD) 작업을 구분하는 패턴이라는 의미다. Read 작업을 하나로 묶고, Create, Update, Delete 작업을 하나로 묶는다! 왜 CQRS 패턴을 사용하게 되었을까? 이는 R과 CUD의 서로다른 특징 때문이다. 기존의 아키텍처(하나로 되어있는)에서는 R과 CUD의 구분없이 동일한 데이터 모델을 사용한다. 간단한 CRUD 작업에서는 이 방식이 좋을 수 있다. 하지만 만약 애플리케이션이 복잡해진다면? Read는 보통 일반적인 CUD의 DTO와 다르게 생긴 DTO를 return 한다(필요한 데이터..

    템플릿 메소드(Template method) 패턴

    템플릿 메소드(Template method) 패턴이란?템플릿 메소드 패턴은 행위패턴 중 하나로, 전체 구조에서 공통적인 부분을 제외한 특정 작업을 처리하는 일부분만 서브 클래스에서 각각 재정의하는 패턴이다. 간단하게 예시를 들어 말하자면, A와 B라는 작업이 있으면 추상 클래스에 알고리즘의 공통되는 부분은 구현을 해놓고 A, B 각각이 다른 작업은 추상 메소드로 재정의하는 것이다.위의 이미지를 보면 상위 클래스에 step1~4를 실행하는, 즉 골격을 잡는 templateMethod()가 있고 이 클래스를 상속받는 ConcreteClass1, ConcreteClass2는 step1~4 중 필요한 것만 오버라이드 해서 재정의하고 있다.템플릿 메소드 패턴의 장단점?장점중복 코드를 줄일 수 있다.자식 클래스의 ..

    Express 폴더 구조

    Express 폴더 구조 Express로 개발을 하면서 느꼈던 장점 중 하나가 자유도가 높다는 점이다. 폴더 구조나 툴, 미들웨어 등 선택할 수 있는 폭이 넓다. 하지만 큰 규모의 프로젝트를 해본적이 없는 나에겐 틀이 없다는게 더 어렵게 느껴졌다. (그래서 어느정도의 구조가 정해져 있는 nestjs가 나온걸수도..!) 그래서 검색을 해보다가 nestjs라는 좋은 프레임워크를 발견했지만 이미 개발을 시작한 상황에서 프레임워크를 변경하기는 어려웠다. + nestjs에 대해 조금 훑어보다가 Spring의 구조와 비슷한걸 깨달았다. 최근에 Spring을 공부하고 있는데 처음에는 구조 파악이 어려웠는데 이제 뭔가 느낌을 알 것 같은 그런 느낌..!! 프로젝트 초반에 가장 고민했던 부분은 프로젝트 구조였다. 어떤 ..

    Swagger 간단 사용법

    Swagger 프런트엔드와 협업을 하는 과정에서 api 명세는 노션에 기록하고 있었다. 초반에 개발할 당시에는 api의 개수가 많지 않아 부담감이 적었지만 그 수가 많아지면서 앱서버도 개발해야하는 입장이 되자 혼자서 감당하기 힘들겠다는 생각이 들었다. 매번 노션에 들어가서 api의 명세를 바꾸는 것도 비효율적이라는 생각이 들었고, 혹시라도 빼먹게 되면 프런트 개발자 입장에서 매우 힘들어질 것이기 때문이다. 따라서 개발할 때는 호다닥 개발을 하더라도 후에 유지 보수를 할 때 상당한 시간 소모가 있을 것이다. 이런 문제를 깨닫고 분명 우리 개발자들은 무언가를 개발해 놓았을 것이다라는 생각이 들어 구글링을 해보았다.역시!api 명세를 위한 툴인 "swagger"라는 것이 있었고 이미 큰 기업부터 작은 스타트업..

    애자일 방법론, HTTP 상태코드

    >애자일 방법론 - 스크럼Rest API를 위한 HTTP 상태 코드 오랜만에 기말고사를 끝내고 돌아와서 다시 TIL작성을 시작한다.오늘은 이번에 개발팀에 도입하게된 애자일 방법론 중 스크럼, 그리고 Rest API 응답코드에 대해서 써봐야지.애자일 방법론 - 스크럼짧았던 몇 개월동안 새로운 프로젝트를 진행하면서 느꼈던 것은 일정관리가 쉽지 않다는 것이다. 기획과 디자인이 완성된 상태에서 시작한 것도 아니고 기존 사이트의 유지보수도 함께 진행해야해서 예상했던 일정에서 계속 고쳐나가야 했다. 학교 중간, 기말고사까지 겹쳐 일정이 밀리고 밀리는 과정에서 '아.. 대책이 필요하다'라는 생각이 들었다. 소프트웨어 공학이라는 수업에서 배웠고, 정보처리기사에서 한번 더 공부한 애자일 방법론이 생각났다. 빠른 반복 작..