전체 글 954

22. Web확장 도메인 클래스 컨버터

스프링 데이터 JPA에서 제공해주는 웹 확장 기능 2가지가 있음. 그 중 도메인 클래스 컨버터 이게 뭐냐면, 말 그대로 컨버터다. 웹으로 받아온 걸 도메인 클래스로 변환해주는. @GetMapping("/members2/{id}") public String findMember2(@PathVariable("id") Member member){ return member.getUsername(); } 이런거다. 왜냐하면 저렇게 받는게 id니까 이런 식으로 할 수 있는거다. 스프링이 중간에 컨버팅 해주고 넣어준다. select m1_0.member_id, m1_0.age, m1_0.create_by, m1_0.created_date, m1_0.last_modified_by, m1_0.last_modified_da..

21. Auditing

Auditing 직역은 감사하다. 감사를 수행하다. 이게 무슨 기능이냐면, 보통 테이블을 만들 때 등록일, 수정일 이 두개는 기본으로 깐다. 감사하다. 라는 뉘앙스 대로 뭔가 감찰하고, 뭐 그런건데, 저런 등록일이나 수정일, 더 나아가서는 등록자나 수정자까지 자동으로 넣어주는 기능이다. 등록자 수정자는 어떤 관리자가 수정을 했고 취소를 했는지 등 시스템 관리자 id? 등으로 넣어줌. 실무에서 많이 사용함. 그럼 우선 jpa로 등록일, 수정일 적용 먼저 보통 이런 것들은 모든 테이블에 공통적으로 들어가는 사항이라, @Getter @MappedSuperclass public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime crea..

vite로 리액트 개발하기 (jsx)

비슷한데, 일단 생성할 때 npm init vite . 이거임. 그럼 뭐 메뉴 선택하라고 나옴. 거기서 알맞은 거 선택하면 됨. 그럼 거기서 개발 시작하면 됨. 이거 장점은 뭐 그냥 개발할 때 npm run start? 여기선 npm run dev임 이거 해서 올라오는게 빠르긴 함. 기능적인 차이는 없다고 함. 개발도 진짜 거의 비슷함. 약-간씩 다른점 있기는 함. 예를 들면 import React from "react"; 솔직히 이거 js에서도 안써도 되긴 하는데, jsx에서는 저거 쓰면 그냥 에러임.

React 2023.11.23

라우터

npm i react-router-dom npm i react-router 일단 이거 2개. dom은 말 그대로 document에 관한 거 사용법은, 먼저 라우터 관련은 다 BrowserRouter 라는걸로 감싸줘야 함. 뭐 어디에다 해야 한다 이런 규칙은 없고, 그냥 라우터 관련은 다 , 그러니까 모든 라우터의 최상위면 됨. Link 포함. 저 두 라이브러리의 컴포넌트들은 모두 감싸고 있어야 함. 이게 새로고침 하는 게 맞음. 근데 바뀐부분만 새로고침 하는거임. (바뀔 때 마다 Network에서 파비콘 새로 로드하는거 보면 새로고침 맞는 듯) 이제 지정하는 방법은, 이렇게. Routes로 감싸고, Route로 개개별 지정해 주면 됨. 그럼 저게 카드 레이아웃? 같은 느낌이라고 보면 됨. 저 path에 ..

React 2023.11.23

20. 확장기능. 사용자 정의 리포지토리

이거는 정말 많이 쓸 것이다. 이게 뭐냐면, 우리가 기존의 SpringDataJPA에서는 메소드명으로 쿼리 지정, 뭐 JPQL직접 작성 등 여튼간에 SpringDataJPA에서가 제공해주는 방식으로만 정의할 수 있었다. 인터페이스이기 때문에. SpringDataJPA이란 JPA를 이용한 것들의 자동구현을 도와주는 라이브러리 이기 때문에. 근데 만약 우리가 jpql이 아니라 순수 sql을 이용해, jdbc template를 이용해 DB에 쿼리를 전달하고 싶다면? 아니면 QueryDSL을 쓰고 싶다면? 어딘가에 직접 우리가 그걸 구현해 줘야 한다. 아쉽게도, SpringDataJPA가 직접 QueryDSL과 뭐 연동해서 해 주는 것은 없다. 우리가 직접 구현을 해 줘야 한다. 그러면 어떻게 하느냐, 먼저, ..

