목표
1. update 쿼리를 추가한다.
2. Entity 구조를 변경한다.
🤔 갑자기 update..?
JPA를 쓰면서 더티 캐싱(트랜잭션이 끝날때 persistence context 내의 entity가 처음과 비교하였을 때 변경된 점이 있다면 update 쿼리를 날리고 트랜잭션을 종료한다.)에 익숙해져 있던 터라 업데이트 쿼리를 작성하는 것을 까먹고 있었다.
MyBatis에서는 자동으로 업데이트 해주는 기능은 찾을 수 없었으므로 직접 update 해주도록 하겠다.
이전 과정을 잘 따라왔으면 board-mapper.xml
에 다음과 같은 쿼리가 이미 생성되어 있을 것이다. (당연히 BoardMapper에서도 동일한 이름의 메소드가 정의되어있다.)
이전에 테스트 코드를 작성하여 검증도 완료하였기 때문에 Service만 수정해주도록 하겠다.
이전코드에서 사용했던 BoardEntity 내부에 정의된 update 메소드를 이용해 새로운 데이터로 치환해주는 로직이다. 이를 지우고 다음을 추가하겠다.
update 메소드의 전체 코드는 다음과 같다.
public void update(BoardForm boardForm, UserForm userForm, long id) {
UserEntity user = Optional.of(userMapper.findByAccountId(userForm.getAccountId())).orElseThrow(() -> new FreeBoardException(UserExceptionType.NOT_FOUND_USER));
BoardEntity target = Optional.of(boardMapper.findById(id).get()).orElseThrow(() -> new FreeBoardException(BoardExceptionType.NOT_FOUNT_CONTENTS));
if (IsWriterEqualToUserLoggedIn.confirm(target.getWriter(), user) == false && HaveAdminRoles.confirm(user) == false) {
throw new FreeBoardException(BoardExceptionType.NO_QUALIFICATION_USER);
}
boardMapper.updateById(target.update(boardForm.convertBoardEntity(user)));
}
톰캣을 띄우고 직접 데이터를 수정해보자.
제목 변경하기 | 수정 후 |
---|---|
JPA에 맞춰서 설정되어있던 어노테이션을 모두 제거할 것이다.
@Getter
@MappedSuperclass
public abstract class BaseEntity {
@Setter
protected long id;
protected LocalDateTime createdAt;
protected LocalDateTime updatedAt;
}
@Getter
@NoArgsConstructor
public class BoardEntity extends BaseEntity {
private UserEntity writer;
@Setter
private String contents;
private String title;
@Builder
public BoardEntity(UserEntity writer, String contents, String title){
this.writer = writer;
this.contents = contents;
this.title = title;
}
public BoardEntity update(BoardEntity newBoard){
this.writer = newBoard.getWriter();
this.contents = newBoard.getContents();
this.title = newBoard.getTitle();
return this;
}
}
@Getter
@NoArgsConstructor
public class UserEntity extends BaseEntity {
private String accountId;
private String password;
@Setter
private UserRole role;
@Builder
public UserEntity(String accountId, String password, UserRole role) {
this.accountId = accountId;
this.password = password;
this.role = role;
}
}
BoardRepository
와 UserRepository
는 영구 삭제 하도록한다.
아직 Repository를 사용하고 있는 코드가 있다면 Mapper로 모두 바꿔주자.
JPA 관련 빈인 위 세가지를 지워주도록 하겠다.
트랜잭션은 사용할 것이므로 대신 아래의 코드를 추가한다.
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
JPA를 사용했던 프로젝트를 MyBatis로 변경하는 작업을 모두 마쳤다.
MyBatis는 난생처음 사용해보느라 xml 파일에서 설정 property를 읽고 이해하는 것부터 시작하였다. 도큐먼트가 한글로 잘 번역되어있으니 반드시 읽을 것!다음 프로젝트는 이전에 JPA를 사용했던 프로젝트에서 데이터베이스를 mySql에서 MongoDB로 변경하는 프로젝트이다. 월요일부터 바로 진행하도록 하겠다.
모든 코드는 github에서 확인 할 수 있습니다.