Programming
Spring Logging (2) : Console Log? AWS CloudWatch? 실행환경별로 로그 남기기
Spring Logging (2) : Console Log? AWS CloudWatch? 실행환경별로 로그 남기기
2021.10.31이전 포스팅에서 HTTP별로 Trace Id를 부여하고, 각 HTTP 요청과 응답에 대해 콘솔 로그를 출력하는 부분을 다뤘다. 이번 포스팅에서는 Spring Active Profile에 따라 콘솔로그를 출력할지, AWS CloudWatch로 로그를 전송할 지 설정하는 부분을 안내한다. 만약 Active Profile이 dev, prod라면 AWS의 CloudWatch로 보내고, 그 외의 경우 콘솔로그를 출력하도록 한다. (AWS IAM 사용자에게 CloudWatch 정책 권한을 넣어두자.) build.gradle 의존성 추가 dependencies { ... implementation 'ca.pjer:logback-awslogs-appender:1.4.0' //logback to aws cloudwatc..
Spring Logging (1) : HTTP Request/Response 로그 남기기
Spring Logging (1) : HTTP Request/Response 로그 남기기
2021.10.29서비스를 운영하면서 서버가 받는 HTTP 요청과 서버가 제공하는 응답을 로그로 남긴다면, 추후 무슨 일이 생겼을 때 추적이 용이하다. 이번 포스팅은 Spring Boot을 사용하여 로그 남기기 시리즈 중 첫번째 포스팅이다 🥳 본 포스팅에서는 Spring Boot을 사용하여 HTTP 요청과 응답에 대한 로그를 남기고, 이 로그를 추적하기 용이하게 HTTP 요청당 Trace Id를 부여하겠다. 다음 포스팅에서 실행중인 프로파일(dev, prod 등)에 따라 콘솔에 로그를 출력할지, 혹은 AWS CloudWatch에 로그를 전송할지 설정하는 예제까지 다룬다. 작업 결과 미리보기 맨 아래 두 줄의 로그를 잘 봐보자. HTTP Request와 Response에 대한 로그를 출력하고 있다. 그리고 하나의 HTTP ..
Filter, Interceptor, AOP의 간단 용도
Filter, Interceptor, AOP의 간단 용도
2021.10.23Filter Spring이 아닌 톰캣과 같은 웹 컨테이너의 영역 ex) HTTP 또한 Spring이 아닌 WAS에서 처리하는 것이니까 HTTP Request/Response에 대한 로깅은 Filter에서 처리하는 게 적절 Interceptor Spring이 제공하는 레이어로, DistpatcherServlet 이 호출되기 전, 호출된 후에 끼어들기 때문에 Spring Context 내부에서 요청과 응답을 가공할 수 있음 ex) Spring Security, 인증 처리를 하는 것이 적절 AOP Spring 내에서 흩뿌려진 반복적인 코드를 한 곳에 모아서 응집력있게 관리할 수 있어 유지보수에 효울적이고, 좀 더 비즈니스 로직에 집중할 수 있으며, 변화 수용에 용이함 ex) 인가, 로깅 등 비즈니스 로직 전/..
[책] Learning PHP 챕터 7~10 요약
[책] Learning PHP 챕터 7~10 요약
2021.07.047. 사용자와 정보 주고받기: 웹 폼 제작 서버 변수 자동 전역변수인 $_SERVER에는 PHP_SELF, REQUEST_METHOD처럼 웹 서버와 현재 요청에 대한 정보를 제공하는 유용한 원소가 많음 PHP_SELF : 현재 요청한 URL의 일부 경로명 REQUEST_METHOD : 브라우저가 어떤 HTTP 메서드로 요청했는 지 QUERY_STRING : 전체 URL에서 ? 이후 쿼리스트링 PATH_INFO SERVER_NAME : 도메인명 DOCUMENT_ROOT : 웹사이트 문서가 위치한 웹수 서버 컴퓨터의 디렉토리 REMOTE_ADDR : 웹 서버로 요청한 클라이언트의 IP REMOTE_HOST : 웹 서버로 요청한 클라이언트의 IP를 호스트명으로 전환한 값. 하지만 웹 서버가 이 전환 작업을 수..
[책] Learning PHP 챕터 4~6 요약
[책] Learning PHP 챕터 4~6 요약
2021.06.304. 데이터 집합: 배열 다루기 배열 선언 및 할당 배열 : key와 value로 구성, key는 스칼라 값만 가능 배열 선언 : $vegetables = array('corn'=>'노랑', 'beet'=>'빨강') 혹은 단축 배열(php 5.4+)로 표현 $vegetables = ['corn'=>'노랑', 'beet'=>'빨강'], $vegetables['corn'] = '노랑'; 배열 재할당 : 배열에 스칼라값 할당 시 배열변수는 스칼라변수로 변경된다. 스칼라 변수를 다시 배열 변수로 덮어씌우려면 array() 구문을 써야함. $스칼라변수['key'] = value 는 php 엔진 경고만 발생시키고 기존 스칼라값으로 유지된다. (배열 안먹음) => 이건 아마.. 배열 변수는 배열 클래스(?)를 상속한..
[책] Learning PHP 챕터 1~3 요약
[책] Learning PHP 챕터 1~3 요약
2021.06.29최근에 이직한 회사에서 운영중인 메인 서비스가 PHP로 되어있다. 입사 전에 OReilly에서 출판한 책 Learning PHP을 도서관에서 대여해서 가볍게 훑었다. 기존에 알고 있었던 언어들과 차이점, PHP만의 특징과 복기해야할(?)만한 것들 위주로 정리했다. 1. 오리엔테이션과 첫걸음 함수의 대소문자 구별이 없으나 변수는 대소문자 구분 있 Here Document(Here 문서) 를 사용할 수 있으나, 이를 인식하지 못하는 서버가 있을 수 있으므로 축약 지양
Spring JSR 380 Validation 적용과 테스트 코드 작성
Spring JSR 380 Validation 적용과 테스트 코드 작성
2020.11.01유효성(Validation)을 체크하는 Java bean인 JSR 380(또는 Bean Validation 2.0)에 대해 간단히 알아보겠다. Java 8 버전 이상의 버전이 요구되며, 필요한 의존성을 추가해야한다. (의존성에 대해서는 추천자료를 참고하길 바람) Java 8 버전 이상의 버전이 요구되며, Spring boot 2.3 이후부터는 validation 의존성을 추가해야한다. org.springframework.boot spring-boot-starter-validation or implementation 'org.springframework.boot:spring-boot-starter-validation' 유효성 체크 정의 유효성 체크를 하고 싶은 DTO에 검증 어노테이션와 관련 메시지를 정의..
[React] useEffect 내 무한루프 원인 (Error Maximum Update depth exceeded)
[React] useEffect 내 무한루프 원인 (Error Maximum Update depth exceeded)
2020.09.19배경 김뉴비는 사내 관리자페이지를 React, Redux-saga로 만들기로 했다. 천천히 학습시간을 갖고 개발하면 좋았겠지만, 시간이 부족해 개발부터하고 버그를 수정하며 React를 알아가는 중이다. 원하던 기능 DB에서 type별로 최신 컨텐츠 목록을 조회해서 store에 담는 것 (아래 코드는 예제를 위해 변형한 것입니다.) const ContentListContainer = () => { const type = 'help'; const dispatch = useDispatch(); const {list, error, loading} = useSelector((contentList) => ({ list: contentList.list, error: contentList.error, })); useE..
Jackson Property - Custom PropertyNamingStrategy 적용
Jackson Property - Custom PropertyNamingStrategy 적용
2020.07.16Jackson에서는 필드명을 직렬화/역직렬화하는 네이밍 전략(PropertyNamingStrategy)을 제공한다. 기본적으로는 카멜 케이스를 제공하고 있으며, 전역적으로 네이밍 전략을 변경하거나 혹은 특정 클래스(DTO)에만 전략을 설정할 수도 있다. 다만, 내가 원하는 '대문자_스네이크_케이스' 전략이 지원 대상이 아니어서 커스텀이 필요한 상황이었다. Camel Case(카멜 케이스) : camelCase Snake Case(스네이크 케이스) : snake_case 내가 원하는 대문자 스네이크 : SNAKE_CASE Jackson이 지원해주는 네이밍 전략은 아래와 같다. PropertyNameingStrategy 클래스에 대한 공식 문서를 살펴보면 자세한 정보를 얻을 수 있다 (일부 네이밍 전략은 S..
Springboot EhCache 3 - 환경설정부터 self-invocation 처리까지
Springboot EhCache 3 - 환경설정부터 self-invocation 처리까지
2020.07.12Ehcache 3 버전을 Spring Boot에 적용해보겠다. Ehcache 3 버전부터는 JSR-107 cache manager를 구현했다고 한다. 참고로 Spring 4.1버전부터 JSR-107 annotations을 강력하게 지원해주기 시작했다. EhCache 2.x 버전과 3.x 버전의 환경설정 포맷 및 사용방법이 조금 달라졌다. 다들 사용중인 버전에 맞추어 환경설정하기를 바란다. (tti, ttl, expiry 등 캐시 유지기간에 대한 속성을 적용하려면 버전과 환경설정이 일치해야한다.) 다음과 같은 목차로 포스팅을 구성하였다. Ehcache 적용하기 의존성 등록 Spring cache management 활성화(@EnableCache) Ehcache 캐시 설정 캐시 적용 (내부에서 호출되는 경우..
Java 단일 요소의 배열 Collections.singletonList vs Arrays.asList
Java 단일 요소의 배열 Collections.singletonList vs Arrays.asList
2020.07.06나의 개발 친구 intelliJ가 친절하게 알려주었다. 단일 요소의 배열에는 asList() 대신 singletonList()를 사용해달라고. intelliJ가 괘 이러한 가이드를 주었는지 IntelliJ의 설명을 읽어 보자. [요약] 메모리 절약을 위해서 요소가 없거나(empty) 하나인 경우에는 Collections.emptyList() 또는 Collections.singletonList()를 사용해라. Arrays.asList()는 배열의 요소가 한 개여도 Collections.singletonList()보다 사이즈가 크다는 것을 추측해볼 수 있다. 각 메소드에 대해 자세히 알아보자. Collections.singletonList() 변경여부 : immutable (불변) 사이즈 : size가 1로..
Springboot 개인정보 암복호화 저장 (4) 암복호화 시점과 주체 선정 - JPA AttributeConverter
Springboot 개인정보 암복호화 저장 (4) 암복호화 시점과 주체 선정 - JPA AttributeConverter
2020.07.01개인정보 암복호화 시점과 주체에 대해 어떤 고민을 하였는 지 공유하겠다. 다른 방법들도 많겠으나 나는 세 가지 후보에 대해서 고려하였고, JPA AttributeConverter를 사용하기로 결정했다. 이를 어떻게 적용하였는 지 간단히 코드를 공개하겠다. JPA AttributeConverter filter를 이용해 view controller 시점에 변경 서비스 단에서 암복호화 함수 사용 암복호화 시점/주체 별 고려사항 1. JPA AttributeConverter JPA에서 제공해주는 속성 변환기로, 아래 그림과 같이 Java Entity와 DB 사이에서 동작한다. 암복호화 기능 외에도 대소문자 처리나 포맷 변경을 위해서 사용하기도 한다. 장점 암복호화 대상이 Entity 클래스에 명확하게 드러나기 ..