본문 바로가기
728x90

🍃SpringFrameworks/SpringBoot16

[SpringBoot] Thread starvation or clock leap detected (feat. 쓰레드 기아 현상) 트러블슈팅 Spring을 위해 열일하는 우리의 작고 귀여운 EC2가 자주 죽는 이유인 쓰레드 기아 현상이란? 제목에 있는 Thread starvation or clock leap detected 해당 에러가 어떤 에러이며, 왜 발생하는지 또 해당 에러로 인한 문제와 해결 방법에 대해 알아보자. 우선 EC2 서버가 갑자기 다운되는 상황은 자원 부족, 예외 처리 미흡, 서버 설정 문제 등 이 외에도 매우 다양한 원인들로 인해 갑작스럽게 돌연사 해버릴 수 있는 개복치 같은 서버의 사망 원인을 파악하기 위해서는 가장 쉬우면서도 중요한 서버의 로그를 확인해보면 서버의 상태나 죽었다면 죽은 이유를 파악할 수 있다. 서버가 이런 로그를 계속하여 뱉어냈다면 이 글에서 다루는 쓰레드 기아 문제이다. WARN 23318 --- [l.. 2024. 2. 11.
[SpringBoot] Redirect처리 과정 (feat. ClassCastException) SpringMVC를 사용하여 웹 API개발 중 세션이 없는 요청에 대해 로그인 페이지로 Redirect 시키는 서비스 로직을 작성하였는데 화면 이동등에 대한 요청은 문제없이 Redirect 처리 되었지만 데이터 조회와 같은 Api요청에서는 에러가 발생하였다. 우선 원인은 Redirect처리 시 발생한 ClassCastException 때문인데, Spring의 Redirect의 처리 과정에 대해 자세히 알아보자. Spring에서 Redirection은 클라이언트에게 새로운 URL로 이동하라고 알려주는 프로세스를 의미한다. 리다이렉션은 주로 사용자를 다른 페이지로 이동시키거나, 요청을 다른 컨트롤러 또는 URL로 보내는 데 사용된다. Redirect Processing Logic (Debugging) 1. .. 2023. 10. 23.
[SpringBoot] 로그아웃 후 이전 페이지로 이동(뒤로가기) 방지 웹 브라우저에서 로그아웃, 세션 만료 등으로 인해 로그인페이지로 이동됐을 때 뒤로가기 버튼을 눌러 이전 페이지로 돌아가는것을 막는 방법..! 웹 사이트에서는 보통 Session을 이용해 사용자의 로그인 상태를 유지한다. Interceptor를 등록해 session의 유무를 확인하여 로그아웃이나 세션 유지기간의 만료로 인해 세션이 소멸된 경우 로그인 화면으로 강제로 이동(redirect)시킨다. 하지만 강제로 로그인 페이지로 Redirect 시키더라도 웹 브라우저의 뒤로가기 버튼을 누르면 이전 페이지를 볼 수 있다. *Session이 없는 상태에서 주요 페이지를 보는것은 보안 매우 취약할 수 있다. 원인: 웹브라우저에서 페이지를 이동하면 자체적으로 방문기록(History)을 캐시(cache)에 저장하는데 .. 2023. 10. 20.
[SpringBoot] MultipartFile 업로드/다운로드 하기 SpringBoot에서 MultipartFile 저장하고, 다운로드 받기 # File Upload Controller 1. controller에서 요청을 받을 때 MultipartHttpServletRequest 타입으로 request를 받아야 한다. 2. 파일과 같이 request body를 받아야 한다면 String타입으로 받은 후 Gson객체를 이용해 형변환 해야한다. 3. front에서 api요청 시 보낸 파일의 변수명으로 파일을 꺼내온다. > request.getFile("???") @RequestMapping(value = "/registerPrivacyResult", method = RequestMethod.POST) public BaseResult registerPrivacyResult(M.. 2023. 9. 5.
[SpringBoot] @Annotation 정리 @Autowired 스프링 DI(Dependency Injection)에서 사용되며, Bean 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입됩니다. 필요한 의존 객체의 “타입"에 해당하는 Bean을 찾아 주입한다. 생성자 / setter / 필드 기본값이 true이기 때문에 의존성 주입을 할 대상을 찾지 못한다면 애플리케이션 구동 실패. 💡 Constructor Dependency Injection 생성자 주입은 생성자에 의존성 주입을 받고자 하는 field를 나열하는 방법으로, 권고되는 방법의 하나 이다. 장점 필수적으로 사용해야 하는 레퍼런스 없이는 인스턴스를 만들지 못하도록 강제함 Spring 4.3 이상부터는 생성자가 하나인 경우 @Aut.. 2023. 8. 20.
[SpringBoot] 주요 개념 정리 💡 Optional 'null일 수도 있는 객체'를 감싸는 일종의 Wrapper 클래스이다. • optional 변수 내부에는 null이 아닌 T 객체가 있을 수도 있고 null이 있을 수도 있다. 따라서, Optional 클래스는 여러 가지 API를 제공하여 null일 수도 있는 객체를 다룰 때 사용한다. // 1) Optional 객체 생성 Optional result = userRepository.findById(userId); // 2) Optional 객체 접근 if(result.isPresent()) { return result.get(); }else{ return result.orElse(null); // Optional객체에 담긴 값이 있으면 객체 내부의 값을 반환. // 만약, null인.. 2023. 8. 20.
[SpringBoot] NaverAPI - RestaurantProject Naver 지역 API정보 검색 > 지역 - Search API 내 애플리케이션 (Id, Secret) 애플리케이션 - NAVER Developers NaverAPI 연동하기! application.properties 파일을 yaml파일로 변경하여 사용 (가독성이 좋아 최근 많이 사용) naver: url: search: local: image: client: id: ?????????? 0){ // 지역 검색 결과가 있다면 실행 var localItem = searchLocalRes.getItems().stream().findFirst().get(); var imageQuery = localItem.getTitle().replaceAll("]*>",""); // 괄호 제거 정규식 var searchIma.. 2023. 8. 20.
[SpringBoot] 07. Server to Server 💡 Client Controller @RestController @RequestMapping("/api/client") public class ApiController { private final RestTemplateService restTemplateService; public ApiController(RestTemplateService restTemplateService) { this.restTemplateService = restTemplateService; } @GetMapping("/hello") public Req getHello(){ return restTemplateService.genericExchange(); } } 사용자가 localhost:9090/api/client/hello를 .. 2023. 8. 20.
[SpringBoot] 06. Spring 기능 활용 💡 Validation Validation 이란 null값에 의한 null pointr exception등과 같은 에러 발생을 방지하기 위해 값을 미리 검증하는 과정이다. if(account == null || pw == null) { return; } if(age == 0) { return; } Validation의 사용 이유 검증해야 할 값이 많은 경우 코드의 길이가 길어진다. 구현에 따라 달라질 수 있지만 Service Logic과의 분리가 필요하다. 흩어져 있는 경우 어디에서 검증을 하는지 알기 어려우며, 재사용의 한계가 있다. 구현에 따라 달라질 수 있지만, 검증 Logic이 변경 되는 경우 테스트 코드 등 참조하는 클래스에서 Logic이 변경되어야 하는 부분이 발생할 수 있다. implemen.. 2023. 8. 20.
728x90