vo로 더 이쁘게 jpa 사용하기
docker를 공부해야했다.
하나의 인스턴스에 두 개의 호스팅을 하는 상황..
톰캣으로 다중 호스팅 하는 건 이미 구시대의 유물이렸다.
Docker컨테이너를 사용해 spring boot의 jar를 배포해보기로 했다.
FROM rtfpessoa/ubuntu-jdk8
ADD GuivingAdmin.war app.war
ENTRYPOINT ["java","-Dspring.profiles.active=dev","-jar","/app.war"]
별건 없고 DockerFile 내용인데 특이점은 jar가 아닌 war로 시도했던 흔적…
jar에서 tomcat-tiles의 경로를 잡는데 no url resource 에러가 난 것이다..
찾아보면서 다시 시도해봤는데 실패한 상황..
참조링크
https://galid1.tistory.com/428
이미 tiles자체 (jsp)도 구시대 유물이 되어버리고 jsp자체도 spring boot에서 사용하지말라고 한다.
결국은 mustache 혹은 thyemleaf로 넘어가야하는 것인가 싶다.
한가지 더 적어두자면
jar빌드 과정에서 좀 애를 먹었는데 sts오류인지 나의 잘못인지
project clean을 하지 않으면 자꾸 실패가 떴다..
내일 다시 이부분 살펴보는걸로..
일련의 이유로 시간아깝게 sts가 디펜던시를 엄청 오랫동안 다운받아
intellij를 켜서 entity를 좀 더 만들었다.
@ToString(exclude = "company")
@NoArgsConstructor
@Getter
@Entity
@Table(name="TB_OPERATOR")
public class Operator {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="op_idx")
private Long id;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "firstName",column = @Column(name = "op_f_name")),
@AttributeOverride(name = "lastName",column = @Column(name = "op_l_name"))
})
private Name name;
@Column(name="op_email")
private String email;
@Column(name="op_phone_num")
private String phoneNum;
@Column(name="op_password")
private String password;
@Column(name="op_uid")
private String uid;
@ManyToOne
@JoinColumn(name = "op_company_idx")
private Company company;
}
오퍼레이터 엔티티를 만들어봤는데
vo개념 (식별자가 없는 필드객체)을 사용해보고 싶었고 검색을 통해 @Embedded를 알게되었다.
참조링크
https://velog.io/@conatuseus/JPA-%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-%ED%83%80%EC%9E%85embedded-type-8ak3ygq8wo
@Embeddable
@Data
public class Name {
private String firstName;
private String lastName;
public String getFullName(){
return firstName+" " + lastName;
}
}
@Embeddable 어노테이션으로 entity의 필드로 속성을 가질 수 있고
@AttributeOverrides와 @AttributeOverride를 통해 각 테이블을 vo객체의 필드로 매핑할 수 있다.
주의할 점은 연관entity인지 vo인지 잘 판단하여 필드를 구성해야 할 것이다..
public interface OperatorRepository extends JpaRepository<Operator,Long> {
@EntityGraph(attributePaths ={"company","company.city","company.city.country"} )
@Query("select DISTINCT a from Operator a")
List<Operator> findAll();
}
엊그제 알게 된 outer join을 사용한 n+1해결
(오퍼레이터는 company 테이블과 외래키 연결이 되지 않는시점이 있기때문에..)
오늘은 여기까지
구식일지라도
내일은 tiles를 docker에 올릴 수 있는 방법을 잘 모색해보는걸로 마무리