Contextlib
·
python
sqlalchemy 를 사용하여 세션을 얻고 트랜잭션을 여는 흔한 코드는 다음과같다.from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerfrom models import Userengine = create_engine("sqlite:///example.db", echo=True)SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False)def find_by_id(user_id: int): session = SessionLocal() # 세션 얻기 try: session.begin() # 트랜잭션 시작 user = ..
FastAPI Depends
·
python
들어가기 앞서자바를 메인언어로 백엔드를 공부했지만 어쩔수없이 FastAPI 를 해야하니 알아보는 시간을 갖도록 했다.자바에서도 DB 와 같은 외부 서드파티 저장소와의 연결을 위한 Connection 객체가 있듯,Python 에서도 충분히 있을거라고 생각했고Springboot 때 처럼 커넥션 객체를 트랜잭션이 시작할때 열리고 트랜잭션 종료때 반환되는 방식인가 했지만?Depends 라는 녀석을 Springboot 로 따지만 Controller 함수에서 사용하는것 처럼 보인다. 필자가 사용하는 환경은 아래와 같다.Lang: Python 3.11ORM: sqlalchemy 2.0.23web: FastAPI 0.104.1사용from fastapi import FastAPI, Depends, HTTPExceptio..
Springboot에서 SpringSecurity는 어떻게 초기화되는가? - 중
·
Web-Spring
개요이전 포스팅에서 Springboot의 초기화 시작점에서 SpringSecurity의 세팅이 어떻게 이뤄지는지 보았다면,이번 포스팅에서는 SpringSecurity내에 기본 필터들이 어떻게 초기화과정을 거치는지 알 수 있어요. 흔히 `securityFilterChain` Bean을 설정하는 코드에서`addFilterBefore()` 이나 `addFilterAfter()` 등을 사용하여 커스텀 시큐리티 필터를 등록하곤 해요이 메소드들의 동작도 함께 알아봅시다. 사전지식이전 포스팅의 사전지식과 동일하며, 해당 포스팅의 글을 읽고 오면 더욱 좋습니다.이전 포스팅을 읽은 적이 없다면, SecurityArchitecture을 이해하고 오면 좋습니다. 저번 포스팅에서 넘어오자면...저번 포스팅의 마지막에서 `We..
Springboot에서 SpringSecurity는 어떻게 초기화되는가? - 상
·
Web-Spring
개요흔히 Springboot에서 로그인 관련 인증/인가를 구현한다고 하면 기계처럼 블로그를 뒤져서라도 SpringSecurity를 도입하려고 시도해요// build.gradleimplementation 'org.springframework.boot:spring-boot-starter-security'implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'또한 SecurityConfig와 같은 Java Configuration 파일을 생성하여 SecurityFilterChain Bean을 구성하고@EnableWebSecurity와 같은 어노테이션을 붙여서 마무리해요.이 과정까지 성공한다면 SpringSecurity 덕에 쉽게 인..
SpringSecurity에서 OAuth2 로그인 시 쿼리 파라미터 유지하기
·
Web-Spring
개요이 문서는 SpringSecurity와 Authorization Code Grant 방식에서의 OAuth2 Client를 통한 소셜로그인이 구축된 환경에서 소셜로그인 요청시에 포함된 쿼리 파라미터를 최종 리다이렉트 주소까지 유지하는 방법을 알려줘요이 기능으로 OAuth2 Client 의 최종 리다이렉트 주소를 동적으로 지정하는 등의 다양한 활용이 가능해요Authorization Code Grant 개념OAuth2에서는 여러 인증방식이 있고, 그 중에서 kakao와 Google등의 소셜로그인 제공자에게 인가코드(Authorization Code)를 전달하는 방식을 Authorization Code Grant 이라고 해요Authorization Code Grant 기본 동작Authorization Cod..
쿠키와 SameSite, Secure, HttpOnly
·
Web-Spring
상황네이버카페의 경우 cafe.naver.com으로 본 네이버의 도메인에서 서브도메인을 사용한다.이와 같이 현재 개발중인 프로젝트도 서브도메인 양식을 사용하게 되는데,이에 따라 프론트에서도 서브도메인별 서로 다른 레포지토리를 활용한다고 들었다. 그러면 중요한것이 인증정보가 서브도메인별로 유지되어야 하는데, 이를 위해서 SSO라는 걸 도입하기도 한다.당장에 인증 체계를 빨리 구현하고 다른 도메인의 비즈니스 로직을 구현해야 한다고 판단했고,쿠키를 통해 서브도메인간 인증정보를 유지해야겠다는 생각이 들었다. 이 과정에서 쿠키를 추가할때 HttpServletResponse에 addCookie 메소드를 통해서 수행되고흔히 Spring에서 쿠키를 다룬다고 하면 JDK 21 기준 jakarta.servlet.http...
DNS와 레코드
·
Infra
상황가비아에서 도메인을 구매한 당시에는 구매한 도메인에 A타입 레코드로 EC2 배포환경에 연결하였다. 하지만, 프론트의 배포환경을 AWS S3에서 CloudFlare 로 옮기고 그거에 따라 DNS 관리도 CloudFlare로 옮기게 되었는데 이 과정에서 기존에 가비아에 가비아 네임서버로 등록되어있는 상태를 CloudFlare 네임서버를 등록하는것으로 교체하였다.가비아 에서 CloudFlare로 옮기면서 문득 1. 네임서버는 왜 바꿔야하는지, 2. 레코드는 어떤건지 궁금해서 파헤쳐본 내용을 이 글에서 기술한다. 네임서버흔히 DNS라고 부르는건 사실 Domain Name System의 약자로 하나의 체계를 뜻한다.실제로 도메인을 IP로 바꾸거나 혹은 다른 도메인으로의 요청으로 바꾸는 등의 역할을 수행하는것은..
@JsonTypeInfo 를 통해 유연하게 Json과 Java객체 매핑하기
·
Web-Spring
상황게시판에 대해서 JPA와 Springboot를 통해 CRUD를 개발하려 하는데게시판은 종류가 여럿 존재하고(자유 게시판, 공지 게시판 등등),게시판 종류와 상관없는 전체 조회의 기능도 제공해야 했었다.또한 게시판별 종류별로 세부 요소들이 다를 수 있었다. 예를들어 자유게시판은 텍스트 에디터로 만들어진 콘텐츠가 있으며,공지 게시판에는 다른 게시판에는 없는 "공지 종류"와 같은 추가적인 요소가 존재하는것이었다. 따라서 생각한 DB 테이블 설계는 게시판별로 다른 요소를가진 테이블을 게시판 종류별로 설계하고공통요소들 (조회수, 좋아요수, 생성날짜, 게시날짜, 업데이트 날짜 등) 을 하나의 테이블로 관리하는것이다.공통요소가 있는 테이블과 게시판 종류별 테이블과의 1:1 관계를 맺는것으로 결론지었다. 이 과정에..