전체 글 96

실전 스프링부트와 JPA활용2 - 조회 API 성능 최적화, OSIV

Order 엔티티를 보면 아래와 같이 Member, Delivery과는 to one관계를, OrderItem과는 to many관계를 맺고 있는 것을 확인할 수 있다. @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) //생성자 숨기기 public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy =..

Spring & SpringBoot 2024.01.11

400에러 HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `jpabook.jpashop.api.

DTO를 만들어서 api 요청, 응답을 처리하던 중 PUT메소드를 테스트하다가 400에러가 발생했다. 원인은 DTO로 사용하는 객체에 디폴트 생성자가 없어서 발생한 문제였다. 스프링부트를 사용한다고 해서 기본생성자가 꼭 필요한 것은 아니지만, JPA 엔티티를 사용하면 리플렉션을 이용하기 때문에 기본생성자가 꼭 필요하다. 그리고 생성자가 없는 클래스는 클래스 파일을 컴파일하는 시점에 자바가 디폴트 생성자를 자동으로 생성해주지만, 임의로 작성한 생성자가 있을 경우, 자동으로 디폴트 생성자를 만들어주지 않는다. 나는 내 임의대로 생성자를 만들어뒀기때문에 기본 생성자가 생성되지 못했고 따라서 요청을 받아서 객체로 전환하는 JSON Serialize 과정에서 오류가 발생한 것 같다. 나는 대체 언제 이 의미없는..

Spring & SpringBoot 2024.01.09

실전 스프링부트와 JPA활용1 - 변경 감지와 병합(merge)

준영속 엔티티를 수정하는 두가지 방법 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 준영속엔티티라 한다. 쉽게 말해서 DB에 이미 한번 갔다와서 id와 같은 식별자가 이미 존재하는 엔티티를 뜻한다. 그리고 이러한 준영속 엔티티를 수정하는데에는 2가지 방법이 있다. 1. 변경 감지 기능 사용(Dirty Checking) 영속성 컨텍스트 안에서 엔티티를 다시 조회하고, 그 후에 데이터를 수정하는 방법이다. 예를 들어 같은 트랜잭션 안에서 엔티티의 값이 수정이 되고 해당 트랜잭션이 커밋되면, 트랜잭션이 커밋되는 그 순간에 update 쿼리가 나간다. (em.flush > 영속성 컨텍스트에서 바뀐 엔티티들을 다 찾아서 update함.) 그리고 이것을 dirty checking, 즉 변경감지가 동작한다고 한다. ..

Spring & SpringBoot 2024.01.08

재귀 알고리즘 예시 (+피보나치 분할정복 방법)

재귀(Recursion) 어떤 함수(혹은 프로시져, 서브 프로그램)에서 직접적으로 혹은 간접적으로 자기 자신 함수를 다시 호출하는 것. 무한 재귀에 빠지지 않도록 base case를 잘 정해주고, 반복되는 부분은 recursive step로 정의해준다. Function call stack 프로그램 중 함수를 호출하면 (Context switching) 지금 실행중인 함수의 지역변수 등 가지고 있는 정보를 저장해두어야 한다. 그리고 새로운 함수 수행이 완료되면 다시 원래의 함수로 제어가 돌어오고, 기존의 정보를 복원해서 사용하여야 한다. 이때 현재 함수가 가지고 있던 정보를 저장하는 연속적인 메모리 공간을 activation record라고 하고, 이 activation record를 call stack ..

자료구조 2023.10.18

정렬 알고리즘

stable sorting algorithm 크기가 같은 데이터가 정렬 이후에도 입력된 순서 그대로 유지되는 알고리즘 ex) Merge sort, Insertion Sort, Bubble Sort, Cocktail Shaker Sort In-Place algorithm 입력 데이터를 저장하는 메모리 이외는 상수 크기의 메모리만 필요한 알고리즘 ex) Heap sort, Insertion sort, Selection sort, Shell sort, Bubble sort, Comb Sort, Cocktail shaker sort Bubble sort 인접한 두 숫자를 비교하여 두 수의 정렬순서가 맞지 않는 경우에는 교환(swap)한다. (stable, in-place) public static void bu..

자료구조 2023.10.17

[스터디] 헤드퍼스트 디자인 패턴 - 1. Strategy pattern

학교에서 소프트웨어 디자인패턴 수업을 듣게되었는데 부교재로 이 책을 사게되었다. 난 몰랐는데 디자인패턴쪽에서는 유명한 책이라고 한다! 학교에서 진도나가는 주교재는 영어 원서여서 이건 스터디하는데에 사용하기로.. 아무튼 유난님과 매주 한챕터씩 읽고 주 1회씩 줌으로 스터디를 하기로 했다! 대학생도 힘든 스터디를 회사 다니면서 하는... 아무튼 정말 대단하네요.... 히튼 그래서 사실 첫 스터디는 저번주에 했는데 정리하는걸 깜빡했어!!! 지금이라도 하도록 하겠어요 전략패턴 (Strategy Pattern) 알고리즘군을 캡슐화해서 각각의 알고리즘들을 수정해서 쓸 수 있게 하는 패턴. 클라이언트로부터 알고리즘을 분리해서 독립적으로 쓸 수 있게 하는 패턴. 배운 것 변화하는 부분은 뽑아서 캡슐화하자! 구현보다는 ..

[Thanks] 플러터 앱 출시 후기

평소에 플러터를 한번 배워보고싶다 생각만 하다가 이번 방학에 한번 공부해봤다. 그런데 배우다보니까 이게 생각보다 너무 재밌고 좋아서 개인적으로 만든 앱을 출시까지 해보게 되었다. 땡스는 하루의 감사한일을 적고 월별로 조회할 수 있는 아주 간단한 앱이고, 플러터로 개발했기 때문에 애플 앱스토어와 구글 플레이스토어 양쪽에 모두 올릴 수 있었다..! 다운로드는 아래 링크에서 가능하다! https://apps.apple.com/kr/app/%EB%95%A1%EC%8A%A4/id6458731401 ‎땡스 ‎* 주요 기능 안내 * 1. 홈 - 캘린더를 통해 날짜를 선택하고 우측 하단의 +버튼을 통해 오늘의 감사한 일을 기록할 수 있어요. - 생성된 감사카드를 클릭하면 수정과 삭제가 가능해요! 2. 모아보 apps...

개인 프로젝트 2023.08.16

Stateful, Stateless Widget LifeCycle

Widget widget은 모두 불변의 법칙을 갖고 있다. 위젯의 색 등 그 값을 변경해야 할때는 기존 위젯을 삭제해버리고 완전히 새로운 위젯으로 대체한다! StatelessWidget 라이프 사이클 class Test extends StatelessWidget { const Test({super.key}); @override Widget build(BuildContext context) { return const Placeholder(); } } StatelessWidget은 Constructor로 생성이 되고, 생성이 되자마자 build함수가 실행된다. 변경이 필요하면 새로운 위젯을 만들어버리고, 하나의 StatelessWidget은 라이프사이클동안 단 한번만 build함수를 실행한다. Statefu..

Flutter 2023.08.16