인프런 워밍업 스터디 3기 후기
·
인프런 워밍업 스터디
📌 인프런 워밍업 스터디?인프런 워밍업 스터디는 한 달 동안 인프런에 올라와있는 지식 공유자의 강의를 듣습니다. 하지만 단순히 강의만 듣는 것이 아니라, 강의와 관련된 미션 등을 수행하고 지식 공유자와 직접 소통할 수 있습니다.제가 참여한 인프런 워밍업 스터디는 박우빈님의 클린 코드 & 테스트 코드입니다.워밍업 스터디 참여 이전에 박우빈님의 테스트 코드 강의를 본 적이 있는데, 만족도가 높아 참여하게 되었습니다.📌 워밍업 스터디 참여!워밍업 스터디를 시작하기 전에 프로젝트를 진행하면서 추상화라는 단어가 제 머리속에 들어왔었습니다. 그래서 ‘어떻게 하는 것이 좋은 추상화일까?’라는 고민을 하던 중, 타이밍이 좋게 워밍업 스터디가 열려 시작하였습니다.워밍업 스터디에서는 강의를 듣는 것 외에 다양한 활동이..
Java 21 Virtual Thread 간단히 알아보기
·
자바
Java 21 부터는 Virtual Thread 사용이 가능합니다. Java 21의 Virtual Thread에 대해 알아보겠습니다.📌 Java의 ThreadJava에서 Thread는 OS Thread를 래핑하여 사용합니다. 따라서 Java에서 Thread를 사용하면, OS Thread를 사용한 것과 같습니다. OS Thread는 생성 갯수가 제한적이고, 생성하거나 유지하는 데에 비용이 비쌉니다. 이로 인해 애플리케이션에서는 Thread를 효율적으로 사용하기 위해 Thread Pool을 사용합니다.기본적으로 Web Request는 Thread Per Request, 하나의 요청 당 하나의 스레드가 필요합니다. 처리량을 높이려면 스레드가 많이 필요한데, OS Thread를 무한정으로 늘릴 순 없습니다.T..
[4주차 발자국] 워밍업 스터디 마무리
·
인프런 워밍업 스터디
인프런 ‘Readable Code: 읽기 좋은 코드를 작성하는 사고법’을 수강한 후, 작성한 내용입니다.📌 강의 내용Presentation Layer기존에 프로젝트에서 Presentation Layer 테스트는 건너뛴 경우가 많았다. 대부분 Business Layer까지만 테스트를 작성했고 사실 어떻게 Presentation Layer 테스트를 작성해야할지 잘 몰라서 안했던 것도 컸다,이번 강의를 통해 MockMVC을 사용하여 Presentation Layer 테스트에 대해 익힐 수 있었고, 프로젝트에도 적용해봐야겠다.Mock을 마주하는 자세Mock은 주로 테스트 하는 대상에 대해 집중하기 위해 사용한다. 예를 들어, 외부 클라이언트에 의존하는 기능이 있을 때 실제 이 기능을 사용하면서까지 테스트할 필..
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()) { ..