반응형
[Spring] @Transactional이 동작하지 않는 이유와 Spring AOP
·
BackEnd
오늘은 Spring AOP에 대해 글을 써보려 한다.Spring AOP가 어떤 방식으로 프록시를 사용하는지 알아보자. 재고 차감 시나리오익숙할만한 코드를 하나 준비했다. 사용자가 주문하면 재고를 차감시키는 로직이다.@Service@RequiredArgsConstructorpublic class OrderService { private final OrderRepository orderRepository; private final ProductRepository productRepository; public void order(Long productId, int quantity) { // 1. 주문 정보 저장 Order order = createOrde..
[DDD] 코드를 기술적 관심사와 분리하기
·
프로그래밍/객체지향 설계
도메인 주도 설계(DDD)는 현실 세계의 문제를 도메인 중심의 코드로 모델링하는 접근이다.핵심은 기술보다 해결 규칙에 집중하는 것이다. 그런데 실제 코드를 작성하다 보면, 우리는 종종 코드로 명시적인 로직을 작성하기보다 DB나 외부 시스템에서 제공하는 메서드로 한번에 해결하고는 한다. 아래 코드를 한번 보자.public class UserService { private final UserRepository userRepository; public void ValidateNewUser(String email) { if (userRepository.existsByEmail(email)) throw new DuplicateEmailException(); }} 회원가입을 시도했을 때..
항해 플러스 백엔드 과정 후기
·
프로그래밍/후기
8월 쯤부터 퇴사를 해야겠다고 생각했고, 타협 끝에 11월에 회사를 퇴사했다.퇴사하기로 결정하고나서 면접도 많이 보았다. 면접을 보며 자기객관화도 많이 된 것 같다. 면접을 보며 깨달은 것들면접을 보며 실력이 부족함을 많이 느꼈다.내가 주로 해온 업무들에 대해서는 나름 대답할 수 있었지만, 그 외에는 대답하기 힘들었다. 특히, 공부만으로는 내 것이 될 수 없다는 걸 절실히 깨달았다.이론적으로는 알고 있어도, 실제로 업무에 적용해보지 않으니 면접에서 제대로 설명하기 어려웠다. 그러면 내 것으로 만들려면 어떻게 해야 할까?스스로 공부하는 법을 잘 모르기에, 다른 사람들과 함께 성장하는 것이 필요하다고 느꼈다. 항해를 선택한 이유내가 항해를 선택한 이유는 크게 두 가지다. 1. 개발자들과 네트워킹을 하고 싶어..
항해99 백엔드 플러스 1주차 회고 - TDD
·
프로그래밍/기타
들어가기전에...10월까지 일하고 퇴사 후 약 한달정도 쉬었네요.퇴사 직전에 남은 휴가 몰아쓰고 일주일정도 개발엔 손도 안대고 쉬었던거 같습니다. 퇴사를 결심하게 된 원인은 건강 문제가 컸습니다. 개발 업무 자체에 불만은 없었지만 업무 외적으로 스트레스가 쌓였고 공황장애로 이어지더라고요.재직중에 이직하는게 가장 좋다지만 그게 건강보다는 중요하지 않다고 생각했어요. 그래서 제 상태를 인지하자마자 퇴사 결정을 하였습니다. 퇴사 후에 몇 번의 면접을 진행하였는데요. 신입때의 면접과는 많이 달라져있었습니다.크게 두 가지가 체감되었는데요.- 과제에 테스트 코드 작성이 거의 필수로 들어간다.- 대용량 트래픽에 대한 동시성 제어에 대한 질문이 많다. (이건 경력 면접이라 그럴지도..?) 동시성 제어는 그렇다 쳐도 ..
[Nest.js] 데코레이터로 트랜잭션 주입해보기
·
BackEnd/Nest.js
Spring에서는 @Transactional을 이용해 트랜잭션 사용이 가능하다.이는 DB 라이브러리 개발자들이 Spring의 트랜잭션 추상화에 맞게 구현했기 때문이다.하지만 Nest.js는 트랜잭션 관련한 추상화된 스펙을 제공하지 않는다.그렇기에 라이브러리에서 제공하는 트랜잭션 명세에 전적으로 의존하게 된다.예를 들면 Prisma의 트랜잭션 사용 방법은 다음과 같다. import { Injectable } from '@nestjs/common';import { PrismaService } from '../prisma.service';import { User } from '@prisma/client';@Injectable()export class UserService { constructor(privat..
[Nodejs] 비동기 API라고 해서 다 같은 비동기가 아니다.
·
BackEnd/Node.js
비동기 API를 이용할 때 Promise.all로 비동기 요청을 병렬 처리하는 경우가 많다.그런데 병렬 처리시 어떤 비동기 API를 사용하느냐에 따라서 몇몇 요청이 지연되는 케이스가 생길 수도 있다. 비동기 API 처리 과정Nodejs에서 비동기 처리는 libuv 라이브러리가 담당한다.libuv는 비동기 요청이 들어오면 커널단에서 비동기적으로 처리가 가능한지 확인한다. 커널에서의 비동기 처리 가능 유무에 따라 다음과 같이 동작한다.- 커널에서 비동기 처리 지원 O -> 메인스레드에서 커널에 비동기 작업 요청- 커널에서 비동기 처리 지원 X -> 스레드풀의 스레드에서 커널에 동기 작업 요청 libuv는 비동기 요청에 대해서 non-blocking 방식으로 시스템콜을 날린다.(non-blocking 방식이기..
[딥러닝] 퍼셉트론과 신경망
·
프로그래밍/기타
딥러닝은 사람의 신경망을 모방하여 구현한다. 신경망에 대해 알아보기 전에 더 단순한 퍼셉트론부터 알아보자. 퍼셉트론이란? 퍼셉트론은 다수의 신호를 받아서 하나의 신호를 출력하는 알고리즘이다. 출력하는 신호는 0 혹은 1이다. (이진 출력) 아래 그림은 2개의 신호를 받는 퍼셉트론의 예다. 가중치 입력 신호와 가중치를 이용하여 출력을 내는데, 이때 사용되는 함수를 활성함수라고 한다. 퍼셉트론의 활성함수는 아래와 같다. 가중치가 큰 신호일수록 출력 신호에 주는 영향도 클 것이다. 즉, 가중치는 입력 신호의 중요도를 결정한다. 편향 하지만 실제 구현에서는 가중치 외에도 편향이라는 값을 사용한다. 위 식에서는 θ가 편향에 해당한다. 편향을 좌변으로 옮기면 -θ가 되는데, b라는 변수로 치환하여 아래와 같이 표..
[Flutter] CERTIFICATE_VERIFY_FAILED 에러
·
프로그래밍/발생한 에러들
플러터에서 개인 서버와 https 통신중에 에러가 발생했다. 에러 내용을 보면 unable to get local isser certificate 라고 한다. 이 에러는 요청하는 서버의 인증서가 유효하지 않다는 것이다. 처음에는 인증서 자체가 잘못된 줄 알았다. 하지만 Postman으로 요청 보내면 문제 없이 잘 되더라... 스택오버플로우나 구글링을 해보면 아래와 같은 코드를 본 경우도 있을 것이다.class MyHttpOverrides extends HttpOverrides{ @override HttpClient createHttpClient(SecurityContext? context){ return super.createHttpClient(context) ..badCertificateCallback..
NestJS v10.0.0 redis 에러 이슈
·
BackEnd/Nest.js
Nest can't resolve dependencies of the RedisCoreModule (Symbol(REDIS_MODULE_OPTIONS), ?). Please make sure that the argument ModuleRef at index [1] is available in the RedisCoreModule context. NestJS v10.0.0 부터 발생하는 이슈다. 이와 관련한 이슈에 대한 해결책으로 대부분의 블로그에서 nestjs-redis 모듈 대신 @liaoliaots/nestjs-redis 사용하라고 권하고 있다. https://www.npmjs.com/package/@liaoliaots/nestjs-redis 그런데 이 모듈 또한 에러가 발생했고, 레포지토리 이슈를 보..
사이드 프로젝트에 사용하기 좋은 서비스
·
프로그래밍/기타
요즘 사이드 프로젝트를 진행하고 있다. 일도 바쁘고 시간이 지날수록 자꾸 늘어져서... 개발 속도가 점점 늦어지고 있다. 리프레쉬 겸 상용 서버에서 사용할 인프라좀 찾아보고 있다. 사이드 프로젝트에서 배포를 고려할 때 가장 큰 문제는 역시 비용이다. 나 역시 비용을 고려하며 쓸만한 서비스가 있나 찾아보았다. 오늘은 내가 찾아본 정보들을 정리해보려 한다. 최대한 간단하게 적을 것이므로 대략 이런 서비스가 있구나 하고 훑어보면 좋을 것 같다. 어차피 프리티어 혹은 바로 윗 단계의 비용을 지불할 가능성이 높다고 생각하기에 비용 정책은 따로 설명하지 않겠다. Firebase, Vercel과 같이 널리 알려진 서비스는 제외하고 서술한다. Server Supabase Supabase | The Open Source..
[JS] bytecode로 분석해보는 var, let, const 호이스팅
·
BackEnd/Node.js
해당 글은 node v16.13.0을 기준으로 작성되었습니다. 본인이 사용하는 node 버전에 따라 인터프리터가 생성하는 바이트코드가 달라질 수도 있습니다. 일반적으로는 var는 호이스팅이 되어서 중복 선언이 가능하다고 알려져있고, let, const는 호이스팅이 되지 않아 중복 선언이 되지 않는다고들 알고 있다. 여기서 더 나아가서 let, const가 호이스팅이 되지만 TDZ에 의해서 변수가 초기화되기 전까지는 접근이 불가능하다는걸 알고 있는 사람들도 많을 것이다. 그러면 여기서 더 더 나아가서, v8 엔진이 자바스크립트 코드를 어떻게 해석하길래 호이스팅이나 TDZ가 우리가 생각하는대로 동작하는지 알아보자. 바이트코드를 출력하기 위해서는 --print_bytecode 옵션을 이용하면 된다. ex) n..
git push 취소하기 (push한 커밋 되돌리기)
·
프로그래밍/git
가끔 협업하다가 브랜치 따는걸 깜빡하고 main에 push하는 경우가 있다. 시간을 되돌려 과거로 돌아가보자. 아래 명령어를 이용하면 push하기 직전의 커밋으로 돌아갈 수 있다. git reset --mixed HEAD^ git push --force 이제 브랜치를 생성해서 git add부터 다시 진행하자. 1. 만약 커밋 변경 내역까지 싹 날리고 싶으면 위의 명령어에서 --mixed => --hard 로 바꾸던가 하면 된다. 2. 커밋 히스토리를 1개가 아닌 2개 이전으로 날리고 싶으면 HEAD^ => HEAD~2 로 바꾸면 된다. (3커밋 전으로 가고싶으면 HEAD~3)
반응형