Coding 91

[팔레트] 스프링 시큐리티와 Refresh Token 제대로 알고 사용하기

이번에 새로운 프로젝트에 참여하게 되면서 사용자 도메인을 담당하게 되었다. 맡은 주요 역할은 바로 Spring Security 기반의 인증(Authentication)과 인가(Authorization) 구현이었다. Spring Security는 워낙 방대한 프레임워크라서 처음부터 쉽지만은 않았다. 적용하면서 많은 오류가 발생했고, 굳이 내가 Spring Security를 써야하나? 하고 고민되는 부분도 많았다. 결론적으로 인증과 인가에 대한 흐름은 Spring Security가 전담하고,각종 사용자 액션(회원가입/로그인 등)은 Spring MVC 기반의 컨트롤러에서 처리하도록 분리했다. 인증과 인가를 담당하면서 여러 기술에 대해 트레이드오프를 고민했고, 더 나은 선택을 하기 위해 수많은 고민을 거쳤다. ..

[토비의 스프링 3.1 Vol 1] 07장.스프링 핵심 기술의 응용

7.1 빈 스캐닝과 자동 와이어링7.1.1 @Autowired를 이용한 자동와이어링@Autowired는 자동와이어링 기법을 이용해서 조건에 맞는 빈을 찾아 자동으로 수정자 메소드나 필드엔 넣어준다. 컨테이너가 자동으로 주입할 빈을 결정하기 어려운 경우, 직접 프로퍼티에 주입할 대상을 지정하는 방법을 병행하면 된다. 단순히 필드에 값을 저장하는 수정자 메소드라도 @Autowired를 필드에 직접 부여했다고 메소드를 생략하면 안 되는 경우가 있다. 스프링과 무관하게 직접 오브젝트를 생성하고 다른 오브젝트를 주입해서 테스트하는 순수한 단위 테스트를 만드는 경우에는 수정자 메소드가 필요하다. 7.1.2 @Component를 이용한 자동 빈 등록@Component가 붙은 클래스는 빈 스캐너를 통해 자동으로 빈으로..

[Real MySQL 8.0 V1] 09장. 옵티마이저와 힌트

이번 장에서는 MySQL 서버가 사용자의 요청을 처리하기 위해 데이터를 가공하는 기본 절차와 빠른 성능을 보장하기 위해 수행하는 최적화에 대해 살펴본다.9.1 데이터 처리9.1.1 쿼리 실행 절차MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나눌 수 있다.사용자로부터 요청된 SQL 문장을 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다.SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.-> 최적화 및 실행 계획 수립 단계두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.9.1.2 풀 테이블 스캔과 풀 인덱스 스캔MySQL 옵티마이저는 다음과 같은 조..

[내일배움캠프] QueryDSL

1. QueryDSL이란?QueryDSL은 미리 컴파일된 Q타입 클래스를 사용하여 타입 안전한 JPQL 쿼리를 동적으로 생성하는 기술이다. JPQL은 JPA의 쿼리 언어로, 데이터베이스에서 JPA 엔티티를 조회하거나 조작하는 데 사용된다. QueryDSL은 JPQL을 더 안전하고 유연하게 작성할 수 있도록 타입 안전한 메커니즘을 제공한다.2. Q타입 클래스란?Q타입 클래스는 JPA 엔티티의 메타모델로, 쿼리의 필드명과 타입을 컴파일 타임에 체크할 수 있게 도와준다. 이를 통해 오타나 잘못된 필드명이 있을 경우, 컴파일 타임에 오류를 잡을 수 있다. 또한, Q타입 클래스는 동적 쿼리를 포함한 쿼리를 더 유연하게 작성할 수 있도록 하는 여러 메소드들을 제공한다. 즉, QueryDSL가 JPQL를 작성하기 ..

Coding/Server 2025.05.14

[알고리즘 TIL] Q3190(자료구조)

문제https://www.acmicpc.net/problem/3190트러블 슈팅1. 뱀의 꼬리 저장 - Queue 자료구조 이용처음에는 단순히 뱀의 머리 위치만 관리하며 이동했지만, 사과를 먹을 때는 꼬리가 움직이지 않아야 하며, 사과를 먹지 않으면 꼬리가 한 칸 줄어들어야 한다. 따라서 머리뿐만 아니라 꼬리까지 추적해야함을 깨달았고, 이를 위해 뱀의 꼬리를 저장하는 변수를 따로 선언했다. 그리고, 뱀의 꼬리는 매번 이전 꼬리의 사방을 확인하여 뱀의 몸통이 있는 좌표를 꼬리로 갱신하였다.for (int i = 0; i 하지만 이전 꼬리의 사방 중 뱀의 몸통이 단 하나라는 보장이 없어서 오류가 난다. 큐를 이용해 뱀의 몸통을 저장하면, 큐에서 poll하여 뱀의 꼬리를 간단하게 관리할 수 있게 된다.머리를..

