본문 바로가기
IT 이야기/CRUD

[Springboot] JPA적용

by Dblog 2021. 5. 2.
728x90

 

spring과 Database를 연결하는 방법으로 현업이나 토이프로젝트에서 mybatis, JPA 두가지를 많이 사용하게됩니다. 

각자 장단점이 있는데 오늘 주제인 JPA는 데이터베이스의 테이블 구조를 class로 정의할 수 있는 장점이 있습니다. class로 정의하면 JPA가 알아서 Database에 테이블을 만들어주거나 수정하게 됩니다.

또한 Repository라는 클래스를 상속받으면 findBy , findAll 처럼 미리 정의된 메소드로 SQL query를 요청할 수 있고 결과도 리턴받을 수 있습니다. 

@Transactional(readOnly = true)
public interface UserDataRepo extends JpaRepository<UserEntity,Long> {
    public UserEntity findByEmail(String email);
}
@Service
@RequiredArgsConstructor
@Slf4j
public class UserServiceimpl {

    @Autowired
    private UserDataRepo userDataRepo;

    @Override
    public UserEntity read(String eamil) {
        return userDataRepo.findByEmail(eamil);
    }
}

 

그러나 단점도 확실하게 존재하긴 합니다.

간단한 예시로  아래 코드가 있을 때 JPA는 users의 이름으로 id, emai, password... 부터 authority의 Attribute를 가지는 테이블을 만들게 됩니다.

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Data
@Entity
@Getter
@Setter
@Table(name = "users")
public class UserEntity {

    @Id@GeneratedValue
    private Long        id;
    private String      email;
    private String      password;
    private String      nickName;
    private String      address;
    private String      phoneNumber;
    private String      authority;
}

 

이때 우리의 JPA는 너무나도 편리하게 타입까지 맞춰서 Database에 넣어줍니다. Long : Int, String : varchar

 

근데 이때 aboutMe라는 attribute를 추가로 선언하고 address를 주석처리해서 삭제하고 앱을 재실행하면

private String      aboutMe;

// private String      address; delete

aboutMe가 추가되고 address가 삭제되는게 아닌 address는 그대로 있되 aboutMe만 추가로 생성됩니다. 단점이 될거라는게 확 와닿지 않겠지만 

// private String      phoneNumber;
private int			phoneNumber;

phonenumber라는 attribute를 int타입으로 바꾸려고 string을 주석처리하고 int를 추가로 생성했을때 phoneNumber attribute가 두개가 생성되게 됩니다. ( 다른이름으로 선언되거나 생성이 안될수도있음.. 테스트 안해봤습니다.)

그러면 나중에 데이터를 불러올때 상당히 헷갈리게 됩니다. 

또한 M:N   N:M 관계를 설정할때 @oneToMany, @ManyToMany를 사용하게 되는데  이때 발생하는 에러를 잡는게 쉽지 않습니다. 

https://www.youtube.com/watch?v=brE0tYOV9jQ

 

백기선님의 영상에서 볼 수 있듯.. 다양한 에러와 만나다보면 JPA가 사용하기는 상당히 편하지만 정확히 공부하고나서 사용해야 된다는걸 느끼게 됩니다.

 

 

728x90

'IT 이야기 > CRUD' 카테고리의 다른 글

[Spring] Spring Boot Security - principal  (0) 2021.05.30
[Spring] Thymeleaf template적용  (0) 2021.05.16
[Spring] QueryDsl 적용  (0) 2021.04.21
[Spring CRUD] update,  (0) 2021.04.04
[Spring CRUD] read,  (0) 2021.03.24

댓글