[인프런 워밍업 클럽 스터디] 4주차 회고
·
스터디/읽기 좋은 코드를 작성하는사고
Layered Architecture 구조의 레이어별 테스트 정리Persistence Layer특징: 데이터를 직접 접근하고 관리하는 계층.테스트 방법: CRUD 중심으로 테스트하되, 비즈니스 로직은 포함하지 않는다.유의점: 테스트 수행 후 데이터 정리(clean-up)를 철저히 해야 한다.Business Layer특징: 비즈니스 로직이 전개되는 중심 계층.테스트 방법: 통합 테스트로 비즈니스 로직의 정확성을 검증하며, 예외 상황 처리에 더 많은 집중이 필요하다.유의점: 예외 케이스를 잘 다루는 것이 개발자의 역량이다.Presentation Layer특징: 외부 요청을 처리하는 계층.테스트 방법: 입력 값의 유효성을 검증하며, 하위 레이어는 모킹 처리하여 독립적으로 테스트한다.유의점: 유효성 검증이 어느..
[트러블 슈팅] ⚠️ 읽기 전용 트랜잭션 내 쓰기 작업 문제와 REQUIRES_NEW 전파 전략 활용(self invocation)
·
프로젝트 트러블 슈팅 및 몰랐던점 정리/CommunityAPI
문제 상황Spring Boot + Spring Data JPA 환경에서 다음과 같은 코드가 있었다@Transactional(readOnly = true)public Post readById(Long postId, Long userId) { PostEntity post = postRepository.findById(postId).orElseThrow(() -> throw new RuntimeException("...")) viewCountService.increase(post.getPostId, userId); ...}클라이언트가 게시글을 조회할 때 조회수가 증가하는 로직이다. 해당 메서드에서는 읽기 전용 @Transactional 이 발생한다. 그리고 increase 메서드 내부viewCou..
[MySQL] MySQL 성능 개선의 핵심, 인덱스 이해하기
·
DB/SQL
인덱스란?특정 컬럼을 기준으로 데이터를 빠르게 조회하기 위해 사용하는 자료구조이다. 일반적으로 인덱스는 B-Tree 구조로 구성되어있어 이진 탐색 방식을 활용하여 데이터를 검색하는 방식이다.인덱스를 생성하면 원본 테이블을 기준으로 새롭게 정렬된 노드 형태를 띄게되며, 자신이 정한 특정 컬럼값들만 저장하고, 그 값이 있는 row를 가리키는 포인터를 가지게 된다. CREATE INDEX idx_salary ON employee(salary);위와 같은 인덱스를 생성할 경우 아래와 같은 B-Tree 구조를 띄게 된다.salary를 기준으로 정렬된 인덱스 테이블이 생기게 되는 것이아니라 노드 구조를 생성한다는 것이다.각 노드에는 salary 값만 들어있게 되고 각 leaf 노드에는 실제 row의 주소 또는 실제..
[MySQL] DB 병목현상 왜 일어나는지, 해결하기 위한 가장 기본적인 방법은 무엇인지에 대해
·
DB/SQL
DB 병목현상 발생 원인동시 사용자의 증가로 인해 수 많은 요청에 대해 처리해야한다거나, 혹은 요청에 의한 응답으로 나가는 데이터 양의 증가, 비효율적인 SQL 발생 등이 원인이 될 수 있다. 이러한 병목은 단순히 애플리케이션 속도 저하로 끝나지 않고, 전체 서비스의 안정성과 사용자 경험에 치명적인 영향을 줄 수 있다. DB 성능 개선을 위한 접근 방식DB 성능을 개선하기 위해서는 다양한 방식들이 존재한다. - SQL 튜닝- 캐시 서버 활용(Redis)- Master/Slave 구조- 샤딩 (수평 분산)- 하드웨어 업그레이드 문제의 상황마다 다르겠지만 이중에서 가장 먼저 만져줘야 하는 부분은 SQL 튜닝 부분이다. 적절한 인덱스를 생성하므로써 성능을 향상 시켜주는 것이 첫번째로 이뤄줘야 하고, 그 후 해..
[인프런 워밍업 클럽 스터디] 3주차 회고록 통합 테스트, 단위테스트 그리고 TDD
·
스터디/읽기 좋은 코드를 작성하는사고
이번 3주차 발자국을 작성하기에 앞서서, 저는 다른 스터디원분들이 작성해준 테스트 시 사용되는 애노테이션의  각 사용법과 차이점 보다는 통합 테스트와 단위테스트 그리고 TDD를 수행해야하는 근본적인 이유에 대해서 작성하였으며 이를 통해 얻고자 하는 것은 궁극적으로 무엇인가에 대해서 작성하였습니다.통합 테스트란??메서드가 어떠한 상황에서 어떻게 작동해야된다.라는 것을 보장하는 것이 단위테스트라면 통합테스트는 A객체와 B.객체가 만나서 협력 시 어떻게 동작한다라는 것을 보장하기 위해서 수행하는 것이다.통합 테스트는 왜 해야하는가?“불안감”때문이다. 정확히 말하면 시스템 전체가 의도한 대로 작동하는지 확인하고 신뢰할 수 있는 상태로 배포하기 위해서이다. 통합 테스트를 해야하는 근본적인 이유는 아래와 같다.“기..
[인프런 워밍업 클럽 스터디 - 테스트 코드를 대하는 자세 2주차 회고] 어떤 것이 더 적절한 단위 테스트인가?
·
회고록
🤔 어떤 것이 적절한 단위 테스트 인가?단위 테스트의 핵심 개념은 “하나의 기능(단위)를 독립적으로 검증” 하는 것이다.“어떤 크기의 단위를 테스트 하는 것이 적절한가?”라는 질문이 생기게 된다.public boolean isCompatibleWith(StudyCafeUsingPass pass) { return Objects.equals(this.passType, pass.getPassType()) && Objects.equals(this.duration, pass.getDuration()); }위와 같은 코드가 있다고 가정하자. 인자로 들어온 객체의 타입과 자신의 타입을 비교하여 true or false를 내려주는 간단한 로직이다.📌 단위 테스트의 적절한..
[인프런 워밍업 클럽 스터디] 👣 리팩토링을 대하는 자세와 단위 테스트를 대하는 자세
·
스터디/읽기 좋은 코드를 작성하는사고
🎯 코드의 의도를 명확하게 표현하기코드를 작성할 때 가장 중요한 요소중 하나는 “코드가 무엇을 하는지”명확하게 나타내는 것.코드 자체가 설명적이여야 하며, 주석에 의존하지 않아야 한다코드는 변한다. 즉 소프트웨어는 발전하며 코드는 동적이지만 주석은 변하지 않는다.좋은 네이밍은 코드의 가독성을 높이며 함축적인 의미를 담는 것이 중요하다.그렇다고 해서 너무 함추적인 의미를 담거나 줄임말은 피해야 한다.함수와 변수를 의미 있는 이름으로 정의하면 코드를 읽는 입장에서도 쉽게 이해할 수 있다.한개의 함수는 한가지 책임만 가져야 하며, 여러가지 기능을 포함하지 않도록 해야한다. 🎯 비즈니스 로직이 자연스럽게 녹아있는가?비즈니스 로직은 도메인의 개념을 반영해야 한다현재 내 프로젝트의 요구사항 및 도메인 개념이 들..
[트러블 슈팅] ⚠️ Spring Boot LocalDateTime 변환 에러 해결법 (@JsonFormat vs @DateTimeFormat)
·
프로젝트 트러블 슈팅 및 몰랐던점 정리/CommunityAPI
Spring Boot로 REST API를 개발하다 보면 LocalDateTime 객체를 JSON으로 변환하는 과정에서 오류를 겪곤한다. 특히 Jackson(ObjectMapper)을 사용할 때 별도 설정 없이 LocalDateTime을 직렬화하려고 하면 예외가 발생한다.  문제 상황게시글 등록 API를 호출하면서 LocalDateTime.now()로 생성 날짜를 지정한 후 DB에 저장하려 했지만, 아래와 같은 에러가 발생했다.2025-03-02T00:09:54.324+09:00 ERROR 73471 --- [free_community] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dis..
cheolhyeon
gotogg