본문 바로가기

Back-End

(91)
Spring JPA 다대다 설정 및 성능 주의 ( Many To Many ) 소개 복잡한 비즈니스 요구 사항이 들어오게 되면 다대다 관계로 모델링을 진행하여야 한다. 이때 어떻게 해야하는지 주의해야 할 점에 대해 정리해보고 싶어 해당 글을 쓰게 되었다. Many to Many 학생이 좋아하는 수업을 정의할 때 다대다 관계가 필요해진다. 여러명의 학생이 수업을 좋아할수도 있고, 한 학생이 여러 수업을 좋아할 수도 있다. 이걸 RDB로 표현을 하면 아래와 같은 다이어그램이다. JPA 코드로 표현을 하면 아래와 같다. @Entity class Student { @Id Long id; @ManyToMany @JoinTable( name = "course_like", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns =..
Spring @Order 어노테이션 @Order 어노테이션을 쓰면 스프링 빈의 순서를 정할 수 있다. 기본 옵션은 Ordered.LOWEST_PRECEDENCE 이다. Spring 4.0때부터 collection에 component를 주입할 수 있게 되면서부터 @Order를 이용하여 순서를 정하는데도 사용하게 되었다. @Component @Order(1) public class Excellent implements Rating { @Override public int getRating() { return 1; } } @Component @Order(2) public class Good implements Rating { @Override public int getRating() { return 2; } } @Component @Order(..
Spring JPA의 사실과 오해 - NHN FORWARD 1. 연관관계 매핑 Entity 매핑 / 연관관계 매핑 정규화를 통해서 최소한의 데이터를 받아오도록 한다. 그렇기 때문에 FK를 이용하여 객체 참조와 매핑항여 사용한다. 그때 다중성, 방향성을 고려하여 설정을 한다. ( OneToOne, OneToMany, ManyToOne, ManyToMany ) 대개의 경우 단방향 매핑이면 충분하다. ( 양방향 매핑은 복잡하고 객체에서 양쪽 방향을 모두 관리해줘야 함 ) 영속성 전이 다대일인 경우 단방향으로도 영속성 전이가 잘됨 일대다 단방향 연관관계 매핑인 경우(Cascade.ALL) : @Transactional public void creeateMember(){ memberRepository.save(member); // MemberDetail 생성및 세팅 } ..
서버 개발자의 SPA 적용기 - NHN FORWARD 웹 개발의 패러다임 변화 mono -> front/backend 기존에는 프론트앤드와 백앤드 구분도 없었다. 하지만, 요즘 프론트앤드는 랜더링에 집중하고 백앤드는 REST API 용으로 기존 레거시 무엇이 문제인가? 일체형 웹 서비스 MVC 패턴을 사용한다. 하지만 비즈니스 요구가 많아지면서 비대해지는 웹서비스가 생긴다. 링크를 클릭하거나 데이터 변경만해도 무조건 새로고침이 된다. 그리고 자바스크립트 코드 때문에 서버단에 숙련도 떨어지는 더러운 코드가 계속 추가된다. SPA의 도입 하나의 페이지(index.html)만 존재하고 페이지 전환 및 구성을 javascript로 구현을 한다. link tag를 사용하는 전통적인 웹 방식은 새로운 페이지 요청 시마다 정적 리소스가 다운로드되고 전체 페이지를 다시 ..
16장. 트랜잭션과 락, 2차 캐시 및 내 생각 현업에서 주문, 결제 등등 민감한 데이터를 수정하는 경우 항상 트랜잭션과 관련된 내용이 나온다. 락은 자원을 선점하도록 설계하지 말고 보통 기본으로 사용하다가 문제가 발생하면 그때 대응하는 식으로 개발했다. ( 대용량 트래픽의 회사에서 근무하시거나 제가 잘못된 개발 방법이라면 언제든 댓글 달아주세요 ) 트랜잭션과 격리수준 원자성(Atomicity) : 트랜잭션 내에서 실행된 작업들은 마치 하나의 작업처럼 모두 성공하거나 모두 실패해야 한다 일관성(Consistency) : 데이터베이스에서 정한 무결성 제약조건을 항상 만족해야 한다 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어, 동시에 데이터를 수정하지 못하도록 한다. 하지만, 격리성은 동시..
14장. JPA 컬렉션과 부가기능 하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드를 hibernate 에서 준비한 collection으로 감싸서 사용한다. 예제를 살펴보자 Team team = new Team(); // before persist Sysout(team.getMembers().getClass()); //java.util.ArrayLists em.persist(team); // after persist Sysout(team.getMembers().getClass()); // org.hibernate.collection.internal.PersistentBag 결과를 보면 영속 상태로 변경된 후에 hibernate가 제공하는 PersistentBag로 변경되었다. 원본 컬렉션을 감싸고 있어서 레퍼 컬렉션이라고 부르기도..
Spring jpa save(), saveAndFlush() 제대로 알고 쓰기 @Transactional 없이 save() vs saveAndFlush() public Member saveMember(MemberDTO memberDTO){ Member member = Member.create(memberDTO); member = memberRepository.save(member); member.setName("TaeHyun"); return member;// break point 설정 } 아래와 같이 console에 출력되지만 변경된 name(태현) 은 입력되지 않는다. Hibernate : insert into member (name, uuid ... ) values (?,?, ... ) public Member saveMember(MemberDTO memberDTO){ Mem..
ObjectOptimisticLockingFailureException 11/1/2019 5:47:27 PMorg.springframework.orm.ObjectOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 11/1/2019 5:47:27 PMat org.springframework.orm.jpa.vendor.HibernateJpaD..
Spring Security - remember-me에 관하여 ( 로그인 유지하기 ) Remember-me architecture 로그인 기억하기를 구현할 때 굳이 전체 아키텍처를 이해하지 않아도 되지만, 커스터마이징이 많아질 수록 전체 흐름을 이해해야 구현하기 편해진다. 그래서 remember-me 전체 흐름도에 대해 알아보자. ( 해당 그림은 token 기반 remember-me의 흐름도다 ) 스프링 시큐리티 필터들과 같이, RememberAuthenticationFilter가 FilterChainProxy에 포함되어 있다. RememberAuthenticationFilter는 request를 보고 필요한 경우 특정 동작을 수행한다. RememberMeAuthenticationFilter인터페이스는 해당 사용자가 이미 로그인 한적이 있는지 확인하기 위해 RememberMeService..
Jackson 관련 객체간 서로 참조인 경우 @JsonManagedReference, @JsonBackReference 사용하기 @JsonManagedReference : 해당 부분이 serialize 된다 @JsonBackReference : serialize 에서 제외 된다.