ORM(Object-Relational Mapping)
- 정의: ORM은 객체와 관계형 데이터베이스를 매핑하는 기술을 의미합니다. 자바의 클래스와 관계형 데이터베이스의 테이블 간 매핑을 통해, 개발자가 SQL을 직접 작성하지 않고도 데이터베이스 작업을 수행할 수 있습니다.
- 역할: 자바 객체와 데이터베이스 테이블 간에 변환을 자동화하여 코드의 생산성과 유지 보수성을 높입니다.
- 예시: ORM 프레임워크로는 Hibernate, JPA, EclipseLink 등이 있습니다.
JPA(Java Persistence API)
- 정의: JPA는 자바에서 ORM을 쉽게 사용할 수 있도록 제공되는 표준 인터페이스입니다. ORM을 위한 규칙이나 가이드라인을 정의한 것입니다. 구현체는 아니므로, 이를 이용하기 위한 구현체 HIBERNATE를 사용해야합니다.
- 역할: 자바 객체와 관계형 데이터 베이스 간의 매핑을 표준화해, 일관성 있는 데이터베이스 작업을 가능하게 합니다.
HIBERNATE
- 정의: HIBERNATE는 JPA의 대표적인 구현체이자, JPA의 표준을 따르는 ORM 프레임워크입니다.
- 역할: JPA에서 정한 규칙을 실제로 구현해 데이터베이스와 상호작용 할 수 있게하고, 캐싱이나 고급 쿼리 등 추가 기능을 제공합니다.
- 장점: 독립적으로도 사용할 수 있으며, JPA 표준 외에도 고유의 기능을 제공해 더욱 효율적으로 데이터베이스와 작업할 수 있습니다.
MYBATIS
- 정의: MYBATIS는 JPA나 HIBERNATE와는 다르게, SQL 매핑 프레임 워크 입니다. ORM 방식이 아닌, SQL문장을 직접 작성하여 데이터 베이스와 상호작용합니다.
- 역할: SQL을 직접 관리하면서 자바 객체와 매핑할수 있도록 도와줍니다. 즉, SQL을 자동으로 생성하지 않고 개발자가 작성한 SQL에 맞춰 매핑을 수행합니다.
- 장점: 복잡한 SQL을 직접 작성할수 있어서, 복잡한 쿼리나 성능 최적화가 필요한 경우 유리합니다. 개발자가 SQL을 직접 제어할 수 있기 때문에, SQL 튜닝이나 고급 쿼리 작성이 자유롭습니다.
기술 | 정의 | 특성 | 장점 |
ORM | 객체-관계 매핑 기술 | 객체와 테이블을 자동으로 매핑 | SQL을 직접 작성하지 않아도 됨 |
JPA | ORM을 위한 표준 인터페이스 | 규칙만 제공, 구현체 필요 | 벤더 독립적, 일관된 데이터베이스 작업 가능 |
Hibernate | JPA의 구현체, ORM 프레임워크 | JPA 표준 준수 + 추가 기능 제공 | JPA 없이 독립 사용 가능, 고급 기능 포함 |
MyBatis | SQL 매핑 프레임워크 | SQL 직접 작성 및 매핑 | SQL 제어 가능, 복잡한 쿼리 작성 유리 |
이렇게 대답하세요!
1. ORM이 무엇인가요?
네, ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑하는 기술입니다. 간단히 말해, 자바의 객체와 데이터베이스의 테이블 간에 다리를 놓아주는 역할을 합니다. 객체 지향적인 자바 코드와 관계형 데이터베이스 사이의 불일치를 해결해 주기 때문에, SQL을 직접 작성하지 않고도 데이터베이스와 소통할 수 있습니다. 이를 통해 개발자는 자바 코드만으로 데이터베이스 작업을 할 수 있어, 생산성과 유지보수성을 크게 높일 수 있습니다.
2. JPA는 무엇인가요?
JPA(Java Persistence API)는 자바에서 ORM을 쉽게 사용하기 위한 표준 인터페이스입니다. 그러니까, 자바에서 데이터베이스 작업을 일관성 있게 할 수 있도록 규칙과 가이드라인을 정의한 일종의 규칙서라고 보시면 됩니다. JPA 자체는 기능을 수행하지 않기 때문에, 이를 구현한 프레임워크(Hibernate 같은 것)가 필요합니다. JPA를 사용하면 특정 구현체에 의존하지 않고 표준화된 방식으로 데이터베이스와 상호작용할 수 있어, 코드의 이식성과 유지보수성을 높여줍니다.
3. Hibernate란 무엇인가요?
Hibernate는 JPA의 대표적인 구현체이자 ORM 프레임워크입니다. JPA의 규칙을 따르면서도, 독자적인 기능을 더 많이 제공하는데요, 예를 들어 고급 쿼리를 작성할 수 있는 HQL(Hibernate Query Language)이나 캐싱 기능 등이 포함되어 있습니다. 이를 통해 데이터베이스와 상호작용할 때 성능 최적화나 효율적인 데이터 처리도 가능해집니다. JPA 표준을 따르지만, JPA 없이도 독립적으로 사용할 수 있어 자바 애플리케이션에서 많이 쓰이는 강력한 도구입니다.
4. MyBatis란 무엇인가요?
MyBatis는 JPA나 Hibernate와는 다르게, ORM이 아닌 SQL 매핑 프레임워크입니다. 데이터베이스 작업을 할 때 SQL을 자동 생성하는 대신, 개발자가 직접 작성한 SQL을 활용합니다. 그래서 복잡한 쿼리나 성능 최적화가 필요한 경우에 유리합니다. SQL을 직접 작성할 수 있기 때문에 데이터베이스 제어를 세밀하게 할 수 있으며, 복잡한 비즈니스 로직이나 성능 튜닝이 필요한 환경에서 MyBatis를 주로 사용합니다.
5. ORM 말고 쓸만한 매핑 기술이 있을까요?
네, ORM 외에 대표적인 매핑 기술로는 JDBC가 있습니다. JDBC(Java Database Connectivity)는 자바와 데이터베이스를 연결해주는 API로, SQL을 직접 작성해서 데이터베이스와 상호작용할 수 있습니다. 이 외에 Spring JDBC Template도 자주 사용됩니다. Spring JDBC Template은 JDBC를 사용할 때 반복적으로 작성해야 하는 코드들을 줄여줘, 더 간편하고 가독성이 좋은 방식으로 데이터베이스 작업을 할 수 있게 도와줍니다.
6. Hibernate와 MyBatis의 차이점과 장단점은 무엇인가요?
Hibernate와 MyBatis는 접근 방식이 다릅니다. Hibernate는 JPA 표준을 따르는 ORM 프레임워크로, 객체를 자동으로 테이블에 매핑합니다. 덕분에 SQL을 직접 작성하지 않아도 되고, 개발 속도와 유지보수성이 높습니다. 하지만, 복잡한 쿼리가 필요하거나 성능을 세밀하게 조정하고자 할 때는 다소 어려움이 있을 수 있습니다.
반면에, MyBatis는 SQL을 직접 작성하는 SQL 매핑 프레임워크입니다. SQL을 직접 관리하기 때문에 복잡한 쿼리 작성이나 성능 튜닝이 가능하며, 데이터베이스 제어를 더 세밀하게 할 수 있습니다. 그러나 SQL을 관리해야 하므로 코드량이 많아질 수 있고, 변경 사항이 생기면 SQL을 일일이 수정해야 하는 단점이 있습니다. 쉽게 말해, Hibernate는 ORM 방식으로 개발을 간편하게 하고, MyBatis는 SQL을 세밀하게 제어할 수 있는 프레임워크입니다.
7. ORM, JPA, Hibernate, MyBatis를 비교해 주세요.
ORM은 객체와 데이터베이스를 자동으로 매핑해주는 큰 개념입니다. 객체 지향 코드와 관계형 데이터베이스의 불일치를 해결하는 기술을 의미합니다.
JPA는 자바에서 ORM을 위한 표준 인터페이스로, "이렇게 데이터베이스와 상호작용하세요"라는 규칙을 정의합니다.
Hibernate는 JPA의 표준을 따른 대표적인 ORM 프레임워크로, JPA 규칙을 구현하면서도 추가적인 기능을 제공합니다.
MyBatis는 SQL 매핑 프레임워크로, SQL을 개발자가 직접 작성해 데이터베이스와 상호작용하는 방식입니다.
8. ORM을 사용할 때 발생할 수 있는 성능 이슈와 해결 방법을 설명해주세요.
네, ORM을 쓸 때 자주 겪는 문제 중 하나가 N+1 문제예요. 예를 들어, 어떤 부모 데이터 하나를 가져올 때 자식 데이터를 한 번에 불러오지 않고, 부모 데이터 개수만큼 추가로 자식 데이터를 쿼리하게 되면서 성능이 확 떨어지는 현상이죠. 이럴 때는 fetch join을 통해 한 번의 쿼리로 자식 데이터를 가져오거나, @EntityGraph를 활용해 데이터 로드를 조절할 수 있어요.
그리고 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading) 문제도 자주 발생하는데요. 지연 로딩은 필요할 때만 데이터를 가져오고, 즉시 로딩은 데이터를 한 번에 가져오는 방식인데요. 연관 데이터를 자주 사용하는 상황이라면 즉시 로딩으로 가져오는 게 유리하고, 그게 아니면 지연 로딩으로 필요할 때만 가져오게 해둬야 성능이 좋아져요.
마지막으로는 캐시 설정을 통해 성능을 높일 수도 있습니다. Hibernate는 기본적으로 1차 캐시를 사용해서 같은 트랜잭션 내에서 동일한 데이터를 여러 번 요청할 때 캐시에서 가져오고요. 만약 자주 조회하지만 변하지 않는 데이터라면 2차 캐시를 추가해 전체 애플리케이션에서 공유되도록 설정하면 데이터베이스 부하를 줄일 수 있습니다
9. MyBatis와 JPA를 같이 사용해야 한다면, 어떻게 설계하시겠어요?
네, MyBatis와 JPA를 함께 사용하게 된다면 두 프레임워크가 맡는 역할을 잘 나눠야 합니다. MyBatis는 고성능이 필요하거나, 복잡한 SQL을 쓸 때 적합해요. 그래서 대량 데이터 조회나 복잡한 쿼리가 필요할 때 MyBatis로 해결하고, 반대로 일반적인 CRUD 작업이나 엔티티 매핑이 필요한 작업은 JPA로 처리하는 게 좋습니다.
트랜잭션 관리도 신경 써야 하는데요, Spring에서 PlatformTransactionManager를 설정하면 MyBatis와 JPA가 같은 트랜잭션을 사용할 수 있게 통합 관리가 가능해요.
10. 트랜잭션 관리에 대해서 설명해 줄 수 있나요? 특히, JPA의 트랜잭션 처리는 어떻게 되나요?
네, JPA에서 트랜잭션은 영속성 컨텍스트와 관련이 깊은데요. 예를 들어, 트랜잭션 전파 속성은 REQUIRED, REQUIRES_NEW처럼 기존 트랜잭션을 그대로 쓸지, 아니면 새로 시작할지 등을 정할 수 있습니다.
JPA에서 트랜잭션이 활성화되면 영속성 컨텍스트가 엔티티의 상태를 관리하고, 이 컨텍스트 내에서는 변경 사항이 데이터베이스와 즉시 반영되지 않고 메모리에서 관리됩니다. 이때, flush()를 통해 영속성 컨텍스트를 강제로 데이터베이스에 동기화할 수도 있지만, 보통은 트랜잭션 커밋 시점에서 자동으로 데이터베이스에 반영되도록 되어 있어요.
11. JPA에서 LazyInitializationException이라는 예외가 발생하는데, 이게 뭔지 아세요? 또 어떻게 방지할 수 있을까요
네, LazyInitializationException은 지연 로딩된 엔티티를 트랜잭션 바깥에서 접근하려고 할 때 발생하는 예외예요. 예를 들어, 연관 엔티티를 fetch = FetchType.LAZY로 설정했는데, 트랜잭션 범위를 벗어난 상태에서 이 데이터를 호출하려고 하면 문제가 생겨요.
해결 방법으로는 데이터가 꼭 필요할 경우 즉시 로딩(Eager)로 설정해두거나, 트랜잭션 내에서 데이터를 미리 가져오는 fetch join을 사용해 로딩하는 게 있어요. 필요에 따라 @Transactional을 사용해 트랜잭션 범위를 넓히는 방법도 있습니다.
12. Hibernate에서는 엔티티 생명주기를 어떻게 관리하나요?
Hibernate에서는 엔티티를 네 가지 생명주기로 관리하는데요. 비영속(new) 상태는 아직 영속성 컨텍스트에 등록되지 않은 상태예요. 영속(managed) 상태는 영속성 컨텍스트에 등록된 상태로, persist()를 호출해 등록할 수 있습니다.
그리고 준영속(detached) 상태는 영속성 컨텍스트에서 분리된 상태로 더 이상 관리되지 않는 상태고, 삭제(removed) 상태는 remove()를 통해 데이터베이스에서 삭제될 상태입니다. 이런 생명주기를 통해 Hibernate가 엔티티를 관리하며 필요할 때 flush를 통해 데이터베이스와 동기화합니다/
13. MyBatis XML Mapper를 활용해 보셨나요? SQL을 어떻게 관리하고 최적화하셨나요?
네, MyBatis XML Mapper를 사용할 때는 SQL 중복을 줄이기 위해 include 태그를 활용해서 공통 SQL 부분을 분리했어요. 그리고 if나 choose를 사용해서 동적으로 SQL이 생성되도록 했고요.
또한 ResultMap을 설정해 컬럼과 객체 필드를 매핑하고, fetchSize를 조절해서 한 번에 가져오는 데이터 크기를 적절히 설정해서 성능을 최적화했어요.
14. Hibernate의 캐시 전략에 대해 설명해 주실래요? 1차 캐시와 2차 캐시의 차이도 알려주세요.
Hibernate에서는 두 가지 캐시를 사용할 수 있는데요. 1차 캐시는 세션 안에서만 사용되는 캐시예요. 같은 세션 내에서는 동일한 데이터를 다시 조회할 때 데이터베이스에 쿼리를 날리지 않고 캐시에 저장된 데이터를 반환해요.
2차 캐시는 세션을 넘어 전체 애플리케이션에서 공유되는 캐시입니다. EhCache 같은 외부 캐시 프로바이더를 사용해 설정할 수 있어요. 2차 캐시는 자주 조회하지만 변경이 적은 데이터를 캐싱할 때 유용해요.
2024.10.30 - [cs정리] - ORM 프레임워크 - HIBERNATE, MYBATIS
2024.10.30 - [cs정리] - SPRING BOOT ORM이란?
2024.10.30 - [cs정리] - SPRING BOOT JPA란?
'면접 예상 질문 모음!' 카테고리의 다른 글
동기, 비동식 처리 방식-면접 예상 질문 (0) | 2024.11.11 |
---|---|
SPRING IOC-면접 예상 관련 질문 (0) | 2024.11.11 |
스프링 빈- 면접 예상 질문 (0) | 2024.11.11 |
스프링 빈 주입시 생기는 문제들 -면접 예상 질문 (0) | 2024.11.10 |
클래스, 인스턴스 (0) | 2024.11.10 |