스프링과 JPA 기반 웹 애플리케이션 개발 #46 지역 도메인

Jake Seo·2021년 6월 9일
0

스프링과 JPA 기반 웹 애플리케이션 개발 #46 지역 도메인

해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.

강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.

제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.


지역 도메인

지역도 밸류가 아닌 엔티티이다.

JPA에서 어떤 객체의 개념이 있을 때 밸류인지 엔티티인지 생각해보는 게 중요하다.

  • 엔티티인지 판단 기준
    • 독자적인 라이프사이클이 있는가?
    • 다른 엔티티에서 참조되는가?
    • DB에서 테이블로서 매핑되어야 효율적인가?

ex) 거주 지역, 관심 지역 등 많은 예시가 있을 수 있다.

  • Zone
    • City (영문 도시 이름)
    • LocalNameOfCity (한국어 도시 이름)
    • Province (주 이름, nullable)
  • AccountZone의 객체지향적 관계
    • Account -> Zone
    • @ManyToMany의 단방향 관계
      • 한 계정이 많은 관심지역을 가질 수 있다. (1:N)
      • 한 지역이 많은 계정의 관심지역이 될 수 있다. (N:1)
  • AccountZone의 관계형 DB에서의 관계
    • Account <- Account_Zone -> Zone
    • 조인 테이블을 사용한 두개의 1대다 관계
  • 지역 데이터 초기화

Zone 도메인 추가

@Entity
@Getter @Setter @EqualsAndHashCode(of = "id")
@AllArgsConstructor @NoArgsConstructor
public class Zone {
    @Id @GeneratedValue
    private Long id;
    @Column(nullable = false)
    private String city;
    @Column(nullable = false)
    private String localNameOfCity;
    @Column(nullable = true)
    private String province;
}

Zone 데이터 가져오기

Zone 데이터는 위키피디아에 있는 Zone 테이블 데이터를 구글 스프레드 시트에 Value 형식으로 붙여넣고, csv 파일로 저장하는 식으로 가져왔다.

위키피디아 데이터

구글 스프레드 시트로 옮긴 데이터

ZoneRepository 추가

public interface ZoneRepository extends JpaRepository<Zone, Long> {
}

ZoneService 추가

@Service
@Transactional
@RequiredArgsConstructor
public class ZoneService {
    private final ZoneRepository zoneRepository;
    // ApplicationRunner ApplicationStartedEvent 등을 이용하여 초기 로직을 실행할 수 있다.
    // @PostConstruct 등을 이용하면, 빈이 등록된 이후 시점의 라이프사이클에 로직을 실행할 수 있다.
    @PostConstruct
    public void initZoneData() throws IOException {
        if(zoneRepository.count() == 0) {
            Resource resource = new ClassPathResource("zone/zones_kr.csv");
            List<Zone> zoneList = Files.readAllLines(resource.getFile().toPath(), StandardCharsets.UTF_8)
                    .stream()
                    .map(line -> {
                        String[] split = line.split(",");
                        return new Zone(null, split[0], split[1], split[2]);
                    }).collect(Collectors.toList());

            zoneRepository.saveAll(zoneList);

        }
    }
}
  • ClassPathResource 클래스는 내 resource 디렉토리 아래에 있는 파일들을 참조하거나 할 때 쓴다.
    • 스프링에서 제공하는 Resource 인터페이스는 내가 가져온 경로의 리소스에서 File 객체를 가져오거나 해당 파일이 존재하는지, URL이 어떻게 되는지 등 다양한 정보를 얻을 수 있도록 추상 메소드를 적어놨다.
  • zone/zones_kr.csv" 파일은 위키피디아에서 얻어온 한국의 지역 정보가 들어있는 파일이다.
  • 위는 빈이 생성된 이후(@PostConstruct 시점)에 Zone 데이터에 대한 초기화를 한다.
    • 파일로 읽어들인 Zone 데이터를 리포지토리에 저장한다.
profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글