JPA Interview

kys95·2022년 10월 31일
0

JPA?

자바 ORM 기술에 대한 표준 명세로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스입니다.

ORM(Object Relational Mapping)?

ORM 프레임워크는 자바 객체와 관계형 DB를 매핑한다. 즉, 객체가 DB 테이블이 되도록 만들어주는 것이다. ORM을 사용하면, SQL을 작성하지 않아도 직관적인 메소드로 데이터를 조작할 수 있다는 장점이 있다. ( 개발자에게 생산성을 향상시켜줄 수 있음 )

JPA는 애플리케이션과 JDBC 사이에서 동작하며, 개발자가 JPA를 활용했을 때 JDBC API를 통해 SQL을 호출하여 데이터베이스와 호출하는 전개가 이루어진다.

즉, 개발자는 JPA의 활용법만 익히면 DB 쿼리 구현없이 데이터베이스를 관리할 수 있다.

JPA 특징(장점)?

  1. 객체 중심 개발 가능
    SQL 중심 개발이 이루어진다면, CRUD 작업이 반복해서 이루어져야한다.

하나의 테이블을 생성해야할 때 이에 해당하는 CRUD를 전부 만들어야 하며, 추후에 컬럼이 생성되면 관련 SQL을 모두 수정해야 하는 번거로움이 있다. 또한 개발 과정에서 실수할 가능성도 높아진다.

  1. 생산성 증가
    SQL 쿼리를 직접 생성하지 않고, 만들어진 객체에 JPA 메소드를 활용해 데이터베이스를 다루기 때문에 개발자에게 매우 편리성을 제공해준다.
  1. 유지보수 용이
    쿼리 수정이 필요할 때, 이를 담아야 할 DTO 필드도 모두 변경해야 하는 작업이 필요하지만 JPA에서는 엔티티 클래스 정보만 변경하면 되므로 유지보수에 용이하다.

  2. 성능 증가
    사람이 직접 SQL을 짜는 것과 비교해서 JPA는 동일한 쿼리에 대한 캐시 기능을 지원해주기 때문에 비교적 높은 성능 효율을 경험할 수 있다.

JPA N + 1 문제와 발생하는 이유 그리고 해결하는 방법을 설명해주세요.

N+1이란 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 의미합니다.

해결 방법에는 여러 방법이 있지만 가장 많이 사용되는 방법은 Fetch Join을 사용해 해결하는 방법입니다.

N+1 문제가 발생하는 이유는 연관관계를 가진 엔티티를 조회할 때  한 쪽 테이블만 조회하고 연결된 다른 테이블은 따로 조회하기 때문인데,
Fetch Join을 사용하면 미리 두 테이블을 Join하여 한 번에 모든 데이터를 가져오기 때문에 N+1문제를 애초에 막을 수 있습니다.

JPA와 같은 ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?

일단 JPA 자체는 정적인 상황에서 사용하는걸 권장하기 때문에 복잡한 쿼리와 동적인 쿼리에 대한 문제가 발생하게 되는데,
그럴때는 JPQL과 Querydsl을 사용할 것을 권장하고 있습니다.

JPA Entity Class에서 @Setter를 지양하는 이유는? (Entity에서 Setter 함수를 사용하지 않는 이유?)

가장 큰 이유는 어떤 포인트에서든지 Setter 함수 호출을 통해 Entity의 값을 변경할 수 있다면, DB 데이터 값 변경에 대한 히스토리를 코드를 보고 파악하기 어려워집니다.

즉, Entity의 값을 변경한 의도를 파악하기 어려운 단점이 있습니다. 마찬가지로, Entity 객체 값의 일관성을 보장하기 어려워집니다.

그렇기 때문에, 의도를 파악할 수 있는 함수를 내부에 따로 만들어 이를 사용하여 값을 변경합니다.

그러면 함수 이름만으로 어떤 목적으로 Entity의 값을 변경하는지 빠르게 파악할 수 있습니다.

@ControllerAdvice 어노테이션의 정의 및 사용 목적, 사용한 이유는?

AOP를 활용해 Exception Handler를 커스터마이징 해서 모든 컨트롤러에서 Exception Handling을 하기 위해 사용했습니다.

@ControllerAdvice 어노테이션은 모든 컨트롤러에 AOP(Advice)를 적용시키는 기능을 합니다. 즉, 모든 컨트롤러에 @ControllerAdvice 어노테이션이 붙은 Bean이 추가되서, 해당 Bean을 무조건 실행하게 됩니다. 그렇기 때문에 AOP 타겟 범위를 별도로 지정할 수 있습니다. (PointCut)

@RestControllerAdvice 어노테이션은 @Controller와 @ResponseBody가 결합된 어노테이션으로, Body 값을 포함해 REST 통신하는 곳에 사용됩니다. 이는 @ControllerAdvice를 포함하고 있습니다.

이러한 @ControllerAdvice는 보통 @ExceptionHandler 를 함께 활용해 예외 처리 핸들링을 커스텀할 때 사용하지만, 이 외에도 @ModelAttribute와 @InitBinder에도 사용합니다.

@ExceptionHandler 어노테이션의 정의와 사용 방법?

@ExceptionHandler 뒤에 Exception(RuntimeException을 상속받은 Class도 가능) Class 이름을 설정할 수 있는데, 이렇게 되면 컨트롤러 뿐 아니라 서비스 등 Bean 객체들에서 발생한 Exception을 여기서 catch해서 처리할 수 있습니다.

이를 통해, Exception 처리를 비즈니스 로직마다 포함시키지 않고 분리함으로써 좀 더 비즈니스 로직에만 집중할 수 있습니다.

만약, 이 것이 없다면 각각의 Bean마다 Exception 발생할 때, 그 지점에서 catch해서 처리하거나 throw해서 상위로 전달해야하는데, 중복 코드도 많아지고 관리 포인트도 많아지게 됩니다.

profile
어제의 나보다 나은 사람이 되자

0개의 댓글