[TIL 23]Spring 기초 공부_13

돗치·2024년 3월 9일
0

Spring Data JPA 기초 배우기

Build Gradle에 아래 코드를 추가한다.

runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

여기있는 application.properties는 프로젝트에 대한 여러 가지 설정 값들을 지정하는 곳이다.
이거를 yml로 바꾸도록 하자.

application.yaml 설정

먼저 spring: 이라고 작성하고, 밑에 jpa 설정을 한다는 jpa:를 작성한다.
그러고 show-sql:은 true 값으로 주고 properties:에 format_sql:도 true로 설정한다.
그 다음에 dialect는
shift를 두 번 누르고 Mysql8Dialect를 클릭하고 위에있는 org.hibernate.dialect를 붙이고 .MySQL8Direct를 붙여준다.

spring:
  jpa:
    show-sql: true
    properties:
      format_sql: true
      dialect: org.hibernate.dialect.MySQL8Direct

여기까지 치고 엔터 누른 다음에 한 칸 지우고 hibernate: ddle_auto: validate를 주자.

그 다음엔 jpa: 와 같은 위치에 오도록 지우고 datasource: 설정을 한다. 총 4가지 값을 준다.

url: driver-class-name: username: password: 를 라인이 맞게 설정한다.
url:은 user 테이블을 보기 위해 /user 넣고 useSSL 은 false 값 주고 useUnicode은 true 값, allowPublicKeyRetrieval값은 true를 주자

url: jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true

driver-class-name:은 com.mysql.cj.jdbc.Driver을 준다.

전체 코드

spring:
 jpa:
   show-sql: true
   properties:
     format_sql: true
     dialect: org.hibernate.dialect.MySQL8Direct
   hibernate:
     ddl_auto: validate
 datasource:
   url: jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true
   driver-class-name: com.mysql.cj.jdbc.Driver
   username: root
   password: 1111

실행하게 되면

8080포트가 떠야한다.

UserEntity 클래스를 만든다

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserEntity {
}

JPA와 맵핑 하기 위해서는

@Entity(name ="user")

를 추가해준다.

워크벤치에 user 테이블을 만들어주고 똑같이 맵핑 시켜준다.

즉 데이터베이스 오브젝트와 DB에 있는 column 값들을 맵핑 해주는 게 ORM이다.

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity(name ="user")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

여기서 ID는 Primary Key로 동작을 하기 때문에 @Id annotation을 달아줘야한다.
@GeneratedValue는 id가 어떤 식으로 생성 될 것이냐 라고 하는 것, GenerationType을 IDENTITY를 사용하도록 하자.
이는 어떤 데이터베이스를 사용하냐에 따라 조금씩 달라지는데 MYSQL은 IDENTITY를 사용한다.
즉 해당 값은 MYSQL DB에 의해 auto-generate가 된다.

다음으로 Repository를 만들어보자.

public interface UserRepository extends JpaRepository<UserEntity, Long>

를 작성해준다. Spring에서 제공되는 JPA Repository를 상속받을 것이다.

private final UserRepository userRepository;

를 작성하면서 @RequiredArgsConstructor 를 넣어 생성자로 UserRepository를 주입받겠다고 하자.

controller에

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/user")
public class UserApiController {
    private final UserRepository userRepository;

    @GetMapping("/find-all")
    public List<UserEntity> findAll(){
        return userRepository.findAll();
    }
}

api tester에 http://localhost:8080/api/user/find-all 을 하면

db에 넣은 user 목록이 뜬다.

JPA 연결이 성공적으로 된 것을 확인했으니 데이터를 SAVE해보자.

    @GetMapping("/name")
    public void autoSave(@RequestParam(name = "name") String name) {
        var user = UserEntity.builder() //id는 auto니까 name부터
                .name(name)
                .build();
        userRepository.save(user);
    }
}

없는 이름을 넣어보면 http://localhost:8080/api/user/name?name=ASDASD No Content가 뜬다

select * from 해보면 내가 넣은 것들이 나온다.

yaml에 show-sql을 true로 했기 때문에 실행되는 쿼리가 나오게 된다. 자동으로 Hibernate에서 Query가 만들어 지는 것이고 Query는 결국 JPA를 통해서 실행이 된다.
즉 SpringJPA 가 Hibernate를 통해서 호출을 하게 되면 해당 Query문은 또 다시 JDBC를 통해 DB에 질의가 된다.

0개의 댓글