728x90

spring 33

Bean의 Scope 중 싱글톤과 프로토타입의 차이

Scope: Bean Object가 생성되어 존재할 수 있는 범위 1. 싱글톤(Singleton) Scope 아무런 설정을 하지 않으면 기본적으로 싱글톤 Scope를 가지며, Property가 공유된다. DI DL 시 매번 같은 Object가 사용된다. 싱글톤 Scope를 가지는 Bean이 많아지면 어플리케이션 구동 시 등록될 Bean의 수가 많아짐으로 구동속도가 느려지게 된다. 등록방법 -> @Component Annotation 사용 시, 기본적으로 싱글톤 Scope을 가지는 Bean으로 등록된다. 2. 프로토타입(Prototype) Scope 싱글톤 Scope과 달리 DI DL 시 매번 새로운 Object가 사용된다. 등록방법 -> @Component Annotation과 더불어 @Scope("pr..

Spring 2024.04.19

Field ‘...’ doesn’t have a default value 오류 해결 방안

어느날 잘되던 API를 체크해보았는데 빌드는 되었지만 런타임 500 오류가 발생하였다. 오류 메시지를 보니 Field '…' doesn't have a default value 라는 메시지를 찾을 수 있었다. 소스코드를 점검해보니 이상이 없었고, 검색해보니 열(컬럼)에 기본값이 따로 지정되지 않았는데 그 열의 값을 뚜렷하게 지정하지 않는 채로 INSERT나 UPDATE 등으로 자료를 넣으면 오류가 발생할 수 있다고 한다. 위 경우는 해당 테이블의 PK에 auto increment 속성이 해제되어 있었고 이를 추가하여 해결할 수 있었다. -- auto increment alter table aaa modify bbb bigint auto_increment; PK에 자동증가 설정 추가 후, API 가 정상동..

Database 2023.08.31

[JWT] Illegal base64url character: ' ' 오류

Postman의 Authorization 탭에서 Type을 Bearer Token으로 설정한 뒤 Token을 입력하고 정상적으로 동작했던 API를 테스트 해보았는데 오류가 발생하였다. 인텔리제이 로그에서는 Illegal base64url character: ' ' 에러로그 메시지가 출력되었다. 에러 로그의 이유는 토큰값을 분해할 때 Base64 형식으로 decode 된 secret key를 사용하여 토큰을 분해하게 되는데, 그 과정에서 오류가 발생하는 것 같다(Base64 형식은 ' '(공백) 을 인식할 수 없다는 것이 이유). 해결 - Postman에서 API 요청할 때, Authorization 탭 대신 Headers 탭에서 Key 컬럼에 Authorization을 입력하고 Value 컬럼에 로그인에..

JWT 인증 2023.08.21

10) Spring Data Redis 셋팅

아래 내용은 https://github.com/beaver84/setting-test 에서 실제 소스를 확인할 수 있습니다. CacheRepository - RedisRepository의 인터페이스(객체 지향의 DIP를 지키기 위한) import java.time.Duration; import java.util.Map; public interface CacheRepository { String getValue(String key); void setValue(String key, String value, int minutes); void setValue(String key, String value); void setValue(String key, String value, Duration duration);..

1) 스프링 부트 프로젝트 생성

스프링 부트 프로젝트 생성 아래 내용은 https://github.com/beaver84/setting-test 에서 실제 소스를 확인할 수 있습니다. 프로젝트 개발을 위해 intelliJ에서 새 프로젝트 만들기를 클릭합니다. 다음 버튼을 클릭 (comment - 현재 기준 Spring Boot 3.x.x 버전은 아직 안정화되지 못했다고 판단하여 2점대 버전중 가장 최신 버전으로 프로젝트를 진행하도록 하였습니다) 이번에는 2.7.9 버전을 선택하고 생성 버튼을 클릭합니다. 루트 디렉터리에서 build.gradle을 더블 클릭합니다. build.gradle 파일에 아래와 같이 추가합니다. plugins { id 'java' id 'org.springframework.boot' version '2.7.4' ..

SpringEL

