분류 전체보기 73

[Spring Security] 카카오 OAuth 로그인 구현하기

카카오 OAuth 간편 인증을 구현하는 과정을 차례대로 기록해 보겠습니다. OAuth2.0 기본 흐름OAuth란 "다른 서비스에 비밀번호를 알려주지 않고 내 정보를 제공하거나 인증을 맡기는 방법"이다. 이번 예제인 카카오 로그인 외에도 일반적인 OAuth2.0의 기본 흐름은 아래와 같다(네이버, 구글 등).사용자가 "카카오 로그인" 버튼 클릭 및 인증 진행카카오가 사용자에게 "동의 요청" 확인(이 사이트에 생년월일 정보를 제공해도 돼?)사용자 "동의"클릭시, 카카오는 사이트에게 인가 코드(Authorization Code) 전달사이트는 Authorization Code를 들고 카카오에 Access Token 요청카카오는 사이트에게 Access Token 전달사이트는 Access Token을 들고 카카오에..

Spring 2025.05.16

Springboot를 Docker Image로 생성 및 실행(Dockerfile)

Springboot 애플리케이션을 Docker Container로 실행하기 위해선우선 Docker Image로 만들어야 한다. 차례대로 기록해 보겠습니다. springboot 프로젝트 받기먼저 스프링부트 프로젝트를 initializr를 통해 생성하자. 아래 GENERATE 버튼을 클릭하면 간단하게 생성 완료. 의존성으로 Spring Web과 DevTools를 추가했습니다.controller 하나를 간단히 만들어서 서버가 정상적으로 동작하는지 확인해 봤습니다. 문제가 없다면 해당 부트 프로젝트를 docker image로 만들어보자. Dockerfile 만들기Dockerfile은 말 그대로 파일인데, Docker Image를 만들게 해주는 파일이다. 중요한 점으로 파일명은 꼭 'Dockerfile'이라고 ..

Container 2025.05.11

Docker Volume 개념 및 활용 예시

도커에서 컨테이너가 제거되면 내부에 저장되어 있던 데이터까지 함께 삭제되어 없어지는 문제가 있다.이를 방지하기 위해 개념인 볼륨(Volume)을 활용하여 MySQL 컨테이너를 실행해 보자.볼륨(Volume)을 활용해 MySQL 컨테이너 실행$ docker run -v C:\docker-workspace\mysql/mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql볼륨은 -v 옵션을 통해 설정이 가능하며, 사용법은 '-v [호스트의 폴더 절대경로]:[컨테이너의 폴더 절대경로]'이다(다른 옵션들의 의미는 여기에서 확인). 포인트는 아래와 같다. 별5개로 중요!!!🤩[호스트의 폴더 절대 경로]에 디렉토리가 이미 존재할..

Container 2025.04.28

Docker 명령어 사용 및 예시(nginx 설치&실행)

Docker를 이용하여 nginx를 실행해 보겠습니다.진행하면서 쓰이는 각각의 명령어에 대해서도 순서대로 정리해 봤습니다. 명령어를 통해 nginx 이미지 다운받기도커(Docker)가 실행되어 있는 상태에서 CMD 또는 PowerShell에 'docker pull nginx' 명령어만 실행하면 nginx를 설치할 수 있다. 이때 이미지를 다운로드받는다고 표현하는데, 여기서 우리는 nginx 이미지를 설치(pull)한 것이다. 이미지(Image)란 특정 프로그램을 실행하는 데 필요한 모든 정보(버전, 설정 등)를 포함한 것이라고 이해하면 된다. 추가적인 개념 내용은 여기에서 확인.$ docker pull nginxUsing default tag: latestlatest: Pulling from librar..

Container 2025.04.25

Docker Desktop 설치 및 확인

도커(Docker)를 Windows나 macOS 같은 데스크탑 환경에서 쉽게 사용할 수 있도록 도와주는 Docker Desktop 설치 및 실행 과정을 포스팅해 보려고 합니다. 설치 파일 다운로드도커 공식 문서 사이트에서 설치 파일을 받도록 하겠습니다. 화면을 조금 스크롤해서 내용을 읽어보면 WSL2 또는 Hyper-V 기반으로 Docker Desktop을 설치할 수 있다고 설명돼있다.컨테이너 기술은 리눅스 기능을 기반으로 만들어졌기 때문에 반드시 리눅스 커널이 필요하다. 하지만 윈도우는 당연하게도 자체적으로는 리눅스 커널을 제공하지 않는다. 따라서 Docker를 실행하기 위해선 리눅스 환경을 가상화해야 한다. 이를 위해 두 가지 방식이 있다. 첫째, '리눅스 커널을 포함한 경량 VM'인 WSL2를 활용..

