분류 전체보기95 [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. [토비의 스프링] 4장. 예외 1. 예외를 잡아서 아무런 조치를 취하지 않거나 의미 없는 throws 선언을 남발하는 것은 위험하다.2. 복구할 수 없는 예외는 가능한 빨리 런타임 예외로 전환하는 것이 바람직하다.3. 스프링은 DataAccessException을 통해 DB에 독립적으로 적용 가능한 추상화된 런타임 예외 계층을 제공한다.4. 스프링은 JdbcTemplate안에서 DB별로 미리 준비된 에러 코드를 비교해서 적절한 예외를 던져준다. DB가 변경되어도 에러를 매핑하여 에러를 던져준다. 스프링에서 예외처리를 하는 다양한 방법과 지양/지향해야 하는 방향을 알려준다. 스프링의 예외처리 동작원리를 추가적으로 정리해야겠다. Study/Spring 2024. 2. 24. [토비의 스프링] 3장. 템플릿 예외처리, 디자인 패턴&DI 등을 적용해서 깔끔한 코드를 만드는 방법 등을 소개하고 있다. 템플릿/콜백 부분은 좀 어려웠다. 템플릿/콜백 부분은 대충 넘어가서 정리할 게 별로 없음.. 1. 같은 애플리케이션 안에서 여러 가지 종류의 전략을 다이내믹하게 구성하고 사용해야 한다면 컨텍스트를 이용하는 클라이언트 메소드에서 직접 전략을 정의하고 제공하게 만든다. 2. 단일 전략 메소드를 갖는 전략 패턴이면서 익명 내부 클래스를 사용해서 매번 전략을 새로 만들어 사용하고, 컨텍스트 호출과 동시에 전략 DI를 수행하는 방식을 템플릿/콜백 패턴이라고 한다. Study/Spring 2024. 2. 24. [토비의 스프링] 2장. 테스트 1. 모든 테스트는 실행 순서에 상관없이 독립적으로 항상 동일한 결과를 낼 수 있도록 해야 한다. 2. 성공하는 테스트만 골라서 만들지 말자. 3. JUnit이 테스트를 수행하는 방식 테스트 클래스에서 @Test가 붙은 public이고 void형이며 파라미터가 없는 테스트 메소드를 모두 찾는다. 테스트 클래스의 오브젝트를 하나 만든다. @Before가 붙은 메소드가 있으면 실행한다. @Test가 붙은 메소드를 하나 호출하고 테스트 결과를 저장해 둔다. @After가 붙은 메소드가 있으면 실행한다. 나머지 테스트 메소드에 대해 2~5번을 반복한다. 모든 테스트의 결과를 종합해서 돌려준다. 4. 픽스처 : 테스트를 수행하는 데 필요한 정보나 오브젝트(@Before 메소드에 정의하는 내용들) 5. @Runwi.. Study/Spring 2024. 2. 24. [토비의 스프링] 1장. 오브젝트와 의존관계 토비의 스프링 1장을 보면서 기억해야 할 핵심 용어, 개인적으로 궁금했던 점들을 찾아 정리해 보았다. (지극히 개인 학습용 자료라서 나만 알아볼 수 있게, 내가 기록하고 싶은 부분만 정리했다)용어 정리제어의 역전: 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조. 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 또 자신이 어떻게 만들어지고 어디서 사용되는지 알 수 없다. ex) 디자인 패턴, 프레임워크빈(Bean): 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트. 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해 주는 제어의 역전이 적용된 오브젝트스프링 컨테이너(Spring Container) : 스프링 빈의 생명주기를 관리하고 IoC를 이용해 애플리케이션 컴포넌트를 관.. Study/Spring 2024. 2. 12. [오브젝트] 2장 객체지향 프로그래밍 개인 학습용 글입니다. 객체지향 프로그래밍의 조건 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지를 고민하라. 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 보라. 객체는 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재다. 객체를 협력하는 공동체의 일원으로 보는 것은 설계를 유연하고 확장 가능하게 만든다. 클래스를 구현하거나 다른 개발자에 의해 개발된 클래스를 사용할 때 가장 중요한 것은 클래스의 경계를 구분 짓는 것이다. 클래스의 내부와 외부를 구분해야 하는 이유 : 경계의 명확성이 객체의 자율성을 보장한다. 프로그래머에게 구현의 자유를 제공한다. 객체 내부에 대한 접근을 통제하는 이유 : 객체를 자율적 존재로 만들기 위함. 객체가 자율적인 .. Study/객체지향 2023. 11. 14. [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. [오브젝트] 1장 객체, 설계 개인 학습용 글입니다. 객체지향적 설계 예시를 위해 절차지향적 코드를 객체지향적 코드로 변경하는 과정을 보여줌. 영화 티켓 판매 프로세스를 모델링함. 1장은 객체지향을 가볍게 훑고 객체지향의 중요성을 강조하기 위해 만들어진 것으로 보임. 많은 정보를 담았다기보다 이 책에서 강조하는 포인트를 독자에게 전달하기 위한 빌드업을 하는 것으로 보였음. 중요 내용 1. 객체지향 설계를 해야 하는 이유 변경에 유연하게 대응 가능하다 버그 발생률이 낮아진다(결합도가 낮기 때문) 이해하기 쉬운 코드를 만들 수 있다 2. 능동적인 객체를 만들어라 수동적인 객체를 만드는 경우 절차지향적으로 흘러간다. 능동적인 객체를 만들어라 키워드 캡슐화 응집도 절차지향 프로그래밍(Procedural Programming) 객체지향(Obj.. Study/객체지향 2023. 10. 11. [Java]@Transactionaleventlistener 다루기 문제 상황 실제 근무 중인 곳에서 발생한 문제입니다. 엔티티를 DB에 저장한 후 외부 api를 호출하는 메서드가 있습니다. 이 메서드는 트랜잭션으로 묶여있기 때문에 외부 api 호출 시 장애가 발생하면 DB 저장 작업까지 모두 RollBack이 되었습니다. 문제는 메서드가 호출되면 DB 저장은 필수로 이루어져야 하기 때문에 RollBack 현상이 발생하면 안 된다는 것입니다. @Transactionaleventlistener이란? 메서드를 트랜잭션을 묶어서 처리하는 경우 트랜잭션이 끝나는 시점에 호출하는 이벤트 리스너입니다. 예를 들어 회원가입 후 쿠폰을 발급하는 로직이 있다고 가정했을 때, 회원가입은 정상적으로 완료되었지만 쿠폰 발급이 실패한 경우 회원가입 처리까지 rollback 되는 현상이 발생하게.. BackEnd/Java 2023. 9. 15. 모니터링 환경 구축 프로세스 정리(feat.Grafana, Prometheus, Spring Actuator, Docker) 이직한 회사에 입사한 후 입사 과제로 모니터링 시스템을 구축해 봤습니다. 그 과정과 프로세스를 끄적여 보겠습니다. 참고로 저는 네트워크 지식은 일자무식이었는데요, 이 과정을 통해 인프라팀과 커뮤니케이션하면서 네트워크 지식을 쌓게 되었습니다. 물론 지금 네트워크 지식이 대단하다! 이런 건 아니고... 옛날보단 발전했다 정도입니다... 완성된 모니터링 프로세스를 정리하자면 아래와 같습니다. 1. Spring Boot Actuator를 통해 매트릭 정보를 수집 2. 프로메테우스를 이용하여 실제 운영 서버에 대한 매트릭 데이터 분석 3. Prometheus에서 분석한 매트릭 데이터를 Grafana로 모니터링 UI 출력 대략 이런 프로세스입니다. 이해를 돕기 위해 단순히 그렸는데요, 세부적으로 설명하면 그림이 조.. 기타/모니터링 2023. 9. 14. Prometheus 개념 및 동작 원리 / 아키텍처 분석 Prometheus란? Prometheus는 SoundCloud사에서 만든 오픈소스 모니터링 툴이다. 메트릭 이름과 Key-Value 쌍으로 식별되는 시계열 데이터가 있는 다차원 데이터 모델 시스템 모니터링 및 경고 툴킷으로 kubernetes에서도 Prometheus를 사용하여 모니터링하는 방식을 장려하고 있다. 하지만 시각화 도구가 부족해서 Grafana를 이용하여 시각화하는 방식을 많이 사용한다. 메트릭이란? 비즈니스 측정치와 핵심 실적 지표를 나타내는 것. 데이터를 시각화해서 우리들에게 보여주는 툴. 예를 들어 대시보드에서 CPU사용량, 시간당 데이터 처리량 등을 볼 수 있는 것과 같다. 동작 원리는 다음과 같다. 1. metric 수집 수집하려는 대상 시스템(Target System)에서 메트릭.. 기타/모니터링 2023. 6. 9. [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. 이전 1 2 3 4 ··· 8 다음