SpringEL 타임리프에서는 ${...} 라는 변수 표현식을 사용하여 변수를 사용한다 (선택 변수는 *{...} ) 이 변수 표현식에는 SpringEL이라는 스프링이 제공하는 표현식을 사용할 수 있다. SpringEL Spring Expression Language라는 뜻의 SpringEL (SpEL)은 런타임 시 메서드 호출 및 기본 문자열 템플릿 등의 기능을 제공한다. #{"표현식"} , ${"프로퍼티"} 으로 사용한다. (SpringEL 공식문서 링크 : https://docs.spring.io/spring-framework/docs/3.0.x/reference/expressions.html ) Thymeleaf Variable Expression : ${...} Text Thymeleaf Var..

Thymeleaf 2023.03.18

Entity Manager Factory와 persist, flush, commit

Entity Manager Factory와 persist, flush, commit 연관 관계 학교에서 한 명의 학생이 하나의 반에 속해있는 상황을 가정해보자. class Student { int studentId; String name; Class clazz; } class Class { int classId; String className; Teacher teacher; } OOP 에서는 학생에 대한 객체가 반에 대한 객체를 포함한다. 정확히는 참조를 가지고 있다. 반면, RDB 에서는 참조를 가지는 것이 아니라 반에 대한 참조를 FK 로 대체하고, 반에 대한 데이터를 분리하여 따로 저장해야한다. 즉, 데이터 저장 시에 데이터를 분리하여 2개의 쿼리를 사용해야 하며, 다시 읽을 때는 조인을 통한 재조..

JPA 2023.03.06

PointCut 표현식 정리

PointCut 표현식 포인트컷에는 다양한 명시자를 이용할 수 있습니다. execution Advice를 적용할 메서드를 명시할 때 사용합니다. within 특정 타입에 속하는 메서드를 JoinPoint로 설정되도록 명시할 때 사용합니다. bean 스프링 버전 2.5 버전부터 지원하기 시작했으며, 스프링 빈을 이용하여 JoinPoint를 설정합니다. execution 명시자 execution([수식어] 리턴타입 [클래스이름].이름(파라미터) 수식어 : public, private 등 수식어를 명시합니다. (생략 가능) 리턴타입 : 리턴 타입을 명시합니다. 클래스이름 및 이름 : 클래스이름과 메서드 이름을 명시합니다. (클래스 이름은 풀 패키지명으로 명시해야합니다. 생략도 가능) 파라미터 : 메서드의 파라..

Spring 2023.03.03

(SpringSecurity) UserDetailsServices 활용

UserDetailsServices 활용 JDBC를 이용하는 방식으로도 DB를 처리해서 사용할수 있지만, 여러 정보들중 제한적인 내용만 이용 한다는 단점이 존재 이러한 문제를 해결하기위해 UserDetailsServices 인터페이스를 구현하는 방식을 이용하는것이 좋다. ( 원하는 객체를 인증과 권한 체크에 활용 할수 있기에 많이 사용된다) UserDetailsServices 인터페이스는 단 하나의 메서드만 존재한다. 가장 일반적으로 많이 사용되는 방법은 하위 클래스 중에서 org.springframework.security.core.userdetails.User 클래스 상속 하는형태이다. 커스텀 UserDetailsService를 이용하는 방식을 이용하기 위해선, MYbatis를 이용하는 MemberM..

Spring/Security 2023.02.14

RestTemplate과 WebClient(feat. 서버 간 데이터 주고 받기)

RestTemplate과 WebClient 스프링 어플리케이션에서 HTTP 요청할 때 사용하는 방법으로 RestTemplate과 WebClient가 있다. 스프링 5.0 이전까지는 클라이언트에서 HTTP 접근을 위해 사용한 것은 RestTemplate 이었다. 스프링 5.0 에서 WebClient가 나왔고 현재는 WebClient를 사용하기를 권고하고 있다. 이번 팀 프로젝트를 진행하면서 RestTemplate을 도입하였었다. 하지만 RestTemplate이 deprecated 될 가능성이 있다는 얘기를 들었고 새로 시작하는 프로젝트에서는 WebClient를 쓰는 것이 좋겠다는 의견이 있어 WebClient를 적용해보게 되었다. 그럼 RestTemplate과 WebClient는 어떤 특징이 있으며 왜 W..

Spring 2022.12.02
728x90