Container 2025.04.17

@Bean, @Configuration, @ComponentScan, @Import 정리

우리가 애플리케이션을 만들기 위해서는"어떤 클래스의 오브젝트를 만들고 그들을 어떻게 연결할 것인가?"에 대한 정보가 필요하다.이 구성 정보를 스프링에게 전달하는 여러 가지 방법이 있는데,컨테이너 초기화 과정에서 빈을 동적으로 생성하도록 약속된 애노테이션들에 대해 알아보자. Bean을 등록시키는 중요 애노테이션1. @Bean@Configurationpublic class PaymentConfig { @Bean public PaymentService paymentService() { return new PaymentService(); }}@Bean 애노테이션이 붙어있는 메소드는 'Bean을 만드는 메소드'를 의미한다. 쉽게 return 되는 객체가 빈으로 등록된다고 이해하면 된다..

Spring 2025.03.19

Spring Batch와 직렬화 엑세스(ORA-08177) 오류 원인 및 해결

SQLException: ORA-08177: can't serialize access for this transactionSpring Batch 설정 중 '이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다.'는 에러가 발생했다. 결론부터 말하자면, 현재 애플리케이션의 트랜잭션 격리 수준이 직렬화(Serializable)로 설정되어 있는데, 이 규칙을 지키지 못해 발생한 에러이다. 여기서 '격리 수준'이란 트랜잭션 간의 동시성 문제를 해결하기 위한 규칙을 의미한다. 그중 Serializable 옵션은 한 트랜잭션이 특정 데이터를 읽는 동안, 다른 트랜잭션이 동일한 데이터에 접근/수정하는 것을 막기 위해 그 데이터에 잠금을 걸어 동시 접근을 방지한다. 따라서, 모든 트랜잭션이 마치 직렬로 실행되는 것처럼 ..

Spring 2024.12.14

[Spring Batch] ORA-00955 에러 해결하기

Spring Batch의 초기 구성을 설정하는 과정에서 여러 오류가 발생할 수 있다.이전 글에 이어 발생할 수 있는 ORA-0085 에러에 대해 알아보자. SQLSyntaxErrorException: ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [org/springframework/batch/core/schema-oracle10g.sql]: CREATE TABLE BATCH_JOB_INSTANCE ( JOB_INSTANCE_ID..

Spring 2024.12.12

[Spring Batch] Table "BATCH_JOB_INSTANCE" not found

Batch 프로젝트의 초기 Config를 구성하는 과정에서 로컬과 개발 서버에서는 정상적으로 동작하는데,이상하게 운영 서버에서 실행하면 에러가 발생했다.해결하는 과정에서 여러 에러를 마주쳤는데, 최대한 상기하며 정리해보겠습니다. BadSqlGrammarException [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]운영에 배포하기 전에 개발서버에서 정상 동작하는 것을 확인했었다. 그리고 에러 로그도 SQL Exception 관련 문제라고 말하지만 문제가 되는 테이블은 Spring Batch에서 관리하는 메타 테이블이기 때문에 mapper 쪽을 잘못 작성해서 발생한 문제는 아니다. 어쨌든..

Spring 2024.11.20

의존성 역전 원칙(DIP)과 인터페이스 소유권의 역전

'의존성 역전 원칙(DIP)'은 '의존성 주입'의 약자인 DI(Dependency Injection)와 비슷하게 생겼기에 유사한 개념이라고 혼동할 수 있다.연관이 아예 없는 것은 아니지만 어쨌든 ' SOLID'라고 객체지향 설계 원칙에서 제일 마지막에 등장하는 원칙인 'Dependency Inversion Principle' 과 이로 인해 생각해 볼 Spring Web MVC 구조에 대해서도 정리해 봤다. 의존성 역전 원칙(Dependency Inversion Principle) 이란?DIP의 정의는 아래와 같다. 이해하기 힘든 문장들을 코드와 함께 하나하나 파헤쳐 보자."상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다. 또한, 추상화는 구체적인 사항에 의존해서는..

Spring 2024.11.17