BackEnd18 [Spring] 스프링 예외처리 동작원리(feat. ControllerAdvice) 토비의 스프링을 읽다가... 스프링의 예외처리 방법 중 가장 대중적으로 많이 사용되는 ControllerAdvice의 동작원리를 한 번 알아보고 싶어서 정리해 본다. 1 2 3 4 5 6 7 8 @RestControllerAdvice public class ExceptionHandlerController { @ExceptionHandler(ExampleException.class) public ResponseEntity exception(ExampleException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } Colored by Color Scripter cs 개발 시 예외처리를 .. BackEnd/Spring 2024. 2. 25. [Error] class com.mysql.cj.jdbc.AbandonedConnectionCleanupThread 서비스 모니터링 중 heap 사용량이 많아 뭔가 이상함을 감지했다. 실제로 cpu 사용량은 20% 이하인데 heap 사용량은 40% 정도였다. 그래서 힙덤프를 뜨고 힙덤프를 분석해 보았다. 1. 사용 중인 서비스의 pid를 찾는다 ps -ef | grep java 혹은 jsp -v 명령어를 이용해 실행 중인 서비스의 pid를 찾는다. 2. heap dump를 뜬다 나는 jmap을 이용해서 heap dump를 떴다. jmap -dump:format=b,file=파일이름 pidId 3. 덤프를 분석한다. 스레드 덤프를 분석할 때는 fastThread를 사용했는데 힙덤프 분석할 때 사용하려니까 용량 초과 메시지가 떴다. 그래서 사용해 본 eclipse mat https://eclipse.dev/mat/down.. BackEnd/트러블슈팅 2023. 11. 14. [Java]@Transactionaleventlistener 다루기 문제 상황 실제 근무 중인 곳에서 발생한 문제입니다. 엔티티를 DB에 저장한 후 외부 api를 호출하는 메서드가 있습니다. 이 메서드는 트랜잭션으로 묶여있기 때문에 외부 api 호출 시 장애가 발생하면 DB 저장 작업까지 모두 RollBack이 되었습니다. 문제는 메서드가 호출되면 DB 저장은 필수로 이루어져야 하기 때문에 RollBack 현상이 발생하면 안 된다는 것입니다. @Transactionaleventlistener이란? 메서드를 트랜잭션을 묶어서 처리하는 경우 트랜잭션이 끝나는 시점에 호출하는 이벤트 리스너입니다. 예를 들어 회원가입 후 쿠폰을 발급하는 로직이 있다고 가정했을 때, 회원가입은 정상적으로 완료되었지만 쿠폰 발급이 실패한 경우 회원가입 처리까지 rollback 되는 현상이 발생하게.. BackEnd/Java 2023. 9. 15. [Java] Default Methods(디폴트 메소드) Default Method 란? 인터페이스는 기능에 대한 선언만 하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없다. 하지만 자바 8에서 이러한 규칙을 깨는 기능이 나왔다. 그것이 Default Method(디폴트 메소드)이다. 메소드 선언 시 default를 명시하게되면 인터페이스 내부에서도 로직이 포함된 메소드를 선언할 수 있다. ** 접근 제어자에서 사용하는 default와 키워드가 같다. 하지만 접근 제어자에선 아무 것도 명시하지 않아도 'default'라고하고, 인터페이스의 default method는 'default'라는 키워드를 명시해야 한다. 1 2 3 4 5 interface TestInterface { default void print() { System.out.println("H.. BackEnd/Java 2022. 10. 20. [Java] 싱글톤(Singleton)이란? 싱글톤 패턴이란? 객체의 인스턴스가 오직 1개만 생성되는 패턴 생성자가 여러번 호출되어도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최로에 생성한 객체를 리턴한다. 아래는 예시이다. 1 2 3 4 5 6 7 8 9 10 11 public class SingleTonEX{ private static SingleTonEx instance; //singleTonEx클래스를 static으로 선언하여 다른곳에서 사용할 수 있게 함 private SingleTonEx(){} //생성자를 외부에서 호출 못하게 private으로 생성 public static SingleTonEx getInstance(){ if(instance==null){ SingleTon = new SingleTonEx();.. BackEnd/Java 2022. 10. 10. [Spring] Spring Bean 이란? 스프링 빈(Spring Bean) 이란? Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 한다. IoC의 특징 일반적인 자바는 모든 작업을 사용자가 제어하는 구조이다. A 객체에서 B 객체에 있는 메소드를 사용하려면 A 객체 내에서 B 객체를 직접 생성하고 메소드를 호출한다. 즉, 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성/조작하는 작업을 한다. 하지만 IoC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡긴다. 이 때 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 된다. 즉 사용자의 제어권을 다른 주체에게 넘기는 것을 IoC(제어의 역전)라고 한다. 우리는 일반적으로 자바에서 Class를 생성하고 new를 입력.. BackEnd/Spring 2022. 10. 10. [Java] 메소드 레퍼런스란? 메소드 레퍼런스란? 람다식에서 불필요한 매개변수를 제거하여 사용할 수 있게 해주는 것 즉, 람다 표현식을 더 간력하게 만드는 표현방법이라고 할 수 있다. 메소드 레퍼런스를 이해하기 위해선 람다식을 이해해야 한다. 람다식 이해에 관한 글은 아래 링크에서 확인할 수 있다. https://grandma-coding.tistory.com/entry/Java-함수형-인터페이스란 [Java] 함수형 인터페이스란? 함수형 인터페이스란? 추상 메서드를 하나만 갖는 인터페이스 @FuncationInterface 어노테이션을 갖는 인터페이스 Single Abstract Method(SAM) 인터페이스 예시 1 2 3 public interface FunctionalInterface {.. grandma-coding.tis.. BackEnd/Java 2022. 10. 9. [Spring] @Transactional 제대로 알고 사용하기 트랜잭션이란? 비즈니스 로직에서 쪼갤 수 없는 하나의 작업 단위이다. 데이터베이스의 상태를 변경하며 한 번에 수행되어야 한다. begin, commit 을 자동으로 수행해주며, exception 발생 시 자동 rollback 처리해준다. 처리 방법 스프링에서 어노테이션 방식으로 메소드, 클래스, 인터페이스 위에 추가하여 사용한다. 이 방식을 선언적 트랜잭션이라고 부르며, 적용된 범위에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit / rollback 시켜준다. @Transactional 옵션 1. isolation 트랜잭션에서 일관성없는 데이터 허용 수준을 설정 2. propagation 트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 지정하는 옵션 3. noR.. BackEnd/Spring 2022. 10. 3. [Java] 함수형 인터페이스란? 함수형 인터페이스란? 추상 메서드를 하나만 갖는 인터페이스 @FuncationInterface 어노테이션을 갖는 인터페이스 Single Abstract Method(SAM) 인터페이스 예시 1 2 3 public interface FunctionalInterface { public abstract void doSomething(); } Colored by Color Scripter cs 함수형 인터페이스를 사용하는 이유 자바의 람다식을 사용할 때 함수형 인터페이스로만 접근이 가능하기 때문이다. @FuncationInterface 어노테이션을 붙여주면 함수형 인터페이스의 규칙을 위반했을 때 에러를 발생시킨다. 기존 방식 1 2 3 4 5 6 7 8 FunctionalInterface func = new F.. BackEnd/Java 2022. 10. 2. [JAVA] LinkedList의 개념 및 사용법 LinkedList란 ? 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료구조 풀어쓰자면 다음과 같다. 데이터를 담고 있는 노드들이 연결되어 있고, 노드의 포인터가 이전 노드와 다음 노드와의 연결을 담당한다. 중간에 데이터를 추가하거나 삭제해도 인덱스가 당겨지거나 밀리는 현상이 없다. 따라서 ArrayList에 비해 데이터 추가/삭제가 용이하지만 인덱스가 없기 때문에 탐색 속도가 느리다. 따라서 탐색 또는 정렬을 자주 하는 경우엔 배열을 사용하고 데이터의 추가/삭제가 많은 경우 연결리스트를 사용하는 것이 좋다. LinkedList 사용법 1. LinkedList 선언 1 2 3 4 5 LinkedList list = new LinkedList();//타입 미설정. Object로 선언.. BackEnd/Java 2022. 9. 7. [JAVA] for문 리팩토링하기(List) JAVA에서 반복문을 사용할 때 for문이나 for-each문을 사용한다. for문과 for-each문 중 어떤 것을 사용하는 것이 더 빠를까? 실제로 실험해본 결과 ArrayList, Array => for문 win LinkedList => for-each문 win 이라는 결과가 나왔다. 따라서 ArryaList/Array를 사용할 경우 for문을, LinkedList를 사용할 경우 for-each문을 사용하는 것이 속도 개선에 좋은 영향을 준다! 그런데 for-each문의 단점은 인덱스를 사용할 수 없다는 것이다. 인덱스가 꼭 필요하다면? 1 2 3 4 5 6 7 static void main(List list){ int i = 0; for(T s : list){ //개발자가 작성한 코드 i++; }.. BackEnd/Java 2022. 9. 4. [JAVA] 생성자 정리 필기로 정리한 내용을 포스팅하려고 한다. BackEnd/Java 2022. 9. 4. 이전 1 2 다음