본문 바로가기

PROGRAMMING/SPRING

(23)
[SPRING] 어떤 @Transactional을 써야할까? @Transactional은 크게 자카르타와 스프링 두 가지 방식이 있다. 1. 스프링에서 제공하는 Transactional (패키지: org.springframework.transaction.annotation.Transactional) 스프링에서 제공하는 Spring AOP를 사용하여 트랜잭션을 관리한다.스프링의 트랜잭션 관리 방식은 매우 유연하며, Propagation, Isolation, Timeout, ReadOnly 등을 커스터마이징할 수 있는데 아래 코드는 스프링에서 제공하는 Transactional의 다양한 커스터마이징 사용 예제이다. import org.springframework.beans.factory.annotation.Autowired;import org.springframewor..
[SPRING] AOP를 활용한 로그 중앙화 (feat.@Aspect, @Pointcut) 문제 상황Controller나 Scheduler가 호출하는 클래스의 메서드가 추가 될 때마다 같은 포멧의 로그코드가 같이 반복적으로 추가된다.슬슬 한번 정리해야 할 때가 온듯하다. 해결 과정1. build.gradle 추가implementation 'org.springframework.boot:spring-boot-starter-aop'// ip정보를 가져오려면 필요implementation 'org.springframework.boot:spring-boot-starter-web' 2. LogAspect.class 생성@Aspect@Log4j2@Componentpublic class LogAspect {// @Pointcut// @Around} 3. 이제 2번에서 생성한 클래스에 원하는 내용을 채워주면 ..
[SPRING] Lombok @Log4j2 log4j-slf4j-impl cannot be present with log4j-to-slf4j 에러 (gradle) 문제 상황Lombok의 @Log4j2 를 사용해 로그를 남기려고 의존성 및 코드 추가 후 실행하자 에러 발생 발생 에러Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j2-impl cannot be present with log4j-to-slf4j 원인Spring Boot 기본적으로 Logback을 로깅 프레임워크로 사용, 고로다른 경우에 의존성을 어셈블하기 위해 스타터를 사용하는 경우 Logback을 제외해야한다.해결방법build.gradle 아래 코드 추가configurations { all { exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' ..
[SPRING] @EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)Lombok 라이브러리에서 제공하는 기능으로 부모 클래스의 equals와 hashCode 메서드를 포함하여 자식 클래스의 해당 메서드를 생성하는 역할을 한다. Lombok 의존성 추가build.gradledependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'} 사용 예제PrivateRequestDto.java import lombok.Builder; import lombok.Data; import org.springframework.web.reactive.function.server.ServerRequest; ..
[SPRING] Spring boot 3.x에서 QueryDSL 설정 spring boot 2.x 버전 설정보다 간단해진듯 하다. build.gradle에 아래 코드 추가 dependencies { implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api"}def querydslSrcDir =..
[SPRING] static field에 @Value annotation 적용? 문제api key 변수를 yml 파일에 넣고 @Value 어노테이션으로 끌어다 쓰고 싶어 코드를 수정 변경 전 private static String AUTH_TOKEN = "access_token"; 변경 후 @Value("${api-key.key}") private static String AUTH_TOKEN; 하지만 실제 구동 시켜 api호출을 하면 Cannot invoke "String.length()" because "s" is null%요런 에러가 발생 원인static 필드는 스프링 컨테이너가 로드 되기 전에 class area에 저장이 되기 때문에,스프링 컨테이너에 의존적인 @Value 어노테이션이 정상적으로 작동하지 않는다. 해결 방법 static 필드에 직접 @Value 어노테..
[SWAGGER] 프로젝트 API 문서 자동화 프로젝트 개발 Phase1이 거의 마무리될 때 즈음 이걸 어떻게 API 문서화하지 하는 생각이 들어 검색해보았고 Swagger를 찾을 수 있었다. 추가하는 방법 implementation 'io.springfox:springfox-boot-starter:3.0.0'implementation "io.springfox:springfox-swagger-ui:3.0.0" Gradle 기준 build.gradle에 추가    SwaggerConfig 생성3.0에선 Docket에 DocumentationType.OAS_30 를 입력해주면 된다.basePackage는 API 문서화 대상 scope인듯 하다.    실제 컨트롤러에 적용한 예제이다.@ApiOperation은 컨트롤러 전체에 대한 설명을 작성한다.@Ope..
[SWAGGER] Swagger 적용 후 LocalDateTime 포맷 깨질 때 문제 상황아무리 뒤져봐도 Swagger API 문서화를 한 것 밖에 없는데 잘 나오던 시간 포멧이 깨지기 시작했다.  데이터 문제인가 싶어서 봤지만, 같은 DB를 바라보는 AWS에서는 아주 잘 나오고 있었다. 해결방법해결방법이 약간 원초적이긴 한데Json포멧으로 변환되면서 생기는 문제임으로  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") @Schema(description = "생성일자") private LocalDateTime createdTime; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") ..