- Django
- select
- static
- SSL
- 스프링
- sql
- join
- spring boot
- 스프링부트
- PYTHON
- string
- springboot
- 1차원 배열
- 프로그래머스
- 자바
- mysql
- spring
- java
- jpa
- Docker
- spring mvc
- spring security 6
- hibernate
- 데이터베이스
- nginx
- @transactional
- 문자열
- ORM
- AWS
- DI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
목록분류 전체보기 (191)
개발하는 자몽
Notice 이 글은 개인적으로 읽기 편하라고 개인 노션에 막 정리한 글을 공유한 것입니다. 스스로가 정리한 것을 까먹지 않기 위함... 배경 Hexagonal Architecture인지 포트 어댑터 패턴인지... 여러 개념들이 등장해서 어딘가 적어두면서 생각하지 않으면 이해하기가 너무 어렵다.그래서 라인에서 작성한 글을 메인으로 잡고 잘 모르는 개념을 검색하며 노션에 막! 정리했다. https://www.notion.so/Hexagonal-Port-Adapter-22ee4ff26d86807497cbe5ddd763765d?source=copy_link 후기살짝 프로젝트 적용해 보면서 느낀 점은 우선... 다 좋은데 코드 작성량이 정말 많이 많아진다. 필요한 무언가가 있으면 이걸 위해서 작성해야 하는 코드..

스프링 시큐리티는 `@AuthenticationPrincipal` 애노테이션을 제공한다. 이는 `Authenticaiton.getPrincipal()`를 메서드 인자로 가져오는 데 사용되며, 보통은 `UserDetails` 타입이나 해당 타입의 커스텀 구현체로 가져오게 된다. `Authentication.getPrincipal()`에는 username, password(AuthenticationManager 구현에 따라 없을 수 있음), role과 같은 사용자 정보가 담겨있다. 간단하게 해당 애노테이션을 그대로 사용해도 되지만, 더 편리하게 사용할 수 있다. 이는 공식문서에서도 안내하고 있다. 실제로 구현해 보자. 여기서는 커스텀 애노테이션 이름을 `@CurrentUser`로 설정했다.import ..

📌 Spring Security 6.5.0 기준 작성 로그인을 구현할 때 보통 JWT를 많이 사용하는데, 이번에는 세션 기반으로 구현했다. 일단... JWT를 사용하여 로그인과 로그아웃을 구현하면 신경 쓸 것이 꽤 많다. 특히 로그아웃이 복잡한 것 같다. 사용자 인증을 위한 액세스 토큰(Access Token) 및 액세스 토큰 재발급을 위한 리프레시 토큰(Refresh Token) 생성요청 시 사용된 토큰이 유효한지 검증(만료, 변조 여부 등)로그아웃을 해도 액세스 토큰의 만료기간이 남아있다면 재사용 가능 → 이를 막기 위해 로그아웃 시 해당 액세스 토큰을 블랙리스트(저장소)에 저장 블랙리스트 저장소에 대한 액세스 속도를 높이기 위해 보통 Redis와 같은 인메모리 DB를 사용한다.한 번은 블랙..
평소에 SQLite는 테스트용으로만 사용하고 실제로는 잘 사용하지 않는데, 설치가 불필요한 로컬 RDB가 요구되는 프로젝트를 진행하게 되어 SQLite를 사용하기로 했다. 타입 종류SQLite는 대표적인 RDBMS인 MySQL이나 PostgreSQL 등과 달리 데이터 타입이 매우 적다. 다음은 SQLite에서 제공하는 storage class이다. TEXT : 데이터베이스 인코딩(UTF-8, UTF-16BE or UTF-16LE)을 사용하여 저장된 텍스트 문자열INTEGER : 값 크기에 따라 0, 1, 2, 3, 4, 6, 8 바이트로 저장되는 정수(signed integer)REAL : 8 바이트 IEEE 부동 소수점 숫자로 저장되는 부동 소수점 값BLOB : 입력 그대로 저장되는 데이터 NULL :..

