본문 바로가기
728x90

스터디/Spring23

[Spring] Springboot 버전에 따른 validation 패키지 (org.hibernate.validator.constraints does not exist) 목차   1. javax와 jakarta package 의 Validation이슈 내용Springboot 2.x 버전에서 Springboot 3.x 버전으로 업데이트한 뒤 Validation 관련 어노테이션을 적용할 때 에러가 발생하였습니다.에러 메시지package org.hibernate.validator.constraints does not existcannot find symbol symbol : class NotBlankjavax 패키지의 Validation을 사용하였고 build.gradle에 필요한 모듈을 모두 추가했음에도 에러가 발생하였습니다.build.gradle...implementation("org.springframework.boot:spring-boot-starter-validat.. 2024. 7. 7.
[Spring] PUT 과 PATCH 사용시 주의할 점 목차   1. Spring 에서 PUT 과 PATCH 사용 시 발생하는 이슈일반적으로 PUT은 전체 수정, PATCH 는 일부 필드 수정으로 이해하고 사용하고있습니다.Spring 을 사용하면서 해당 Http Method 를 사용하다가 이슈가 발생한 경험이있는데요, 어떤 이슈가 있었고 어떻게 해결하는지 알아보겠습니다.  2. PUT method예시 코드class TestController { @PutMapping("/test/put") public void putSample( @RequestBody Task task) { System.out.println(task); }}class Task { private String title; private String content; ...}  Reque.. 2024. 7. 6.
[Spring] PUT 과 PATCH 차이 PATCH /customers?id=1{ name : AA, balance : 0}목차   1.PUT 메소드정의The HTTP PUT request method creates a new resource or replaces a representation of the target resource with the request payload.HTTP PUT 메서드는 요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체합니다. UPDATE 방식예시아래와 같은 데이터가 존재한다고 가정합니다.idbalancename1100A220B3-120C id=1 인 유저의 데이터를 아래와 같이 두 케이스로 PUT 요청을 보냈다고 했을 때 결과는 다음과 같습니다.요청 1)PUT /cu.. 2024. 7. 5.
[Spring] MultiValueMap 의미와 사용법 목차 1. 개요 코드 작업 중에 MultiValueMap 이라는 인터페이스를 알게되었습니다. MultiValueMap 은 URLScheme을 생성할 때 url 파라미터를 셋팅 할 때 사용하였습니다. public String generateTaskViewAppScheme(String domainId, String projectId, String taskId) { LinkedMultiValueMap params = new LinkedMultiValueMap(); params.add("domainId", domainId); params.add("projectId", projectId); params.add("taskId", taskId); params.add("version", "18"); String app.. 2024. 4. 21.
[Spring] properties와 yml 중 어떤걸 사용할까? Springboot에서 일반적으로 프로젝트의 설정을 application.properties 또는 application.yml 파일을 통해 설정합니다. 기본적으로 Spring Initializer을 통해 springboot 프로젝트를 생성하면 application.properties 가 생성되지만, application.yml 파일을 사용할 수도 있습니다. properties properties 파일은 key=value 형태로 이루어져있습니다. 예시코드 spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:8080/test spring.datasource.username= spring.datasource.password= yml yml의 경우엔 들여쓰기로 구.. 2023. 9. 4.
[Spring] Mybatis resultType과 resultMap Mybatis 개념 mybatis-spring은 mybatis에서 mybatis3과 spring 연동 라이브러리로 제공된다. 싱글톤 패턴으로 스프링 빈으로 등록하여 주입하고 쉽게 사용이 가능하다. mybatis mapper interface를 통해 DB에 접근하다. 객체 프로퍼티로 파라미터와 결과를 객체(dto 등)로 자동 매핑을 지원한다. 스프링 연동 모듈을 제공해주기 때문에 스프링 설정이 간단하다. 트랜잭션을 관리해주기 쉽게 설정이 가능하다. ResultType - resultType The fully qualified class name or alias for the expected type that will be returned from this statement. Note that in the .. 2023. 8. 25.
[Spring] @JsonProperty와 @SerializedName 목차 1. Gson과 Jackson Jackson Jackson은 JSON 구조를 처리해주는 라이브러리입니다. json뿐만 아니라 xml도 지원합니다. Gson Gson은 자바에서 json을 파싱하고 생성하기 위해 사용하는 구글에서 개발한 오픈소스입니다. Java Object → Json 문자열, Json 문자열 → Java Object로 변환할 수 있습니다. 2. @JsonProperty 사용하기 POST로 넘어오는 Json 데이터는 스네이크 케이스로 이루어져있는 반면 자바 엔티티는 카멜 케이스로 이루어져있습니다. 이러한 경우 컨트롤러 단에서 Json ↔ 자바 엔티티를 맵핑 시켜주어도 데이터의 key가 달라지는 경우 제대로 값을 받아오지 못 할 수 있습니다. 이를 해결하기 위해 @JsonProperty.. 2023. 8. 19.
[Springboot] CircuitBreaker 적용방법(2) - 코드 적용 목차 지난번 CircuitBreaker 적용방법(1)에 이어서 포스팅하겠습니다. 1. CircuitBreaker 코드 적용하기 방법 1) 코드 적용 방식 연동 로직에 직접 CircuitBreaker를 적용하려면 먼저 적용대상 CircuitBreaker를 CircuitBreakerRegistry를 통해 구해야한다. 연동 로직에 CircuitBreaker를 decorate 하도록 직접 코드를 적용한다. 연동 대상 서버 API 호출 공통 로직에 적용 시 모든 API에 동일한 설정 적용이 가능하다. https://resilience4j.readme.io/docs/examples 1) Create a CircuitBreakerRegistry // Create a custom configuration for a C.. 2023. 8. 18.
[Springboot] CircuitBreaker 적용방법 (1) - Resilience4j 목차 1. CircuitBreaker 적용 방법 circuitbreaker는 라이브러리를 통해 적용이 가능합니다. circuitbreaker를 제공하는 라이브러리는 아래와 같이 크게 3가지 종류가있습니다. 구분 Resilience4j Netflix Hystrix Sentinal Home https://github.com/resilience4j/resilience4j https://github.com/Netflix/Hystrix https://github.com/alibaba/Sentinel 라이센스 Apache License 2.0 Apache License 2.0 Apache License 2.0 특징 Light Weight, dependency 적음 Java 8 Fuctional Interface로 .. 2023. 8. 18.
[Springboot] CircuitBreaker란 뜻 의미 목차 1. CircuitBreaker란? 말 그대로 누전 차단기 누전 차단기는 전기 회로에서 과부하가 걸리거나 단락으로 인한 피해를 막기 위해 자동으로 회로를 정지시키는 장치 서버에서 외부 API 통신의 장애 전파를 막기 위해 장애를 탐지하면 외부와의 통신을 차단하는 역할 Circuit Breaker가 실행(open)되면 Fail Fast함으로써 외부 서비스에 장애가 나더라도 빠르게 에러를 응답 받고 개발자가 지정한 행위를 리턴받을 수 있다. *fail-fast: 오류가 발생하면 곧바로 오류를 알리고 작업을 중단 장점 연동 서버의 장애로 인해 slow call 발생 시 전체 서버로의 장애 전파 방지 연동 서버 장애 발생 시 call을 차단하여 연동 서버의 장애가 과중되지 않도록 한다. => 장애 발생된 .. 2023. 8. 17.
[Springboot] @Scheduled cron 사용하는 방법 @Scheduled 사용하기 @Scheduled 어노테이션을 사용하기 위해서 @EnableScheduling을 추가해주어야한다. @EnableScheduling public class TaskBatchApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(TaskBatchApplication.class); springApplication.addListeners(new ApplicationPidFileWriter()); springApplication.run(args); } } SpringbootApplication 위에 @EnableScheduling 어노.. 2023. 8. 12.
[Spring] Spring 프로젝트에서 리소스 파일 읽기 (Java8) Springboot에서 File 을 읽어오자 스프링부트에서 자바 코드로 파일을 읽어오기 위해 아래와 같이 코드를 생성했습니다! Path fileName = Path.of("src/main/resources/template/test.txt"); String actual = Files.readString(fileName); 하지만 Path.of 와 Files.readString에서 인텔리제이가 빨간 밑줄을 쳐줬는데요, 자바8에서는 지원하지 않는 메소드여서 오류가 발생했습니다. 그래서 자바8 기준으로 코드를 수정했습니다. Path filePath = Paths.get("src/main/resources/template/test.txt"); List lines = Files.readAllLines(filePat.. 2023. 8. 11.
[Spring] 스프링 @MockBean, @SpyBean 배경 스프링과 Junit을 이용해서 테스트 코드를 작성하다 보면 테스트 환경(database, api)을 구현하는 코드까지 작성해야 하고 실제 테스트할 코드보다 환경을 구현하는 코드가 훨씬 더 복잡해지게 됩니다. 이런 문제 영역을 해결하기 위해서 테스트 더블 이라는 것이 나왔고 Java진영에서는 대표적으로 Mockito가 있습니다. Mockito를 사용하다보면 아래 어노테이션을 자주 접하게됩니다. @Mock @MockBean @Spy @SpyBean @InjectMocks SpringBoot 1.4에서 2개의 테스트 어노테이션 @MockBean, @SpyBean 이 추가되었습니다. 두 어노테이션 모두 spring-boot-test에서 제공하는 어노테이션입니다. Spring 에서는 보통 객체생성시 직접 생.. 2023. 3. 12.
[Spring] 스프링 캐시 알아보기 (@Cacheable, @CachePut, @CacheEvict) 스프링 캐시 캐시란? 자주 사용되는 데이터를 저장하는 공간을 의미합니다. 자주 사용되는 데이터를 매번 요청 때마다 생성하여 응답하는 것 보다는 생성된 데이터를 저장해놓고 똑같은 요청이 왔을 때 로직을 거치지 않고 데이터를 반환해주는 것이 서버에 리소스 사용을 줄일 수 있으므로 성능을 향상할 수 있습니다. 그렇다면 캐시는 어디에 사용하는 것이 좋을까요? 클라이언트에게 전달되는 값이 동일할 때 빈번하게 호출될 때 한 번 처리할 때 많은 서버 리소스를 요구 할 때 예시로는 공지사항, 조회수, 랭킹 등이 캐시를 많이 적용합니다. 반대로 캐시를 적용하지 말아야하는 경우는 언제일까요? 실시간으로 정확성을 요구하는 경우 빈번하게 데이터 변경이 일어나는 경우 spring-boot-starter에서 제공하는 캐시는 서버.. 2023. 3. 12.
[Spring] Filter와 Interceptor 의미와 차이 필터(Filter)란? 필터 개념 필터는 Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. Dispatcher Servlet은 스프링 가장 앞단에 존재하는 프론트 컨트롤러(Front Controller)라고도 한다. 즉 필터는 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 된다. (스프링 범위 밖에서 처리) 필터 구조 필터 메소드 필터를 추가하하기 위해서 Filter 인터페이스를 구현해야한다. (implements) 이때 3가지 메소드를 구현한다, init() doFilter() destroy() 1) init() init 메소드는 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드이다. 웹 컨.. 2022. 10. 6.
[Spring] @ResponseBody와 @ModelAttribute 차이점 @RequestBody @RequestBody는 클라이언트가 전송하는 Json(application/json)이나 xml 형태의 HTTP Body내용을 Java Object로 변환시켜준다 (POST / PUT). 따라서 Body가 존재하지 않는 GetMapping에 RequestBody를 사용하면 에러가 발생한다. Spring에서 관리하는 MessageConverter를 활용하여 Java 객체로 변환된다. @ModelAttribute @ModelAttribute는 클라이언트가 전송하는 multipart/form-data 형태의 요청 데이터(GET) 내용과 HTTP 쿼리 파라미터들을 Setter 메서드를 통해 1:1로 객체에 바인딩한다. 매핑시키는 파라미터의 타입이 객체의 타입과 일치하는지를 포함한 다양한.. 2021. 8. 17.
[Spring] @NotNull @NotEmpty @NotBlank 차이점 서버에서 클라이언트의 요청에 대하여 유효성을 검증해야하는 부분이 필요하다. 이때 스프링에서 @Valid 라는 어노테이션으로 검증을 수행하는데 Valid 중에서 위 세가지 어노테이션을 비교해보고자한다. 차이점 @NotNull @NotEmpty @NotBlank Null X X X 길이가 0인 값(ex: "") O X X 공백(ex: " ") O O X 위 세가지 어노테이션은 bean validation (Hibernate Validation)에서 제공하는 표준 Validationdmfh 클라이언트의 파라미터 중 null 값인지 체크하거나 공백 유무를 체크하는데 사용된다. @NotNull의 경우 Null값은 허용하지 않지만 "", " " 은 허용한다. 따라서 위 어노테이션은 정확히 구분해서 상황에 따라 적절.. 2021. 8. 17.
[Spring] 싱글톤 패턴 (Singleton pattern) 1. 싱글톤 패턴이란 (Singleton pattern) 소프트웨어 디자인 패턴에서 싱글톤 패턴을 따르는 클래스는 , 생성자가 여러 차례 호출되더라고 실제로 생성되는 객체는 1개이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. Why? 싱글톤 패턴을 왜 사용할까? 만약 DI 컨테이너가 매번 클라이언트에서 요청이 들어올때마다 각 로직을 담당하는 오브젝트를 생성한다고 가정해보자. 요청이 엄청 많은 트래픽 사이트에서는 계속 객체를 생성하게되어 메모리 낭비가 심해지고 서버가 감당하기 힘들어진다. 그래서 싱글톤 패턴을 사용한다! 2. 싱글톤 패턴 구현 2-1. DI Container AppConfig appConfig = new AppConfig(); // 호출 할 때마다 다른 객체.. 2021. 8. 17.
[Spring] Spring Container, BeanFactory 그리고 ApplicationContext 스프링에서 가장 중요한 개념인 Container, BeanFactory 그리고 ApplicationContext 에 대해서 알아보고자 한다. 스프링에서 BeanFactory 와 ApplicationContext는 IoC Container 역할을한다. Spring Container 스프링에서 DI를 이용하여 애플리케이션을 구성하는 여러 빈들의 생명주기와 애플리케이션의 서비스 실행등을 관리하며 생성된 인스턴스들에게 기능을 제공하는 것. 컨테이너에 적절한 설정만 있으면 프로그래머의 개입 없이 작성된 코드를 컨테이너가 빈을 스스로 참조한 뒤 알아서 관리한다. 스프링 컨테이너는 주로 BeanFactory와 ApplicationContext 두 가지로 다룬다. *빈(Bean) : 스프링이 제어권을 갖고 직접 생성 .. 2021. 8. 17.
[Spring] PSA (Portable Service Abstraction) 란? PSA (Portable Service Abstraction) 잘 만든 인터페이스(PSA)를 가지고 나의 코드가 바뀌지 않도록 다른 기술로 간편하게 바꿀 수 있도록 확장성을 갖는 것이다. Spring은 Spring Web MVC, Spring Transaction, Spring Cache 등의 다양한 PSA를 제공한다. 1. Spring Web MVC 일반 클래스에 @Controller 애노테이션을 사용하면 요청을 매핑할 수 있는 컨트롤러 역할을 수행하는 클래스가 된다. 또한, 의존성 설정에서 코드 한 줄만 바꾸면 tomcat이 아닌 netty기반으로 실행되게 변경할 수 있다. 이러한 어노테이션과 dependency 등을 통해서 복잡한 인터페이스를 가지고 사용자가 웹 기술 스택을 편리하게 바꿀 수 있도록.. 2021. 7. 4.
728x90