![[Cloudflare] 가비아 NS -> Cloudflare로 전환](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FzU2zx%2FbtsPwvD3k9s%2FAAAAAAAAAAAAAAAAAAAAAM_1AaFCCj1vjIkCnDfD28u37vx5U3E9olyb4a2MbyzP%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DJDRczLqgYeO4S4z7SXRsfqOw8H8%253D)
서버 환경 ubuntu server - 24.04LTS 기존에 가비아에서 도메인을 샀기 때문에 가비아 네임서버를 이용했다.하지만 Cloudflare에서 제공하는 기능이 너무 좋아보여서 갈아타기로 결정했다. 간단하게 Cloudflare의 네임서버를 사용하면 아래의 이점이 있다.기본 DDoS 공격 방어무료 SSL 인증서 자동 발급빠른 DNS 속도실제 서버 IP 숨김(프록시 기능)GeoIP 기능 위와같이 프록시 상태가 되면 사용자는 원(origin)서버의 주소를 알 수 없게된다. 사용자의 요청은 Cloudflare의 서버를 거쳐서 원(origin)서버에 요청을 보내기 때문이다. Cloudflare 통해 HTTPS 강화Full(strict) 적용기본적인 Cloudflare TLS 기본 설정만 사용하면 보안적인 ..
![[QueryDSL] OpenFeign QueryDSL 기본 설정 및 사용법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FJCbPG%2FbtsPqJ8Hr9v%2FAAAAAAAAAAAAAAAAAAAAALK0Ch-FOWSZtJmGKVGbf0aRyBijzv8hG3ioDjWd2a1c%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3Di4awGdALkV9atSmmiGf%252Fo32bDPw%253D)
공식 QueryDSL은 사실상 유지보수 중단상태인것 같다...마지막 릴리스가 5.1로 이후 업데이트가 없고 취약점 문제도 존재한다고 한다.OpenFeign의 QueryDSL은 25년 7월 기준 7.0까지 나온상태고 계속 유지보수가 이뤄지고 있는 것 같다.또한 기본적인 사용법과 API 정의는 거의 동일한것 같기 때문에 OpenFeign의 QueryDSL을 도입하기로 했다. 기본 설정build.gradle// QueryDSL 설정def queryDslVersion = "7.0" // 25년 7월 기준 가장 최신def querydslSrcDir = layout.buildDirectory.dir("generated/querydsl").get().asFile // build/generated/querydslta..
![[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%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DJ%252Br3ZOddupJNMJrB%252Fr6MaEdxz%252B8%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%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DY6hJP0kTD6TYABhCstKvX7I2xs8%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..
![[GitHub Actions] Self-Hosted Runner JDK 업그레이드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FPGkCu%2FbtsPeSD9I9c%2FAAAAAAAAAAAAAAAAAAAAAM8AfCAvtF3z59z7baVXSKPPF1b_CQ3Umb3bGYOMyH0x%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DLK4BOCckfS53zZmgIKUnS0z%252BxOg%253D)
서버 환경 : ubuntu-server 24.04 LTS 기존 테무린 jdk 17을 사용하다가 테무린 JDK 21로 업그레이드를 하기로 결정했다.# 시스템 업데이트 및 필요 패키지 설치sudo apt updatesudo apt install -y wget apt-transport-https gnupg# 올바른 방식으로 GPG 키 추가wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo gpg --dearmor -o /usr/share/keyrings/adoptium-archive-keyring.gpg# 시스템 코드명 자동 감지하여 저장소 추가echo "deb [signed-by=/usr/share/keyrings/ado..
![[Redis] 스프링에 레디스 추가](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2F1Ey6Q%2FbtsOq8nDzFK%2FAAAAAAAAAAAAAAAAAAAAAOzkGNnKfLeJtL6p_Pjbg8Hw96hDcaUqaLOWuib4Eb4j%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DuxWMr2kJX4pdtkLxixosFjSptm4%253D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.스프링에 레디스를 도입해서 간단한 게시판 서비스의 조회 성능을 개선하는 코드 기본적인 애플리케이션 설정application.yml# local 환경spring: profiles: default: local datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true data: redis: host:..
![[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%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DHk2Cef1pICw1FRKaWmxX%252FMxmEek%253D)
CQRS는 CUD(Command)와 R(Query)를 분리하는 것이다.기존의 CRUD 서비스 구조는 보통 하나의 클래스나 API에서 create, read, update, delete 전부 처리한다.CQRS는 이를 명확히 나눠서,Command (명령): create, update, deleteQuery (조회): read이 두 가지를 서로 다른 책임으로 나누는 패턴이다. CQRS 패턴을 도입하는 이유역할이 다르기 때문Command는 상태를 바꾸는 작업.Query는 상태를 읽기만 함. 성능 최적화 가능예를 들어 Command는 트랜잭션 안전성과 정합성 위주로, Query는 빠르게 결과만 제공하도록 설계할 수 있다. 코드 유지보수 편리로직이 복잡해질수록 읽기와 쓰기를 분리하는 게 유리하다. CQRS는 단순히..
![[Github Actions] 기본 문법과 배포 자동화 방법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FV9vtv%2FbtsOoeQNQkb%2FAAAAAAAAAAAAAAAAAAAAAAA-56xPMtWYbdYNzefSYyvnY68iKG5J0uCpUa1Vjoug%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3Dy1JK1oS3zdIdq0j%252Bb%252BmpXk4IqvE%253D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.기본 문법GitHub Actions에서 가장 중요한 파일은 deploy.yml인데, 이 파일의 위치는 git으로 관리되는 최상위 루트의 .github/workflows/ 폴더에 저장되어 있어야 한다.-> 최상위루트/.github/workflows/deploy.yml(deploy.yml 의 이름은 변경해도 상관없다.)# Workflow의 이름# Workflow : 하나의 yml 파일을 하나의 Workflow라고 부른다. name: Github Actions 실행시켜보기# Event : 실행되는 시점을 설정# main이라는 브랜치에 push 될 때 아래 Workflow를 실행on: push: branches: ..