[SPRING] 스프링 MVC 폼 - 백킹 객체 트리 초기화를위한 베스트 프랙티스
SPRING스프링 MVC 폼 - 백킹 객체 트리 초기화를위한 베스트 프랙티스
복잡한 객체 트리가있는 form-backing 객체가있는 경우 - String 객체가있는 Contact Info 객체가있는 Person은 객체가 구성 요소로 완전히 채워 져야합니다. 내가 바인딩 할 수 있기 전에 객체. 그래서 새로운 Person을 생성한다면, 모든 컴포넌트 객체가 박쥐에 채워져 있는지 확인해야합니다. 데이터베이스에서 Person을 검색하는 경우, 내가 가지고 있지 않은 객체가 있는지 확인해야합니다 데이터베이스에서 채워지는 빈 개체가 채워집니다.
첫 번째 질문은 물론 - 위의 가정에서 맞습니까? 그것은 person.contactInfo.homeAddress.street에 바인딩하려고하면 ContactInfo가없는 것처럼 보입니다. null 포인터 예외가 발생합니다.
둘째, 내 개체를 초기화하는 가장 좋은 방법은 무엇입니까. 나는 두 가지 접근법을 생각할 수있다. 하나는 선언시 모든 멤버 객체를 초기화하는 것입니다.
public class Person {
String name;
ContactInfo contactInfo = new ContactInfo();
//getters, setters, etc.
}
public class ContactInfo {
String phone;
Address homeAddress = new Address();
}
기타 등등.
또 다른 접근법은 모든 것을 초기화하는 PersonFactory를 가지거나 모든 것을 초기화하는 Person.getInstance 팩토리 메소드를 갖는 것입니다.
데이터베이스에서 Person을 검색하는 경우 첫 번째 방법으로 문제를 해결할 수 있습니다 (즉,이 특정 인물이 데이터베이스에 주소가 없으면 개체에 주소가 있음). 그러나 이는 각 개체를 만드는 것을 의미합니다. 두번. 데이터베이스에서 아무 것도 검색되지 않은 경우에도 DAO가 모든 것을 명시 적으로 채우도록하는 경우를 제외하고는이 방법을 다룰 방법을 모릅니다. 또는 객체를 통과하고 누락 된 것을 "채우는"방법을 팩토리에 제공 할 수 있습니다.
제안?
해결법
-
==============================
1.여러분이 원한다면 과장이라고 부르지 만, 우리가 실제로 끝내는 것은 모든 객체를 취하고 반사를 사용하여 (재귀 적으로) 모든 null 속성을 찾고 올바른 유형의 객체를 인스턴스화하는 일반적인 팩토리를 만드는 것입니다. 나는 이것을 Apache Commons BeanUtils를 사용하여했다.
여러분이 원한다면 과장이라고 부르지 만, 우리가 실제로 끝내는 것은 모든 객체를 취하고 반사를 사용하여 (재귀 적으로) 모든 null 속성을 찾고 올바른 유형의 객체를 인스턴스화하는 일반적인 팩토리를 만드는 것입니다. 나는 이것을 Apache Commons BeanUtils를 사용하여했다.
이렇게하면 다양한 소스 (DAO, XML의 비 직렬화 등)에서 가져온 객체를 가져 와서이 팩토리를 통해 전달할 수 있으며 바인딩에 필요한 것을 염려하지 않고 양식지지 객체로 사용할 수 있습니다. 널이 되라.
틀림없이 이는 주어진 양식에 필요하지 않은 속성을 인스턴스화하는 것이지만 일반적으로 적용되지 않는 속성을 인스턴스화하는 것을 의미합니다.
-
==============================
2.일반적으로 객체가 완전히 초기화되었는지 확인합니다. 객체를 훨씬 간단하게 만들고 코드 전체에서 null 검사를 분산시키지 않습니다.
일반적으로 객체가 완전히 초기화되었는지 확인합니다. 객체를 훨씬 간단하게 만들고 코드 전체에서 null 검사를 분산시키지 않습니다.
이 경우 getter에 초기화를 넣으면 자식 객체가 실제로 사용될 때만 인스턴스화됩니다. 즉 getter가 호출 될 때 그리고 null 인 경우에만 인스턴스가 초기화됩니다.
일대일 관계로 데이터베이스에서로드하는 측면에서 보면 일반적으로 조인을하고로드를 많이 수행합니다. 일반적으로 성능에 미치는 영향은 거의 없지만 성능에 미치는 영향은 미미해야합니다.
일대 다 관계에있을 때 나는 보통 게으른 로딩을 선호합니다. Hibernate가이 작업을 수행하지만, 자신 만의 작업을 수행한다면, 내용과 관련된 메소드가 호출 될 때 적절한 DAO를 호출하는 List의 사용자 정의 구현이 필요합니다.
일대 다 관계에서이 동작에 대한 한 가지 예외는 반복 할 의도가있는 부모 객체의 목록과 자식을 반복 할 각 부모에 대한 목록이있는 경우입니다. 분명히 성능이 좋지 않을 것입니다. 왜냐하면 실제로 2 회의 통화로 DB를 호출 할 수있을 때 n + 1 전화를 걸 것이기 때문입니다.
-
==============================
3.나는 당신이
같은 것을 말하는 것 같아요? 나를 위해 명확하지 않지만 내가 옳다고 가정 :) :나는 당신이
같은 것을 말하는 것 같아요? 나를 위해 명확하지 않지만 내가 옳다고 가정 :) :1) 예, person.contactInfo.homeAddress.street를 작성할 때 person.getContactInfo (). getHomeAddress (). getStreet ()를 읽습니다. ContactInfo 또는 HomeAddress 또는 Street 객체가 null 인 경우 해당 메소드 중 하나를 호출하면 NullPointException이 발생합니다.
2) 일반적으로 코드 스 니펫과 마찬가지로 선언 할 때 멤버 개체를 초기화합니다. 초기화 값이 무조건적인 경우 작업을 수행하기 위해 factory 클래스의 이점을 보지 못합니다. 나는 분명히 당신이 두 번 사람을 창조하도록 강요당하는 문제를 보지 못했지만 피곤할 수있다;)
-
==============================
4.나는 Factory 메소드 접근법을 사용했다. (정적 메서드로 사용하는 것이 더 좋기 때문에 별도의 클래스를 사용하는 팬이 아니다.) 나는 ~ 같은 것을 가지고있다.
나는 Factory 메소드 접근법을 사용했다. (정적 메서드로 사용하는 것이 더 좋기 때문에 별도의 클래스를 사용하는 팬이 아니다.) 나는 ~ 같은 것을 가지고있다.
public static Person getInstanceForContactInfoForm() { ContactInfo contactInfo = ContactInfo.getInstanceForContactInfoForm(); Person person = new Person(contactInfo); // set whatever other properties you need for Person // just enough to 1-render the form and 2-avoid any exceptions return person; }
데이터베이스에서 Person을로드하는 경우 Person 클래스에 "initalizeForContactInfoForm"또는 이와 비슷한 메서드가 있습니다. Person을 데이터베이스에서 로딩 한 후에 폼 백킹 객체를 반환하는 Spring MVC 메소드에 의해 호출되는 메소드의 Service 레이어에서이 메소드를 호출 할 것이다.
나는 이것이 정말로 국제 대회라고 생각하지 않습니다. 그것은 제가 스스로 해결 한 방법 일뿐입니다. 누군가가 동의하지 않으면 어떤 결점이 있는지 정말 모르겠다.
from https://stackoverflow.com/questions/378066/best-practice-for-spring-mvc-form-backing-object-tree-initialization by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @RequestMapping을 사용하여 Spring MVC 컨트롤러에서 코드를 최적화하는 방법은 무엇입니까? (0) | 2019.02.06 |
---|---|
[SPRING] 스프링 부트 REST 애플리케이션을 사용하는 OAuth2 - 토큰을 사용하여 리소스에 액세스 할 수 없음 (0) | 2019.02.06 |
[SPRING] 봄 + 각도 동일한 파일을 두 번 업로드 할 수 없습니다. (0) | 2019.02.06 |
[SPRING] Spring MVC를 사용하여 입력 텍스트의 날짜 형식 설정 (0) | 2019.02.06 |
[SPRING] IllegalArgumentException : 형태를 null로 할 수 없다 (0) | 2019.02.06 |