본문 바로가기

일기

2023-02-15

목터뷰 조사한 내용 정리 3일차...

 

 

 

 

 

 

 

11. JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있을까요?

JPA 는 자바 진영에서 ORM(Object-Relational-Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다.

즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크를 의미한다. JPA 를 구현한 대표적인 오픈소스로는 Hibernate 가 있다.

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 이다.

 

위에서 말한 ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다.

어플리케이션 Class 와 RDB 의 테이블을 매핑(연결) 한다는 뜻이며, 기술적으로는 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.

  • SQL 문이 아닌 Method 를 통해 DB 를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데에만 집중할 수 있다.
  • 객체지향적인 코드 작성이 가능. 즉, 객체지향적 접근만을 고려하면 되기 때문에 생산성이 증가된다.
  • 매핑하는 정보가 Class 로 명시 되었기 때문에 ERD 를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리하다.
  • 기존 방식에서 MySQL 을 사용하다가 다른 SQL 로 변환할 때, 새롭게 쿼리를 짤 필요가 없다.
  • 다만, 프로젝트의 규모가 크고 복잡해 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 발생
  • 복잡하고 무거운 쿼리는 속도를 위해 별도의 튜닝이 필요해 결국 SQL 문을 사용해야 할 수도 있다.

+ JPQL 이란

Jaca-Persistence-Query-Language 의 약자로, 테이블을 대상으로 쿼리하는 것이 아닌 엔티티 객체를 대상으로 쿼리를 한다.

SQL 과 비슷한 문법을 가지며, JPQL 은 결국 SQL 로 변환된다. JPA 에서 제공하는 메소드만 으로는 복잡한 쿼리 작성에 한계가 있기 때문에 탄생하게 되었다.

SQL 을 추상화하여 만든 객체 지향 쿼리 언어 이며, 특정 밴더에 종속적이지 않다.

 

정리

JPA 는 SQL 문이 아닌 Method 를 통해 DB 조작이 가능해 개발자가 비즈니스 로직을 구성하는데에만 집중이 가능해고 객체지향적 접근만을 고려함으로 생산성을 높일 때 필요하다.

다만, 프로젝트의 규모가 크고 복잡할 때 설계를 잘못하면 성능 저하가 발생할 수 있으며, 복잡하고 무거운 쿼리의 경우에는 SQL 문을 사용해서 해결해야 하는 경우가 발생할 수도 있다.

 

11번 질문의 다른 사람들의 답변

데이터베이스가 바뀔 가능성이 있는 경우 JPA를 권장합니다. JPA는 추상화한 데이터 접근 계층을 제공하기 때문에 설정 파일에 사용할 데이터베이스를 등록하기만 하면 얼마든 데이터베이스를 변경할 수 있습니다. 그러나 통계 처리 같은 복잡한 쿼리가 필요한 경우에는 JPA 보다는 SQL문이 오히려 나을 수도 있습니다. JPA에서 Native SQL Query를 사용할 수 있지만 특정 데이터베이스에 종속 된다는 문제가 있습니다. 이를 보완하기 위해 JPA에서는 SQL과 유사한 기술인 JPQL을 지원합니다. 그리고 JPA에 대한 이해가 부족해 잘못된 매핑으로 설계하는 경우 N+1 문제로 성능 저하가 발생할 수 있습니다.
CRUD를 중심으로 빠르게 개발할 필요가 있을 때는 JPA를 사용하는 것이 좋습니다. 하지만 통계와 같은 작업을 할 때는 JPA를 사용하는 것보다 직접 SQL을 사용하는 것이 보다 효율적인 결과가 나올 수 있습니다.

 


 

12. JPA의 더티 체킹이란 무엇인가요?

Dirty Checking, 짧게 말해 상태 변경 검사라고 한다.

JPA 에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영한다.

여기서 말하는 변화가 일어난 시점은 최초 조회 상태 이후를 말한다.

JPA 에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만들어 놓는다.

그리고 트랜잭션이 끝나느 시점에 이 스냅샷과 비교해서 다른점이 있으면 update query 를 데이터베이스로 전달한다.

이러한 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용이 된다.

Detached(준영속) - 영속성 컨텍스트에 저장되었다가 분리된 상태

Transient(비영속) - DB에 반영되기 전 처음 생성된 엔티티

위와같은 준영속/비영속 상태의 엔티티는 더티체킹 대상에 포함되지 않는다.

 

정리

상태 변경 검사를 의미하는 더티체킹은 JPA 에서 트랜잭션이 끝나는 시점에 최조 조회한 시점에 생성된 스냅샷과 비교해서 변화가 있는 모든 엔티티 객체에 update query 로 데이터베이스에 전달하는 것을 말한다.

다만, 준영속 및 비영속 상태인 엔티티의 경우엔 더티체킹에 대상에 포함되지 않는다.

 

12번 질문의 다른 사람들의 답변

더티 체킹(Dirty Checking)이란 상태 변경 검사 입니다. JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해줍니다. 이 때 변화가 있다의 기준은 최초 조회 상태이며 이 상태 변경은 영속화된 데이터에서만 동작합니다. 이 때 업데이트는 모든 필드에서 동작하는데 변경된 데이터에서만 업데이트 동작을 원하면 @DynamicUpdate으로 해결할 수 있습니다.

 


 

13. Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?

사전적 의미로 주석이라는 뜻이다. 자바에서 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행해주는 기술이다.

자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이며 보통 @ 기호를 앞에 붙여서 사용한다.

JDK 1.5 버전 이상에서 사용 가능하며, 자바 Annotation 은 클래스 파일에 임베디드 되어 컴파일러에 의해 성성된 후 자바 가상머신에 포함되어 작동한다.

어노테이션을 활용함에 따라 코드가 깔끔해지며 재사용에 용이해진다. 이러한 효과로 인해 가독성 또한 좋아진다.

어노테이션의 종류

  • 표준(내장) 어노테이션 "built-in annotation" : 자바가 기본적으로 제공해주는 어노테이션
    @Override, @Deprecated, @SuppressWarings, @Functionallnterface
  • 메타 어노테이션 "Meta annotation" : 어노테이션을 위한 어노테이션
    @Target, @Retention, @Documented, @Inherited
  • 사용자 정의 어노테이션 "Custom Annotation" : 사용자가 직접 정의하는 어노테이션

[표준] @Override

선언한 메서드가 상위 클래스의 메서드를 오버라이딩하는 메서드라는 것을 컴파일러에 알려주는 역할을 한다.

만일, 해당 메서드가 오버라이딩 하는 메서드가 없을 경우 에러를 발생시키는데 이러한 사용자의 실수를 방지하기 위해서 사용한다.

[메타] @Target

자바 컴파일러가 어노테이션이 어디에 적용될지 결정하기 위해서 사용한다.

@Target(ElementType.PACKAGE) 이런식으로 속성값을 붙여줘서 사용하는데 지금 사용한 것은 패키지 선언에 사용한다는 의미가 된다. 이 외에도 TYPE, FIELD, METHOD 등이 있다.

 

+ 우리가 자주 사용하는 @Service 를 예로 들자면, @Service 를 Bean 으로 등록해주기 위해 @Component 를 내포하고 있는 있는데 이 때, 여기서 @Component 도 메타 어노테이션이 된다.

 

정리

자바에서 코드 사이에 주석처럼 쓰이며 특별한  의미, 기능을 수행해주는 기술이다.

JDK 1.5 버전 이상에서 사용 가능하며, 어노테이션은 클래스 파일에 내장되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동하게 된다.

총 3가지 종류가 있는데 표준, 메타, 사용자 정의 어노테이션 이 있다.

표준의 가장 대표적인 예로 @Override 가 있는데, 이는 선언한 메서드가 상위 클래스의 메서드를 오버라이딩 하는 메서드라는 것을 컴파일러에게 알려주는 역할을 한다.

 

13번 질문의 다른 사람들의 답변

Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술입니다. Annotation을 활용하면 코드가 깔끔해지고 재사용에 용이합니다. Spring framework에서 제공하는 @ComponentScan는 하위 @Component 또는 직접 등록할 Bean 예를 들면 @Controller, @Service, @Repository 등을 스캐닝하여 Bean 등록합니다. @Autowired 같은 Annotation은 또 달리 등록 된 Bean을 찾아 의존성 주입을 위해 사용 됩니다. 또 다른 예로 Lombok 라이브러리에서 제공하는 Annotaion @Setter, @Getter 등은 코드를 줄여 가독성을 높여주는 역할을 합니다.
자바 개발을 하다 보면 클래스 또는 메서드 또는 변수 앞에 @Override 같은 @ 표시가 있다. 이 어노테이션은 JEE5(Java Platform, Enterprise Edition 5)부터 새롭게 추가된 요소이다. 이 어노테이션으로 인해 데이터의 유효성 검사 등을 쉽게 알 수 있고, 이와 관련한 코드가 깔끔해지게 된다. 일단 어노테이션의 용도는 다양한 목적이 있지만 메타 데이터의 비중이 가장 크다 할 수 있다. Annotation에는 크게 세 가지 종류가 존재한다. JDK 에 내장되어 있는 built-in annotation, 어노테이션에 대한 정보를 나타내기 위한 어노테이션인 Meta annotation, 개발자가 직접 만들어 내는 Custom Annotation등이 있다.

 


 

15. 인덱스란 무엇이고 일반적인 원리는 어떠한지 설명해주실 수 있을까요?

인덱스란 추가적인 쓰기 작업과 저장공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.

테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 해준다.

이를 활용하면 데이터를 조회하는 Select 나 Update, Delete 성능도 함께 향상된다. 이는 해당 연산을 수행하기 위해서 해당 대상을 조회해야만 작업이 가능하기 때문이다.

만약 index 를 사용하지 않은 컬럼을 조회해야 하는 상황이라면 전체를 스캔해서 수행해야 하지만 이는 전체를 비교하여 탐색하기 때문에 처리속도가 떨어질 수 밖에 없다.

또한, 인덱스 생성 시 데이터를 오름차순으로 정렬하기 때문에 정렬된 주소체계 라고 표현할 수도 있다.

 

원리를 적어보자면

특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다.

이렇게 인덱스를 생성하였으면 앞으로 쿼리문에 "인덱스 생성 컬럼을 WHERE 조건으로 거는 등" 의 작업을 하면 옵티마이저에서 판단하여 생성된 인덱스를 탈 수가 있다.

만약 인덱스를 타게 되면 먼저 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오는 식으로 동작을 하여 검색 속도의 향상을 가져올 수 있다

 

정리

데이터베이스 테이블의 검색 속도를 향상시키위 위한 자료구조를 말한다.
컬럼을 조회할 때 전체를 스캔해서 수행하면 처리속도가 떨어질 수 밖에 없는데 인덱스를 사용하면 해당 대상만을 조회해서 작업을 할 수 있기 처리속도에서 큰 이점을 가질 수 있다.
인덱스 생성시 해당 컬럼의 데이터를 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장하고 조회시 해당 조건(WHERE)에 맞는 데이터의 물리적 주소에 접근해서 데이터를 가져오는 방식이다.

 

15번 질문의 다른 사람들의 답변

인덱스란 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조입니다. 데이터 블록이 10만개 있다고 가정할 때 SELECT문 실행시 server process가 구문 분석 과정을 마친 후 database buffer cache 에 조건이 부합하는 데이터가 있는지 확인, 해당 정보가 buffer cache에 없다면 디스크 파일에서 조건에 부합하는 블럭을 찾아서 database buffer cache에 가져온 뒤 사용자에게 보여줌, 이 때 인덱스가 없으면 10만개를 전부 database buffer cache 로 복사한 후 풀스캔으로 찾게 되는데 index가 있으면 where절의 조건의 컬럼이 index의 키로 생성되어있는지 확인한 뒤, 인덱스에 먼저 가서 조건에 부합하는 정보가 어떤 ROWID를 가지고 있는지 확인 후 ROWID에 있는 블럭을 찾아가 해당 블럭만 buffer cache에 복사합니다.
인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조입니다. 특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터를 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장됩니다. 동작 원리는 데이터베이스 버퍼 캐시에 데이터가 있는지 확인하고 해당 정보가 없다면 디스크 파일에서 조건에 부합하는 데이터를 찾아 데이터베이스 버퍼 캐시에 가져온 뒤 사용자에게 보여줍니다. 이때 인덱스가 있다면 조건에 따라 인덱스의 키로 생성 되어 있는지 확인한 뒤 인덱스에 조건에 부합하는 정보가 어떤 ROWID(주소)를 가지고 있는지 확인 후 ROWID에 있는 블럭을 찾아가 해당 블럭만 버퍼 캐시에 복사합니다.

'일기' 카테고리의 다른 글

2023-02-17  (0) 2023.02.17
2023-02-16  (0) 2023.02.17
2023-02-14  (0) 2023.02.14
2023-02-13  (0) 2023.02.13
2023-02-10  (0) 2023.02.10