전체 글 82

Springboot Slack으로 알림 받기

시작하며 Error 또는 중요한 배치 시 알람을 받을 방법으로 회사에서 사용하는 Slack을 접목시켰다. 링크 : https://github.com/seungsoos/slack-demo Slack 의존성 추가 및 yml 설정 implementation("com.slack.api:bolt:1.18.0") implementation("com.slack.api:bolt-servlet:1.18.0") implementation("com.slack.api:bolt-jetty:1.18.0") 구글링을 통해 방법을 찾고, 해당 토큰을 입력한다. 코드내용은 아래와 같다. @Slf4j @Component @RequiredArgsConstructor public class SlackComponentImpl implemen..

Backend/Spring 2023.09.11

AWS WAF(403 Fobidden)

시작하며 프로젝트 개발 테스트시 발생된 에러와 대처방법을 기록하였다. 인프라 영역을 누군가가 조작하고, 정보교환이 되지않아 발생하였다. 프로젝트에서 서버와 서버간의 통신을 할때 RestTemple을 사용하였다. 서버간의 통신구간에 try-catch문으로 예외처리를 한 부분에서 발생된 에러이다. 로그상 403 Forbidden이 발생하였고, 해당 403 에러의 경우 접근권한과 맞지 않는 접근 요청이 왔을 경우 발생하는 에러라고한다. 해당 부분은 대량의 트래픽이 서버로 전송되는 부분이였고, 관련되어 이전에 상용 서버에서 비슷한 경험이 있었다. 이전 경험을 토대로 수정하려했지만, AWS를 잘 몰라 이거 저거 만지고 찾아보며 삽질하며 해결한 방법이다. AWS의 WAF & Shield 설정으로 이동 좌측 메뉴의 ..

Cloud/AWS 2023.08.26

[ERROR] ClientAbortException

시작하며서버로그중 가끔씩 ClientAbortException가 보인다. Response body : {"code":"400","msg":"Insufficient parameters.","data":"I/O error while reading input message; nested exception is org.apache.catalina.connector.ClientAbortException: java.io.EOFException"} 발생원인 : 클라이언트가 연결을 끊었을때 발생하는것이 일반적이다.서버가 클리이언트로 응답을 보내려하지만, 클라이언트의 연결이 이미끊어진경우 발생한다. 해당 에러는 클라이언트 단에서 발생하였다. 해당 에러는 Filter에서 Handling설정을 하였다. 참고사이트 https..

Backend/Spring 2023.08.10

데이터베이스(DB) index

시작하며 Index 정리 및 예시를 통해 학습한 내용을 정리하였다. 인덱스란? - 인덱스는 데이터베이스 테이블에 대한 검색 성능 속도를 향상시켜주는 자료 구조이다. 인덱스는 특정 컬럼(여러컬럼의 조합)에 대한 정렬된 값의 집합으로, 데이터베이스 엔진이 데이터를 빠르게 찾을수 있도록 도와준다. Ex) 책의 목차라고 생각하면 이해가 쉽다. 책의 목차에서는 내가 찾고자 하는 페이지가 어디 있는지 빠르게 찾을 수 있도록 해준다. 인덱스는 데이터베이스 테이블의 특정 컬럼(여러 컬럼)의 값을 사전 순서 또는 정렬 순서로 저장하여 데이터 접근과 검색을 최적화한다. 일반적으로 B-트리(B-tree)나 해시 테이블 등의 자료구조를 사용하여 인덱스를 관리한다. 실생활에서의 인덱스 사용예제) 인덱스의 자료구조 해시 테이블..

Backend/DB 2023.07.30

[Chap 6] 스트림으로 데이터 수집

6.1 컬렉터란 무엇인가? Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. 6.1.1 고급 리듀싱 기능을 수행하는 컬렉터 collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의 할 수 있다는 점이 컬렉터의 최대 강점이다. 구체적으로 설명해서 스트림에 collect를 호출하면 스트림의 요소에 리듀싱 연산이 수행된다. Collectors 유틸리티 클래스는 자주사용하는 컬렉터 인스턴스를 손쉽게 생성 할 수 있는 정적 팩토리 메서드를 제공한다. Ex) 가장 많이 사용하는 직관적인 정적 메서드로 collect(Collectors.toList); 6.1.2 미리 정의된 컬렉터 미리 정의된 컬렉터는 groupingBy 같이 Collectors 클래스에서 제공하는 ..

[Chap 5] 스트림 활용

5.1 필터링 5.1.1 프레디케이트로 필터링 스트림 인터페이스는 filter 메서드를 지원한다. filter 메서드는 프레디케이트를 인수로 받아서 프레디케이트와 일치하는 모든 요소를 포함하는 스트림을 반환한다. /** * 5.1.1 프레디케이트로 필터링 */ List menu = new ArrayList(); List vegetarianMenu = menu.stream() .filter(Dish::isVegetarian) // 채식 요리인지 확인하는 메서드참조 .collect(Collectors.toList()); 5.2 스트림 슬라이싱 5.2.1 프레디케이트를 이용한 슬라이싱 TAKEWHILE 활용 List specialMenu = Arrays.asList( new Dish("seasonal frui..

[Chap 4]스트림 소개

4.1 스트림이란 무엇인가? 스트림은 자바 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리 할 수 있다. 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리 할 수 있다. Ex) 기존 자바 7 코드 /** * 기존 자바 7코드 */ List lowCaloricDishes = new ArrayList(); List menu = new ArrayList(); for (Dish dish : menu) { if (dish.getCalories() < 400) { lowCaloricDishes.add(dish); } } Collections.sort(lowCaloricDishes, new Comparator() { // 익명 클래스 사용 @Ove..

[Chap 3]람다 표현식

3.1 람다란 무엇인가? 람다 표현식은 메서드로 전달 할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생 할 수 있는 예외 리스트는 가질 수 있다. 다음은 람다의 특징이다. 1. 익명 - 보통의 메서드와 달리 이림이 없으므로 익명이라 표현한다. 2. 함수 - 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식 ,가능한 예외 리스트를 포함한다. 3. 전달 - 람다 표현식을 메서드 인수로 전달하거나 변수로 저장 할 수 있다. 4. 간결성 - 익명 클래스처럼 많은 코드를 구현 할 필요가 없다. 람다표현식을 사용시 간결한 방식으로 코드를 전달 할 수있다. 람다가 ..