Coding/알고리즘 2025.05.12

[알고리즘 TIL] Q1986(구현)

문제https://www.acmicpc.net/problem/1986트러블 슈팅1. 배열 인덱스 접근 시 조건 순서 문제퀸의 위협 영역을 구현할 때, 아래와 같은 코드에서 ArrayIndexOutOfBoundsException이 발생했다.while (!board[i - count][j].equals("Pawn") && i - count >= 0)여기서 i - count가 음수인 상태에서 배열 접근이 먼저 실행되었기 때문에 런타임 오류가 발생했다. 조건 순서를 반드시 인덱스 유효성 검사 → 배열 접근 순으로 바꿔야 한다.while (i - count >= 0 && board[i - count][j].equals("Safe")) { ...} 2. 나이트 이동 구현 중 조건문 반복 → 방향 배열로 리팩토..

Coding/알고리즘 2025.05.11

[내일배움캠프] Spring Security + OAuth 2.0

1. Spring Security란?Spring Security란 Spring 기반 애플리케이션의 보안을 담당하는 프레임워크이며, 인증, 인가, CSRF, 세션 관리, 비밀번호 암호화 등 다양한 기능을 제공하고 있다. Spring Security는 기본적으로 Servlet Filter 기반으로 동작하며, FilterChainProxy를 통해 보안 관련 필터들을 순차적으로 적용한다. Spring Security가 강력한 이유는 Spring Security가 제공하는 아키텍처 위에서 개발할 경우 내가 크게 노력하지 않아도 객체지향이 녹여진 코드 작성이 가능하다는 데에 있다. 따라서 Spring Security를 쓸거면 반드시 아키텍처에 대한 확실한 이해를 가지는 게 필수다.1-1. Spring Securit..

Coding/Server 2025.05.11

[알고리즘 TIL] Q1697(BFS)

문제https://www.acmicpc.net/problem/1697트러블 슈팅1. visited 타입 선택처음에는 방문 여부를 판단하기 위해 ArrayList를 사용했고, .contains()로 중복 방문을 방지했다. 하지만 contains()는 내부적으로 선형 탐색을 수행하기 때문에 시간 복잡도는 O(N) 이다. 입력 범위가 0부터 100,000까지인 이 문제에서 결국 시간 초과가 발생했다.boolean[] visited = new boolean[100001];처럼 배열을 활용하면 O(1)로 즉시 방문 여부를 확인할 수 있어, 훨씬 효율적인 BFS 구현이 가능하다. 2. 좌표 범위 조건 누락문제에서는 0 ≤ K ≤ 100000이라는 명확한 좌표 범위 제한이 있었지만,처음에는 이를 코드에 명시하지 않아..

Coding/알고리즘 2025.05.09

[알고리즘 TIL] Q1347(구현)

문제https://www.acmicpc.net/problem/1347트러블슈팅1. 90도 회전 공식미로 안에서 "R"(오른쪽) 또는 "L"(왼쪽) 명령에 따라 캐릭터의 이동 방향을 회전시켜야 했다. 나는 현재 방향을 (dy, dx) 형태의 2차원 벡터로 관리하고 있었고, 처음에는 동서남북 각각의 방향마다 +1, -1 연산이 다 달라서, "회전은 규칙 없이 분기문으로만 처리해야 하나?" 라는 고민을 했다. 하지만 알고 보니, 2차원 벡터를 기준으로 명확한 회전 공식이 존재했다.//시계 방향 90도 회전(dy, dx) → (dx, -dy)//반시계 방향 90도 회전(dy, dx) → (-dx, dy)이 공식을 적용하면, 각 방향을 기준으로 분기 처리할 필요 없이 간단하게 한 줄로 방향 회전이 가능해졌다. 2..

Coding/알고리즘 2025.05.08

[알고리즘 TIL] Q1063(구현)

문제https://www.acmicpc.net/problem/1063트러블슈팅 1. 위치 이동 로직의 구조화처음에는 명령어 하나하나에 대해 일일이 조건을 분기해 위치를 직접 이동시켰다. 하지만 체스판처럼 상하좌우, 대각선 등 이동 방향이 고정된 경우, dx, dy 배열을 활용하면 코드를 훨씬 간결하고 직관적으로 만들 수 있다.이 방식은 실수를 줄여줄 뿐만 아니라, 방향 추가나 수정이 필요할 때도 유지보수가 훨씬 쉬워진다. 2. 예외 처리이 문제의 핵심은 다양한 예외 상황을 순서에 맞게 처리하는 것이었다. 처음엔 "킹을 먼저 이동시키고 → 이동 후 돌과 위치가 겹치면 → 돌도 이동한다"는 순서로 구현했지만, 이 방식에는 한 가지 큰 문제가 있었다.만약 돌이 경계를 넘어 이동할 수 없는 상황인데도 킹은 이동..

Coding/알고리즘 2025.05.07