좌충우돌 개발공부

TIL(20240628) [기술면접질문]


📌 기술면접질문

  • 통합 테스트와 단위 테스트의 차이점에 대해서 설명해주세요.
    통합테스트는 여러 모듈간의 상호작용(모듈의 호환성)이 올바르게 동작하는지 확인하는 테스트이고 단위테스트는 하나의 모듈, 하나의 기능이 올바르게 동작하는지 확인하는 독립적인 테스트입니다.
  • 통합 테스트과 단위 테스트의 장/단점에 대해서 설명해주세요.
    통합테스트의 장점을 먼저 말씀드리자면 실제 빈을 직접 띄워서 테스트 하기 때문에 운영환경과 가장 유사한 테스트를 할 수 있고 서로 다른 컴포넌트들이 통합되었을 때 발생할 수 있는 오류를 발견할 수 있지만(API오류응답이나 Null포인트오류 등) 실제 빈을 직접 띄워서 실행시키기 때문에 테스트시간이 오래걸리고 많은 코드를 테스트 하기 때문에 어디서 에러가 발생했는지 확인이 쉽지 않습니다. 단위테스트의 장점은 통합테스트에 비해 하나의 모듈을 확인하는 테스트이기에 시간이 절감되고 자신이 작성한 코드를 확인검증 할 수 있으며 코드를 리팩토링하여도 빠르게 문제여부를 확인할 수 있다는 장점이 있으나 독립적인 테스트이기에 연결된 다른객체들을 가짜객체로 대체하여 어떤 결과에 대한 반환값을 개발자가 직접 정해주어야 하는 상황이 발생합니다. (stub) 여기서 개인적으로 들었던 생각은 이 단위테스트가 실제환경에서 제대로 작동을 하는 걸까 라는 생각이 들었던 것 같습니다.
  • 레이어별로 나누어서 Slice Test 를 하는 이유에 대해서 설명해주세요.
    슬라이스 테스트는 실제 톰캣(어플리케이션 웹서버)을 실행시키지 않고 대상이 되는 계층에서 필요한 bean만 등록하여 테스트를 하기 때문에 속도가 빠르고, 특정계층의 기능에 집중하여 그 기능이 올바르게 작동하고 있는지 세밀하게 확인할 수 있어 레이어별로 나누어 슬라이스 테스트를 진행합니다.

통합테스트와 슬라이스테스트

  • 테스트 코드를 직접 짰을 때, 느낀 테스트 코드 작성의 필요성을 설명해주세요.
    개인적인 경험에서 말씀드리면, 테스트 코드는 제가 작성한 코드가 안정성이 있는지 검증을 해주는 역할을 하고, 제가 직접 테스트 코드를 작성하면서 코드 대한 흐름을 명확히 되짚어보게 되어 리팩토링이 필요한지에 대해서도 재확인하게 되는 동기부여를 주는 것 같습니다.
  • JPA와 Hibernate의 차이점은 무엇인가요? :JPA는 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 입니다. 차이점이라고 하면, JAVA에서 JPA와 Hibernate의 관계를 보자면 interface와 interface를 실제로 구현한 class관계라고 볼 수 있습니다.

JPA개념정리
JPA차이점
JPA와 Spring data JPA

** Spring data JPA -> Repository와 같은 개념 실제 구현체 X (interface)
** Hibernate -> 개발자에게 따로 SQL문을 작성하지 않고 직관적인 메서드를 사용해 데이터를 조작할  있다는 
** ORM -> 객체지향 어플리케이션에서 사용하는 객체와 DB를 자동으로 매핑해주는 기술
  • QueryDSL을 사용하여 복잡한 동적 쿼리를 작성하는 방법을 설명해 주세요.

  • 프로젝트에서 좋아요 기능을 구현할 때, 특정 사용자가 특정 게시글을 이미 좋아요 했는지 확인하는 방법을 설명해 주세요.
    likeRepository에서 postId와 userId가 있는지 isPresent()메서드를 사용하여 중복여부를 확인할 수 있습니다.
  • JPA에서 Lazy Loading과 Eager Loading의 차이점은 무엇인가요? 각각의 장단점에 대해 설명해 주세요.
    Eager은 즉시로딩을 의미하며 데이터 조회시, 연관된 데이터까지 한번에 불러오는 것이고 Lazy는 지연로딩을 의미하며 필요한 시점에서 연관된 데이터를 불러오는 것에서 차이점이 있습니다. 각각의 장단점을 다대1 연관관계를 가진 member와 team에 비유를 해서 설명해드리면 Eager의 경우 member조회시 어떤 팀에 속해있는지에 대해서 까지 SQL문이 날아갑니다. 그런데 LAZY로 설정해놓는다면 오로지 member만 조회하는 SQL문이 날아가게 되는데, member와 team을 같이 조회해야하는 상황에서라면 Eager설정이 필요하지만 오직 member만 조회를 하려고 하는 상황이라면 Lazy설정이 효율적입니다. 그 이유는 member와 연관된 team의 데이터가 많다면 엄청난 양의 SQL문이 날아가기 때문에 비효율적일 수 있기 때문입니다.
  • JPA에서 N+1 문제를 해결하기 위한 방법을 설명해 주세요.

  • ⭐⭐⭐⭐(CS)트랜잭션(특징,프로세스 등)

📌 QueryDSL 작성

이전 아웃소싱 프로젝트에서 익명/비익명 게시판을 주제로 프로젝트를 구현했으므로 Post/PublicPost로 나뉘게 된다.

과제 요구사항에 따라 추가해야 할 부분이 필요했는데, 프로젝트에서는 따로 게시물 조회시 responseDto에서 likeCount의 필드를 별도로 가지고 있지 않아 추가를 해주었고, likeCount의 경우 likeCount를 조회하는 쿼리문을 구현해주셔서 가져오는 형식으로 했다.

  • 게시글 및 댓글 단건조회 응답에 좋아요 개수 추가
    • 게시글 단건 정보 조회시 게시글의 좋아요 개수필드를 추가합니다.
    • 댓글 단건 정보 조회시 댓글의 좋아요 개수필드를 추가합니다.

아래는 비익명게시판의 Dto이다.


@Getter
public class PublicPostResponseDto {
    String title;
    String content;
    String userName;
    LocalDateTime createdAt;
    LocalDateTime modifiedAt;
    int likeCount;

    public PublicPostResponseDto(PublicPost post, int likeCount) {
        this.title = post.getTitle();
        this.content = post.getContent();
        this.userName = post.getUser().getUserName();
        this.createdAt = post.getCreatedAt();
        this.modifiedAt = post.getModifiedAt();
        this.likeCount = likeCount;
    }

    public PublicPostResponseDto(PublicPost post) {
        this.title = post.getTitle();
        this.content = post.getContent();
        this.userName = post.getUser().getUserName();
        this.createdAt = post.getCreatedAt();
        this.modifiedAt = post.getModifiedAt();
        this.likeCount = 0;
    }