728x90

Backend 150

Contents-Type, Accept

둘 다 HTTP 헤더 요소 중 하나인데 각각 구분해서 설명하면 아래와 같다. Content-Type request, response 에 모두 지정할 수 있는 헤더로 전송하는 데이터 형식을 명시한다. HTTP 표준 스펙을 따르는 브라우저와 웹서버는 Content-Type 헤더를 기준으로 HTTP 메시지에 담긴 데이터를 분석해서 파싱한다. 만약 Content-Type 헤더를 지정하지 않는다면 특정한 형식의 데이터일지라도 데이터를 받는 입장에서는 단순히 텍스트 데이터(text/plain)로 받아들인다. Get 방식의 경우 url의 쿼리스트링만으로 데이터 형식을 파악할 수 있기 때문에 굳이 Content-Type 을 지정하지 않아도 되지만 PUT, POST 처럼 메시지를 body 에 넣어서 보낼때는 반드시 지정..

SpringBoot 정적자원

SpringBoot 사용 전에는 jsp, html 같은 정적자원들은 src/main/webapp 디렉토리 하위에 배치했었다. 이는 클래스패스에 해당하는 경로로 패키징시 정적자원을 참조하는 특수경로이다. 하지만 SpringBoot 공식 메뉴얼에 보면 아래와 같이 이 경로를 사용하지 말라고 안내하고 있다. src/main/webapp애플리케이션이 jar로 패키징 된 경우 디렉토리를 사용하지 마십시오 . 이 디렉토리는 공통 표준이지만 전쟁 패키징 에서만 작동 하며 jar를 생성하면 대부분의 빌드 도구에서 자동으로 무시됩니다. 출처: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-spring-mvc-stati..

Backend/Spring+Boot 2021.04.20

Tomcat appBase, docBase

로컬에서 Tomcat 을 구동하고 http://localhost:8080/ 로 접근했을 때 화면에 보여줄 자원(html 등) 을 찾는 기본적으로 경로는 Tomcat 설치 디렉토리 아래 있는 webapps/ROOT 디렉토리이고 이를 Document Root라고 부른다. 이에 대한 설정은 conf/server.xml 에서 확인할 수 있는데 아래와 같다. ... 태그 하위에는 태그가 포함될 수 있는데 위와 같이 생략되어 있다면 기본값은 ROOT 이기 때문에 Document Root 는 webapps/ROOT 가 된다. 즉, 이는 아래와 같다. ... 여기에서 appBase 는 Tomcat 에서 기본경로이고 docBase 는 Tomcat 안에서 내부적으로 나눠지는 경로이다. 도서관을 예로 들면 도서 위치가 ap..

Backend/Server 2021.04.20

SpringBoot 에러페이지 정의

SpringBoot 는 아무것도 하지 않더라도 아래와 같은 기본 에러페이지를 제공한다. 또한 view 자원 root 디렉토리에 error 디렉토리를 생성하고 그 하위에 에러상태코드에 해당하는 파일을 만들어 놓으면 각 에러 발생시 자동으로 해당 페이지가 연결된다. view자원의 root 디렉토리는 어떤 라이브러리를 사용하느냐에 따라 다르고 입맛에 맞게 얼마든지 커스텀이 가능한데 일반적인 경우을 살펴보면 아래와 같다. 기본 html: src/main/resources/public Thymeleaf: src/main/resources/templates jsp: src/main/webapp 즉, 각 라이브러리의 error 페이지는 아래 경로에 만들면 된다. 기본 html: src/main/resources/pu..

Backend/Spring+Boot 2021.04.19

Redis 커넥션 풀

SpringBoot 기반 Redis 예제를 서칭하다보면 application.yml 에 아래와 같이 구성정보를 설정하는 경우를 볼 수 있다. spring: redis: host: localhost port: 6379 lettuce: pool: max-active: 10 max-idle: 10 min-idle: 2 그런데 lettuce.pool 설정은 사실 의미없는 설정이다. Redis 자체는 싱글스레드 기반이기 때문에 여러 커넥션을 사용한다고 해도 성능이 좋아지지 않기 때문이다. 공식 문서를 보면 Redis 커넥션 풀링은 트랜잭션을 사용할때만 제한적으로 사용된다고 되어 있다. 참고 lettuce.io/core/release/reference/index.html#connection-pooling.is-co..

Backend/Redis 2021.04.15

Redis null 값 캐싱하지 않기

value 가 null 일 경우 굳이 캐싱할 필요가 없기 때문에 RedisCacheManager 선언시 아래와 같이 disableCachingNullValues() 를 포함하곤 한다. 그런데 실제로 @Cacheable 를 선언한 메소드에서 null을 리턴하는 순간 아래와 같은 에러를 마주할 수 있었다. Avoid storing null via '@Cacheable(unless="#result == null")' or configure RedisCache to allow 'null' via RedisCacheConfiguration. 결국 @Cacheable 어노테이션에 unless = "#result == null" 속성을 추가하라는 말인데 나는 분명 전역적으로 null 을 캐싱하지 않겠다고 했는데 왜 ..

Backend/Redis 2021.04.15

jackson 역직렬화 시 주의할 점

자바 진영에서는 json 직렬화/역직렬화시 거의 대부분 jackson 라이브러리를 사용한다. jackson은 json을 역직렬화시 생성자를 활용하고 모든 인자를 받는 생성자에 @ConstructorProperties 어노테이션이 달려있으면 해당 생성자를 역직렬화에 사용하지만 없을 경우 기본 생성자를 사용하게 된다. @ConstructorProperties 는 lombok을 이용해서 모든 인자를 받는 생성자를 생성하면 컴파일시 자동으로 붙여주던 것인데 @AllArgsConstructor, @Builder 를 사용하는 경우를 예로 들 수 있다. 그런데 lombok 1.16.20 이상부터는 이게 자동으로 붙지 않기 때문에 명시적으로 기본생성자를 생성해줘야 한다. 물론 기존처럼 자동으로 @ConstructorP..

Backend/Java 2021.04.14
728x90