프로젝트에서 배운 점
MVC 패턴과 데이터베이스 접근 방법의 최적화
문제점
프로젝트 진행 중, 트랜잭션 내 데이터 접근과 데이터베이스 조인 최적화에 관련된 두 가지 주요 문제를 겪었습니다.
- 트랜잭션 내 데이터 접근 문제:
MVC 패턴을 사용하며 MyBatis로 데이터베이스 접근을 하는 중, 서비스 레이어에 @Transactional을 적용하여 트랜잭션 내에서 작동하도록 설계했습니다. 회원가입 서비스에서, 주소(Address) 테이블이 회원(Member) 테이블을 참조하는 구조를 사용했습니다. 회원 테이블에 데이터를 먼저 삽입한 후 자동 증가된 PK 값을 주소 테이블에 삽입하려 했으나, 트랜잭션이 완료되기 전에 데이터를 조회하려다 보니 멤버의 ID를 정상적으로 얻을 수 없었습니다. - 데이터베이스 조인 최적화 문제:
처음에는 필요한 데이터만 선택적으로 가져오는 쿼리를 작성했으나, 다른 팀원들이 작성한 코드는 3~4개의 테이블을 모두 조인하여 모든 정보를 가져오는 방식으로 설계되었습니다. 이 방식은 데이터베이스 성능에 부정적인 영향을 미쳤고, 성능 테스트 결과 해당 작업이 200ms가 걸리는 것을 확인했습니다.
해결과정 및 배운점
해결과정
- 트랜잭션 내 데이터 접근 문제 해결:
- 문제를 디버깅하여 트랜잭션이 완료되지 않아 조회 시 null이 반환되는 것을 확인했습니다.
- 이를 해결하기 위해 메서드를 두 개로 나누어 트랜잭션이 완료된 후 ID를 조회하는 방식으로 처리했습니다.
- 이후 JPA를 공부하면서, JPA에서는 EntityManager의 flush와 clear 메서드를 사용하여 한 메서드 내에서 문제를 해결할 수 있음을 알게 되었습니다.
- 데이터베이스 조인 최적화 문제 해결:
- 모든 데이터를 한 번에 조인하는 방식에서 필요한 데이터만 선택적으로 조인하는 방식으로 쿼리를 수정했습니다.
- 성능 테스트 결과, 쿼리를 2개로 나누어 2개씩 조인하는 방식으로 수정하고 성능 테스트를 진행한 결과, 50ms로 줄어드는 것을 확인했습니다.
- JPA를 공부하면서 lazy loading과 fetch join 등을 활용하여 이 문제를 더욱 간편하게 해결할 수 있음을 알게 되었습니다.
배운점
- 트랜잭션의 동작 원리:
- 트랜잭션이 완료되기 전에는 데이터베이스의 변경 사항이 반영되지 않음을 명확히 이해하게 되었습니다.
- JPA를 사용하면 EntityManager의 flush와 clear를 통해 트랜잭션 내에서도 데이터 변경 사항을 반영할 수 있어 코드를 더욱 간편하게 작성할 수 있음을 배웠습니다.
- 쿼리 최적화의 중요성:
- 데이터베이스 성능을 고려하여 쿼리를 작성하는 것이 중요하며, 불필요한 데이터를 모두 가져오는 방식은 성능 저하를 초래할 수 있음을 깨달았습니다.
- JPA를 사용하면 lazy loading과 fetch join을 통해 데이터베이스 성능을 더욱 효율적으로 관리할 수 있음을 배웠습니다.
이번 프로젝트를 통해 트랜잭션 관리와 데이터베이스 최적화의 중요성을 깨달았고, JPA를 사용하여 이러한 문제들을 더욱 효과적으로 해결할 수 있음을 배웠습니다. 추후 프로젝트에서는 JPA를 적극 활용하여 성능과 효율성을 고려한 코드를 작성할 계획입니다.
'IT' 카테고리의 다른 글
Spring 웹 애플리케이션 마이그레이션: 파일 권한 문제 해결기 (0) | 2024.12.06 |
---|---|
팀 프로젝트 회고 [Smart Farm] (0) | 2024.06.26 |
MVC 패턴의 낯선 세계 (0) | 2024.04.10 |
객체지향의 5가지 원칙, SOLID에 대한 이해 (0) | 2024.04.02 |
CORS 에러에 대해 알아보자 (0) | 2024.04.01 |