목록전체 글 (531)
개발놀이터
Q. 데이터베이스에서 인덱스를 사용하는 이유는 무엇인가요? A. 데이터베이스에서 인덱스를 사용하는 이유는 검색 성능을 향상시키기 위함입니다. 하지만 검색 성능을 실질적으로 향상시키기 위해서는 해당 쿼리가 인덱스를 사용하는지, 카디널리티, Selectivity 같은 요소들이 고려된 인덱스인지 확인해야 합니다. Q. 데이터베이스에서 인덱스를 사용하면 좋은점과 나쁜점은 무엇인가요? A. 인덱스를 사용했을 때 장점으로는 빠른 검색 성능을 들 수 있습니다. 단점으로는 인덱스를 구성하는 비용 즉, INSERT, UPDATE, DELETE 연산시에 인덱스를 형성하기 위한 추가적인 연산이 수행됩니다. 또한, 인덱스를 관리하기 위해 데이터베이스의 10퍼센트에 해당하는 저장공간이 필요합니다. https://coding-r..
DB를 사용하면서 데이터의 양에 다라 실행 결과의 속도가 차이가 납니다. JOIN이나 서브 쿼리 사용 시 곱 연산이 일어나 데이터 양이 증가하기 때문에 WHERE 조건에 필요한 데이터만 추출 후 사용하는 것이 좋다고 합니다. 쿼리의 성능을 높이는데 중요한 것은 인덱스를 적재적소에 사용하는 것입니다. 그렇다면 인덱스란 무엇인지 구조는 어떻게 되는지 사용시 장단점은 무엇인지 등에 대해 지금부터 포스팅 해보도록 하겠습니다. 인덱스 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조입니다. 여기서 중요한건 '검색 속도'를 향상시키기 위한 자료구조라는 것입니다. 그럼 다른 연산은 향상이 안되는건가? 꼭 그렇지만은 않습니다. 향상은 되지만 추가적인 연산이 ..
Q. N + 1 문제는 무엇이고 이것이 발생하는 이유와 해결 방법에 대해서 설명해주세요. A. 하위 엔티티들이 존재하는 경우 한 쿼리에서 모두 가져오는 것이 아닌, 필요한 곳에서 각각 쿼리가 발생하는 경우를 말합니다. N + 1 문제는 즉시로딩과 지연로딩 둘 다 발생할 수 있는데 즉시 로딩에서 발생하는 이유는 전체 조회를 했을 때, 영속성 컨텍스트가 아닌 데이터베이스에서 직접 데이터를 조회한 다음 즉시로딩 전략이 동작하기 때문입니다. 지연 로딩에서 발생하는 이유는 지연로딩 전략을 사용한 하위 엔티티를 로드할 때 해당 엔티티를 조회하기 위한 추가적인 쿼리가 실행되어 발생합니다. 해결 방법으로는 fetch join이라고 불리는 JPQL의 join fetch를 사용하는 방법이 있으며, 또 다른 방법으로는 @E..
Q. JPA를 사용하는 이유에 대해서 설명해주세요. A. JPA를 사용하는 이유는 객체지향 프레임워크이기 때문입니다. JPA를 사용하면 비즈니스 로직이 RDBMS에 의존하는 것이 아니라, 자바 코드로 표현될 수 있기 때문에 생산성이 올라갑니다. 또한, JPA는 JPQL로 SQL을 추상화하기 때문에 RDBMS에 관계없이 동일한 쿼리를 작성해서 같은 동작을 기대할 수 있다는 장점도 가지고 있습니다. 이는 Database Dialect를 지원하기 때문에 가지는 장점입니다. Q. 자바 코드로 표현했을 때 생산성이 높아지는 이유는 무엇인가요? A. 자바 컬렉션에 저장하듯이 JPA에게 저장할 객체를 전달하여 지루하고 반복적인 코드를 개발자가 직접 작성하지 않아도 되며, DDL 문도 자동으로 생성해주기 때문에 데이터..
Q. JPA 영속성 컨텍스트의 이점을 설명해주세요. A. 영속성 컨텍스트를 사용하는 이유는 1차캐시, 동일성 보장, 쓰기 지연, 변경 감지, 지연 로딩이 있습니다. Q. 더 자세히 설명해주세요. A. 1차 캐시는 조회가 가능하며 1차 캐시에 없으면 DB에서 조회하여 1차 캐시에 올려 놓습니다. 동일성 보장은 동일성 비교가 가능합니다. 쓰기 지연은 트랜잭션이 지원하는 쓰기 지연이 가능하며 트랜잭션 커밋하기 전까지 SQL을 바로 보내지 않고 모아서 보낼 수 있습니다. 변경 감지는 스냅샷을 1차 캐시에 들어온 데이터로 찍고 커밋 되는 시점에 엔티티와 스냅샷을 비교하여 update 쿼리를 생성합니다. 지연 로딩은 엔티티에서 해당 엔티티를 불러올 때 그 때 SQL을 날려 해당 데이터를 가져옵니다.
Q. POJO 란 무엇인가요? 스프링 프레임워크에서 POJO는 무엇이 될 수 있을까요? A. POJO란 인터페이스, 클래스를 구현하거나 확장하지 않은 단순한 클래스를 말합니다. POJO 클래스는 자바에서 제공하는 API 외에 종속되지 않습니다. 특정 환경에 종속되지 않아 코드가 간결하고 테스트 자동화에 유리합니다. 스프링에서는 도메인과 비즈니스 로직을 수행하는 대상이 POJO가 될 수 있습니다.
Q. @Bean / @Component 어노테이션에 대해서 설명해주시고 둘의 차이점에 대해서 설명해주세요 A. 두 어노테이션 모두 싱글톤으로 빈을 등록할 때 사용하는 어노테이션입니다. @Bean은 메서드를 빈으로 등록하는 어노테이션이고 @Component는 클래스를 빈으로 등록하는 어노테이션입니다.
Q. CORS 에러가 무엇인가요? A. Cross Origin Resource Sharing 의 약자로 동일한 출처가 아닌 다른 출처에 대한 접근을 막는 보안 정책입니다. Q. CORS 에러를 스프링에서 해결하는 방법이 뭔가요? A. Servlet Filter에 Access-Control-Allow-Origin 을 헤더에 담아 응답하거나, WebMvcConfiguer 를 구현한 Configuraion 클래스를 만들어서 빈으로 등록하거나, Controller 클래스에서 @CrossOrigin 어노테이션을 통해 접근을 허용할 수 있습니다. 제일 간단한 것은 어노테이션을 붙이는 것이지만 컨트롤러가 많을 때 붙여야하는 어노테이션도 많아진다는 단점이 있습니다.
Q. Servlet Filter 와 Spring Interceptor 의 차이는 무엇인가요? A. 차이점이 여러개 있는데 우선 스펙이 다릅니다. 필터는 서블릿 필터로써 javax.servlet 스펙에 포함되는 클래스이고 인터셉터는 Spring MVC 스펙에 포함되어있는 클래스입니다. 그리고 각자 실행시점이 다르다는 차이가 있습니다. 필터는 서블릿 전후처리를 담당하지만 인터셉터는 스프링에서 핸들러를 실행하기 전후나, ViewResolver를 통해 컨트롤러에서 리턴한 View Name 으로부터 렌더링을 담당한 View 오브젝트를 반환한 후 실제 View를 렌더링한 후에 처리를 담당합니다. 또한, 등록 위치도 다릅니다. 필터는 Web Application 에 등록합니다. 톰캣을 사용할 경우 web.xml에 등..
Q. Spring Web MVC 의 Dispatcher Servlet의 동작 원리에 대해 간단히 설명해주세요. A. 먼저 디스패처 서블릿이 핸들러 매핑에서 핸들러를 조회합니다. 그리고 핸들러 어댑터 목록에서 핸들러를 처리할 수 있는 핸들러 어댑터를 조회합니다. 핸들러 어탭더가 실행되면서 실제 핸들러를 실행합니다. 핸들러 어댑터는 디스패처 서블릿에게 ModelAndView를 반환합니다. 디스패처 서블릿은 viewResolver를 호출합니다. viewResolver는 디스패처 서블릿에게 View를 반환합니다. 디스패처 서블릿이 View를 통해서 View를 랜더링합니다.