Spring
-
[springboot, kotlin] 배포시 FileReader FileNotFoundExceptionSpring/Spring Boot 2021. 9. 28. 01:17
FileReader("src/main/resources/templates/$fileName.yaml") .readText() 로컬에서는 파일 경로를 읽어와서 잘 읽지만 쿠버네티스 파드에 JAR 패키징으로 실행한 어플리케이션 안에서는 FileNotFoundException이 발견되었다. 실행할 때 jar 로 패키징해서 실행하였다면 InputStream을 써서 읽어야 한다. File로 읽을 수 있는건 자바 메인으로 실행했을 때 파일 경로로 읽을 수 있는것이고 JAR 안에 들이었는 리소스를 클래스패스로 접근해서 읽을 때는 파일시스템에 있는 파일이 아니라 JAR 안에 있는 파일이기 때문이다. javaClass.getResourceAsStream("/data/$fileName") ?.bufferedReader(..
-
스프링 @Transactional과 잠금Spring/Spring 2021. 8. 11. 11:27
Spring Framework에서 @Transactional 어노테이션과 잠금의 차이를 알아보자. @Transactional 어노테이션을 사용하는 것만으로 메서드에 잠금이 걸리는 것은 아니다. @Transactional은 트랜잭션의 경계를 정의하고 트랜잭션 관리의 일관성을 유지하는 데 사용된다. 하지만 이는 동시성 제어나 잠금을 직접적으로 처리하는 것은 아니다.트랜잭션 관리와 잠금은 다르다. 트랜잭션 관리:@Transactional 어노테이션은 데이터베이스 트랜잭션을 시작하고, 커밋하거나 롤백하는 역할을 한다.트랜잭션 내에서 수행되는 모든 작업은 원자적으로 처리되며, 트랜잭션이 완료되기 전까지 다른 트랜잭션에서 해당 데이터에 접근할 수 없도록 보장된다.예를 들어, 사용자 계정 정보 업데이트와 같은 시나..
-
Mono.just()와 Mono.defer()에 대한 이해Spring/Spring 2021. 7. 30. 13:26
리액티브 프로그래밍을 위해 스프링 WebFlux를 사용할 때, Mono를 사용하여 단일 값을 비동기적으로 처리하는 경우가 많다. 이때 Mono.just()와 Mono.defer()는 매우 유용한 메서드이다. 이 글에서는 Mono.just()와 Mono.defer()의 차이점과 사용 사례를 살펴보겠다. Mono.just()란?Mono.just()는 단일 값을 즉시 감싸서 Mono로 반환한다. 값을 이미 알고 있고, 그 값을 비동기적으로 반환해야 할 때 유용하다. 예를 들어, 이미 계산된 값이나 상수를 Mono로 반환하고자 할 때 사용된다.public Mono getFixedValue() { return Mono.just("Hello, World!");}위의 코드에서 Mono.just("Hello, ..
-
1주차 스프링 스터디Spring/Spring 2021. 4. 19. 22:11
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크 객체 지향 프로그래밍? 객체 지향 프로그래밍은 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 객체 지향 프로그래밍을 위한 세가지 요소 캡슐화 다형성 상속 캡슐화 객체 지향의 중요한 원리는 캡슐화이다. 캡슐화는 외부에서 알 필요가 없는 부분을 감춤으로써 대상을 단순화하는 추상화의 한 종류다. 객체는 자신이 어떤 데이터를 가지고 있는지를 내부에 캡슐화하고 외부에 공개해서는 안된다. 객체는 스스로의 상태를 책임져야 하며 외부에서는 인터..
-
@ConfigurationPropertiesScan 과 생성자 바인딩Spring/Spring Boot 2020. 12. 15. 00:35
기존 @ConfigurationProperties application.properties에 여러 값들을 정의해 놓고 원하는 클래스에서 바인딩을 받고 싶다면 다음과 같이 프로퍼티 설정파일에 값을 이용하려면 @ConfigurationProperties 와 @Component를 통해서 선언해주었어야 했다. 혹은 다음과 같이 @EnableConfigurationProperties에 바인딩 받는 클래스를 모두 적어주어야 됐다. 실제 ApplicationRunner을 통해 확인해보면 값이 잘 바인딩된 것을 알수 있다. @ConfigurationPropertiesScan 스프링 부트 2.2 버전 이후 @ConfigurationPropertiesScan이 등장했다. 기존과 달리 @ConfigurationPropert..
-
application.properties 란?Spring/Spring Boot 2020. 8. 29. 19:21
resources 디렉터리 밑에 있게 되는 application.properties 나 application.yaml 파일은 스프링 부트가 자동으로 로딩하게 되는 규약들이다. 이러한 프로퍼티들을 사용하는 방법은 여러 가지이며 각 사용마다 우선순위가 다르므로 오버 라이딩될 수도 있다. 다음은 프로퍼티에 우선순위이다. 1. 유저 홈 디렉터리에 있는 spring-boot-dev-tools.properties 2. 테스트에 있는 @TestPropertySource 3. @SpringBootTest 애노테이션의 properties 애트리뷰트 4. 커맨드 라인 아규먼트 5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로퍼티)에 들어있는 프로퍼티 6. ServletConfig 파라미터 7...
-
ThreadLocal 과 SpringSecuritySpring/Spring 2020. 8. 9. 14:54
ThreadLocal Java.lang 패키지에서 제공하는 스레드 범위 변수이다. 스레드 수준의 데이터 저장소로써 같은 스레드 내에서만 공유한다. 따라서 같은 스레드라면 해당 데이터를 메서드 매개변수로 넘겨줄 필요가 없게 된다. 클래스에서 한 변수를 선언한다면 해당 변수의 scope은 해당 클래스가 될 것이다 메서드 안의 변수의 scope은 해당 메서드가 될 것이다. ThreadLocal에서 변수의 scope은 Thread가 되며 한 스레드 내에서 변수를 공유한다. 요청이 한 쓰레드내에서 사용된다면 파라미터로 전달하지 않아도 된다. 1. 가져온 유저의 정보를 ThreadLocal을 통해 setAccount에 저장해보자. 2. SpringSecurityContextHolder에는 Authentication..
-
AuthenticationManager와 AuthenticationSpring/Spring 2020. 8. 9. 03:05
SecurityContextHolder는 Authentication을 담고 있는 곳이며 실제 Authentication을 만들고 인증을 처리하는 인터페이스는 AuthenticationManager이다. AuthenticationManager는 authenticate라는 메서드만을 가지며 여기서 authentication은 유저가 입력한 username, password 등의 인증정보를 담고 있다. 유효한지 확인 후 UserDetailsService가 return 한 객체를 Principal로 담고 있는 Authentication 객체를 return 해준다. 실제 이러한 인증의 구현체로 ProviderManager을 사용하게 된다. ProviderManager에 Debug을 걸어서 어떠한 과정으로 인증이 ..