전체 글

전체 글

    [TIL] 23/8/1 트랜잭션, JPA 쿼리 최적화, 시간대 관리: IN절, ZonedDateTime, DB에 들어가는 시간이 다를 때 해결 방법

    1. javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call : 트랜잭션을 사용해야 하는 DB 연산이 트랜잭션 없이 수행될 때 발생하는 에러다. 에러가 발생시킨 메서드, 즉 트랜잭션이 필요한 메서드에 @Transactional 어노테이션을 달아주면 해결된다. 2. 주문 완료 후 카트에 있는 아이템 삭제하는 기능을 구현하며 쿼리 성능에 대한 고민을 많이 했다.. 스트림에 map 함수는 입력을 받아서 그 입력을 다른 값으로 변환하는 역할을 한다. 반환값이 없는 void 타입이라면 ma..

    [TIL] 23/07/31 서버 시간을 UTC로 저장해야하는 이유와 방법 + 타임존

    코로나 재확진을 이기고 돌아온 TIL! 타임존 관련 표준 자바스크립트에서 타임존 다루기 (1) : NHN Cloud Meetup 자바스크립트에서 타임존 다루기(1) meetup.nhncloud.com Should servers have their timezone set to GMT/UTC? This may not be a big deal for smaller shops that only have one or a few site, but for larger organizations this is something I'm curious about. What are the pros and cons have having all/most of ... serverfault.com Are all of your adm..

    [TIL] 23/07/20 메뉴 조건에 따라 다르게 장바구니 save 실행 분기 처리 (saveAll, @Transactional)

    ❗️ 메뉴마다 옵션이 있을 수도 없을 수도 있다. 없는 경우에는 바로 cart 엔티티만 생성해서 insert 하면 되지만, 옵션이 있는 경우에는 cart와 그에 대응하는 cart_option을 저장하는 insert문이 n번 이상 실행돼야 한다. 한 개의 메뉴 (한 개의 카트)는 여러 개의 옵션을 가질 수 있다. 즉, 한 개의 카트와 n개의 옵션이 db에 모두 반영되던가, 전혀 반영되지 않아야 하는 원자성을 지녀야 한다. 기존 코드는 이러한 특성이 반영되지 않았기 때문에 CartController addItemToCart를 수정하고 CartService에 카트와 옵션을 함께 저장하는 메서드를 생성했다. Controller if (optionId == null) { cartService.createCart(..

    [TIL] 23/07/18 페이지 리로드 없이 HTML 폼 사용하여 서버로 데이터를 전송하고 응답 처리하기

    카트에 아이템 저장하기 1. html form이 submit 되면 값을 가지고 컨트롤러로 간다. 2. 사용자의 장바구니에 아이템을 넣은 후에 response entity를 리턴한다. message와 httpStatus는 결과에 따라 다르다. 성공하면 message: "item added" status: ok 실패하면 internal server error. 3. 리턴 받은 값을 가지고 다시 프론트에서 처리해준다. 만약에 받은 메세지가 item added라면, 아이템이 잘 담겼다는 팝업을 띄운 후에 현재 페이지에 머무르게 하고 만약 메시지가 item added와 같지 않다면, 팝업으로 에러메시지를 띄워준다. 브라우저는 form의 submit 버튼이 클릭되면 페이지를 새로고침하거나 새 페이지를 열도록 기본 ..

    [TIL] 23/07/17 장바구니 삭제 구현

    1. 장바구니 삭제 HTML form으로 delete 요청 보내기 spring.mvc.hiddenmethod.filter.enabled=true 2. 참조 무결성 제약 조건을 위해 cart_option -> cart 순서로 삭제하기

    멱등성 알아보기

    프로그래밍 용어 ‘멱등성(Idempotent)’ 알아보기 | 요즘IT ‘멱등(Idempotent)하다’는 생소한 표현이지만 알고 보면 쉽습니다. 컴퓨터 과학에서 멱등하다는 것은 첫 번째 수행을 한 뒤 여러 차례 적용해도 결과를 변경시키지 않는 작업 또는 기능의 속성을 yozm.wishket.com

    [TIL] 23/7/13 장바구니 리스트 쿼리문 성능 개선 고민

    장바구니 리스트 쿼리문 성능 개선 개선 전: 사용자의 아이디를 기준으로 카트에 담은 아이템의 리스트를 가져와야 한다. 먼저 직관적으로... 장바구니에서 보여줘야 할 정보를 담은 UserCartDTO를 만들었다. private int cartId; private int menuId; private String menuName; private int quantity; private Integer optionId; private String optionName; private Double optionPrice; 위 DTO를 프로젝션하는 쿼리문은 다음과 같이 작성했다. select c.cart_id, c.menu_id, m.menu_name_eng, c.quantity, co.option_id, o.option..

    [TIL] 23/7/12 JPQL DTO 프로젝션

    JPQL DTO 프로젝션 하는 법 DTO 프로젝션: 엔티티에서 원하는 필드만 선택하여 쿼리 결과로 반환하는 방법 DTO 클래스 작성: 원하는 필드를 가지고 있는 DTO 클래스를 작성한다. 해당 필드를 담는 생성자 및 Getter 메서드는 필수. JPQL 쿼리 작성: SELECT 절에서는 엔티티 대신 DTO 클래스의 생성자를 사용하여 원하는 필드에 값이 들어가도록 작성한다. FROM절에는 엔티티를 지정하기. @Query("SELECT new com.ohouse.ohouse.domain.UserCartDTO(" + "cart.cartId, cart.user.userId, cart.menu.menuId, cart.quantity, " + "co.cart.cartId, co.cartOptionId, co.opt..

    [TIL] 23/07/11 장바구니 담기 기능 구현 중

    1. 옵션이 있는 메뉴와 없는 메뉴가 있다. 옵션이 없는 경우에는 파라미터가 전달되지 않을 수 있으므로 이를 처리해야 한다. @RequestParam(value = "menuOption", required = false) @RequestParam에 required 파라미터를 false로 설정하면 된다. required가 false로 설정되면 해당 HTTP 요청 파라미터가 반드시 필요하지 않게 되어, 값이 없는 경우에도 에러가 발생하지 않는다. 또한 옵션은 한 개가 들어올 수도 있고 여러 개가 들어올 수 있다. 이 경우를 대비해 List로 optionId를 받았다. cart와 cartOption 객체를 저장하는 코드는 옵션이 한개 이상 들어올 경우에만 수행해야 한다. (옵션이 들어오지 않으면 카트 객체만 ..

    [TIL] 23/07/06 AWS 인스턴스 재부팅 후 502 에러, 대상 그룹 Unhealthy 해결

    문제: AWS EC2 인스턴스를 중지하고 다시 시작한 이후 502 에러가 발생했다. 재부팅 이전에는 로드밸런서를 포함하여 아무 문제 없이 잘 작동했는데 재부팅 이후로 사이트에 접속이 안되기 시작했다. 502 Bad Gateway 에러는 사용자의 요청이 뒷단의 서버까지 제대로 전달되지 않을 때 발생한다. 이를 확인하기 위해 로드밸런서 보안 그룹, IP 연결 등등을 확인했으나 이상이 없었다. 대상 그룹(Target Group)에 들어와 확인해 보니 80 포트가 Unhealthy 상태였다. 조건: 1. 로드밸런서에는 80포트, 8080포트가 등록 2. 대상 그룹에는 80포트만 등록 3. 실제 애플리케이션은 80포트에서 8080포트로 포트 포워딩을 진행하지 않은 상태. 원인: 로드밸런서에는 80포트와 8080포..