본문 바로가기
프로젝트

날씨 일기 프로젝트

by Lv.1 ysg 2024. 1. 27.

1. Mysql 연동시 에러 발생

아래 참고 링크로 해결했었다

https://titlejjk.tistory.com/264

 

Could not resolve all files for configuration ':runtimeClasspath'.

Execution failed for task ':MemberApplication.main()'. > Could not resolve all files for configuration ':runtimeClasspath'. > Could not find mysql:mysql-connector-java:. Required by: project : Possible solution: - Declare repository providing the artifact,

titlejjk.tistory.com

 

2. Mysql  auto increment 속성

memo 테이블의 컬럼 id 속성에 auto increment가 설정 되어 있어 파라미터로 넣어주는 id 값은 무시되고 저장된다

 

 

3. @Transactional

@Transactional은 이러한 문제를 해결해주는 Spring이 제공하는 어노테이션으로 @Transactional을 메서드 또는 클래스에 명시하게 되면 특정 메서드 또는 클래스가 제공하는 모든 메서드에 대해 내부적으로 AOP를 통해 트랜잭션 처리코드가 전 후 로 수행된다.

 

AOP는 일반적으로 두가지 방식이 있다.

  • JDK Dynamic Proxy 방식 (타겟 클래스가 인터페이스 구현체일경우)
  • CGLib 방식

JDK Dynamic Proxy 방식 (타겟 클래스가 인터페이스 구현체일경우)

 

 

왼쪽은 @Transactional을 적용하기전 상태이며, 오른쪽은 @Trnasactional이 적용되고 JDK Dynamic Proxy 방식 AOP로 동작했을 때의 모습이다.

트랜잭션 처리를 다이나믹 프록시 객체에 대신 위임한다.

다이나믹 프록시 객체는 타깃이 상속하고있는 인터페이스를 상속 후 추상메서드를 구현하며 내부적으로 타깃 메서드 호출 전 후로 트랜잭션 처리를 수행한다. Controller는 타깃의 메서드를 호출하는것으로 생각하지만 실제로는 프록시의 메서드를 호출하게된다. 

 

CGLib 방식

CGLib는 Java 리플랙션 대신 바이트 코드 생성 프레임워크를 사용하여 런타임 시점에 프록시 객체를 만드는 방식이다.

타깃오브젝트가 인터페이스를 상속하고 있지 않는 다면 CGLib를 사용하여 인터페이스 대신 타깃오브젝트를 상속하는 프록시 객체를 만든다.

 

프록시 객체는 JDK Dynamic Proxy 또는 CGLib 방식 중 설정된 한 방식으로 만들어진다. Spring boot는 기본적으로 proxy-target의 값이 true이므로 CGLib를 사용하여 타깃이 인터페이스를 상속하건 말건 모두 수용하여 타깃을 상속하는 프록시 객체를 생성한다. 인터페이스가 없을때만 CGLib를 사용하고 이외에 JDK Dynamic Proxy 방식을 사용하고 싶다면 아래와 같이 application 파일에 proxy-target 값을 false로 주면된다.

 

요약하면 클라이언트는 타깃 Bean을 주입 받고 타깃의 메서드를 호출하는것 처럼 보이겠지만 실제는 프록시 객체를 주입받고 프록시 객체 메서드를 먼저 호출하게 되는것이다.

 

https://hwannny.tistory.com/98

 

@Transactional 동작 원리

들어가며 해당 포스팅은 Spring boot 2.2.0.RELEASE 환경에서 진행됐다. @Transactional이란? 비즈니스로직이 트랜잭션 처리를 필요로할 때 트랜잭션 처리 코드가 비즈니스 로직과 공존한다면 코드 중복이

hwannny.tistory.com

참고 : 테스트 코드에서의 @Transactional은 db에 커밋되지 않도록 설정해준다

 

4. 로그 logback 사용

프로젝트를 개발하면서 로깅 라이브러리를 logback을 사용했다

 

https://wildeveloperetrain.tistory.com/302

 

spring boot 로그 파일 남기는 방법 (logback-spring.xml 설정)

스프링 부트 logback-spring.xml 파일을 통한 로깅 설정 해당 포스팅은 '스프링 부트 환경에서 로그를 콘솔 또는 파일 등으로 기록하는 방법'에 대해 정리한 내용입니다. .properties(또는 .yml) 파일을 통

wildeveloperetrain.tistory.com

 

추가로

info 레벨로 설정하기위해 application.yml에 아래와 같이 추가해 주었다

logging:
  level:
    root: INFO

 

또 각 환경 ( 개발,운영 등) 에 대해 로깅 설정을 위해 아래와 같이 추가 했다

spring:
  profiles:
    active: local

 

 

5. type javax.servlet.http.httpservletrequest not present 에러

https://devfunny.tistory.com/929

 

SpringBoot 3.x 버전 이상 프로젝트에 Swagger 적용 오류 해결 및 springdoc-openapi 적용

오류상황 SpringBoot3.1.2 버전 프로젝트에 Swagger를 적용하려고한다. https://devfunny.tistory.com/692 SpringBoot + SpringSecurity 프로젝트에 Swagger 3.0 적용하기 이전 버전 Swagger 2.0 적용 방법 https://devfunny.tistory.com

devfunny.tistory.com

swagger 적용중에 위와 같은 에러를 만나게 되어 위 링크의 설명대로 스프링 부트 버젼을 낮추어 해결했다

원인은  SpringBoot 3.0은 JavaEE가 아닌 JakartaEE용으로 빌드되었는데, JakartaEE를 지원하는 SpringFox 릴리스가 없기 때문에 위와 같은 오류가 발생하는 상황이다.