기존에 사용하던 방식은 다음과 같았다. 아무런 문제가 생기지 않아 그냥 한번 잘 만들어두고 잘 복사해서 쓰고 있었는데 이번에 Bootstrap의 modal을 이용하면서 아래와 같은 형태로 사용하면서 에러가 발생했다. th:onclick="|retrievePackageData('${orderItem.trackingNumber}');|" 에러의 내용은 다음과 같다. Caused by: org.attoparser.ParseException: Only variable expressions returning numbers or booleans are allowed in this context, any other datatypes are not trusted in the context of this expressi..
상황은 다음과 같았다. 유저는 상품을 등록할 수 있고 상품은 메인 옵션, 세부 옵션, 가격, 재고라는 한 요소와 공통적인 상품명, 설명, 사진 등을 가진다. 옵션에 관련된 요소는 여러개를 등록할 수 있다. 이 상품을 한번의 요청으로 보낼 수 있어야 한다. 문제는 옵션을 등록하지 않는 경우에 대한 form을 미리 만들어 두었고 같은 페이지를 사용하지만 해당 form을 이용하는 것이 아닌 새로운 방법을 통해 값을 보내고자 하였다. 프론트 먼저 유저가 상품에 대해 등록하면 바로 확인할 수 있게 보여주고자 하였다. 이전에는 createElement라는 방법을 사용했는데 더 찾아보니 cloneNode(true)라는 아주 훌륭한 방법이 있었다. 미리 원본을 만들어두고 그 원본을 복사해서 사용하는 방식이다. 원본은 ..
이 4개는 매일 사용하면서도 매일 헷갈린다. 내용 정리를 확실하게 해놔야 할 필요성을 느껴 정리한다. @RequestBody HTTP 요청으로 넘어오는 body의 내용을 HttpMessageConverter를 통해 Java Object로 역직렬화한다. multipart 요청이 아닌, 즉 어떤 바이너리 파일을 포함하고 있지 않은 데이터를 받는 역할을 한다. HttpMessageConverter란? 간단하게 HTTP 요청과 응답에 대해서 "전략 패턴"을 사용해서 converting 해주는 역할. 전략 패턴은 하나의 메서드가 여러 가지의 대응 방법을 미리 준비해두고 필요한 상황마다 대응 방법을 달리 하는 방법을 말한다. RequestBody는 HTTP 요청으로 같이 넘어오는 Header의 Content-typ..
예를 들어 회원가입을 할 때 유저는 핸드폰 번호를 입력하고 그 핸드폰 번호가 중복이 있는지 요청을 보내고 그에 따라서 검증을 거친 다음 유저에게 정보를 알려줘야 한다. (물론 실무에서는 당연히 외부 API를 이용한 검증을 할 것이므로 핸드폰 번호를 이런 식으로 하진 않을 것이다) 이때 본인이 만든 핸드폰 번호는 Embeddable를 객체로 만들어두어 JPA에서 바로 접근하려고 하면 Embeddable은 객체이고 받아온 값은 데이터라 타입이 맞지 않는 문제가 생겼다. User 객체에 속한 핸드폰 번호 객체. @Embeddable @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString public class PhoneNumber { @Not..
예외 처리는 한 가지 포맷을 통해서 처리하는 것이 가장 좋다. 그리고 그 포맷은 ExceptionHandler와 ControllerAdvice를 이용해서 미리 정해진 ErrorMessage 포맷을 이용한 JSON 데이터로 처리하는 것이 가장 보편적이다. 하지만 혼자서 프로젝트를 진행하여 뷰나 리액트에 깊이가 있지 않으면 렌더링을 위해서 타임리프같은 템플릿 엔진을 사용할 수 밖에 없었기때문에 전체 프로젝트에서 군데군데 타임리프로 예외처리를 하는 일이 발생했다. 단순한 Validation 체크라면 Controller에서 BindingResult를 통해 바로 되돌려 보내면 되지만 Service layer에서 발생하는 비즈니스 로직에 의한 예외 처리가 항상 헷갈렸다. 정확히는 타임리프는 던져지는 예외에 대해서 ..
Entity를 생성할때 @Embbeded를 통해서 코드를 생성하는 경우가 빈번한데 Embeddable로 선언된 Class 내에 있는 모든 값이 전부 null일 경우에 Class 자체가 null이 되어버려서 해당 클래스를 사용하려고 할때 NullPointerException이 발생해버린다. 일단 문제를 해결하기 전에 ORM의 기본 스펙이 Embeddable은 null이 되어서는 안 된다는 것이다. 만약 원칙을 반드시 지키면서 하고자 한다면 설계를 다시 확인해보는 것이 좋을 것같다. 해결 방법 해결 방법은 크게 2가지가 있다. 절대 null일 수가 없는 값을 미리 만들어 넣는 방법 예를 들어 생성되는 날짜가 Embeddable 내에 반드시 포함되게 하여 최소한 값 하나는 null이 되지 않도록 하는 방법을 ..
본인이 옵션을 구현한 방식은 사용자가 직접 옵션을 key-value 형태로 저장 할 수 있고 그 key-value 형태에 따라 서버에 적절히 저장되며 이후에 HTML에서도 dynamic하게 출력될 수 있게 하였다. 프론트에서 서버로 유저가 직접 옵션과 세부 옵션을 추가해서 선택할 수 있게 옵션을 입력하는 input과 그 input을 보여주는 컨테이너를 만들었다. 옵션 추가 사용자가 옵션을 넣고 입력하면 입력값을 적절하게 가공해야한다. 일단 특수문자가 들어올 수 없게 특수문자를 처리해주고 trim해준다. 이후에 "옵션-세부옵션 (삭제버튼)"의 형태로 사용자에게 보여주기 위해 HTML을 적절히 조합해서 사용자가 입력한 옵션의 형태를 볼 수 있게 하였다. 이때 약간 야매스러운 방법을 사용했는데 옵션을 삭제할 ..
*************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context form a cycle: pagingApiController defined in file ┌─────┐ | qnaService defined in file ↑ ↓ | sellerService defined in file └─────┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your a..
- Total
- Today
- Yesterday
- 레디스
- JavaScript
- 아키텍처
- RequestParam
- IDE
- ModelAttribute
- RequestBody
- 배포
- lunarvim
- 루나빔
- 도커
- Dap
- RequestPart
- vim
- neovim
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |