- 목표
- JDBC 및 JPA를 사용하는 이유에 대해 설명할 수 있다.
- 단순히 ORM의 기능을 넘어서 영속성 컨텍스트를 이용하는 장점(1차 캐시, 지연 로딩, 쓰기 지연 등)
- Transactional 등의 부가 기능들도 잘 설명할 수 있다.
- 잘못 사용하는 경우의 영향력과 해결 방법에 대해 설명할 수 있다.
- JAVA 진영의 JPA와 Spring 진영의 JPA가 어떻게 구현되어 있는지 설명할 수 있다.
- JDBC, JPA, Hibernate, JPA, Spring Data JPA의 차이를 설명할 수 있다.
- Kolin으로 Spring JPA를 사용할때 주의점
- JDBC 및 JPA를 사용하는 이유에 대해 설명할 수 있다.
1. JDBC란?
(From Oracle) Java Database Connectivity의 약자로서 자바의 Universal Data Access를 제공한다.
The Java Database Connectivity (JDBC) API provides universal data access from the Java programming language.
(From princeton.edu) JDBC는 SQL 실행을 위한 JAVA API이다.
JDBC is a Java API for executing SQL statements
JDBC의 목적
JDBC는 자바 환경에서 데이터베이스 접근에 대한 표준을 제시하며, 데이터베이스의 종류(Oracle, MySQL PostgreSQL 등)가 달라지더라도 추상화 내용은 유지한 채, JDBC 드라이버의 구현체만 변경하여 유연한 설계가 가능하다)
JDBC를 알아야 하는 이유
우리가 많이 사용하는 ORM들이 JDBC를 기반으로 동작한다.
2. JDBC의 단점
JDBC를 이용하는 방법
예제 코드에서 보듯이 다음과 같은 단점이 있다.
- 많은 양의 Boiler Plate 코드가 필요하다.
- Connection들의 상태관리를 직접해줘야한다.
- Raw Query를 직접 입력해야 하고, "?" 및 setString 등 인자들을 타입에 맞추어 직접 넣어줘야한다.
public class IngredientRepository {
public Ingredient findById(String id) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// Connection 매번 생성
// connection = DriverManager.getConnection(url, username, password)
// DataSource를 이용한 Connection Pool 이용
// connection = dataSource.getConnection();
statement = connection.PreparedStatement("selet * from Ingredient where id = ?");
statement.setString(1, id);
resultSEt = statement.executeQuery();
Ingredient ingredient = null;
if (resultSet.next()) {
ingredient = new Ingredient(
resultSet.getString("id"),
resultSet.getString("name"),
Ingredient.Type.valueOf(resultSet.getString("type")));
}
return ingredient;
} catch (SQLException e) {
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {}
}
if (statement != null) {
try {
statemenet.close();
} catch (SQLException e) {}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {}
}
}
}
}
JdbcTemplate을 이용하는 방법
- Raw Query를 직접 입력해야 하고, "?" 및 setString 등 인자들을 타입에 맞추어 직접 넣어줘야한다.
ResultSet에서 각 칼럼에 맞는 값을 객체로 변환하기 위한 코드(ex. mapRowToIngredient)가 필요하다.
public class IngredientRepository {
public Ingredient findById(String id) {
return jdbc.queryForObject(
"select * from Ingredient where id=?",
this::mapRowToIngredient, id
);
}
private Ingredient mapRowToIngredient(ResultSet rs, int rowNum) throws SQLException {
return new Ingredient(
rs.getString("id"),
rs.getString("name"),
Ingredient.Type.valueOf(rs.getString("type"))
)
}
}
3. ORM 이란?
4. JPA 란?
5. Spring Data JPA에서는 어떻게 interface만으로도 동작할까?
@Service에 실제 주입되는 Bean은 Repository의 Proxy 객체이다.
Proxy 클래스는 리플렉션을 이용하여 동적으로 바이트코드(.class file)로 직접 생성되며,
interface repository에 선언했던 findAll 등의 메소드도 구현하여 추가한다.
MemberService
ㄴ MemberRepository :
면접 관련 질문
기본 키 맵핑 전략의 default가 왜 Identity가 아닐까요?
mysql에서 foreign key를 설정하면 뭐가 좋아
JPA와 Hibernate의 차이점은 무엇인가요?
Hibernate에서 Session과 Transaction의 역할은 무엇인가요?
JPA에서 Entity의 Life Cycle은 어떻게 이루어지나요?
JPA에서 Entity의 상태(State) 전이는 어떻게 이루어지나요?
JPA에서 Persist() 메서드는 무엇을 하는 메서드인가요?
JPA에서 Flush() 메서드는 무엇을 하는 메서드인가요?
JPA에서 Cascade Type을 지정하지 않으면 어떻게 될까요?
JPA에서 FetchType.LAZY로 설정했을 때 N+1 문제가 발생하는 이유는 무엇인가요?
JPA에서 Entity를 캐시하는 방법은 무엇인가요?
JPA에서 쿼리 캐시를 사용하는 방법은 무엇인가요?
Hibernate에서 1차 캐시와 2차 캐시의 차이점은 무엇인가요?
JPA에서 Dirty Checking이란 무엇인가요?
Hibernate에서 Dirty Checking이 어떻게 이루어지나요?
JPA에서 Proxy란 무엇인가요?
Hibernate에서 Proxy는 어떻게 생성되고 사용되나요?
JPA에서 Query Language는 무엇인가요?
JPA에서 JPQL(JPA Query Language)이란 무엇인가요?
JPA에서 Named Query란 무엇인가요?
JPA에서 Criteria API란 무엇인가요?
JPA에서 Criteria Query를 사용하는 이유는 무엇인가요?
Hibernate에서 SQL Query를 작성하는 방법은 무엇인가요?
Hibernate에서 Native SQL Query를 작성하는 방법은 무엇인가요?
JPA에서 Transaction의 기본 동작 방식은 무엇인가요?
JPA에서 Transaction의 Isolation Level은 무엇인가요?
JPA에서 Transaction의 Propagation은 무엇인가요?
JPA에서 Inheritance(상속)란 무엇인가요?
JPA에서 Inheritance 전략에는 어떤 것이 있나요?
JPA에서 Inheritance 전략 중 Single Table 전략이란 무엇인가요?
JPA에서 Inheritance 전략 중 Joined Table 전략이란 무엇인가요?
JPA에서 Inheritance 전략 중 Table per Concrete Class 전략이란 무엇인가요?
JPA에서 Lazy Loading과 Eager Loading의 차이점은 무엇인가요?
JPA에서 연관 관계(OneToMany, ManyToOne 등)를 설정하는 방법은 무엇인가요?
JPA에서 CascadeType.ALL의 의미는 무엇인가요?
JPA에서 orphanRemoval 옵션은 무엇인가요?
JPA에서 FetchType.LAZY와 FetchType.EAGER의 차이점은 무엇인가요?
JPA에서 OneToOne 양방향 연관 관계를 설정하는 방법은 무엇인가요?
JPA에서 OneToMany 양방향 연관 관계를 설정하는 방법은 무엇인가요?
JPA에서 ManyToMany 양방향 연관 관계를 설정하는 방법은 무엇인가요?
JPA에서 테이블 간 연관 관계를 매핑하는 방법은 무엇인가요?
JPA에서 Embedded Object란 무엇인가요?
JPA에서 Embedded Object를 사용하는 방법은 무엇인가요?
JPA에서 EntityManager란 무엇인가요?
JPA에서 EntityManager의 주요 메서드는 무엇인가요?
JPA에서 EntityManager를 사용할 때 주의할 점은 무엇인가요?
JPA에서 @Transactional 어노테이션을 사용하는 이유는 무엇인가요?
JPA에서 영속성 컨텍스트란 무엇인가요?
JPA에서 영속성 컨텍스트의 생명 주기는 어떻게 이루어지나요?
JPA에서 영속성 컨텍스트를 어떻게 관리하나요?
JPA에서 영속성 컨텍스트가 엔티티를 관리하는 방법은 무엇인가요?
JPA에서 쓰기 지연 SQL 저장소란 무엇인가요?
JPA와 Hibernate의 차이점은 무엇인가요?
JPA에서 Cascade Type을 지정하지 않으면 어떻게 될까요?
JPA에서 FetchType.LAZY와 FetchType.EAGER의 차이점은 무엇인가요?
JPA에서 OneToMany와 ManyToOne의 관계에서 어떤 Fetch Type을 사용해야 할까요?
JPA에서 Named Query와 Dynamic Query의 차이점은 무엇인가요?
JPA에서 Transaction의 Isolation Level은 어떤 것이 있나요? 각각 어떤 특징을 가지고 있나요?
Hibernate에서 Dirty Checking은 어떻게 이루어지나요?
Hibernate에서 1차 캐시와 2차 캐시의 차이점은 무엇인가요?
Hibernate에서 Lazy Loading과 Eager Loading의 차이점은 무엇인가요?
JPA에서 QueryDSL을 사용하는 이유는 무엇인가요?
JPA에서 엔티티를 상속하는 방식 중 어떤 것이 가장 좋은 방법인가요? 그 이유는 무엇인가요?
JPA에서 FetchType.LAZY로 설정한 엔티티를 조회할 때 발생하는 N+1 문제를 해결하는 방법은 무엇인가요?
Hibernate에서 Transaction의 Isolation Level은 어떤 것이 있나요? 각각 어떤 특징을 가지고 있나요?
Hibernate에서 Second Level Cache를 사용하는 이유는 무엇인가요?
Hibernate에서 OneToMany와 ManyToOne의 관계에서 어떤 Fetch Type을 사용해야 할까요?
Hibernate에서 HQL과 Native SQL Query의 차이점은 무엇인가요?
JPA에서 Embedded Object와 Inheritance 전략 중 어떤 것을 사용해야 할까요? 그 이유는 무엇인가요?
JPA에서 Entity를 삭제할 때, CascadeType.REMOVE와 orphanRemoval 속성 중 어떤 것을 사용해야 할까요?
Hibernate에서 SessionFactory와 Session의 차이점은 무엇인가요?
JPA에서 EntityManagerFactory와 EntityManager의 차이점은 무엇인가요?
JPA에서 엔티티를 저장할 때 persist()와 merge()의 차이점은 무엇인가요?
Hibernate에서 Inheritance 전략 중 Single Table 전략의 단점은 무엇인가요?
Hibernate에서 HQL을 사용하는 것보다 Criteria API를 사용하는 것이 좋은 이유는 무엇인가요?
Hibernate에서 Entity를 삭제할 때 CascadeType.REMOVE와 orphanRemoval 속성이 동시에 사용될 때 발생할 수 있는 문제는 무엇인가요?
Hibernate에서 Batch Insert를 사용하는 이유는 무엇인가요?
JPA에서 Entity를 저장할 때 @GeneratedValue와 @SequenceGenerator를 같이 사용하는 이유는 무엇인가요?
Hibernate에서 Inheritance 전략 중 Joined Subclass 전략의 장단점은 무엇인가요?
Hibernate에서 Criteria API를 사용하는 것과 JPQL을 사용하는 것 중 어떤 것이 더 좋은가요?
JPA에서 EntityManager가 관리하는 상태에 대한 설명을 해주세요.
Hibernate에서 StatelessSession을 사용하는 이유는 무엇인가요?
1. JPA는 상속 매핑 전략을 어떻게 처리합니까? 각 전략을 자세히 설명하십시오.
2. FetchType.LAZY와 FetchType.EAGER의 차이점은 무엇입니까? 예를 들어 설명하십시오.
3. JPA Second-Level Cache의 작동 방식과 이점을 설명하십시오.
4. JPA에서 낙관적 잠금과 비관적 잠금의 차이점과 각 전략을 사용하는 경우를 설명하십시오.
5. JPA에서 JPQL, Criteria API 및 native SQL을 사용하는 것의 주요 차이점은 무엇입니까?
6. CascadeType 열거형과 다양한 값에 대해 설명하십시오. 각각 언제 사용해야 합니까?
7. JPA는 트랜잭션을 어떻게 처리합니까? EntityManager 및 트랜잭션 전파의 역할을 설명하십시오.
8. JPA의 N+1 select 문제는 무엇이며 어떻게 완화할 수 있습니까?
9. JPA로 페이지네이션 및 정렬을 처리하는 모범 사례를 설명하십시오.
10. JPA에서 merge() 및 persist() 메소드의 차이점을 설명하십시오.
11. JPA에서 복합 기본 키를 어떻게 매핑합니까? @EmbeddedId 및 @IdClass 주석을 설명하십시오.
12. JPA에서 stateless 세션 bean과 stateful 세션 bean의 차이점은 무엇입니까? 사용 사례를 설명하십시오.
13. JPA 엔티티에서 Auditing(예: 생성/업데이트된 타임스탬프)를 어떻게 처리할 수 있습니까?
14. JPA에서 양방향 관계를 관리하기 위한 모범 사례는 무엇입니까?
15. 비표준 데이터베이스 유형을 Java 개체에 매핑하기 위해 사용자 지정 JPA 변환기를 어떻게 구현합니까?
16. JPA에서 EntityListeners의 역할과 이를 이벤트 기반 프로그래밍에 사용하는 방법을 설명합니다.
17. JPA에서 버전 관리로 낙관적 잠금을 어떻게 구현합니까?
18. JPA에서 관리, 분리 및 제거된 엔터티 상태 간의 차이점을 설명하십시오.
19. JPA에서 예외를 어떻게 처리합니까? JPA 예외의 계층 구조를 설명하십시오.
20. EntityManagerFactory의 목적은 무엇이며 EntityManager와 어떤 관련이 있습니까?
21. 컨테이너 관리 또는 애플리케이션 관리 지속성 컨텍스트를 사용할 때 JPA에서 트랜잭션 경계를 어떻게 관리합니까?
22. JPQL 사용의 제한 사항은 무엇입니까? Criteria API는 이러한 한계를 어떻게 극복할 수 있습니까?
23. 다대다 관계를 JPA의 추가 속성과 어떻게 매핑합니까?
24. JPA의 단방향 관계와 양방향 관계의 차이점과 사용 사례를 설명하십시오.
25. JPA 기반 애플리케이션의 성능 튜닝 및 최적화에 대한 주요 고려 사항은 무엇입니까?
26. 마이크로서비스 아키텍처에서 JPA의 역할과 데이터 일관성에 미치는 영향을 설명하십시오.
27. JPA 기반 애플리케이션에서 데이터 마이그레이션 및 스키마 변경을 어떻게 처리합니까?
28. JPA 프로젝션의 개념과 효율적인 데이터 검색을 위해 이를 사용하는 방법을 설명하십시오.
29. JPA를 NoSQL 데이터베이스 또는 메시지 큐와 같은 다른 데이터 액세스 기술과 어떻게 통합합니까?
30. JPA 개발에서 흔히 발생하는 안티 패턴은 무엇이며 이를 방지할 수 있는 방법은 무엇입니까?
JPA 고난이도 면접 질문입니다.
단순한 개념 이해를 넘어서 경험에 기반한 대답을 해야 하는 질문입니다. 상당히.. 까다롭네요^^
Entity 상태 전이의 복잡성: JPA에서 Entity 상태 전이 (예: transient, persistent, detached, removed) 과정 중 가장 복잡하거나 오해하기 쉬운 부분은 무엇이며, 이를 어떻게 관리하나요?
1차 캐시와 2차 캐시의 교차점: 1차 캐시와 2차 캐시의 차이점을 설명하고, 이 두 캐싱 메커니즘을 어떻게 효율적으로 사용했는지 구체적인 예를 들어 설명해 주세요.
최적화 및 성능 문제: JPA를 사용할 때 겪었던 가장 까다로운 성능 문제는 무엇이었고, 어떻게 해결했나요?
쿼리 최적화 전략: JPA와 함께 복잡한 쿼리를 최적화하기 위해 사용한 전략은 무엇이며, 이러한 최적화가 실제 어플리케이션 성능에 어떤 영향을 미쳤나요?
객체-관계 매핑의 복잡성: 복잡한 객체-관계 매핑을 어떻게 관리하며, 이 과정에서 발생할 수 있는 문제를 어떻게 해결하나요?
Lazy Loading의 문제점: Lazy Loading이 가져올 수 있는 N+1 Select 문제를 어떻게 식별하고 해결하나요?
JPA의 락킹 메커니즘: JPA에서 제공하는 다양한 락킹 메커니즘 (예: 낙관적 락, 비관적 락)을 언제 어떻게 사용해야 하는지, 그리고 실제 경험에서 이러한 락킹 전략을 어떻게 적용했는지 설명해 주세요.
Criteria API vs JPQL: Criteria API와 JPQL 중 어느 것을 선호하며, 그 이유는 무엇인가요? 실제 사용 사례를 통해 그 차이를 설명해 주세요.
JPA와 데이터베이스 버전 관리: JPA를 사용하여 데이터베이스 스키마 버전을 관리하는 방법과 이 과정에서 발생할 수 있는 문제점과 해결 방법에 대해 설명해 주세요.
프로젝션과 DTO: JPA에서 프로젝션을 사용하여 성능을 최적화하는 방법과 DTO(Data Transfer Object)를 어떻게 활용했는지 구체적인 사례를 들어 설명해 주세요.
'프로그래밍 > 스프링' 카테고리의 다른 글
[스프링 인 액션] 0. 이 책을 다시 읽는 이유 (0) | 2024.02.27 |
---|---|
[스프링 마이크로서비스 코딩 공작소] 2. 스프링 부트로 마이크로서비스 구축 (3) | 2023.08.21 |
[스프링 마이크로서비스 코딩 공작소] 1. 스프링, 클라우드와 만나다 (3) | 2023.08.21 |
[스프링 마이크로서비스 코딩 공작소] 0. 개요 (0) | 2023.08.20 |
2. 서블릿 - 1)서블릿 생명주기, 초기화 (0) | 2018.11.18 |