오늘도 이어서 면접 질문들을 복습했다.
제네릭은 자바의 기능으로 클래스나 메서드에서 사용할 내부 데이터 타입을 컴파일 시 미리 지정하는 방법입니다. 컴파일 중에 미리 타입 에러를 잡을 수 있기 때문에 런타임시에 타입 캐스팅을 안전하게 처리할 수 있게됩니다. 컬렉션 프레임워크에서는 제네릭을 통해 타입 안정성을 확보하고 코드의 가독성과 유지보수성을 얻을 수 있어 제네릭을 사용합니다.
적용 시점에서 차이가 납니다. Filter는 dispatcherServlet으로 요청이 가기 전에 실행되어 HTTP요청과 응답을 처리하는 데 사용됩니다. 인터셉터는 그 후 Controller로 요청이 가기 전에 실행되어 주로 프레임워크 레벨에서 작업을 수행합니다. AOP는 인터셉터 이후 적용되는데 포인트 컷을 이용해 다양한 시점과 넓은 범위의 기능을 사용할 수 있습니다. 주로 로깅, 트랜잭션관리, 보안, 캐싱과 같은 작업을 모듈화해 재사용하는 데 쓰입니다.
n+1문제는 ORM 사용 시 데이터베이스 쿼리를 최적화하지 않아 발생하는 성능 문제입니다. 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 발생해 성능의 저하가 발생합니다. 연관관계를 가진 엔티티를 조회할 때 하위 엔티티까지 한번에 가져오지 않고 하위 엔티티를 사용할때 추가로 조회하기 때문에 발생하는 문제입니다. 대표적인 해결 방법으로는 Fetch join을 사용해 연관된 엔티티를 한번에 가져오는 방법이 있습니다.
lombok의 어노테이션은 주로 컴파일 시점에 적용됩니다. 이 어노테이션들은 소스코드에 특정 기능을 자동으로 추가하거나 변경해서 개발자의 코드 작성을 간편하게 해줍니다. 대표적으로는 @Getter, @Setter, @Builder 등이 있습니다. 컴파일 시점에 작동해서 런타임 성능에는 영향을 끼치지 않고 코드 간소화와 가독성 향상을 가져다줍니다.
어떤 클래스가 단 하나의 객체(인스턴스)만 갖도록 보장하는 디자인 패턴입니다. 단일 인스턴스이기 때문에 항상 동일한 객체가 반환되어 메모리가 낭비되지 않고, 이미 생성한 인스턴스를 재활용하니 속도 측면에서 장점이 있습니다. 그리고 전역적으로 접근해 데이터 공유가 쉬워지는 장점이 있습니다.