분류 전체보기 954

0. 프리뷰

스프링 데이터 적용하려면, public interface MemberRepository extends JpaRepository { } JpaRepository을 상속받아 인터페이스를 구현하면 된다. @NoRepositoryBean public interface JpaRepository extends ListCrudRepository, ListPagingAndSortingRepository, QueryByExampleExecutor { void flush(); S saveAndFlush(S entity); List saveAllAndFlush(Iterable entities); @Deprecated default void deleteInBatch(Iterable entities) { deleteAllInB..

17. OSIV 성능 최적화

하이버네이트 : Open Session In View JPA는 Open EntityManager In View 라고 함. 트래픽 많은 서비스에서는 장애가 날 수 있음. 이걸 알아야 함. 스프링 시작할 때, 남기는 WARN이 하나 있다. 2023-11-17T06:33:36.261+09:00 WARN 8448 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to..

16. Dto로 조회. 플랫 데이터 최적화 쿼리 하나

컬렉션인 OrderItem까지도 join해서 쿼리 하나로 가져오는 거다. sql로 정말 flat하게 조회 해와야 한다 @Data public class OrderFlatDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private String itemName; private int orderPrice; private int count; } 저렇게 OrderItem의 내용들까지고 펼쳐놔서 flat하게 만들 것이다. 일단 그러면 가져오려면 public List findAllByDto_flat() { retur..

15. Dto 직접조회 컬렉션 최적화

지금은 컬렉션도 각각 Dto로 조회해오면서, batch가 안 먹히게 되었다. (정확히 등록된 엔티티를 조회해와야만 되는 듯 하다(fetch 한것 등)) 그래서 지금 컬렉션은 ToOne이 아니라서 row 뻥튀기를 일으키게 하지 않기 위해 따로 넣어줬다. 그래서 이렇게 OrderItem을 넣어줄 때마다 또 그 OrderItem을 조회해주는 쿼리가 n번 나가게 되었다. 이제는 저 OrderItem 조회하는 걸 쿼리를 한번만 나가게끔 만들 것이다. @GetMapping("/api/v5/orders") public List ordersV5(){ return orderQueryRepository.findAllByDto_optimization(); } public List findAllByDto_optimizatio..

14. 컬렉션 Dto로 직접 조회

화면에 fit한 데이터들 찾는 용도의 Repository는 따로 패키지및 클래스를 만든다. @GetMapping("/api/v4/orders") public List ordersV4(){ return orderQueryRepository.findOrderQueryDtos(); } public List findOrderQueryDtos() { List result = findOrders(); result.forEach((o)->{ List orderItems = findOrderItems(o.getOrderId()); o.setOrderItems(orderItems); }); return result; } 여러 메소드로 나눠서 조회했다. ToOne?과 ToMany는 따로 조회했다. 이유는 new 오퍼레이션..

서스펜스, 비동기 로딩

서스펜스란 어떤 컴포넌트가 읽어야 하는 데이터가 아직 준비가 되지 않았다고 리액트에게 알리는 방법. 리액트에서 비동기 데이터를 읽어 오는 것을 표준화. 이거 리액트에서 ~~비동기 이렇게 하라고 제공해 주는데 왜 안돼냐.. 여튼 로딩방법 const [success, setSuccess] = useState(false); const [data, setData] = useState([]); useEffect(()=>{ axios.get(~~~~) .then((res)=>{ return res.date }) .then((data)=>{ setData(data); setSuccess(true); }) },[]) return( { success?( { data.map((el)=>{ return {el.name} }..

React 2023.11.15

cors 정책

일단 node js에서는 const cors = require('cors'); app.use(cors()); 이렇게 라이브러리가 따로 있어서 전체적으로 설정해 줄 수 있음. use는 미들웨어라고 하는데, 프록시 같이 요청 오면 낚아채는 그런건가? 낚아서 한번 처리하고 라우터에 보내는. 근데 여기서, app.use(cors({origin:'http://localhost'})); 이런 식으로 허용할 주소를 정할 수 있나 봄. 또, 라우터 별로도, 원래 이거 헤더 설정으로 res.setHeader('Access-Control-Allow-origin', '*'); 이런 식으로 라우터 응답의 헤더에 설정하면 될 듯.

스프레드

배열이나 객체의 속성들을 펼쳐서 주는 것. 예를 들어 배열 하나를 ...arr 하면 내부의 값을 쫙 개개로 뿌려줌 객체도 가능함 const [dbData, setDbData] = useState({ _id:'', name:'', belong:'', phone:'', status:'' }); const changeHandler = (e)=>{ setDbData({ ...dbData, [e.target.name]:e.target.value }); } 이렇게가 가능. e.target은 input인데 name이 보통 db의 열이름이랑 맞추니까. 그게 관례니까. 배열도 가능

React 2023.11.15

트리거

트리거는 자동수행하는. 그러니까 특정 테이블에 insert, delete, update등이 작동할 때 자동으로 실행되게끔 할 수 있음. 일반적으로 after를 많이 씀. 정의는 스토어드 프로시저랑 비슷한데, call로 따로 호출할 수는 없음. 그래서 in, out 등의 매개변수도 불가. delimiter $$ create trigger myTrigger after delete on trigger_table for each row begin set @msg = '가수 그룹이 삭제됨'; end $$ delimiter ; 이렇게 스토어드 프로시저 정의 하듯, delimiter로 시작해서, create trigger 하면서 시작함. after delete는 delete 후에. on trigger_table이라는..

DB 2023.11.15