728x90

전체 글 362

[JPA] fetch join과 카르테시안 곱

JPA와 Hibernate를 사용할 때, 연관된 엔티티를 효율적으로 가져오기 위해 흔히 Fetch Join을 사용합니다. 그러나 Fetch Join을 잘못 사용할 경우 예상치 못한 문제가 발생할 수 있습니다. 이번 글에서는 Hibernate 공식 문서를 기준으로 이러한 문제들을 명확히 분석하고 올바른 해결법을 제시합니다.🔥 Fetch Join과 카르테시안 곱다음과 같은 엔티티가 있다고 가정합시다.@Entitypublic class A { @Id private Long id; @OneToMany(mappedBy = "a", fetch = FetchType.LAZY) private List bList = new ArrayList(); @OneToMany(mappedBy = "a"..

JVM/JPA 2025.04.03

[Keycloak] 어드민 API 호출 권한, 사용자에게 직접 부여하기

이번 글에서는 Keycloak의 Admin API 호출 권한을 클라이언트가 아닌 개별 사용자에게 직접 부여하는 방법을 정리합니다. 일반적으로 권한은 클라이언트에 설정되지만, 특정 사용자만 API 호출 권한을 갖게 하려면 직접 사용자에게 역할을 부여해야 합니다.목표 시나리오특정 사용자가 Keycloak Admin API 호출에 필요한 권한을 직접 갖도록 설정예를 들어, 특정 관리자가 직접 사용자 정보 조회 및 그룹 조회 등의 API를 호출할 수 있게 설정왜 사용자에게 직접 역할을 부여하는가?장점 설명세부 권한 관리특정 사용자에게만 정교하게 권한 부여임시 권한 부여 가능긴급 상황 등 일시적으로 API 호출 권한 부여 가능최소 권한 원칙 준수클라이언트 전체가 아닌 특정 사용자에게만 제한적으로 권한 부여Keyc..

Keycloak 2025.04.01

[Nuxt] 빌드 후 동적 프록시 설정하기

이 글에서는 Nuxt 애플리케이션에서 빌드 후 런타임 환경 설정을 통해 외부 API로의 프록시를 구현하는 방법을 설명합니다.📌 왜 빌드 후 동적 프록시인가?Nuxt 프로젝트는 종종 빌드 환경과 운영 환경의 API 주소가 달라질 수 있습니다. 이때 빌드 후에도 쉽게 API의 엔드포인트를 변경하기 위해 런타임 시 프록시 설정을 활용할 수 있습니다.Nuxt 서버 라우트 설정하기아래와 같이 서버 라우트를 설정하여, 모든 /spring 경로의 요청을 동적으로 지정된 API로 프록시할 수 있습니다.예시 코드 (server/routes/spring/[...].ts)export default defineEventHandler(async (event) => { const config = useRuntimeConfig..

Javascript/NuxtJS 2025.03.26

[Keycloak] Spring Boot Resource Server 연동하기

이 글에서는 Keycloak 26과 Spring Boot 기반의 리소스 서버 간의 JWT 연동 방법을 설명합니다. 특히, 리소스 서버가 Keycloak에 클라이언트로 별도 등록되지 않고도 JWT를 검증하는 방법, JWT 파싱 컨버터 설정 및 기본 보안 설정을 다룹니다.리소스 서버는 Keycloak에 클라이언트로 등록될 필요가 없습니다.JWT의 iss 클레임과 리소스 서버의 issuer-uri 설정이 정확히 일치해야 합니다.리소스 서버는 {issuer-uri}/protocol/openid-connect/certs를 통해 JWT 파싱을 위한 컨버터 설정이 필요합니다.간단한 Security 설정을 진행합니다.Spring Boot 프로젝트 의존성 설정Gradle 설정 예시 (build.gradle.kts)dep..

Keycloak 2025.03.26

[Keycloak] JWT에 Custom 스코프 추가하기

이 글에서는 최신 버전인 Keycloak 26을 기준으로 JWT에 사용자가 소속된 그룹 정보를 {id, name} 형태로 추가하기 위한 Client Scope 설정 및 Custom Mapper를 구현하는 방법을 자세히 다룹니다.1. 요구사항 정의Keycloak에서 발급한 JWT의 Payload에 사용자가 속한 그룹의 id와 name 정보를 배열 형태로 추가합니다.예상되는 Payload 구조:{ "sub": "12345678-1234-1234-1234-123456789abc", "preferred_username": "johndoe", "group_info": [ {"id": "group-1-id", "name": "Admins"}, {"id": "group-2-id", "name": "U..

Keycloak 2025.03.26

[DevOps] Slack으로 서버 디스크 사용량 알림 받기

서버 관리 시 중요한 지표 중 하나가 디스크 사용량입니다. 이번 글에서는 간단한 Bash 스크립트를 이용해 디스크 사용량을 체크하고, Slack을 통해 실시간으로 알림을 받는 방법을 소개합니다.1. Slack에서 Incoming Webhook 설정Slack 워크스페이스에서 Slack API에 접속해 새로운 앱을 생성하거나 기존 앱을 선택합니다.'Incoming Webhooks' 기능을 활성화하고 새로운 Webhook URL을 생성합니다.생성된 Webhook URL은 다음과 같은 형태입니다.https://hooks.slack.com/services/TXXXXX/BXXXXX/XXXXXXXX이 URL은 추후 스크립트 작성 시 사용할 예정입니다.2. 디스크 사용량 체크 스크립트 작성스크립트를 /usr/local..

DevOps 2025.03.25

EditorConfig란 무엇일까?

팀 단위로 개발하거나 여러 환경에서 개발할 때 코드 스타일이 제각각이라면 매우 번거로울 수 있습니다. 이런 문제를 해결하기 위한 간단하면서도 강력한 도구가 바로 EditorConfig입니다.EditorConfig는 IDE와 에디터가 일관된 코딩 스타일을 유지할 수 있도록 지원하는 설정 파일입니다. 이를 통해 개발자 간 코드 스타일을 통일하고 불필요한 코드 리뷰나 스타일 수정 시간을 크게 줄일 수 있습니다.EditorConfig 파일 작성하기프로젝트 루트 디렉터리에 .editorconfig라는 파일을 생성합니다.아래는 JavaScript, TypeScript, Vue 파일에 대한 기본 설정 예시입니다.[*.{js,jsx,ts,tsx,vue}]indent_style = spaceindent_size = 1t..

카테고리 없음 2025.03.17

[Nuxt3] NextAuth, keycloak 연동

NextAuth.js는 OAuth 2.0 및 OpenID Connect(OIDC) 제공자와의 복잡한 인증 과정을 추상화하여 간편하게 설정할 수 있도록 지원하는 라이브러리입니다. 이 글에서는 Nuxt 3 환경에서 Keycloak과 NextAuth.js를 연동하면서, 실제로 구현한 내용을 바탕으로 세부 동작을 설명합니다.https://auth.sidebase.io/ NuxtAuth | Authentication for Nuxt 3User authentication and sessions via authjsauth.sidebase.ioNextAuth.js 인증 단계NextAuth의 역할자동 여부로그인 버튼 클릭 (클라이언트에서 signIn() 호출)🔹커스텀 화면 사용시 개발자 구현NextAuth 랜딩 화면 ..

Javascript/NuxtJS 2025.03.16
728x90