19. JPA 힌트, Lock

먼저 JPA 힌트란, SQL에는 Hint 라는 것이 있다. 그러니까, SELECT employee_name FROM employees USE INDEX(employee_idx) WHERE department_id = 10; Hint 라는 것은 어떤 명령을 처리하기 위해 최적화된 방법?을 지시해 주는 것이다. mysql에서는 저렇게 use index로 힌트를 주로 제공한다고 한다. use index말고도 여러 힌트들이 있다고 한다. USE INDEX : 사용할 인덱스를 지정합니다. FORCE INDEX: USE INDEX와 비슷하지만 더 강력합니다. 비용을 고려하지 않습니다. IGNORE INDEX: 최적화 프로그램에 특정 인덱스를 무시하도록 지시합니다. 여튼, sql문에 쿼리 실행 방법에 대해 뭔가 최적..

18. @EntityGraph

엔티티 그래프 연관된 엔티티들을 한번에 조회해 오는 방법. join fetch 그거임. 엔티티 그래프 이전에, 객체 그래프 라는 것이 객체간의 연결된 관계를 보여주는 그래프임. 이런 거. 엔티티도 마찬가지임. 엔티티그래프란 엔티티간의 연결된 관계를 보여주는 그래프. join fetch라는 개념이, 이런 엔티티그래프임. join fetch라는게 이런 엔티티 그래프를 다 끌고온다는 개념임. 그래서 옛날에 join fetch 배웠을 때 fetch한 건 select에다가 별칭으로 fetch한 것의 일부분만 가져오고 그런 게 안된다고 했던 거임. 그래서 여튼, 지금 사실 Spring Data JPA가 아니라 Jpa스타일로 그냥 쿼리로 했는데, @Query("select m from Member m join fet..

17. 벌크성 수정쿼리

우리가 기존 수정은 데이터를 가져온 다음, 그걸 트랜잭션 내부에서 엔티티의 값을 변경을 하면 알아서 update 쿼리가 commit 시점에 나간다. 근데, 만약 예를 들어 전체 회사원의 연봉을 10% 올리고 싶다면? 이렇게 한번에 bulk(통으로)적으로 수정하는 걸 벌크성 수정 쿼리라고 한다. 먼저 순수 JPA에서 public int bulkAgePlus(){ return em.createQuery("update Member m set m.age= m.age + 3") .executeUpdate(); } 그냥 통으로 update 시켜 버리면 됨. 조건 넣고 싶을 경우 인자로 받던지 해서 넣으면 되고, 그리고 나름 중요한 부분이, executeUpdate() 저 부분. 저걸 해야 영향받은 row의 개수를 ..

useCallback

useMemo와 비슷한데, 이거는 callback을 캐싱하고 있는거임. 보통 우리가 props를 통해 콜백함수를 자식으로 내려준다. 그런데, 부모 컴포넌트가 리랜더링 되면 자식컴포넌트들도 리랜더링 된다. 그러면 자식 컴포넌트들은 매번 부모가 리랜더링 될 때마다 내부 동작을 다시 실행하게 된다. (아예 컴포넌트 자체가 처음부터 끝까지 실행 됨.) 다시, useCallback은 props에 콜백함수를 자식으로 전달해도 쓸데없이 자식컴포넌트 내에서 재생성 하지 않고, 메모리에 캐싱해 뒀다가 그걸 참조해서 사용한다. 일단은 이걸 내가 이해하기 좀 어려웠던게 뭐냐면, 나는 사실 리액트 배우면서 생명주기도 create, update 순간만 알고 있었다. 그래도 리액트를 사용하는데는 아무 제약이 없으니까. 충분했다...

React 2023.11.21