SpringBoot 2.X 정리
  • README
  • 1. SpringBoot 처음 사용할 때 + Lombok 설명
  • 2. Spring Data JPA
  • 3. Spring Data JPA 를 이용한 쿼리 연습
  • 4. JPA 연관관계 처리
  • 5. Thymeleaf 사용법
  • 6. Spring MVC 를 이용한 게시판 구현연습
  • 7. Spring Security 4 JDBC 를 이용한 로그인 인증방법
  • 8. Maven -> Gradle 변경작업
  • 9. React 구성하기
  • 10. SpringSecurity 인증 후 로그인 객체는 어떻게?
  • 11. SpringBoot에서 Amazon SES 서비스 사용하기
  • 12. SpringBoot에서 ElasticBeanStalk ebextensions 파일 만들기
  • 오류 상황과 대처법
    • 1. Querydsl
    • 2. MYSQL 오류 대처법
    • 3.Ajax CSRF 대처법
    • 4. Heroku 배포하기
    • 5. 프로젝트 이름 변경
    • 6. Gradle 오류 대처법
    • 7. React 오류 대처법
    • 8. Tymeleaf LocalDateTime
    • 9. JpaAuditing을 통한 시간 동기화
    • 10. AWS RDS timezone과 charset 변경
Powered by GitBook
On this page
  • 1. 문제점
  • 2. Entity 설정
  • 3. 예시 Domain 설정
  • 4. AppApplication.class 설정
  • 5. 예시를 통한 결과 확인
  • 6. 결과 예시

Was this helpful?

  1. 오류 상황과 대처법

9. JpaAuditing을 통한 시간 동기화

Previous8. Tymeleaf LocalDateTimeNext10. AWS RDS timezone과 charset 변경

Last updated 5 years ago

Was this helpful?

Jpa 와 Hibernate를 이용해 Mysql을 사용하고 있다.

그런데? 문제가 발생 -> 데이터를 수정했는데 시간이 바뀌질 않아?? -> 무엇이 문제였을까?

1. 문제점

  1. Query를 Repository에서 바로 구현해서 쓰면 시간이 고쳐지질 않았다.

    => Jpa를 이용해 save 방식으로 해결했다.

2. Entity 설정

시간에 대해서는 어떠한 Domain에서도 모두 사용하기에 아래와 같이 구성했다. LocalDateTime을 사용했으므로 을 참고해라. 이 때 EntityListener로 AuditingEntityListener를 가져와서 쓸 것이다.

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime regdate;

    @LastModifiedDate
    private LocalDateTime modifieddate;
}

3. 예시 Domain 설정

equalsAndHashCode를 사용할 경우 extends 로 받은 BaseTimeEntity로 인해 warning이 발생할 것이다. callSuper를 통해 문제를 해결할 수 있는데 이 callSuper는 부모 클래스까지 비교해서 참과 거짓을 분간할 건지 의사를 묻는다고 보면 된다.

@EqualsAndHashCode(of="ano",callSuper = false)
public class Activity extends BaseTimeEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long ano;

    // =========== user list =========== //
    @OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name="act_no")
    private List<User> users;

}

4. AppApplication.class 설정

아래처럼 @EnableJpaAuditing 과 EntityListener가 run과 함께 동작하도록 설정

@SpringBootApplication
@EnableJpaAuditing
@EntityListeners(AuditingEntityListener.class)
public class TestAppApplication {

    @Bean
    public Java8TimeDialect java8TimeDialect() {
        return new Java8TimeDialect();
    }

    public static void main(String[] args) {
        SpringApplication.run(AttendenceAppApplication.class, args);
    }

}

5. 예시를 통한 결과 확인

예시처럼 Repository를 통해 하나의 Activity를 받고 @setter를 통해 save하면 시간이 변경된다.

@PostMapping(value= {"/test"})
@Transactional
@ResponseBody
public int testActivity(@PathVariable String url) {
    Activity act = actRepo.findOneByURLLike(url);
    act.setFinished(!act.isFinished());
    try {
    actRepo.save(act);
    } catch(Exception e) {
        return 500;
    }
    return 200;
}

6. 결과 예시

+-----+---------------------+---------------------+-------+-----------------------------+----------+--------+ | ano | modifieddate | regdate | aname | url | finished | mem_no | +-----+---------------------+---------------------+-------+-----------------------------+----------+--------+ | 1 | 2019-12-02 21:24:40 | 2019-12-02 21:18:07 | asd | XXXXXXXXXXXXXXXXXXX | 0 | 1 | +-----+---------------------+---------------------+-------+-----------------------------+----------+--------+ 1 row in set (0.00 sec)

8장