스프링과 JPA 기반 웹 애플리케이션 개발 #46 지역 도메인
해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.
강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.
제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.
지역도 밸류가 아닌 엔티티이다.
JPA에서 어떤 객체의 개념이 있을 때 밸류인지 엔티티인지 생각해보는 게 중요하다.
ex) 거주 지역, 관심 지역 등 많은 예시가 있을 수 있다.
Zone
City
(영문 도시 이름)LocalNameOfCity
(한국어 도시 이름)Province
(주 이름, nullable)Account
와 Zone
의 객체지향적 관계Account
-> Zone
@ManyToMany
의 단방향 관계(1:N)
(N:1)
Account
와 Zone
의 관계형 DB에서의 관계Account
<- Account_Zone
-> 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 테이블 데이터를 구글 스프레드 시트에 Value 형식으로 붙여넣고, csv 파일로 저장하는 식으로 가져왔다.
위키피디아 데이터
구글 스프레드 시트로 옮긴 데이터
public interface ZoneRepository extends JpaRepository<Zone, Long> {
}
@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
데이터를 리포지토리에 저장한다.