자바 프로그래밍 7주차 학습일지

1. 학습한 내용 정리

ORM(Object Relational Mapping) 개념과 그 구현체인 JPA(Java Persistence API)를 중심으로 학습하였다.
ORM은 자바 객체(Object)와 데이터베이스 테이블을 자동으로 매핑해주는 기술로, SQL문을 직접 작성하지 않고도 데이터를 조작할 수 있게 한다.
특히 JPA는 자바에서 표준으로 정의된 ORM 스펙으로, 대표적인 구현체로는 Hibernate가 있다.
이번 실습에서는 JPA를 사용하여 Customer 엔티티를 데이터베이스에 매핑하고, CustomerRepository를 통해 CRUD 기능을 수행하였다.
또한, 테스트 코드에서 SQL 스크립트를 활용하여 테스트 데이터를 주입하는 방법을 배웠다.
Spring Boot의 @DataJpaTest 어노테이션을 이용하면 데이터베이스와 관련된 JPA 기능만 테스트할 수 있으며, @Sql 어노테이션을 통해 테스트 실행 전에 특정 SQL 파일을 자동으로 실행할 수 있다.
이 과정을 통해 다음 내용을 이해하였다:
JPA를 사용하여 엔티티(Entity) 클래스와 테이블을 자동으로 매핑하는 원리
@DataJpaTest를 이용한 JPA 단위 테스트 수행 방법
@Sql을 활용해 테스트 실행 전에 데이터베이스 초기 데이터를 세팅하는 방법
JpaRepository의 findAll, findById, findByName, save 등 주요 메서드 활용

2. 작성한 핵심 코드 설명

@DataJpaTest public class CustomerRepositoryTest { @Autowired private CustomerRepository customerRepository; @Test @Sql("/insert-members.sql") void getAllCustomer() { customerRepository.findAll().forEach(it -> System.out.println(it)); } @Test @Sql("/insert-members.sql") void geCustomerById() { Customer customer = customerRepository.findById(1L).get(); System.out.println(customer); } @Test @Sql("/insert-members.sql") void geCustomerByName() { Customer customer = customerRepository.findByName("이름1").get(); System.out.println(customer); } @Test @Sql("/insert-members.sql") void geCustomerByAge() { Customer customer = customerRepository.findByNameAndAge("이름1", 12).get(); System.out.println(customer); } @Test @Sql("/insert-members.sql") void InsertCustomer() { Customer customer = new Customer("최사번","101-0101-010",40); customerRepository.save(customer); Optional<Customer> cusIn = customerRepository.findByName("최사번"); System.out.println(cusIn.get()); } }
Java
복사
@DataJpaTest: Spring Boot에서 JPA 관련 컴포넌트만 로드하여 테스트하는 전용 어노테이션
@Sql("/insert-members.sql"): 테스트 실행 전에 SQL 스크립트를 실행해 테스트 데이터를 삽입
findAll / findById / findByName: JpaRepository가 제공하는 CRUD 쿼리 메서드
save(customer): 새로운 고객을 DB에 저장
테스트가 실행되기 전 아래 SQL 파일이 자동 실행되어 동일한 초기 데이터를 유지하게 된다.
INSERT INTO customer (name, phone, age) VALUES ('이름1', '010-0101-0101',12); INSERT INTO customer (name, phone, age) VALUES ('이름2', '010-0101-0101',14); INSERT INTO customer (name, phone, age) VALUES ('이름3', '010-0101-0101',14);
SQL
복사

3. 오류 해결 과정 및 주의사항

원인: 엔티티와 SQL 컬럼명이 불일치함
@Column(name = "useename", nullable = false) private String name;
Java
복사
→ 실제 SQL에서는 name 컬럼을 사용 → 컬럼명이 다르므로 INSERT 실패
해결: 컬럼명 엔티티와 일치시키기
@Column(nullable = false) private String name;
Java
복사
SQL 스크립트 예시
INSERT INTO customer (name, phone, age) VALUES ('이름1', '010-0101-0101',12); INSERT INTO customer (name, phone, age) VALUES ('이름2', '010-0102-0102',34);
SQL
복사
테스트용 DB 설정
spring.jpa.hibernate.ddl-auto=create spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
Plain Text
복사

4. 연습문제

1.
틀린 설명: ④ 기본키는 NULL 값이 들어갈 수 없다.
2.
객체와 데이터베이스를 연결하는 프로그래밍 기법은? → ORM
3.
영속성 컨텍스트의 특징이 아닌 것 → ① 연결 풀링
4.
엔티티에서 사용되는 애너테이션이 아닌 것 → ⑤ @Transactional
5.
CRUD 메서드를 제공하는 스프링 데이터 JPA 인터페이스 → JpaRepository