![[Spring] Soft Delete(@SQLDelete, @SQLRestriction, @SoftDelete)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FboWLKW%2FbtsPre8nyUj%2FAAAAAAAAAAAAAAAAAAAAAJV140OUUofdmS-ejVyoA-G__Utn-zNgmkJVvbHA4--O%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DX2xi2xPTyHT%252FMgDMJU8K6Rs0swI%253D)
Soft Delete VS Hard DeleteSoft Delete와 Hard Delete는 데이터 삭제 방식을 구분하는 개념이다.Soft Delete: 데이터를 물리적으로 삭제하지 않고, 삭제 여부를 나타내는 플래그(예: is_deleted, deleted)로 표시만 하는 방식 Hard Delete: 데이터를 DB에서 완전히 제거(DELETE) 하여 복구 불가능하게 만드는 방식 Soft DeleteSoft delete는 삭제 여부를 판단할 수 있는 컬럼을 추가해 데이터가 삭제되었는지, 아닌지에 대한 값을 넣어서 표시한다.삭제 할 데이터가 추후에 조회해야 하거나, 실수로 삭제했을 시 복원 가능해야 하는 중요한 도메인일 경우에 사용한다.UPDATE Users SET deleted = true WHERE i..
![[Spring Security] @Secured,@PreAuthorize, @PostAuthorize](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FcZF5DR%2FbtsPnyfxUrB%2FAAAAAAAAAAAAAAAAAAAAAJ0pptjz_luP9knd74W15XaSo2Cmvhh_FbT0Og71KxK5%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DYrLIiQ5sQ0DYkzw7otSXneK2MjI%253D)
@Secured,@PreAuthorize, @PostAuthorize활성화 설정@Configuration@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true) // 중요public class SecurityConfig {@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true)SecurityConfig 파일에 해당 애노테이션을 적용해야 @Secured,@PreAuthorize, @PostAuthorize 이 애노테이션들을 사용할 수 있다.@PreAuthorize만 사용할꺼면 @EnableMet..
![[Spring] CQRS 패턴](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbGK14c%2FbtsOqeaLI7s%2FAAAAAAAAAAAAAAAAAAAAAEQoJr5B5-I9Ssb2qt_A6oOQ8TGHqm-UbSay4OadBUs5%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3D4i2QkS30Ecg%252FDKms%252FfkiEpFVhhI%253D)
CQRS는 CUD(Command)와 R(Query)를 분리하는 것이다.기존의 CRUD 서비스 구조는 보통 하나의 클래스나 API에서 create, read, update, delete 전부 처리한다.CQRS는 이를 명확히 나눠서,Command (명령): create, update, deleteQuery (조회): read이 두 가지를 서로 다른 책임으로 나누는 패턴이다. CQRS 패턴을 도입하는 이유역할이 다르기 때문Command는 상태를 바꾸는 작업.Query는 상태를 읽기만 함. 성능 최적화 가능예를 들어 Command는 트랜잭션 안전성과 정합성 위주로, Query는 빠르게 결과만 제공하도록 설계할 수 있다. 코드 유지보수 편리로직이 복잡해질수록 읽기와 쓰기를 분리하는 게 유리하다. CQRS는 단순히..
![[Spring Boot 핵심원리와 활용] 사용자 정의 메트릭](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FrvNvJ%2FbtsNS3t6q4a%2FAAAAAAAAAAAAAAAAAAAAANaUNe4lrOg0TPtiwZ0neqm4bDaFkC_X_GKeTkqVdYeL%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DPuztxsUS6uO%252F0h4DhdPsBvKIDSU%253D)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.MeterRegistry마이크로미터 기능을 제공하는 핵심 컴포넌트스프링을 통해서 주입 받아서 사용하고, 이곳을 통해서 카운터, 게이지 등을 등록한다.MeterRegistry는 마이크로미터(Micrometer)에서 모든 메트릭(Counter, Gauge, Timer 등)을 등록하고 관리하는 중심 객체이다.Spring Boot에서는 MeterRegistry를 빈(bean)으로 자동 주입받아 사용할 수 있으며, 이 객체를 통해 커스텀 메트릭을 생성하거나 값을 기록할 수 있다. 카운터(Counter)Counter(카운터)단조롭게 증가하는 단일 누적 측정항목 (단일 값, 보통 하나씩 증가)누적이므로 전체 값을 포함(to..
![[Spring Boot 핵심원리와 활용] 마이크로미터, 프로메테우스, 그라파나](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FrNG6e%2FbtsNSMMzAYK%2FAAAAAAAAAAAAAAAAAAAAAMRHZa9gFbY9a7XWVFQRiIDL1e51PjsOI39xNP5h_nKc%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DEyILm9FoDJginuZTLmDhHvupGJA%253D)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.마이크로미터세상에는 수 많은 모니터링 툴이 있고, 시스템의 다양한 정보를 이 모니터링 툴에 전달해서 사용하게 된다.모니터링 툴이 작동하려면 시스템의 다양한 지표들을 각각의 모니터링 툴에 맞도록 만들어서 보내주어야 한다.그런데 중간에 사용하는 모니터링 툴을 변경하면 기존에 측정했던 코드를 모두 변경한 툴에 맞도록 다시 변경해야 한다.개발자 입장에서는 단순히 툴 하나를 변경했을 뿐인데, 측정하는 코드까지 모두 변경해야 하는 문제가 발생한다.이런 문제를 해결하는 것이 바로 마이크로미터(Micrometer)라는 라이브러리이다. 다양한 메트릭마이크로미터와 액츄에이터가 기본으로 제공하는 다양한 메트릭은 아래와 같다.JVM ..
![[Spring Boot 핵심원리와 활용] 액츄에이터(Actuator)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FnbLis%2FbtsNSaApJzn%2FAAAAAAAAAAAAAAAAAAAAAOgyz0pveh-JXN4X42GNirKsyemh0X9B0hF7acX_R2tw%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DEP2BT%252FDCu%252BaSLayo0crymUeD1%252F4%253D)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.액츄에이터를 사용하려면 스프링부트 의존성에 다음과 같이 추가해야한다.build.gradledependencies { implementation 'org.springframework.boot:spring-boot-starter- actuator' // actuator 추가} 의존성을 추가하고 /actuator 경로로 접근하면 액츄에이터에 접근할 수 있다.http://localhost:8080/actuator 액츄에이터의 모든 기능을 웹에 노출하려면 application.yml에 아래와 같이 작성하면 된다.application.ymlmanagement: endpoints: web: exposur..
![[Spring Boot 핵심 원리와 활용] 외부 설정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FpyMD5%2FbtsNJH6QG2Z%2FAAAAAAAAAAAAAAAAAAAAAAiQtjrZ24_panvtW9Vyca-wcmz38c3Dj6JzPrXdMRPJ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DzIYvNPWqLY3fsD9aI%252BQ50TyoI%252Fg%253D)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.외부 설정이란 애플리케이션을 실행할 때 필요한 설정값을 외부에서 불러와서 전달하는 것을 의미한다.외부 설정은 일반적으로 다음 4가지 방법이 있다.OS 환경 변수: OS에서 지원하는 외부 설정, 해당 OS를 사용하는 모든 프로세스에서 사용자바 시스템 속성: 자바에서 지원하는 외부 설정, 해당 JVM안에서 사용자바 커맨드 라인 인수: 커맨드 라인에서 전달하는 외부 설정, 실행시 main(args) 메서드에서 사용외부 파일(설정 데이터): 프로그램에서 외부 파일을 직접 읽어서 사용 스프링 통합커맨드 라인 옵션 인수, 자바 시스템 속성, OS 환경변수는 모두 외부 설정을 key=value 형식으로 사용할 수 있는 방법..
![[Spring Boot 핵심 원리와 활용] 자동 구성 라이브러리 제작 및 사용](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FcwSsvf%2FbtsNIM8HBg6%2FAAAAAAAAAAAAAAAAAAAAAA3CdSxeR81T4zAzbxhjOasjGuslybRXQiC7eZf2_RCp%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3Dnhj7SzpWu8APd%252FE%252FvESJWLfCZmM%253D)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다. package memory;import org.springframework.boot.autoconfigure.AutoConfiguration;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.context.annotation.Bean;@AutoConfiguration@ConditionalOnProperty(name = "memory", havingValue = "on")public class MemoryAutoConfig { @Bean public MemoryCon..