Backend/Spring 36

Spring REST API 요청 및 응답시 직렬화, 역직렬화의 원리

먼저 직렬화와 역직렬화란 무엇인가? 직렬화 : 메모리를 바이트 스트림으로 변환하는 과정으로 이를통해 네트워크 통신이 가능해진다. 역직렬화 : 네트워크 통신으로 받은 데이터를 메모리에 쓸수 있는 형태로 변환하는것이다. Spring의 직렬화 및 역직렬화 일반적으로 Spring에서는 직렬화 및 역직렬화시 Java 객체 ↔ JSON 형태로 변환한다. Spring-web 라이브러리에는 HttpMessageConverter를 상속받는 다양한 Converter가 존재한다. 유형에 따라 Converter가 사용되며, RestApi 유형의 경우에는 MappingJackson2HttpMessageConverter 가 사용된다. 여러 Converter 중 적합한 Convert를 판단하는 방법은? public interfac..

Backend/Spring 2024.04.23

동시성 문제에 대한 N개의 해결방법

시작하며 인프런의 모든강의가 30% 할인 하길래 동시성관련 강의를 구매 후 공부한 내용을 기록하였다. [강의] 동시성 문제란? 동시성 문제란 여러 쓰레드들이 공유 자원에 대한 경쟁을 벌여 의도하지 않은 결과를 말한다. 강의는 상품의 재고에대한 동시성문제를 다루는 내용이다. 재고 감소로직의 순서로는 1) 재고 감소 로직은 해당 ID값을 통해 엔티티를 조회 @Transactional public void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(stock); } 2) 요청 재고가 기존 재..

Backend/Spring 2024.03.24

Spring boot, Kafka 연동

시작하며Kafka에 대한 지식이 부족하다고 판단하여, Local 환경에서 Spring boot와 Kafka의 연동실습이며, 이론적인 내용은 추후에 작성할 예정이다. Kafka 서버 구축하기1. Apache Kafka 공식 홈페이지에서 Kafka 다운로드Apache Kafka 홈페이지다운로드 후 압축을 해제하면, bin과 config 파일이 존재한다.bin 디렉토리내에는 Kafka 관련 각종 실행 sh가 , config 디렉토리내에는 설정관련 파일이 위치한다. 2. Kafka Zookeeper 구동하기./bin/zookeeper-server-start.sh ./config/zookeeper.propertiesZookeeper는 기본적으로 2181 포트에서 구동한다.3. Kafka Broker 구동하기./b..

Backend/Spring 2024.01.14

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

[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

JPA, Hibernate, Spring Data JPA

JPAJPA는 Java Persistence API의 약자로, '자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스'이다.자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세이다. 나는 지금껏 '라이브러리' 정도로 생각하며, 사용하였다.JPA는 단순한 인터페이스 이기 때문에 구현체가 없다. 이런 JPA의 구현체는 아래그림과 같다. JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, DataNucleus, EclipseLink 같은 ORM 프레임워크를 사용해야한다.그중 Hibernate가 가장 범용적으로 다양한 기능을 제공한다고 한다.3가지 ORM 프레임워크는 다음에 찾아보자. HibernateHibernate는 JPA 구현체 중 하..

Backend/Spring 2023.06.08

유효성검사

시작하며 현재 사용하고 있는방법을 기록해두고 더 좋은 코드를 찾을시 비교하기위한 기록용이다. ex) @RequestPart(required = false, value = "img_file") MultipartFile imgFile , @Valid @RequestPart(value = "data") InsertRequest insertRequest , BindingResult bindingResult 1차. 입력값의 유무 if (insertRequest == null){ throw new RootException(ApiStatusCode.BAD_REQUEST, "잘못된 정보입니다."); } 2차. 입력값의 이상유무 BidingResult를 사용하여 최초의 Request값에 대한 검증을 한다. Request..

Backend/Spring 2023.05.06

@ModelAttribute @RequestParam @RequestBody 차이

시작하며 Spring을 사용하며 @RequestParam, @RequestBody, @ModelAttribute 3가지 어노테이션을 활용하였다. 대충 어떻게 사용하는지는 알지만 한번 정리의 필요성을 느꼈다. 정리 고고 @RequestParam public String getTest(@RequestParam("name") String name){ System.out.println(name); } @RequestParam은 1개의 HTTP 요청 파라미터를 받기위해서 사용한다. - value - defaultValue - required = true(기본설정 true / )false 설정가능 required = false 설정을 하지않고 파라미터를 전송하지않을시 400 에러가 발생한다. @RequestBody..

Backend/Spring 2023.05.06