software engineering/web 20

React.js + TypeScript 폼 필드에서 에러가 난다면? A component is changing a controlled input of type text to be uncontrolled. Input elements should not switch from controlled to uncontrolled

Form에서 에러가 난다. A component is changing a controlled input of type text to be uncontrolled. Input elements should not switch from controlled to uncontrolled 위 에러는 타입이 잘못 들어왔다는 뜻이다. 살펴보아야 하는 것들은 아래와 같다. 1. input에 다른 타입의 값을 넣고 있는지? String이 들어가야하는 자리에 undefined, Number 등의 타입이 들어가선 안된다. -> 변수를 undefined 대신 빈 문자열로 초기화하거나, value로 넘겨주는 시점에 널처리를 추가할 수 있다. var foo = useState(''); 2. Select, Suggest, Seach..

React.js 환경변수 사용하기 REACT_APP_

리액트 상에서 환경변수를 사용해서 프로파일을 구분하려고 할 때, 보통 .env.{환경이름} 파일을 이용해서 프로파일별로 다른 환경변수를 선언한다. 그런데, 환경변수를 추가하려는데 리액트 앱에서 계속 읽지 못하고 undefined가 뜬다. 왜일까? 알고보니 리액트에서 꺼내쓸 수 있는 환경변수는 prefix가 정해져있어서 'REACT_APP_'으로 시작하는 변수명으로 선언해야 한다.

Javascript ERR_UPLOAD_FILE_CHANGED 에러

파일을 첨부한 이후에 해당 파일에 변경사항이 생기면 서버에 전송하려고 할 때 ERR_UPLOAD_FILE_CHANGED 에러가 발생한다. 변경사항이 생긴다는 것은 첨부 시점 이후에 파일을 수정해서 저장한 경우를 뜻한다. 그리고, input 태그의 file type을 이용할 때, 파일을 한번 선택해놓고 다시 같은 파일을 선택하면 변경이 일어나지 않았다고 판단하여 파일을 새로 읽지 않는다. 이게 변경사항을 저장한 후 다시 파일을 첨부했을 때에도 계속 위 에러가 발생하는 이유다. 쉽게 해결하는 방법은 파일을 선택하려고 할 때, 이전에 선택된 값을 날려주면 된다. https://stackoverflow.com/questions/61916331/re-uploading-a-file-with-ajax-after-it..

JPA Inheritance Mapping 하나의 테이블을 여러 엔티티로 분리하기

테이블은 하나지만 특정 type컬럼에 따라 논리적으로는 성격이 나뉘는 경우가 있다. 예를 들자면 우리집 반려동물 테이블에 고양이와 강아지가 함께 들어있는데 강아지만 최근 산책 정보를 갖고 있는 경우이다. 이럴 때, 부모 엔티티를 두고 각 타입별로 자식 엔티티를 만들어 Inheritance Mapping을 지어줄 수 있다. 분류 기준이 되는 컬럼은 Discriminator Column으로 표시해주면 된다. 아래 예시는 TYPE이라는 컬럼이 분류 기준인 경우이다. 사용할 TYPE 값 중 하나는 A이다. @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="type") @DiscriminatorValue("A") https..

같은 클래스인데 왜 ClassCastException이 발생하는걸까? Redis Cache Manager가 DevTools와 만났을 때

캐싱 했더니 ClassCastException이 발생한다. java.lang.ClassCastException: com.example.demo.User cannot be cast to com.example.demo.User ?????????????? 이해할 수 없는 에러 메시지였다. 앞뒤가 똑같은 클래스구만 왜 캐스팅이 안된다는 건지 의문이었다. https://brunch.co.kr/@springboot/212 Spring Boot DevTools 클래스로더 이슈 - 스프링부트 관련 잡다한 기술 이야기 | "Spring Boot DevTools 클래스로더 이슈"라는 제목으로 글을 작성하였는데, 막상 글을 다 작성한 후 다시 읽어보니 너무 잡다한 내용이 되었다. 그래서, 이 글 brunch.co.kr 이 ..

Java의 File Path 상대경로

Path를 나타내는 방법에는 절대경로와 상대경로가 있다. 절대경로 : 시스템 루트 디렉터리에서부터 시작해 모든 경로를 표시한다. 상대경로 : 특정한 디렉터리(현재 디렉터리)를 기준으로 위치를 표시한다. 그렇다면, 자바(JVM)는 어디를 상대경로의 기준 디렉터리로 인식하는 걸까? System.getProperty("user.dir"); 시스템 프로퍼티를 읽어보면 바로 알 수 있다. intelliJ에서는 프로젝트 내부에 들어있는 파일들의 상대경로를 간단히 구해올 수 있다. 우클릭 -> Copy Path -> Copy Path... -> 4. Path from repository root

Spring 5.2, SpringBoot 2.2 Http Codec이 변경되었다.

안깨지던 에러 메시지가 갑자기 한글 인코딩이 깨져보이는 이슈. 찾아보니 SpringBoot 2.2 버전으로 업그레이드 되면서 디폴트 ContentType이 변경되었다. package org.springframework.http; public class MediaType extends MimeType implements Serializable { ... /** * Public constant media type for {@code application/json;charset=UTF-8}. * @deprecated Deprecated as of Spring Framework 5.2 in favor of {@link #APPLICATION_JSON} * since major browsers like Chrom..

Java Garbage Collection

더보기 https://d2.naver.com/helloworld/1329 Garbage Collection stop-the-world! GC 실행 중에는 애플리케이션이 멈춘다. GC를 실행하는 쓰레드를 제외한 나머지 모든 쓰레드가 작업을 멈춘다. 어떤 GC 알고리즘이라도 stop-the-world는 발생한다. GC 튜닝은 대개 이 stop-the-world 시간을 줄이는 것이다. 메모리를 명시적으로 해제할 때? 해당 객체를 null로 지정하기 System.gc() 호출하기 -> 절대 하지 말 것. 성능저하! 가비지 컬렉터의 두 가지 가설 - Weak Generational Hypothesis 1. 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다. 2. 오래된 객체에서 젊은 객체로의 ..

JPA EntityListener가 Bean을 주입 받지 못하는 이유

EntityListener는 JPA Entity에 변경사항이 발생할 때, 로깅 등의 전/후처리를 하기 위해서 사용한다. Entity 자체에 메서드를 선언할 수도 있고, 별도 클래스에 정의한 후 @EntityListeners 애너테이션의 인자로 전달하는 방법도 있다. 이 기능을 사용하다보면 전/후처리 시 Spring Bean을 사용하고 싶은 상황이 생기기도 한다. 하지만 EntityListener에 Repository Bean을 주입할 경우, 사용하려 할 때 NPE가 터지고 만다. 그렇다면 EntityListener는 POJO인걸까? 아니다. EntityListener를 대상으로 AOP를 걸어놓을 경우 정상적으로 동작한다. Spring Bean임에도 불구하고 Bean 주입은 불가능한 불가사의한 객체인 것이..