근래 FastAPI + PostgreSQL 조합으로 백엔드 개발을 진행하고 있다. 프론트엔드에서 API를 가져다 쓰려면 배포를 해야 하므로 처음에는 AWS의 EC2나 Lambda, Elastic Beanstalk을 고려했다. (고려하면서 좀 찾아봤는데 셋 다 목적이 달라서 어쩌다 보니 공부하게 된건 덤) 백엔드 개발 규모가 그리 크지 않아서 AWS를 사용하는 건 부담스럽게 느껴졌다. 그렇게 다른 플랫폼을 찾다 보니 Render를 선택했다. 사실 전에 Java(SpringBoot)도 가능하다는 말을 어디선가 봐서 도전했다가 안 좋은 감정만 남았던 기억이 있는데, 사용 후기가 꽤 있는 Python은 뭔가 다를지도 몰라! 하는 기대감으로 도전했다. Render는 여타 다른 클라우드 플랫폼이 그렇듯 여러 플랜과..

보통 백엔드 개발 시 주로 스프링 부트를 사용하는데, 파이썬을 사용하는 AI 엔지니어와 협업할 때 호환성이 좋지 않았다. 그래서 AI 엔지니어와 협업할 때만 사용할, 스프링 부트를 대체할 파이썬 기반 백엔드 프레임워크 사용을 계속 고민해 왔다.인증이나 주된 기능은 스프링 부트로 처리하되 AI 프로그램에서 넘어오는 데이터를 처리하고 API로 전달하는 용도로 쓰고자 했다. 따라서 비교적 무거운 Django를 제외하고 Flask와 FastAPI 중에서 고민했다. 이전에 사용해 본 Flask는 Java로 백엔드 개발하는 것과 비슷한 부분이 있어서 끌렸는데, FastAPI는 Flask와 동일하게 API나 마이크로서비스 개발 등에 적합하며 API 문서 자동화를 지원한다고 한다! API 문서 자동화 지원은 사용할 ..

RDS MySQL를 사용하는 프로젝트에서 시간대가 맞지 않음을 알게 되었다. 타임존 설정을 까먹은 것...! 해당 DB 인스턴스의 설정을 바꾸는 일이므로 DB 파라미터 그룹을 새로 생성하여 수정하기로 했다. DB 파라미터 그룹DB 파라미터 그룹은 하나 이상의 DB 인스턴스에 적용되는 구성 값의 모음이다. DB 파라미터 그룹을 지정하지 않고 DB 인스턴스를 만드는 경우 DB 인스턴스에서는 기본 DB 파라미터 그룹을 사용한다. 기본 DB 파라미터 그룹 설정은 수정할 수 없으므로 새 파라미터 그룹을 생성해야 한다. 그리고 원하는 파라미터 설정을 변경하고, DB 인스턴스나 DB 클러스터를 수정하여 새로 생성한 파라미터 그룹을 연결하면 된다. AWS 콘솔로 들어가서 파라미터 그룹을 생성하자. 설정하기..

Spring 환경에서 STOMP 프로토콜을 사용하여 일대일 실시간 채팅을 구현해야 하는 일이 있었는데, 잘 알지도 못하고 설정에 SockJS 활성화를 추가했다. 클라이언트인 Flutter는 `StompClient` 라이브러리와 `ws` 프로토콜로 서버에 연결 요청을 시도했으나 계속 실패했다. 개발 시간이 촉박해서 제대로 STOMP와 SockJS에 대해 공부하지 않았던 탓에 계속 오류를 뿜어댔다... 아래는 Flutter에서 Spring 서버로 연결 시도 시 실패했던 Spring, Flutter 코드이다. Spring Boot 3.4.1@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMess..
if코틀린의 `if`문은 표현식(expression)으로, 아래와 같은 방식으로 변수에 값으로 할당될 수 있다. (삼항연산자를 풀어서 쓰는 느낌이다)fun main() { val a: Int = 100 val b: Int = 200 val c: Int c = if (a >= b) { a } else { b } println(c)} `null` 체크는 다음과 같이 할 수 있다. fun main() { val a: Int? = null if (a == null) { println("null check true") // print } else { println("a ..
요즘 스프링 개발 환경에서도 코틀린을 사용하는 경향이 꽤 보인다. 그래서 코틀린에 관심이 생겨서 찾아본 기본 문법! 변수 타입코틀린에는 `var`와 `val`라는 두 가지 형태의 변수가 존재한다.`var`: 초기화 이후에도 값 변경이 가능한 가변 변수`val`: 초기화 이후에는 값을 변경할 수 없는 불변 변수fun main() { var a = 1 a = 2 // 가변 변수이므로 값 변경 가능 val b = 1 b = 2 // 불변 변수이므로 에러 발생 var c: Int // 타입은 명시했으나, 초기화 하지 않은 상태 println(c) // 초기화 하지 않은 상태이므로 에러 발생 c = 1 // 초기화 println(c) // 1 출력}..