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가 사용하기는 상당히 편하지만 정확히 공부하고나서 사용해야 된다는걸 느끼게 됩니다.
'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 |
댓글