2024.07.03.수.TIL 내일배움캠프 55일차 <기술면접>

김기남·2024년 7월 3일
0

안녕하세요, 오늘은 기술면접을 대비하며 준비한 내용을 정리해보았습니다.

JPA에서 Lazy Loading과 Eager Loading의 차이점은 무엇인가요? 각각의 장단점에 대해 설명해 주세요.

게시글과 댓글의 연관관계를 보았을때, 즉시 로딩 방식을 사용하면 댓글을 조회하는 시점에 바로 게시글까지 불러오는 쿼리를 날려 한번에 데이터를 불러옵니다.
반면, 지연로딩은 댓글을 조회하는 시점이 아닌 실제 게시글을 사용하는 시점에 쿼리가 나가서 데이터를 불러옵니다.
데이터를 불러오는 속도적인 측면에서 즉시로딩이 강점을 같지만, 조회하는 댓글에 연관되어 있는 테이블이 많다면 그만큼 데이터를 과하게 불러와서 메모리 사용이 비효율적입니다.
때문에 실무에서는 가급적 지연로딩 사용을 지향합니다.

JPA에서 N+1 문제를 해결하기 위한 방법을 설명해 주세요.

즉시로딩을 사용하면 부모 객체를 가져올 때 연관된 모든 자식 객체들도 함께 가져오게 됩니다. 이로 인해 부모 객체의 수만큼 추가 쿼리가 발생할 수 있으며, 이를 N+1 쿼리 문제라고 합니다. 이는 데이터베이스 부하와 성능 저하를 초래할 수 있습니다.
이러한 상황을 피하기 위해서는 지연로딩(Lazy Loading)을 사용하거나, 페치 조인(fetch join) 등을 활용하여 쿼리를 최적화해야 합니다.
A만 필요할 때는 FetchType.Lazy 지연 로딩으로 A 만 불러 사용하고, A와 B를 같이 부르고 싶을 경우에는 FetchType.Lazy + fetch join 조합을 사용하여 성능을 향상 시킬 수 있다.
페치 조인은 지연로딩 전략을 사용했을 때, 연관된 데이터를 한 번의 쿼리로 모두 가져오는 방식으로, sql 구문처럼 테이블간 연결을 시켜줍니다.

JPA와 Hibernate의 차이점은 무엇인가요?

JPA는 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로, 실제 사용을 위해서는 ORM 프레임워크를 추가로 선택해야 합니다. 이때, 대표적인 프레임워크로 하이버네이트를 많이 사용합니다.
JPA를 구현한 하이버네이트
Hibernate는 JPA의 모든 기능을 지원하며 Hibernate는 객체와 관계형 데이터베이스 간의 매핑을 자동으로 처리해서 개발자가 일일이 SQL 쿼리를 작성하지 않도록 도와줍니다.
인터페이스를 직접 구현한 라이브러리입니다. JPA와 Hibernate 관계는 자바의 interface와 해당 interface를 구현한 class와 같은 관계입니다.

통합 테스트와 단위 테스트의 차이점 장/단점에 대해서 설명해주세요.

통합테스트는 @SpringBootTest 를 이용하여 모듈간의 연결과 상호작용을 테스트하고, 단위 테스트는 하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트를 합니다.
통합 테스트는 다양한 구성 요소간 상호작용을 테스트하여 단위테스트 보다 정확하게 평가 할 수 있습니다. 그러나 테스트 케이스 작성에 대한 복잡성이 증가하여 테스트 시간이 오래 걸립니다.
단위 테스트는 격리된 환경에서 개별적인 코드 단위를 테스트하기 때문에 디버깅과 문제 해결이 쉽습니다. 그러나, 개별적인 코드 단위를 대상으로 하기에 시스템 전체적인 동작은 반영하지 않습니다.

트랜잭션에 대해서 자세히!!! 설명(특징, 프로세스 등등)해보세요. 트랜잭션을 검색을 통해 공부하시고, 꼬리 질문까지 준비해주세요.

원자성(Atomicity) - 한 트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패하는 걸로 간주합니다.
일관성(Consistency) - 트랜잭션은 일관성 있는 데이타베이스 상태를 유지합니다.
격리성(Isolation) - 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해주어야합니다.
지속성(Durability) - 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 합니다.

레이어별로 나누어서 Slice Test 를 하는 이유에 대해서 설명해주세요.

레이어별로 나누어서 슬라이드 테스트를 사용하면 레이어 특성에 맞는 테스트 전략을 통해 적정한 테스트를 할 수 있고, 테스트를 실행하는 데 필요한 시간이 줄어들며 디버깅이 더 쉬워집니다.

테스트 코드를 직접 짰을 때, 느낀 테스트 코드 작성의 필요성을 설명해주세요.

테스트 코드를 직접 짜보면서 기존에 완성되었다고 생각했던 부분에서 구조적인 문제가 있다는걸 알 수 있었습니다. 이러한 점에서 보았을 때, 테스트를 해야 문제가 커지고 수습비용이 커지기 전에 수정할 수 있겠구나 라고 느꼈습니다.

QueryDSL을 사용하여 복잡한 동적 쿼리를 작성하는 방법을 설명해 주세요.

쿼리 DSL(QueryDSL)은 자바 기반 오픈 소스 프레임워크로, SQL 쿼리를 더욱 쉽고 편리하게 작성할 수 있도록 도와주는 라이브러리입니다. 특히 Java와 Spring Boot 프레임워크를 사용하는 개발자들에게 강력한 쿼리 기능과 유연성을 제공합니다.
동적 쿼리란 실행 시점에 쿼리문장이 만들어져 실행되는 쿼리문을 의미합니다.
쿼리를 작성할 때 오타나 문법 오류가 발생할 확률이 줄어들어 생산성을 높여줍니다. 또한 QueryDSL은 JPQL과 SQL을 완벽하게 지원하므로, 데이터베이스 특성에 따라 유연하게 대응할 수 있습니다.

프로젝트에서 좋아요 기능을 구현할 때, 특정 사용자가 특정 게시글을 이미 좋아요 했는지 확인하는 방법을 설명해 주세요.

좋아요의 타입을 boolean 으로 하여 좋아요 레포지토리에서 조회하여 1. 레포지토리에 비어 있다면 좋아요 true. 2. 레포지토리에 있고 좋아요 true 이면 예외처리 3. 레포지토리에 있고 좋아요 false 이면 true.

profile
새로운 시작~!

0개의 댓글