'Spring' 카테고리의 글 목록
본문 바로가기
728x90

Spring31

[SpringBoot] IntelliJ와 Gradle이 테스트 구성을 처리하는 방식의 차이에서 발생한 오류 문제 상황 기존 코드는 @SpringBootTest를 사용하였습니다. 테스트를 진행할 때 Intellij의 test를 실행하면 정상 작동되고 gradle clean test를 사용하면 빌드 오류가 났습니다. 즉, 테스트 & 개발할땐 전혀 문제가 없는데 빌드만 하면 저기가 실패합니다. @SpringBootTest를 사용하면 @Configuration, @Component 등과 같은 주석을 사용하여 빈과 해당 종속성을 정의하여 Spring이 이러한 개체의 인스턴스화, 연결 및 수명 주기 관리를 처리할 수 있도록 합니다. // 오류 코드 Could not detect default configuration classes for test class [com.ll.MOIZA.boundedContext.select.. 2023. 6. 28.
[SpringBoot] @SpringBootTest와 @Import @SpringBootTest와 @Import Spring Boot에서 적절한 테스트 구성 접근 방식을 선택하는 것은 효과적이고 안정적인 테스트 환경을 만드는 데 중요합니다. 각 접근 방식의 목적, 용도, 특성 및 이점을 자세히 살펴보고 다른 접근 방식을 선택해야 하는 이유에 대해 알아보겠습니다. @SpringBootTest: 목적 및 역할: @SpringBootTest는 Spring Boot 테스트 프레임워크에서 제공하는 강력한 주석입니다. 통합 테스트를 위한 애플리케이션 컨텍스트를 생성하고 모든 구성, 구성 요소 및 빈과 함께 전체 컨텍스트를 로드합니다. 사용법: 테스트 클래스에 @SpringBootTest로 주석을 달아 런타임 환경을 유사하게 모방하고 포괄적인 통합 테스트를 수행합니다. 구성 요소 검.. 2023. 6. 28.
[Spring Boot] Spring Boot 3.x 실행 안될 경우 3.X부터는 Java 17부터 지원된다. 기존에 Java8, 11등을 사용하시던 분들은 3.x 스프링 부트 프로젝트를 실행할때 에러들을 만나게 된다. //error No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.1 was found. The consumer was configured to find a runtime of a library compatible with Java 16, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6' .. 2023. 4. 24.
DB 연동 에러 HikariPool-1 - Exception during pool initialization ERROR 5084 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. 이러한 오류가 나면 application.properties 파일에 spring.jpa.hibernate.ddl-auto = none 이 조건을 추가하면 된다. 이미 만들어진 테이블 생성하는데서 오류가 난듯하다. 2022. 11. 30.
[JPA] @ElementCollection RDB에는 컬렉션과 같은 형태의 데이터를 컬럼에 저장할 수 없다. 별도의 테이블을 생성해 컬렉션을 관리하게된다. 컬렉션이란 그저 용도가 같거나 유사한 문서들을 그룹으로 묶은 것 JPA 에서 컬렉션 객체임을 지정하는 방법은 @ElementCollection 어노테이션을 사용하는 방법이다. // Member 클래스 @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ElementCollection(fetch = FetchType.LAZY) @Builder.Default Private Set roleSet = new HashSet(); Pu.. 2022. 11. 27.
스프링부트 몽고DB find*() query에러 spring boot with mongodb error //error at com.aks.springStorage.SpringStorageApplication.main(SpringStorageApplication.java:22) [classes/:na] Caused by: org.springframework.data.mongodb.UncategorizedMongoDbException: Query failed with error code 2 and error message 'Field 'locale' is invalid in: { locale: "testDB" }' on server localhost:27017; nested exception is com.mongodb.MongoQueryException:.. 2022. 11. 25.
[Spring] API 호출하기-RestTemplate RestTemplate Spring 3.0 부터 지원한 RestTemplate는 Rest 방식 API를 호출할 수 있는 Spring 내장 클래스이다. Spring 5.0 이후 부터는 RestTemplate는 deprecated 되었다. 그래서 WebClient 사용을 지향한다. WebClient 와 RestTemplate 의 차이점은 동기, 비동기 차이이다. RestTemplate 특징 Spring 3.0 부터 지원하는 Spring의 HTTP 통신 템플릿 HTTP 요청 후 JSON, XML, String 과 같은 응답을 받을 수 있는 템플릿 RESTful 형식에 맞추어진 템플릿 Header, Content-Tpye등을 설정하여 외부 API 호출 Blocking I/O 기반의 동기방식을 사용하는 템플릿 S.. 2022. 11. 4.
[Spring] API 호출하기-WebClient Spring WebClient Spring WebClient는 Single Thread와 Non-Blocking방식을 사용한다. Spring Web Client 특징 싱글 스레드 방식을 사용 Non-Blocking 방식을 사용 JSON, XML을 쉽게 응답받는다. React Web 프레임워크인 Spring WebFlux 에서 Http Client로 사용됩니다. Spring Web Client 동작 원리 출처: https://luminousmen.com/post/asynchronous-programming-blocking-and-non-blocking 각 요청은 Event Loop 내에 Job으로 등록이 된다. Event Loop는 각 Job을 제공자에게 요청한 후, 결과를 기다리지 않고 다른 Job을 처.. 2022. 11. 1.
[Spring] kakao login api access token 발급하기 redirect uri 로 코드 값을 받게 된다. 받은 코드값을 //controller @GetMapping(value="/oauth/kakao") public ResponseEntity login(@RequestParam("code") String code) { String access_Token = oAuthService.getKakaoAccesToken(code); ​ return ResponseEntity.ok().body(jwtToken); } //service public String getKakaoAccesToken(String code) { String access_Token = ""; String refresh_Token = ""; String reqURL = "https://kauth... 2022. 10. 28.
[Spring] kakao login api access token 으로 회원 정보 받기 //controller @GetMapping(value="/oauth/kakao") public ResponseEntity login(@RequestParam("code") String code) { String access_Token = oAuthService.getKakaoAccesToken(code); ​ HashMap userInfo = oAuthService.getUserInfo(access_Token); return ResponseEntity.ok().body(userInfo); } //service public HashMap getUserInfo (String access_Token) { ​ // 요청하는 클라이언트마다 가진 정보가 다를 수 있기에 HashMap타입으로 선언 HashMap u.. 2022. 10. 25.
[Spring] kakao login API 전체 프로세스 액세스 토큰을 프론트에서 받아서 백으로 보내는 예도 있는데, 카카오에서 발급받은 액세스 토큰을 바로 사용하는 건 추천하지 않는 방식이다. 출처 : https://devtalk.kakao.com/t/topic/124144/4 로그아웃이나, 연결 해제 요청 시 카카오 액세스 토큰이 필요하다. 그럼 백앤드에서 카카오 액세스 토큰을 저장할지 고민을 해야 한다. 암호화를 한번 걸어서 사용할지, 자체 토큰에 회원 식별 ID만을 보내고 캐시 혹은 DB에 식별 ID와 액세스 토큰을 가지고 있거나 하는 다양한 방법이 있다. Oauth 2.0 을 사용한 로그인이 Kakao만 있는 게 아니기 때문에 주로 사용하는 방법은 자체 토큰을 발급해 사용하는 것 같다. 다시 돌아가 Kakao login API 에서 인증코드를 가지고 .. 2022. 10. 21.
스웨거 헤더 넣기, swagger activate of authorize button api 서버 구현 중에 JWT 토큰 인증 방식으로 구현하면 헤더에 JWT 토큰을 받아서 유효한지 검사하게 된다. swagger 를 활용해 api 문서 작성과 테스트를 하기 위해 swagger 에 헤드에 값을 넣는 방법을 알아보자. build.gradle 설정 implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0' implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '3.0.0' SwaggerConfig 설정 @Configuration @RequiredArgsConstructor public class SwaggerConf.. 2022. 10. 7.
[Spring] Could not read JSON/ Cannot construct instance of XXXDto, XXXResponse 에러해결 DTO를 사용해 값을 입출력하는데 에러가 뜬다. 에러 내용은 Cannot construct instance of XXXDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 문제 원인은 DTO를 재구성하는데 생성자가 없기 때문이다. 기존에 DTO는 Builder 로만 객체를 생성했었다. @Getter @Builder public class XXXDto { // ~~~ } 오류를 해결하기 위해 @AllArgsConstructor, @NoArgsConstructor 를 추가해줘야한다. @Getter @Builder @AllArgsCo.. 2022. 9. 13.
[Spring] Sagger 3.0.0 with Spring boot 2.7.0. 개발 환경 SpringBoot 2.6.1 gradle Swagger 3.0.0 의존성 추가 /* build.gradle */ dependencies { // .. implementation 'io.springfox:springfox-boot-starter:3.0.0' // .. } Seagger 3.x 부터 pringfox-boot-starter 하나로 하위에 필요한 모든 라이브러리가 포함된다. Config 추가 @Configuration public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .useDefaultResponseMessages(false) .select() .api.. 2022. 9. 6.
Spring-Core Container 1. Beans Spring 프레임 워크의 근간이 되는 IOC/DI기능을 지원하는 담당 BeanFactory를 기반으로 Bean 클래스들을 제어할 수 있는 기능을 지원 스프링 DI기능의 핵심인 bean Factory와 DI기능을 제공하는 모듈이며 bean의 meta data, bean리더, beanFactory의 구현과 Properti aditor가 포함 2. Core Core는 스프링에서 사용하는 핵심모듈이며 주요 어노테이션, 컨버터, 상수, 유틸리티 클래스 등을 제공 3. Context Core and Beans를 견고히(solid)한 모듈(Beans의 확장 버전) JNDI처럼, 프레임 워크 방식이고 객체에 접근하기 위한 방법 제공 Beans모듈에 더하여 국제화, 이벤트 전판, 리소스 로딩, 투명한 .. 2022. 5. 13.
Java Bean? Spring Bean? Bean 이란 반복적으로 코드를 따로 작성하여 재사용하기 위해 만들어진 클래스 빈은 속성과 메서드로 이루어져 있으며, 데이터의 처리를 담당 Java Bean의 정의 데이터를 표현하는 것을 목적으로 하는 자바 클래스( JavaBean 규격서에 따라 작성 ) 컴포넌트와 비슷한 의미로도 사용 DTO 혹은 VO의 형태가 Java Bean이라고 생각하면 쉽다. Java Bean 필드는 private로 구성되어 getter와 setter를 통해서만 접근할 수 있고, 전달 인자가 없는 생성자를 가지는 형태의 클래스이다. 모든 필드는 private로 getter/setter를 통해서만 접근 가능 public class Bean_ClassName [ implements java.io.Serializable ] { pri.. 2022. 4. 29.
Spring DI 종류 1. 생성자 주입 생성자에 파라미터를 만들어두고 이를 통해 DI 컨테이너가 의존할 오브젝트 레퍼런스를 넘겨주는 방식 // PicoContainer class MovieLister... public MovieLister(MovieFinder finder) { this.finder = finder; } ​ class ColonMovieFinder... public ColonMovieFinder(String filename) { this.filename = filename; } 무의식 중에 가장 많이 쓰는 주입 방식 객체 생성시 필수로 생성자가 실행되기 때문에, 필드 주입과 달리 참조 관계를 눈으로 쉽게 확인할 수 있다. 2. Setter 주입 의존성을 입력받는 세터 메소드를 만들고 이를 통해 의존성을 주입 .. 2022. 4. 22.
Spring IoC, DI 가 무엇인지 IoC(Inversion of Control) : 제어가 반대로 간다는 개념 IoC는 Spring 에서만 사용되는 개념이 아니며, 프로그래밍 패턴이기 때문에 범용적으로 쓰이며 작게는 객체간에 디자인 패턴으로 크게는 컨테이너, 프레임워크 역활에 적합한 구조이기 때문에 상황에 맞게 사용되는 프로그래밍 모델이다. "IoC : 제어의 역전" 이라는 의미는 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다. 즉, IoC는 객체 생명 관리, 흐름 제어를 제 3자에게 위임하는 프로그래밍 모델이다. 일반적으로 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 객체가 생성되곡 실행된다. 그런데 서블릿은 배포하고 나서 개발자가 직접 제어할 .. 2022. 4. 19.
Spring-JPA-hibernate.naming JPA를 적용하고 나서 Entity 생성 시 변수 명을 그대로 매핑 안하고 언더바 형식 카멜을(UserName => user_name) 으로 자동 매핑해준다. 이 부분을 변수 명과 DB칼럼명을 그대로 매핑 하려면 application.properties 에 추가해주면 된다. spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl application.yml 경우 jpa: hibernate: ddl-auto: none naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategy.. 2022. 3. 22.
Filtet vs Interceptor 모든 컨트롤러에 로그인 여부를 확인하는 코드를 짜야하는 상황이라 코드의 중복이 많아지고 로그인 로직이 바뀌면 복잡해진다. 이러한 여러 로직에서의 공통 관심이 있는 것을 cross-cutting concern(공통 관심사) 라고 한다. 서블릿 필터 life cycle HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 필터체인: HTTP 요청 -> WAS -> 필터1 -> 필터2 -> 서블릿 -> 컨트롤러 필터 -> 서블릿 //인증된 사용자 필터 ->(서블릿 호출 x) //비 인증 사용자 스프링 인터셉터 life cycle HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 필터체인: HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터.. 2022. 3. 18.
spring-boot, react, axios 사용시 Cors, session, cookie 문제 Spring-boot로 rest형식의 api를 구현하였고, React로 구현된 Client와 연결하는 작업중에 발생한 이슈이다. 구글링해서 찾은 3가지 방법 시도 1. spirn-boot에서 CORS 설정 -> 값 주고 받기 성공 (session 값은 가져오지 못한다.) (Cross-Origin Resource Sharing,CORS)란 다른 출처의 자원을 공유할 수 있도록 설정하는 권한 체제 즉, CORS 를 설정하지 않거나 잘못 설정하는 경우, 리소스를 공유하지 못한다. config.WebConfig.java 설정 package com.example.booking_service_01.config; import org.springframework.context.annotation.Configuratio.. 2022. 3. 4.
Spring boot Rebuild없이 정적소스(HTML,CSS,js) 적용방법 devtools 라이브러리 의존성 추가 maven org.springframework.boot spring-boot-devtools 2.0.4.RELEASE Gradle compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.0.4.RELEASE' application 옵션 추가 application.yml spring: devtools: livereload: enabled: true freemarker: cache: false thymeleaf: cache: false application.properties spring.devtools.livereload.enabled=true spring.freemark.. 2022. 2. 25.
mapstruct/Lombok차이 및 충돌 오류, cannot find symbol 차이 ModelMapper 은 modelMapper.map 매핑이 일어날 때 리플렉션이 발생하고 MaStruct 는 컴파일 시점에서 구현체를 만들어 리플렉션이 발생하지 않는다 *리플렉션은 구체적인 클래스 타입을 알지 못해도, 컴파일한 클래스 정보를 활용해 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해 동적으로 프로그래밍이 가능하도록 지원하는 API *동적으로 프로그래밍 -> 런타임 시점에 타입을 결정 즉, ModelMapper은 런타임에 매핑이 일어나고 MaStruct은 컴파일 시점에 구현체를 만든다. 문제 mapstruct가 정상적으로 작동하지 않았으며, "cannot find symbol"오류 발생 충돌 원인 mapstruct를 호출하는 방식이 조금 달라서 Lombok과 충돌이 발생 해결.. 2021. 12. 3.
Spring Security Spring Security는 Spring 기반 애플리케이션에 인증과 권한 부여를 모두 제공하는 데 중점을 둔 프레임워크. 사실상 Spring 기반 애플리케이션 보안의 표본이다. Spring Security는 "인증"과 "권한(인가)"에 대한 부분을 Filter의 흐름에 따라 처리합니다. Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다. Spring Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인을 하게 된다. Spring Security에서는 이러한 인증과 인가를 위해 Principal을 아이디로.. 2021. 9. 10.
JPA & PostgreSQL 연동 JPA(Java Persistence API)란 ORM에 대한 자바 API 규격 ORM(Object Relational Mapping)이란 객체가 테이블이 되도록 매핑 시켜주는 프레임워크 Hibernate는 JPA를 구현한 ORM 프레임워크 중 하나 설정 dependency org.springframework.boot spring-boot-starter-data-jpa org.postgresql postgresql runtime DB 연결정보 (postgresql은 미리 설치되어 있어야하며, DB에서 설정한 값을 가져와야한다.) # resources/application.properties # Datasource Settings spring.datasource.url=jdbc:postgresql://12.. 2021. 9. 3.
728x90