4. 데이터베이스 작업

DAEILLIM·2023년 12월 2일
0
post-thumbnail

1. 리포지토리

리포지토리는 간단하게 말하면 데이터베이스를 조작하는 클래스입니다. 리포지토리를 생성하는 경우에는 반드시 인터페이스를 정의하고 구현해야 합니다. 그 이유는 리포지토리 인터페이스의 필드에 리포지토리 구현 클래스를 DI하여 특정 구현에 의존하는 것을 피할 수 있기 때문입니다.

자바에서는 인터페이스를 구현한 클래스의 접미사에 'Impl'을 붙이는 경우가 많습니다.(Impl은 implements의 약자입니다.)

image-20231202151239213

2. 스프링 데이터 JDBC


2.1 O/R 매퍼

O/R 매퍼(Object-Realiational Mapper)를 간단한게 설명하면, 어플리케이션에서 사용하는 객체(O, Ojbect)와 릴레이션(R, Relational)의 데이터를 매핑하는 것입니다.

조금 더 자세하게 설명하면 O/R 매퍼는 미리 설정된 객체와 관계형 데이터베이스 간의 대응 관계 정보를 가지고 인터페이스의 데이터에 대응하는 테이블에 내보내거나 데이터베이스에서 값을 읽어 들여 인터페이스에 대입하는 작업을 자동으로 실행합니다.

image-20231202152238992


2.2 스프링 데이터 JDBC

스프링 데이터 JDBC는 O/R 매퍼입니다.
스프링 데이터가 제공하는 CrudRepository를 상속해서 자동으로 CRUD를 지원하는 메서드를 사용할 수 있습니다.


2.3 application.properties 설정

spring.datasoruce.driver-class-name=org.postgresql.Driver
spring.datasoruce.url=jdbc::postgresql://locahost:5432/postgres
spring.datasoruce.username=postgres
spring.datasoruce.password=postgres

  1. spring.datasoruce.driver-class-name=org.postgresql.Driver
    JDBC 드라이버의 클래스명을 지정합니다. 여기서는 postgreSQL의 드라이버를 설정합니다.
  2. spring.datasoruce.url
    데이터베이스의 '접속 URL'을 설정합니다.
  3. spring.datasoruce.username
    데이터베이스에 접속하는 '유저명'을 설정합니다.
  4. spring.datasoruce.password
    데이터베이스에 접속하는 '비밀번호'를 설정합니다.

2.4 엔티티 설정

member 테이블에 대응하는 Meber 엔티티를 생성합니다. Lombok에서 제공하는 어노테이션을 사용합니다.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    
    @Id
    private Long id;
    private String name;
}

  • @Data
    클래스에 부여하는 것으로, 전 필드에 대해 Getter / Setter로 액세스 할 수 있습니다.
    hashCode(), equlas(), toString() 도 자동 생성됩니다.
  • @NoArgsConstructor
    기본 생성자가 자동 생성됩니다. 클래스에 부여합니다.
  • @AllArgsConstructor
    전 필드에 대해 초기화 값을 인수로 가지는 생성자가 자동 생성됩니다. 클래스에 부여합니다.
  • @Id
    테이블의 기본키(Primary Key)에 해당하는 id 필드에 부여합니다.

2.5 리포지토리 생성

MemberCrudRepository 인터페이스를 생성하고 CrudRepository를 상속합니다. CrudRepository 인수 타입인 Member@Id 어노테이션을 부여한 필드의 타입인 Long 의 순서로 지정합니다. 이것은 저장 대상 객체의 타입과 저장 대상 객체의 기본키 타입을 지정한 것입니다.

이것으로 MemberCrudRepository 인터페이스 안에서 메서드를 작성하지 않아도 CRUD 사용이 가능합니다.
메서드의 사용되는 반환값이나 인수의 엔티티나 ID는 <Meber, Long>로 지정한 타입이 됩니다.

public interface MemberCrudRepository extends CrudRepository<Member, Long> {
}

2.6 클래스 생성

@SpringBootApplication
public class SpringDataJdbcSampleApplication {
    public static void main(String[] args) {
        SrpingApplication.run(SpringDataJdbcSampleApplication.class, args)
            .getBean(SpringDataJdbcSampleApplication.class).execute();
    }
    
    @Autowired
    MemberCrudRepository repository;
    
    private void execute() {
        executeInsert(); // 등록
        executeSelect(); // 전체 취득
    }
    
    private void executeInsert() {
        Member member = new Member(null, "이순신"); // 엔티티 생성(id는 자동 부여 되기 때문에 null 설정)
        member = repository.save(member);
        System.out.println("등록 데이터: " + member);
    }
    
    private void executeSelect() {
        System.out.println("-----전체 데이터를 취득합니다.------");
        Iterable<Member> members = repository.findAll(); // 리포지토리에서 전체 데이터를 취득
        for (Member member : members) {
            System.out.println(memeber);
        }
    }
}

CrudRepository를 상속하는 것만으로 CRUD를 실행할 수 있는 메서드를 사용할 수 있습니다. 단, MemberCrudRepository 인터페이스에는 @Repository를 부여하지 않습니다. @Repository는 인스턴스 생성을 위한 어노테이션이며 인터페이스는 인스턴스화할 수 없습니다.

어디까지나 CrudRepository를 상속하는 것은 인터페이스입니다. 그럼 CrudRepository를 상속한 인터페이스의 구현은 어디서 생성되는 것일까요? 구현 클래스는 스프링 데이터 JDBC가 자동 생성하므로 직접 구현 클래스를 생성해 @Repository를 구현 클래스에 부여할 필요가 없습니다.

profile
필기하고, 타이핑하고, 말하면서 읽고, 코딩하고, 눈으로 읽고 오감으로 공부하기

0개의 댓글