본문 바로가기

분류 전체보기270

[Java] 자바의 리플렉션 자바에 대한 공부를 하던중 리플렉션이라는 개념이 있었다. 막상 예제를 보니 이미 사내 소스코드에 그렇게 쓰는 부분이 있음을 바로 알 수 있었다. Java Reflection API 구체적인 클래스 타입을 알지 못해도, 해당 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API 구체적인 클래스 타입을 알지 못하면 메소드를 실행 할 수 없다. 리플렉션이 가능한 이유는? 자바의 클래스 파일은 바이트 코드로 컴파일되어 Method 영역에 적재되어있다. 그래서 이 영역에서 클래스에 대한 정보를 가져올 수 있다. ClassName Class Modifiers (public, private, synchronized 등) Package Info Implemented Interfaces Consturc.. 2020. 6. 12.
[Java] 자바 직렬화, serialVersionUID 직렬화란? 글에 이어 부족한 부분을 추가하려한다. serialVersionUID 클래스를 역직렬화 할 때, 멤버 변수가 새로 추가 되었다면 예외가 발생한다. java.io.InvalidClassException local class incompatible: stream classdesc serialVersionUID = -8896802588094338594, local class serialVersionUID = 7127171927132876450 serialVersionUID의 정보가 일치하지 않기 때문에 발생한 것이다. serialVersionUID 값을 설정하지도 않았는데 왜 이런 에러가 발생할까? SUID 는 필수 값은 아니다. 호환 가능한 클래스는 SUID값이 고정되어 있다. SUID가 선언되어.. 2020. 6. 7.
Maven VS Gradle 메이븐(Maven)과 그래들(Gradle) 흔히 스프링에서 빌드 도구로 메이븐 또는 그래들을 사용한다. 그런데 요즘 트렌드를 보면 대부분 Spring Boot + Gradle을 사용한다. 왜 Maven말고 Gradle을 더 많이 사용할까? 궁금해졌다. 간단히 각각의 특징을 알아보자. 메이븐(Maven) apache의 ant build의 대안으로 만들어졌으며, apache 라이센스로 배포되는 오픈 소스 소프트웨어이다. pom.xml을 사용한 정형화된 빌드 시스템 그래들(Gradle) Ant와 Maven의 장점을 합쳐서 출시 빌드 스크립트가 자바와 같이 JVM 위에서 동작하는 groovy라는 언어로 작성하게 된다. 스크립트 언어이므로 컴파일을 할 필요는 없다. Maven VS Gradle Maven은 XML.. 2020. 6. 2.
[Spring] Bean LifeCycle 솔직하게 말해서 기존에는 LifeCycle이 왜 중요한지 체감을 못했다. 단순히 중요하다니까 보는정도? 하지만, JPA를 공부하다보니 Entity의 LifeCycle이 엄청 중요했다. 그래서 LifeCycle에 대한 공부를 하려한다. Spring Bean의 생명주기 Spring Application 시작 Bean 설정파일 초기화 Config 파일이나 web.xml을 사용해 Bean으로 등록할 대상을 찾아 기본 생성자를 호출하여 Bean에 등록한다. Bean으로 등록할 객체 초기화 //@Component를 사용 할 경우 @PostConstruct public void init() { System.out.println("Init"); } //@Bean을 사용 할 경우 @Bean(initMethod = "in.. 2020. 5. 11.
[JPA] 변경 감지(dirty checking)와 병합(merge) 본 내용은 인프런 김영한님의 JPA 활용 강의를 수강하며 정리한 내용입니다. 준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. 객체가 이미 DB에 한번 저장되어 식별자가 존재하는 경우, 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있다. jpa가 관리를 하지 않음, persist 상태가 아니기 때문에 값을 바꿔도 DB변경이 일어나지 않음 준영속 엔티티를 수정하는 2가지 방법 dirtyChecking을 사용하여 값을 저장 @Transactional void update(Item itemParam) { //itemParam: 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회 findI.. 2020. 5. 2.
[JPA] 엔티티 설계시 주의사항 본 내용은 김영한님의 실전 스프링 부트 JPA 활용 강의를 수강하며 정리한 내용입니다. 가급적 Setter를 지양해라 Setter가 모두 열려있으면, 변경 포인트가 너무 많아져서 유지 보수가 어렵다. 모든 연관관계는 지연로딩(LAZY)으로 설정해라(중요) 즉시로딩(Eager)의 경우 N+1 문제가 발생 할 수 있다. 어떤 SQL이 실행될지 추적하기 어렵다. 실무에서 모든 연관관계는 지연로딩(LAZY)로 설정해야 한다. 함께 조회해서 가져오고 싶은 경우 fetch join 또는 엔티티 그래프 기능을 사용해야한다. xxxToOne어노테이션은 기본값이 Eager이기 때문에 LAZY로 바꿔줘야한다. 컬렉션은 필드에서 초기화 하자. 필드에서 바로 초기화 하는것이 안전하다. null에 대해 안전하다. 하이버네이트에.. 2020. 4. 30.