본문 바로가기

Spring

(28)
[Error] java equals 사용 시 NPE 해결하는 습관 isDeleted field에, "Y", "N", null 값만 들어올 수 있도록 지정했기 때문에, NPE가 생기는 것이 이상해서 debugging을 진행하였다. 문제는, isDeleted field의 값을 체크하는 것을 null부터 하지 않았던 것이였다. null일 경우에, 이미 앞에서 equals 메소드를 진행할 때 NPE가 나버리기 때문이다. 앞에서부터 차례로 조건을 확인한다는 것을 기억하자. 코딩테스트에서도 비슷한 경우가 있다. plain에 대한 bfs를 진행할 때, plain의 범위 안에 들어있는지 확인한 후 방문 여부를 확인한다(0
[ERROR] JSON parse error: Cannot deserialize value of type `java.time.LocalTime` from String [기본개념] deserialize : 역직렬화 - JSON을 Java 타입으로 변환하는 과정 [Jackson] spring-boot-starter-web dependency를 추가하면, 그 하위에 json객체를 파싱해주는 spring-boot-starter-json 라이브러리가 기본으로 탑재되어있다. 그 하위에는 jackson 라이브러리들 (jackson-datatype-jsr310 라이브러리 포함)이 존재한다. Jackson 라이브러리의 @JsonFormat 어노테이션을 활용해서, 해당 오류를 해결하면 된다. 1. RequestBody로 들어온 json을 파싱하기 컨트롤러에서는 @RequestBody를 통해 request 객체를 받는다 @PostMapping("/api/requested-store/re..
[Spring] AOP AOP 부가기능을 똑 떼어서, 재사용하기 위한 것이다. 인프라 로직 (부가기능) 애플리케이션의 전 영역에서 나타날 수 있다 중복 코드를 만들어 낼 가능성 - 유지보수 힘들어짐 비즈니스 로직과 함께 있으면, 비즈니스 로직을 이해하기 어려워진다 비즈니스 로직 위에 횡단으로(가로로) 같은 로직들이 위치해있기 때문에, 인프라 로직은 횡단 관심사라고도 불린다. AOP (Aspect Oriented Programming) 관점 지향 프로그래밍. 즉, 횡단 관심사에 따라 프로그래밍 한다고 생각하면 된다. 자바에서는 AspectJ 라는 구현체로 AOP가 구현되어있다. 부가기능을 똑 떼어서, 재사용하기 위한 것이다. 그럼, 1. 어떤 부가기능을, 2. 언제, 3. 어디에 사용해야할까? 1번과 2번 -> Advice로 정..
[Spring] 스프링으로 파일 업로드, 다운로드 구현하기 (3) - DB까지 사용하여, 실제로 파일 업로드와 다운로드 해보기 지금까지는 업로드에 대해서 알아보았다. 실제 DB에도 저장하지 않았다. 실제로 파일을 업로드, 다운로드 하기 위해서는, 파일의 내용을 저장하는 DB까지 필요하다. 이제, 실제 예시를 통해 파일 업로드와 파일 다운로드 방법을 알아보자. [개념] 파일 업로드란? 파일 업로드라는 것이 파일을 바이너리 데이터로 만들어서 DB에 넣어둔다는 뜻이 아니다. 비싼 저장장치인 DB를 이미지 저장소로 사용하지는 않는다. 우리는 DB에 파일의 정보(파일 이름, 파일이 서버에 저장되었을 때의 이름, 컨텐트 타입, 등록 날짜, 수정 날짜 등등)만을 저장할 것이다. 파일이라는 데이터 그 자체는, 서버에 올라가게 된다(현재는 작업을 로컬에서 진행하므로, 내 로컬 저장소(하드디스크)가 그 역할을 하게 된다) 정리하자면 파일 업로드란..
[Spring] 스프링으로 파일 업로드, 다운로드 구현하기 (1) - multipart/form-data란 무엇인가? 스프링은 HTML Form을 이용해 서버로 데이터를 전송하게 된다. HTML Form 전송방식에는 2가지가 있는데, 다음과 같다. application/x-www-form-urlencoded multipart/form-data 1번은 서버로 데이터를 전송하는 가장 기본적인 방법이다. Form으로 데이터를 전송할 때(post요청) 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 Header에 [ Content-Type: application/x-www-form-urlencoded ] 를 추가한다. 그 다음, Body에 폼에 입력한 전송 데이터를 문자로 username=kim&age=20 와 같이 &로 구분하여 전송하게 된다. 2번은 파일을 업로드 할 때 사용하는 방식이다. 파일은,..
[Spring] [SpringJDBC] insert시, key값 알아오기 keyholder를 사용하면, auto-generated된 key값을 가져올 수 있다. private NamedParameterJdbcTemplate jdbcTemplate; // 1. reservation_info 만들어서 insert // 이때, pk값 알아와야한다 public int insertReservationInfo(ReservationInfo reservationInfo){ Map params = new HashMap(); params.put("product_id", reservationInfo.getProductId()); params.put("display_info_id", reservationInfo.getDisplayInfoId()); params.put("user_id", reser..
[운영체제] 커널 스택이란 무엇인가? 너무 잘 정리되어있는 글이 있어서 링크만이라도 걸어둔다. 요약하자면, 메모리의 최상단 부분에 kernel space가 있는데, 해당 공간 내부에 프로세스 별로 커널 스택이라는 것이 나눠져서 존재한다는 것이다. https://blog.naver.com/lache96/140051813931 Linux Kernel Stack에 대한 오해 [root@XLRDev ~]# cat /proc/1/maps 00271000-00272000 r-xp 00271000 00:00 0 0052f000-0053f000 r-xp... blog.naver.com
[Spring] [ERROR] @RequiredArgsConstructor의 잘못된 사용으로 인한 NullPointerException 수정 전 코드 return insertActionWithReservationInfo.executeAndReturnKey(params).intValue(); 이 부분에서, insertActionWithReservationInfo가 np exception이 발생하였다. (디버깅으로 발견) 문제는, 생성자 주입을 사용하면서 @RequiredArgsConstructor를 사용한 것이였다. NamedParameterJdbcTemplate jdbc, SimpleJdbcInsertOperations insertActionWithReservationInfo 와 같은 객체들이 빈으로 등록되어있는 상황이 아닌데 @RequiredArgsConstructor를 사용하였기 때문에, np exception이 발생하였다. @Rep..
[Spring] [ERROR] ... ;nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'kr.or.connect.security.dao.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Depend.. [에러내용] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customUserDe..
[Spring] [Spring JDBC] RowMapper와 @NoArgsConstructor, @Setter spring JDBC를 사용하면, rowMapper를 통해서 select한 값을 dto로 변환한다. 이때, 기본 생성자가 반드시 있어야 하므로, @NoArgsConstructor를 붙여주자. (@Builder나, @AllArgsConstructor를 사용하면, 기본 생성자가 안생기므로 그때 반드시 @NoArgsConstructor를 붙여야 한다!) 추가로, Setter 또한 반드시 있어야 한다. 이걸로 진짜 엄청 고생했으므로, @Setter를 붙이자. (빌더 패턴을 사용한다고 엔티티 클래스에는 setter를 안붙였는데, spring-jdbc를 사용하는 이상 setter를 붙여야 한다)