inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Phát triển ứng dụng web dựa trên Spring và JPA

엔티티에 저장이 안되는 문제에 대한 문의

Đã giải quyết

641

gabozanet1044

17 câu hỏi đã được viết

0

안녕하세요. 강의 잘 보았습니다. 강의 도움 받아서 테스트 진행해보고 있는데요. 저장이 안되는 부분에 대해 문의 드려봅니다.

Car, Camp 엔티티가 있고 Car 전체 데이터 읽어서 특정 필드의 값을  Camp 에서 찾아서 업데이트하는 로직입니다.

if (carRepository.count() > 0) {

carRepository.findAll().stream().forEach(s -> {
String campName = s.getCampEngName();
Optional<Car> car = carRepository.findById(s.getId());

Camp camp = campRepository.findByEngName(campName);
if (camp != null) {
car.ifPresent(m -> m.setNote(camp.getKorName()));
}
});
}

해당 부분 코드는 이렇게 했는데, 수행 후에 실제 Car 엔티티의 note 값이 변경이 안되어있습니다. 로그 찍어보면 campName 값은 일일이 잘 가져오고 있는데 setNote로 저장이 안됩니다.

트랜젝션 문제일까요? 강의를 제대로 소화를 못했는지 원인을 못찾겠네요. ㅠㅠ  도움 부탁드립니다.

아.. 저게 수행되는 곳이, 일반 컨트롤러 통해서 들어오는게 아니라 최초 실행시점입니다.(혹시 이게 문제일까요?)

@PostConstruct

public void initCarData() throws IOException {

...

if (carRepository.count() > 0) {

}

...

}

이 부분입니다.

JPA thymeleaf spring-boot spring java

Câu trả lời 7

0

gabozanet1044

감사합니다.~

0

whiteship

아 @PostConstruct를 쓴거였군요! 순서가 달라서 @Transactional이 적용이 안됩니다. 구체적으로는 @Transactional이 적용되려면 CarService의 프록시 객체가 만들어져야 가능한건데 그 작업은 @PostConstruct 실행하는 단계 이후에 벌어지는 일이라서 사실상 @Transactional없이 호출한거랑 같습니다. 다른 방법도 있긴하지만 이 경우에는 간단히 save()를 명시적으로 호출해주면 해결할 수 있긴합니다.

0

gabozanet1044

Optional<Car> car = carRepository.findById(s.getId());

아.. 저건 필요없는건데, 저거 없이 했을때 안돼서 이렇게 저렇게 시도해보는 중에 들어간 부분입니다.

원래소스는 아래와 같습니다. campName으로 조회한 Camp도 잘 가져옵니다.

@Service
@Transactional
@RequiredArgsConstructor
public class CarService {

private final CarRepository carRepository;
private final CampRepository campRepository;

@PostConstruct
public void initCarData() throws IOException {

if (carRepository.count() > 0) {
carRepository.findAll().stream().forEach(s -> {
String campName = s.getCampEngName();
Camp camp = campRepository.findByEngName(campName);
if (camp != null) {
addNote(s, camp);
}
});


}
}
public void addNote(Car car, Camp camp) {
System.out.println(">>>car = " +
"" + car.getCarNumber() + ", camp = " + camp + ", campId = " + camp.getId());
car.setNote(camp.getKorName());
}

}

-------------------------------
로그찍어보면 아래와같이 car 갯수만큼 잘 찍힙니다.

>>>car = 81조4766, camp = 광주2(GWJ2)/광주(Gwangju), campId = 45
>>>car = 83보8744, camp = 인천5(ICH5)/인천(Incheon), campId = 5


---------------------------------
근데, 컨트롤러에서 addNote 호출하면 정상적으로 저장이 됩니다.

0

whiteship

그리고 campName은 잘 찍힌다고 하셨는데 혹시 그 campName으로 조회한 Camp도 잘 가져오는지 확인해 보셨나요?

0

whiteship

해당 코드가 컨트롤러에 있다고 잘못 읽었네요. 죄송합니다.

우선 코드가 잘 이해가 안되는 부분이 있는데요. carRepository로 findAll을 했는데 하나씩 순회하면서 다시 id로 findById는 왜 하시는거죠? 

 Optional<Car> car = carRepository.findById(s.getId());

0

gabozanet1044

답변 감사합니다. 

해당 코드는 서비스 부분에 위치하고 있습니다. 서비스 전체코드는 아래와 같습니다.

클래스 상단에 @transaction 도 기재했고요. 이렇게 해도 안돼서 문의 드렸습니다. 

@Service
@Transactional
@RequiredArgsConstructor
public class CarService {

private final CarRepository carRepository;
private final CampRepository campRepository;

@PostConstruct
public void initCarData() {


if (carRepository.count() > 0) {

carRepository.findAll().stream().forEach(s -> {
String campName = s.getCampEngName();
Optional<Car> car = carRepository.findById(s.getId());

Camp camp = campRepository.findByEngName(campName);
if (camp != null) {
car.ifPresent(m -> addNote(m, camp));
}
});

}
}

}

0

whiteship

트랜잭션이 있어야 퍼시스턴스 상태의 객체 변화를 감지(dirty checking)해서 트랜잭션 끝날 때 플러쉬 하면서 데이터 상태를 DB에 동기화 한다고 강좌에서 여러번 언급한거 같은데 아쉽네요. 해당 코드 블럭을 서비스로 옮기고 서비스 클래스나 해당 메서드 위에 @Transactional을 붙여보시기 바랍니다.

Study 개설하는 로직에 대해서 궁금점이 있습니다.

0

53

1

앱 재시작 후 회원가입

0

99

1

app.host 관련 질문이 있습니다

0

96

1

강의 버전 정보

0

124

1

event, study 참조

0

218

2

비밀번호 변경 로직 질문있습니다.

0

134

1

프로필 수정 처리 merge 질문입니다.

0

104

1

회원가입 성공 후 redirect이동시 권한 질문

0

490

3

HtmlEmailService 개발하다 생긴 의문입니다

0

248

2

postgreSql 연결하여 JPA 를 통해 테이블 생성시 ZONE 테이블 생성에서 에러가 납니다

0

428

2

수업질문 [긴급] 로그인안되는 문제 말씀해주시는 부분 반영해서 최종 질문드립니다

0

259

2

[긴급-재업로드]수업질문 로그인 안 되는 문제

0

234

1

[긴급] 로그인해도 네비게이션 바가 안 바뀌고 있습니다!! 로그인이 안 됩니다 도와주세요

0

275

1

cropper 오류 문제로 질문드립니다..

0

284

2

authentication관련 질문...

0

494

2

모임참가 취소 할때 로직 질문

0

349

3

안녕하세요 기선님 질문이있습니다..

0

228

1

HTML코드 및 강의 중간자료들

0

677

3

springSecurity

0

519

2

버전 질문입니다.

0

299

1

부트스트랩, css

0

350

2

영속성 컨텍스트 질문

0

245

2

다시 강의를 보니 드는생각..

0

349

2

5:50에 나오는 HTML코드는 어디서 찾을 수 있나여?

0

311

1