open-in-view값 true/false
189
작성한 질문수 18
@Controller
@RequiredArgsConstructor
@RequestMapping("/board")
public class BoardController {
@PostMapping("/update")
public String update(@ModelAttribute BoardDTO boardDTO, Model model) {
BoardDTO board = boardService.update(boardDTO);
model.addAttribute("board", board);
return "detail";
}
}
@Service
@RequiredArgsConstructor
public class BoardService {
private final BoardRepository boardRepository;
public BoardDTO findById(Long id) {
System.out.println("findById : "+ em.getDelegate());
// 이 아래 코드에서 질문 있습니다.
Optional<BoardEntity> optionalBoardEntity = boardRepository.findById(id);
if (optionalBoardEntity.isPresent()) {
BoardEntity boardEntity = optionalBoardEntity.get();
return BoardDTO.toBoardDTO(boardEntity);
} else {
return null;
}
}
public BoardDTO update(BoardDTO boardDTO) {
System.out.println("update : "+ em.getDelegate());
BoardEntity boardEntity = BoardEntity.toUpdateEntity(boardDTO);
boardRepository.save(boardEntity);
return findById(boardDTO.getId());
}
}
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public class BaseEntity {
@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdTime;
@UpdateTimestamp
@Column(insertable = false)
private LocalDateTime updatedTime;
}
@Entity
@Getter @Setter
@Table(name = "board_table")
public class BoardEntity extends BaseEntity {
@Id GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String boardWriter;
private String boardPass;
private String boardTitle;
private String boardContents;
private int boardHits;
public static BoardEntity toUpdateEntity(BoardDTO boardDTO) {
BoardEntity boardEntity = new BoardEntity();
boardEntity.setId(boardDTO.getId());
boardEntity.setBoardWriter(boardDTO.getBoardWriter());
boardEntity.setBoardPass(boardDTO.getBoardPass());
boardEntity.setBoardTitle(boardDTO.getBoardTitle());
boardEntity.setBoardContents(boardDTO.getBoardContents());
boardEntity.setBoardHits(boardDTO.getBoardHits());
return boardEntity;
}
}
위에 코드 상황에서 open-in-view를 true로 하면 optionalBoardEntity에 createdTime 값이 null입니다.
제 생각으로는 open-in-view가 true 이므로 update()에서 (createdTime 값이 없는) boardEntity가 영속성 컨텍스트 1차 캐시에 존재하고, findById()에서 boardRepository.findById(id) 값을 호출하지만 1차캐시에 있는 값을 줘서 최종적으로 boardEntity값에는 createdTime값이 없는 것으로 이해했습니다.
그런데 왜 open-in-view값을 false로 하면 boardEntity에 createdTime 값이 있는지 모르겠습니다.
open-in-view가 true 이건 false 이건 영속성 컨텍스트 생존 범위에 Service는 포함되니 createdTime 값이 둘 다 없어야 되는것이 아닌지 궁금합니다.
답변 1
0
안녕하세요. lwisekiml님
도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.
실제 동작하는 전체 프로젝트를 ZIP파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 문제 영역을 실행할 수 있는 방법
2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)
링크: 공식 서포터즈
링크: 자주하는 질문
감사합니다.
0
https://drive.google.com/file/d/1H0CJLp_dNX_jlm00iipeNtgYYwGwgeSF/view?usp=drive_link
실행 방법과 순서는 첨부파일에 추가하였습니다.^^
0
안녕하세요. lwisekiml님
우선 osiv 설정과 무관하게 항상 트랜잭션 안에서 엔티티를 조회하고 변경하는 방법을 고민하셔야 합니다.
서비스에서 업데이트 메서드를 다음과 같이 트랜잭션 안에서 엔티티를 조회하고, 변경 감지를 통해 변경한다면 원하는 결과를 확인하실 수 있을거에요.
@Transactional
public BoardDTO update(BoardDTO boardDTO) {
System.out.println("update : "+ em.getDelegate());
BoardEntity boardEntity = boardRepository.findById(boardDTO.getId()).get();
boardEntity.setBoardWriter(boardDTO.getBoardWriter());
boardEntity.setBoardTitle(boardDTO.getBoardTitle());
boardEntity.setBoardContents(boardDTO.getBoardContents());
return findById(boardDTO.getId());
}
감사합니다.
강의 관련 외 질문입니다.
0
81
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
1
100
1
BeanCreationException
0
96
3
Update 후 UpdateMemberResponse 매핑할 때
0
57
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
102
2
페이징 + 검색조건 관련해서 질문드립니다.
0
74
1
Query Dsl Q파일 질문입니다.
0
86
1
루트 쿼리라는것은
0
62
1
메서드를 분리하는 기준
0
71
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
116
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
92
2
fetch join과 영속화와 OSIV의 관계
0
90
2
Distinct 사용 전 결과에 대한 의문
0
118
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
63
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
79
2
dto 필드 속 엔티티 여부
0
63
1
뷰템플릿 사용 시
0
82
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
88
1
DTO 대신 Form 사용은 안되나요?
0
140
1
OSIV ON 상태일 때
0
99
1
fetch join VS fetch join 페이징 궁금증
0
190
2
양방향 연관관계 알아보는 법?
0
110
1
16강 17강 간단 정리 이게 맞을까요 ?
0
168
2





