JpaRepository Save 시, Lock 문제 발생 오류
·
트러블 슈팅
📌 문제 상황토이 프로젝트에서 JPA 엔티티의 PK를 래퍼 클래스 Long으로 지정하고 Repository의 save에 대한 테스트 코드를 작성하던 중, 다음 오류가 발생했습니다.Hibernate: select ue1_0.id,ue1_0.created_at,ue1_0.email,ue1_0.nickname,ue1_0.password,ue1_0.updated_at from users ue1_0 where ue1_0.id=?Hibernate: select ue1_0.id,ue1_0.created_at,ue1_0.email,ue1_0.nickname,ue1_0.password,ue1_0.updated_at from users ue1_0 where ue1_0.id=?Row was updated or delete..
[3주차 발자국] 스프링과 테스트 코드
·
인프런 워밍업 스터디
📌 3주차 강의Spring & JPA 기반 테스트레이어드 아키텍처와 테스트레이어를 구분하는 이유 ⇒ 관심사의 분리!스프링과 JPA라는 기술 자체가 중요한 것이 아니라,무엇을 어떻게 테스트 할 것인지가 중요하다.통합 테스트여러 모듈이 협력하는 기능을 통합적으로 검증단위 테스트만으로는 기능 전체의 신뢰성을 보장하기 어렵다.풍부한 단위 테스트 & 큰 기능 단위를 검증하는 통합 테스트Spring / JPA 훑어보기 & 기본 엔티티 설계Library vs Framework라이브러리는 내 코드가 주체가 된다.프레임워크에서는 코드를 작성해서 끼워넣는다.SpringIoC : 객체의 생명주기에 대한 관리를 제 3자가 한다.DI : 컨테이너가 주입해준 객체를 사용한다.AOP : 코드 상으로 흩어져있는 부가적인 앞뒤로 해..
인덱스를 통한 받은 편지 조회 개선하기
·
데브코스
Boltter 서비스는 익명으로 편지를 주고받을 수 있는 서비스입니다. 작성된 편지는 여러 사람들에게 추천되기 때문에 하나의 편지는 많은 사용자에게 전송될 수 있습니다. 이러한 도메인 규칙에 의해 편지 작성 요청보다 편지를 조회하는 요청이 더 많다고 판단하여, 개발 기간이 종료되었지만 받은 편지 조회 성능을 개선해보고자 합니다.실제 서비스에서는 사용자와 편지를 주고받는 데이터의 양이 적기 때문에 조회 요청에 대한 응답이 빠르게 이루어집니다. 따라서, 테스트를 위한 데이터를 삽입하여 편지 조회 성능을 개선해보도록 하겠습니다.주고받은 내역이 저장된 테이블의 row는 약 380만 건으로 설정하였습니다.다른 팀원이 개발한 파트라 기존 기능을 최대한 유지하며 기능을 개선하였습니다.📌 기존 내용기존에 받은 편지 ..
[인프런 워밍업 스터디] 2주차 발자국: Readable Code 적용기
·
인프런 워밍업 스터디
인프런 ‘Readable Code: 읽기 좋은 코드를 작성하는 사고법’을 수강한 후, 작성한 내용입니다.📌 2주차 강의 (Readable Code)코드 다듬기주석의 양면성주석이 많다 ⇒ 비즈니스 요구사항을 코드에 잘 녹이지 못했나 의심해보자.추상화로 설명이 덜 된 것은 아닐까?주석에 의존하면 적절하지 않은 추상화 레벨을 가지게 된다.좋은 주석우리가 가진 모든 표현 방법을 총동원해 코드에 의도를 녹여내고, 그럼에도 불구하고 전달해야 할 정보가 남았을 때 사용하는 주석의사 결정의 히스토리를 도저히 코드로 표현할 수 없을 때, 주석으로 상세하게 설명!번수와 메서드의 나열 순서변수는 사용하는 순서대로 나열하자.인지적 경제성메서드의 순서는 객체의 입장에서 생각해보자.객체는 외부 세계와 어떻게 소통할 것인지가 중..
[Real MySQL 8.0] 인덱스
·
개발서적
디스크 읽기 방식데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건.HDD와 SSDHDD = 기계식 장치 ⇒ 데이터베이스 서버에서는 디스크 장치가 주로 병목이 된다.SSD = 전자식 저장 장치 ⇒ HDD보다 훨씬 빠름순차 I/O는 SSD가 HDD보다 조금 빠르거나 비슷하다. SSD의 장점은 기존 하드 디스크 드라이브보다 랜덤 I/O가 훨씬 빠르다는 점!랜덤 I/O를 통해 작은 데이터를 읽고 쓰는 작업이 대부분이므로 SSD의 장점은 DBMS용 스토리지에 최적💡 랜덤 I/O와 순차 I/O공통점 : 플래터를 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 후 데이터를 읽음순차 I/O : 1번의 시스템 콜 요청 ⇒ 헤드 1번 움직임랜덤 I/O : 3번의 시스템 콜 요청 ⇒ 헤드 ..
[인프런 워밍업 스터디] 추상과 객체 지향의 구체화
·
인프런 워밍업 스터디
인프런 ‘Readable Code: 읽기 좋은 코드를 작성하는 사고법’을 수강한 후, 작성한 내용입니다.📌 1주차 기간 강의섹션 2. 추상코드를 잘 짠다는 것은?개발자라면 코드를 잘 짜기 위해 노력한다. ‘코드를 잘 짠다’라는 것은 무엇일까?코드를 잘 짠다는 것은 이해하기 쉬운 코드, 즉 ‘읽기 좋은 코드’라는 것에 동의하지 않는 사람은 없을 것이다.내가 짠 코드를 읽는 대상은 결국 나와 동료이다. 미래의 나와 동료를 위해 매 순간 읽기 좋은 코드를 작성하려고 노력해보자.클린 코드와 리팩토링의 가장 좋은 예시는 테스트 코드 생성 사이클로 볼 수 있다.리팩토링 대상/범위 확인기능 보장을 위한 테스트 코드리팩토링 & 테스트 코드로 검증클린 코드를 추구하는 이유그런데 클린 코드를 추구하는 이유는 뭘까?코드가..
[미션 Day 4] 코드 리팩토링 및 나만의 언어로 작성한 SOLID 원칙
·
인프런 워밍업 스터디
📌 1. 코드 리팩토링✔️ 사용자가 생성한 '주문'이 유효한지를 검증하는 메서드.✔️ Order는 주문 객체이고, 필요하다면 Order에 추가적인 메서드를 만들어도 된다. (Order 내부의 구현을 구체적으로 할 필요는 없다.)✔️ 필요하다면 메서드를 추출할 수 있다.public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { ..
AI 시대의 개발자의 가치
·
인프런 워밍업 스터디
인프런 지식공유자 박우빈님의 강의내용을 기반으로 작성된 글 입니다!최근 몇 년 사이에 AI 라는 단어가 더 가까이 다가온 듯 합니다. 과거 알파고를 통해 AI를 간접적으로 경험하였지만, 제 생활과는 거리가 먼 이야기 같았습니다. 하지만 이제는 모두가 ChatGPT를 알고, IT 업계가 아니더라도 잘 활용되고 있습니다. 또한 최근에는 딥시크가 화제에 오르기도 하였습니다.AI!AI…AI는 세상을 급변화시키고 있고, 현재 엄청난 생산성을 가져다주는 도구입니다. 하지만 반대로 이로 인해 대체되는 일도 생기게 됩니다.개발자! 개발자의 미래는 어떻게 될까요?AI는 PMF(제품 시장 적합성, Product Market Fit) 임계값을 급변시켜 붕괴를 일으킬 수 있다!PMF 임계값을 급변시킨다는게 뭐지..?우빈님께서..
[Real MySQL 8.0] 트랜잭션과 잠금
·
개발서적
트랜잭션 : 작업의 완전성 보장논리적인 작업 셋을 모두 완벽하게 처리처리하지 못할 경우, 원 상태로 복구작업의 일부만 적용되는 현상(Partial update) X데이터의 정합성을 보장하기 위한 기능잠금 : 동시성을 제어하기 위한 기능한 시점에서 하나의 커넥션만 자원 변경 가능📌  트랜잭션논리적인 작업 셋 자체가 100% 적용되거나 아무것도 적용되지 않아야 함을 보장쿼리 중 일부라도 오류가 발생하면 전체를 원 상태로 만든다.1) 처리 시작 - 데이터베이스 커넥션 생성 - 트랜잭션 시작2) 로그인 여부 확인3) 글쓰기 내용 오류 확인4) 입력 내용 DBMS에 저장5) 첨부 파일 정보 DBMS에 저장6) 저장된 내용 또는 기타 정보 DBMS에서 조회7) 게시글 등록에 대한 알림 메일 발송8) 알림 메일 발..
알림을 비동기 방식으로 보내기
·
스프링
보틀러에서 알림이 필요한 경우, 알림이 저장되고 푸시 알림이 전송됩니다. 이때 푸시 알림이 전송되기를 기다리기보다는 비동기적으로 푸시 알림을 전송하는 것이 효율적이라 판단하였습니다.📌 비동기 처리란?비동기 처리는 작업의 결과를 기다리지 않고 다른 작업을 진행하는 방식입니다.푸시 알림 전송의 경우, 전송 결과를 통한 추가 작업이 존재하지 않고 FCM을 이용하기 때문에 비동기 작업으로 진행해도 괜찮다 판단하였습니다.그렇다면 스프링에서 비동기 처리는 어떻게 할 수 있을까요?📌 스프링에서의 비동기 처리스레드 생성 이용하기직접 스레드를 생성하여 실행시키는 방법이 있습니다. private void pushMessage(NotificationType type, Subscriptions subscription..