TIL

220812 자바객체복사. JoinTable. findById 의 작동원리 등

하얀잔디 2022. 8. 12. 14:27

1. findByRoleRoleCd : 가장 처음 확인하는 경우 By 이후의 전체 단어를 엔티티에 속성에 존재하는지 확인함

2. findByRoleRoleCd : 1번에서 못찾으면 오른쪽 끝에서부터 CamelCase 기준으로 왼쪽으로 이동하면서 해당 단어 엔티티에 속성이 존재하는지 확인함.

3.findByRoleRoleCd : 2번이 안되면 다음 CamelCase.

 

 

JPA

getbyId vs findById 

 

@Override
public T getById(ID id) {

    Assert.notNull(id, ID_MUST_NOT_BE_NULL);
    return em.getReference(getDomainClass(), id);
}

 

1.id가 널이 아닌지 확인하고 프록시 줌.

 

getbyId : 프록시객체만 가져오고, 실제 사용할때 DB에 접근하고 없으면 EntityNotFoundException해줘ㅜㅁ.

 

FIndById : 

@Override
public Optional<T> findById(ID id) {

    Assert.notNull(id, ID_MUST_NOT_BE_NULL);

    Class<T> domainType = getDomainClass(); //1
  

    if (metadata == null) {  //2
        return Optional.ofNullable(em.find(domainType, id));  //3
        
    }

    LockModeType type = metadata.getLockModeType();  //4

    Map<String, Object> hints = new HashMap<>();
    getQueryHints().withFetchGraphs(em).forEach(hints::put); //5

    return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
	//6
}

0. id가 null인지 확인하고

1. Entity Class 타입을 가져옴.

2. metadata는 JPA 인터페이스를 상속한 거에서 에노테이션 정보를 갖고있음. 딱히없으면 기본 select 동작 수행함.

3. EntityManager find 메서드를 호출해 가장 기본 파라미터만 가지고 조회합니다

4. metadata에 Lock 이 정의되어있으면 LockMode를 획득함. // find는 읽기니까 s 락인듯?

5. metadata에 Hint 가 정의되어있으면 정의된 Hint 모두를 파라미터로 전달할 수 있게 Map에 매핑함.

6. type가 null 이면 -> hint를 가지고 find 하고 , 아니면 hint , type 등을 이용해 em.find를 수행함.

 

 

 

 

자바는 equals()로 같은지 비교함 문자열은. ==은 그냥 객체가 같은지 비교임.

 

CTagNotFoundException::new

이렇게 예외처리를 해버리는데 orElseThrow에서, 이 뜻은 그냥 새로만드는것

 

 

---

JPA 복합키에서 바로 findbyId로 조회는 안되는것같음 << *추후 알아보기. 그래서 기본키 두개 AND 로찾았음.

 

---

ObjectMapper

@RequestBody, @ResponseBody 처럼 

 

Java <-> Json 간의 변환을 해주는 라이브러리.

 

BeanUtils

서로 다른 두 객체 사의 필드값을 복사하기 위한 라이브러리임.

 

주의점 : getter setter 을 기반으로 복사하기에, setter가 있는 dto -> entity로 만들때는 문제가 됨.

 

Member member = new Member();
member.setName("이름");

    Member newMember = new Member();
// member 의 필드가 newMember 로 복사된다.
BeanUtils.copyProperties(member , newMember);

이런식으로  복사함.

 

ModelMapper

Java 객체 사이에 필드 값을 복사하기 위함.

보통 getter setter 이지만, 설정 바꾸면 Reflection 기반으로 필드주입함.

 

 

ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setFieldAccessLevel(Configuration.AccessLevel.PRIVATE).setFieldMatchingEnabled(true).setMatchingStrategy(MatchingStrategies.LOOSE);

 

위 정보는 Dto <-> Entity 변환할때 주로 사용한다. 꼭 기억해두자!!

 

---

자바 객체 복사 clone() 함수 들여다보기.

 

protected native Object clone() throws CloneNotSupportedException;

--> clone 함수 원형은 저렇게 생김.

앞에 native 란 -> 자바 언어가 아닌 JNI 를 통해서 구현되는것임.

 

JNI : C언어같은 로우레벨과도 연동되도록 하는 언어.

'TIL' 카테고리의 다른 글

220816 자바에서의 한글문자열. Dto에서 NoargsConstructor 가필요한이유  (0) 2022.08.16
220816 자바에서의 문자열  (0) 2022.08.16
220811  (0) 2022.08.11
220810 TIL  (0) 2022.08.10
220808 // Kafka란?  (0) 2022.08.08