본문 바로가기

Java/Spring

[Spring] 길찾기 서비스 #6

What to do?

예제 데이터 추가

1. Jpa Auditing 기능 추가하기

2. Docker파일 수정


Jpa Auditing

 

  • 생성일/수정일/삭제일 필드
    • 엔티티 삭제시 실제 데이터베이스에서 레코드를 삭제하지 않고, removed_at 컬럼에 삭제일자만 기록 
    • @Where(clause = "removed_at is NULL")
      • 엔티티 조회 시에는 removed_at 필드가 NULL인 경우만 조회
  • 작성자, 수정자 필드는 인증 기능 후 구현
@Getter
@ToString
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Where(clause = "removed_at is NULL")
public abstract class AuditingFields {
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @CreatedDate
    private LocalDateTime createdAt;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @LastModifiedDate
    private LocalDateTime modifiedAt;
    private LocalDateTime removedAt;

    // TODO : 인증기능 구현 및 Jpa 설정 변경 후 주석제거
//    @CreatedBy @Column(updatable = false)
//    private String createdBy;
//    @LastModifiedBy
//    private String modifiedBy;
}

Store Entity

 

  • AuditingField를 상속
  • @SQLDelete(sql = "UPDATE store SET removed_at = NOW() WHERE id=?")
    • Entity 삭제 시 레코드를 삭제하지 않고, removed_at 컬럼에 삭제시간만 기록
@Entity(name="store")
@Getter
@Setter
@SQLDelete(sql = "UPDATE store SET removed_at = NOW() WHERE id=?")
public class StoreEntity extends AuditingFields {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
    private String name;
    @Column(nullable = false) private String address;
    @Column(nullable = false) private Double latitude;
    @Column(nullable = false) private Double longitude;

    private StoreEntity(String name, String address, Double latitude, Double longitude) {
        this.name = name;
        this.address = address;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    protected StoreEntity(){}

    public static StoreEntity of(String name, String address, Double latitude, Double longitude){
        return new StoreEntity(name, address, latitude, longitude);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        StoreEntity that = (StoreEntity) o;
        return id.equals(that.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

Main Class

 

  • @EnableJpaAudting 데코레이션을 달아주어야 jpa auditing 기능이 동작함
@SpringBootApplication
@EnableJpaAuditing
@ConfigurationPropertiesScan
public class CompassApplication {

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

}


sql 파일

 

  • /database/init/data.sql 경로에 작성
  • Docker 컨테이너가 처음 실행될 때 store 테이블을 생성하고, 데이터를 넣는 쿼리 파일 작성
CREATE TABLE store (
   id BIGINT AUTO_INCREMENT NOT NULL,
   created_at datetime NULL,
   modified_at datetime NULL,
   removed_at datetime NULL,
   name VARCHAR(255) NULL,
   address VARCHAR(255) NOT NULL,
   latitude DOUBLE NOT NULL,
   longitude DOUBLE NOT NULL,
   CONSTRAINT pk_store PRIMARY KEY (id)
);

INSERT INTO store (latitude, longitude, address, name) values (37.60894036,127.029052,'서울특별시 성북구 동소문로47길 12','호수온누리약국');
INSERT INTO store (latitude, longitude, address, name) values (37.61040424,127.0569046,'서울특별시 성북구 화랑로 248','돌곶이온누리약국');
INSERT INTO store (latitude, longitude, address, name) values (37.60101417,127.0331664,'서울특별시 성북구 종암로 123 홀리데이약국','홀리데이약국');
INSERT INTO store (latitude, longitude, address, name) values (37.59373053,127.0159792,'서울특별시 성북구 아리랑로 9','하얀약국');
INSERT INTO store (latitude, longitude, address, name) values (37.60475389,127.0230392,'서울특별시 성북구 길음로 20','콩약국');
INSERT INTO store (latitude, longitude, address, name) values (37.58650918,127.0294735,'서울특별시 성북구 개운사길 2','소원약국');


(중략)


Docker Compose 

 

  • 이전 포스팅에서 작성한 docker-compose-dev.yaml 파일에서 volumes 부분에 한줄 추가
  • ./database/init:/docker-entrypoint-initdb.d
    • 로컬에 ./database/init 경로에 있는 sql 파일들을 
    • docker container의 docker-entrypoint-initdb.d 와 연결


Test

 

  • docker-compose-dev.yaml 라는 경로에 있는 docer-compose 파일을 실행
docker-compose -f docker-compose-dev.yaml up

 

  • 3306번포트나 6379번 포트가 이미 사용중인 경우 에러가 발생할 수 있음
    • MariaDB는 3306, Redis는 6379 포트 사용
    • cmd에서 사용 netstat -ano | findstr :3306 를 입력해서 해당 포트를 사용중인 프로그램의 PID를 찾음
    • 작업관리자에서 해당 PID에 해당하는 프로그램을 종료시킴

cmd에서 3306포트를 사용중인 프로그램 PID 찾기

 

작업관리자 > 세부정보

 

 

  • docker desktop을 열어서 Maria DB 컨터이너에 접속
  • Terminal에서 명령어 입력
    • mysql -uroot -p

docker desktop

 

  • select 쿼리를 날리면 데이터 베이스에 데이터들을 확인할 수 있음

 

'Java > Spring' 카테고리의 다른 글

[Spring] 간단한 SNS 만들기 #2  (0) 2022.12.22
[Spring] 간단한 SNS 만들기 #1  (0) 2022.12.22
[Spring] 길찾기 서비스 #5  (0) 2022.12.11
[Spring] 게시판 만들기 #12  (0) 2022.11.26
[Spring] 게시판 만들기 #11  (0) 2022.11.24