본문 바로가기

Happyer16

(314)
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를 사용하는 전통적인 웹 방식은 새로운 페이지 요청 시마다 정적 리소스가 다운로드되고 전체 페이지를 다시 ..
권도균의 스타트업 경영수업 스타트업은 탐색을 위한 임시적인 조직이다. 경진대회 입상, 언론의 조명, 매출이 일어남 -> 사업 성공을 말하는게 절대 아님 린 스타트업의 원리 사무실에서 탁상공론하지 말고 잠재 고객을 만나서 가설 검증 ( customer development ) 애자일 개발 방식을 따라 MVP 만들어 고객의 문제점을 하나씩 해결하고 고객의 반응을 확인하며 배우는 과정 반복 자신의 사업의 가설잉 무엇인지 규정\ 제품 개발에 앞서 최소 200명 이상의 잠재 고객을 만나서 질문하고 배우기 사업과 고객에 대해 성급히 예단하지 마라 성급히 쉬운 해석으로 추론하려 하지도 마라. 쉬운 답을 찾으면 편안함을 느끼겠지만 그 너머에는 오류의 절벽이 기다린다. 비즈니스 모델부터 제대로 설계하고 출발하라. 사업은 단거리 여행이 아니라 장거..
Java 8 - stream 예제 모음 String list -> string 사이사이에 코마 넣기 return cjtoneOrderResponse.getCoupons().stream().map(OrderResponse.Coupon::getOrderSales) .collect(Collectors.joining(","));
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..
ThreadLocal이란 사용자 별로 변수를 관리하고 싶은 경우가 있을 것이다. 아래와 같이 구현하면 컨트롤러는 빈 관리를 Singleton으로 하기 때문에 melon은 매번 재사용되며 요청때마다 증가하게 된다. @RestController public class ShoppingController { private int melon; @RequestMapping("/") private String test() { this.addMelon(); return String.valueOf(melon); } private void addMelon() { melon++; } } 그렇다면, 사용자별로 melon의 숫자가 증가하려면 어떻게 해야할까? ThreadLocal 사용하기 아래와 같이 사용하면 Thread별로 저장소가 생성된다. pub..
4장. Ducks 구조와 redux-actions 사용하기 https://velopert.com/3358 Redux 를 통한 React 어플리케이션 상태 관리 :: 4장. Ducks 구조와 redux-actions 사용하기 | VELOPERT.LOG 이 튜토리얼은 5개의 포스트로 나뉘어진 이어지는 강좌입니다. 목차를 확인하시려면 여기를 참고하세요. 4장. Ducks 구조와 redux-actions 사용하기 Redux 공식 문서에서는, ActionType, Action, Reducer 이 3가지를 따로 따로 다룹니다. 그러다보니, 하나의 액션을 추가하려면 3개의 다른 파일들을 수정해야하죠. 가끔씩은, 액션생성자를 하나하나 만들고 또 그것들을 dispatch 하는 과정이 귀찮게 느껴질때도 있습니다. 상태 velopert.com 해당 포스팅은 이 글을 읽으면서 저의 ..