카멜 표기법(camelCase)를 사용한다. camelCase : 최초에 사용된 단어를 제외한 첫 번째 문자가 대문자이며 나머지는 소문자이다. 1. 패키지(Package) 명명 규칙 패키지명은 표준 패턴을 따라야 한다. Ex) [com].[Company].[Project].[TopPackage].[LowerPackage] Ex) egovframework.com.ext.jstree 는 프레임워크 단위 프로젝트이므로 제외한다. 패키지명은 가급적 한 단어의 명사를 사용한다. Ex) 좋은 예 : com.nexon.sudden.member.object Ex) 나쁜 예 : sudden.memberObject 2. 클래스(Class) 명명 규칙 클래스명에는 한글을 사용한다. Ex) public class HelloWorld {} 인터페이스에는 특별한 접두사나 접미사를 사용하지 않고 파스칼을 사용한다. Ex) public interface Animal {} 인터페이스를 구현한 클래스에는 특별한 접두사나 접미사를 사용하지 않고 파스칼을 사용한다. Ex) public class Tiger implements animal{} 추상 클래스에는 특별한 접두사 접미사를 사용하지 않고 파스칼을 사용한다. Ex) public abstract class Animal {} 3. 메소드(Method) 명명 규칙 메소드명에는 파스칼 표기법을 사용한다. Ex) public void SendMessage(String message) {} 속성에 접근하는 메소드명의 접두사는 'get','set'을 사용한다. Ex) public void setDisplayName Ex) public void getDisplayName 데이터를 조회하는 메소드명의 접두사는 find를 사용한다. Ex) public void findData(String data){} 데이터를 입력하는 메소드명의 접두사는 input을 사용한다. Ex) public void inputData(HashMap data){} 데이터를 변경하는 메소드명의 접두사는 modify를 사용한다. Ex) public void modifyData(HashMap data){} 데이터를 삭제하는 메소드명의 접두사는 delete를 사용한다. Ex) public void deleteData(String data){} 데이터를 초기화 하는 메소드명의 접두사는 initialize을 사용한다. Ex) public void initData(String data){} 반환값의 타입이 boolean인 메소드는 접두사로 is를 사용한다. Ex) public void isData(String Data){} 데이터를 불러오는 메소드명의 접두사는 load를 사용한다. Ex) public void loadData(){} 데이터가 있는지 확인하는 메소드명의 접두사는 has를 사용한다. Ex) public void hasData(){} 보다 지능적인 set이 요구될때 사용하는 메소드명의 접두사는 register를 사용한다. Ex) public void registerAccount(){} 새로운 객체를 만든뒤 해당 객체를 리턴해주는 메소드명의 접두사는 create를 사용한다. Ex) public void createAccount(){} 해당 객체를 다른 형태의 객체로 변환해주는 메소드명의 접두사는 to를 사용한다. Ex) public void toString(){} 해당 객체가 복수인지 단일인지 구분하는 메서드명의 접미사는 s를 사용한다. Ex) public void getMembers(){} B를 기준으로 A를 하겠다는 메소드명의 전치사는 By를 사용한다. Ex) public void getUserByName(String name){} 지역변수와 멤버변수(전역변수)는 변수명 앞에 밑줄(_)을 사용하여 구별한다. boolean타입의 변수는 접두사로 is를 사용한다 Ex) isCheck 모듈은 가장 상위에 위치하는 구현의 단위, 컴포넌트는 런타임 엔티티를 참조하는 단위라고 생각하면 금방 그 차이를 이해 할 수 있을거라고 생각된다. 따라서 모듈과 컴포넌트는 상위와 하위관계를 명확히 구분짓기 어렵고 서로 다른 개념으로 바라보아야 한다고 생각한다. 그렇기 때문에 모듈 1000개가 모여 하나의 컴포넌트가 될 수도있고, 컴포넌트 1000개가 모여서 하나의 모듈을 구성 지을 수도있다. 쉽게 설명해서, 모듈이란 실질적으로 구현이 된 단위를 의미한다. 자료구조, 알고리즘 등 이를 제공하는 인터페이스라고도 할 수 있을 것이다. 반면, 컴포넌트는 실제적으로 동작하고있는 엔티티로써 활동중인 독립적인 단위를 중점적으로 보고 있다. 상위에 있는 링크에서는 서버와 클라이언트의 예로 설명하고 있다. 1개의 서버에게 서비스를 제공받는 100개의 클라이언트가 존재한다고 가정하자. 위에 설명한 내용으로 모듈, 컴포넌트의 개수를 각각 세어보면 서버가 구현된 모듈 1개, 클라이언트가 구현된 모듈 1개이므로 이 시스템 인프라의 총 모듈 개수는 2개이다. 컴포넌트의 경우 실제 동작하고 있는 엔티티를 의미하므로 총 101개가 된다. Entity 간의 릴레이션 관리 방안 DB 정규화에 의하여, OneToMany 를 사용 해야한다면. 아래와 같이 GLOBAL_TREE_MAP을 JoinTable로 사용하여, 연결하도록 한다. ( 단방향, 양방향 ) // -- 1:N table 연계 private Set pdServiceVersionEntities; @LazyCollection(LazyCollectionOption.FALSE) @JsonManagedReference @OneToMany(cascade = CascadeType.ALL) @JoinTable( name = "GLOBAL_TREE_MAP", joinColumns = @JoinColumn(name = "pdservice_link"), inverseJoinColumns = @JoinColumn(name = "pdserviceversion_link") ) @WhereJoinTable( clause = "pdserviceversion_link is not null") public Set getPdServiceVersionEntities() { return pdServiceVersionEntities; } public void setPdServiceVersionEntities(Set pdServiceVersionEntities) { this.pdServiceVersionEntities = pdServiceVersionEntities; } 동일한 Domain Data 인데, DB 정규화에 의하여, OneToOne 을 사용해야 한다면. 다음을 고려해야 한다. 이 경우의 OneToOne은 매우 드물며, 설계 자체를 다시 점검해 볼 필요가 있다. 두 엔티티가 동일한 Domain Data의 경우이며 OneToOne 을 사용하지 마십시오. 재검토 하십시오 서로 다른 Domain Data 간의 연결 관계를 성립해야 할 때, Java Server Tree Framework 기반에서 OneToOne을 사용해야 한다면. 아래와 같이 설정 할 수 있다. 이 경우는 Entity 컬럼에 연결할 Key를 저장하는 방식이고 이 방식은 사용하지 마십시오. 아래 GLOBAL_TREE_MAP을 사용하여 연결하는 방식을 사용하십시오. 이유는 포스트 끝에 설명하겠습니다. // -- 1:1 Row 단방향 연계 private ReqPriorityEntity reqPriorityEntity; @LazyCollection(LazyCollectionOption.FALSE) @JsonManagedReference @OneToOne @JoinColumn(name = "c_req_priority_link", referencedColumnName = "c_id") public ReqPriorityEntity getReqPriorityEntity() { return reqPriorityEntity; } public void setReqPriorityEntity(ReqPriorityEntity reqPriorityEntity) { this.reqPriorityEntity = reqPriorityEntity; } GLOBAL_TREE_MAP을 사용하여 연결하는 방식은 아래와 같다. @Entity @Table(name = "employee") public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; //... @OneToOne(cascade = CascadeType.ALL) @JoinTable(name = "emp_workstation", joinColumns = { @JoinColumn(name = "employee_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "workstation_id", referencedColumnName = "id") }) private WorkStation workStation; //... getters and setters } @Entity @Table(name = "workstation") public class WorkStation { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; //... @OneToOne(mappedBy = "workStation") private Employee employee; //... getters and setters } 동일한 Domain Data 인데, DB 정규화에 의하여, ManyToOne를 사용 해야한다면. 아래와 같이 GLOBAL_TREE_MAP을 JoinTable로 사용하여, 연결하도록 한다. ( 양방향 ) 이경우는 OneToMany를 설정한 Parent Entity에 의한 설정이므로 양방향 설정을 의미하기도 한다. private PdServiceEntity pdServiceEntity; @ManyToOne @JsonBackReference @JoinTable( name = "GLOBAL_TREE_MAP", joinColumns = @JoinColumn(name = "pdserviceversion_link"), inverseJoinColumns = @JoinColumn(name = "pdservice_link") ) @WhereJoinTable( clause = "pdservice_link is not null") public PdServiceEntity getPdServiceEntity() { return pdServiceEntity; } public void setPdServiceEntity(PdServiceEntity pdServiceEntity) { this.pdServiceEntity = pdServiceEntity; } 동일한 Domain Data 인데, DB 정규화에 의하여, ManyToMany를 사용 해야한다면. 이 경우 역시 ManyToMany 관계는 매우 드물지만, 발생 할 가능성이 있다. ( 보통 서로다른 Domain Data ) ( 조직도를 생각할 때, 하나의 팀장이 특수한 사람을 포함하는 관계에서 다른팀에도 속하는 경우 ) 따라서, GLOBAL_TREE_MAP을 JoinTable로 사용하여, 연결하도록 한다. ( 양방향 ) 다만, 특수한 케이스이기 때문에 아래를 참고하여 구현하도록 한다. employee_project 는 GLOBAL_TREE_MAP으로 대치할 것 @Entity @Table(name = "Employee") public class Employee { // 단방향 @ManyToMany(cascade = { CascadeType.ALL }) @JoinTable( name = "Employee_Project", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = { @JoinColumn(name = "project_id") } ) Set projects = new HashSet<>(); // standard constructor/getters/setters } @Entity @Table(name = "Project") public class Project { // 양방향 @ManyToMany(mappedBy = "projects") private Set employees = new HashSet<>(); // standard constructors/getters/setters } Java Service Tree Framework 는 PLE 개발 방식을 준수하기 위해 노력하고 있습니다. Entity 간에 연결 관계를 Global Tree Map 하나로 처리하는 것은 성능에 영향을 주는 문제를 야기 할 수 있습니다. 네. 알고 있습니다. 다만, Global Tree Map Manager 가 ( 유틸리티 ) 현재 하나의 테이블을 기준으로 작성되어 있으므로, 메니저의 기능이 강화하면 분리된 테이블 형태로 관리 할 수 있도록 가이드를 업데이트 하겠습니다. 상기 Entity 릴레이션 처리 방안은 Normal 한 Case . 즉 Java Service Tree Framework 를 활용한 데이터 엔티티를 대상으로 하며, 예외 케이스가 존재합니다. 바로, 동적으로 테이블을 확장하는 방식인 파티셔닝 테이블을 구성했을 때. Java Service Tree Framework는 해당 파티셔닝 테이블을 대상으로 하는 엔티티는 Global Tree Map 범주에서 제외합니다. 따라서, 지원할 수 있는 범주는. OneToOne 그것도 @JoinColumn 만을 지원하오니 이점 참고하여 유의 해 주시기 바랍니다.