전체 글 (60) 썸네일형 리스트형 OAuth2 인증 Flow OAuth2는 서버에서는 사용자의 ID/PW 없이, 인증 서버를 통해 인증을 수행하는 프로토콜입니다.즉, 사용자가 직접 로그인 정보를 입력하지 않고도 Google, GitHub 등 외부 인증 서비스를 통해 로그인할 수 있게 해줍니다. 사용자와 클라이언트 모두 보안에 대한 부담을 낮춰줄 수 있습니다. 용어 정리OAuth2 에서는 의미가 비슷한 용어가 있어서 글에서 아래 용어는 다음과 같은 의미로 사용하겠습니다.사용자 : 사용자 + 프론트엔드(브라우저) 를 통합한 개념클라이언트 : OAuth2 인증을 연동하는 애플리케이션 서버 (예: my-service)인증 서버 : OAuth2 인증을 제공하는 서버 (예: Google, GitHub) 0. 클라이언트를 Auth 서버에 등록 OAuth2를 사용하려면, 먼저 .. Fleet 단축키 모음 기본 탐색 & 이동기능단축키커맨드 팔레트 열기⌘ ⇧ P파일 탐색기 열기 / 닫기⌘ \특정 파일 열기 (Go to File)⌘ P심볼 검색 (함수/변수 찾기)⌘ ⇧ O최근 열었던 파일⌘ E정의로 이동 (Go to Definition)⌘ 클릭 or F12파일 내 검색⌘ F전체 프로젝트에서 검색⌘ ⇧ F 코딩 & 다중 커서 편집기능단축키다음 일치 항목 선택 (다중 편집)⌘ D마지막 선택 제거⌘ ⇧ D같은 단어 전체 선택⌘ ⇧ L위/아래에 커서 추가⌥ ⌘ ↑ / ↓행 복사⌘ ⇧ D행 삭제⌘ ⌫행 이동⌥ ⇧ ↑ / ↓코드 포맷팅⌥ ⌘ L 코드 리팩토링 & 자동완성기능단축키자동완성⌃ Space빠른 수정 (Quick Fix)⌘ .변수명 리네임⇧ F6코드 템플릿 삽입 (Live Template)⌘ J 디버깅.. 소프트웨어 복잡성 소프트웨어 복잡성개발을 시작한 지 2년이 넘어가고 개발 팀장이 되면서 소프트웨어 복잡성이라는 벽을 실감하기 시작했습니다. 작은 애플리케이션을 만들 때는 모든 게 단순해 보였지만, 시스템이 커져갈수록 보이지 않던 복잡성이 곳곳에서 드러났습니다.재미있게도 이 복잡성은 단순히 코드 구조나 아키텍처 문제만이 아니였습니다. 조직 구조, 커뮤니케이션, 일정 압박, 우선순위 결정 등 비기술적인 요소들과 복잡하게 얽혀 있다는 것입니다. 한가지 예를 들어보겠습니다. 어떤 서비스가 Web 서비스와 API 서비스를 모두 제공한다고 가정할 때, 사용자의 요청으로 ‘A’라는 기능을 개발하게 되었습니다. 처음엔 Web 서비스에만 우선적으로 기능을 추가하고, API 서비스는 나중에 개발하기로 계획했습니다. 그러나 시간이 흐르면서 .. [JPA] fetchJoin 과 Paging 처리의 한계 및 해결 방안 EntityGraph를 사용하여 fetch join을 할 경우, 쿼리에서 직접적으로 페이징 처리가 어려워집니다. 이유는 다음과 같습니다: 1. 복잡한 조인 구조예를 들어, A, B, C 세 테이블을 조인하는 경우를 생각해 봅시다. A와 B는 1:N 관계이고, B와 C도 1:N 관계라면, 예를 들어 N이 3이라 가정할 때페이지 크기가 10이면, 실제로 10개의 A 엔티티를 가져오더라도 조인 결과로는 최대 10 × 3 × 3 = 90개의 행(row)이 반환될 수 있습니다. 2. RDBMS와 객체지향의 차이관계형 데이터베이스에서는 위와 같이 다중 조인된 결과에 대해 LIMIT을 적용할 때, 원래의 A 엔티티 기준으로 제한하지 않고 전체 행에 대해 제한을 걸게 됩니다.그래서 결과적으로 full scan을 하고,.. 실전 문제와 해결 전략 이번 글에서는 백엔드 실전 문제들을 살펴보고, 각각의 문제를 해결하는 방법에 대해 정리해보겠습니다.1. CS - CAS(Compare-and-Swap) 활용 문제: synchronized 없이 다중 스레드 환경에서 동시성 제어하기 멀티스레드 환경에서 하나의 변수를 여러 스레드가 동시에 수정하는 경우 경합 상태(Race Condition)가 발생할 수 있습니다. 기존에는 synchronized 키워드를 사용하여 동기화했지만, 이는 성능 저하의 원인이 될 수 있습니다. 이를 해결하기 위해 CAS(Compare-and-Swap) 연산을 활용한 AtomicInteger 사용을 고려해야 합니다. 해결 방법: AtomicInteger를 활용한 CAS 동기화import java.util.concurrent.atom.. Socket 통신 1. Socket 통신이란 무엇인가?Socket은 네트워크 프로그래밍에서 가장 기본적이고 중요한 개념 중 하나입니다. 다양한 네트워크 애플리케이션(채팅, 실시간 게임, 파일 전송 등)을 개발하려면 클라이언트-서버 간 통신이 필수적입니다. 이때 Socket은 데이터를 주고받는 양 끝단의 연결점을 의미합니다. 2. Socket 통신의 기본 개념2.1. Socket이란?Socket은 네트워크 상의 두 호스트 간 통신을 위한 인터페이스입니다.주로 TCP/IP 또는 UDP 프로토콜 위에서 데이터를 주고받을 때 사용됩니다. 2.2. TCP와 UDP의 차이구분TCPUDP프로토콜 타입연결형(Connection-oriented)비연결형(Connectionless)신뢰성데이터 무결성 및 순서 보장신뢰성 보장 안 함속도느림.. 코어 수에 따른 프로세스와 쓰레드 개수의 관계와 성능 영향 코어 수와 쓰레드 수의 관계는 멀티스레드 프로그래밍에서 성능 최적화의 핵심 요소입니다. 쓰레드 수가 특정 코어 개수와 맞지 않을 때 성능이 저하되는 이유는 여러 가지가 있으며, 이는 CPU가 수행하는 컨텍스트 스위칭, 메모리 대역폭 문제, 그리고 CPU 코어의 오버헤드와 관련이 있습니다. 이를 구체적인 예시로 살펴보겠습니다. 1. 코어 개수와 쓰레드 개수의 관계CPU는 보유한 코어 수만큼 작업을 동시에(병렬성) 수행할 수 있습니다. 예를 들어, 4개의 코어가 있는 CPU는 이론적으로 최대 4개의 쓰레드를 동시에 실행할 수 있습니다. 이보다 많은 쓰레드가 실행될 경우, 운영 체제는 TCB(Thread Control Block)을 사용해 각 쓰레드의 상태를 저장하고 복구하면서 컨텍스트 스위칭을 수행하게 됩니.. 대규모 트래픽에 대비한 아키텍처 확장 전략 이 글에서는 기본적인 Application 서비스 환경에서 대규모 서비스로의 전환을 시간 순으로 나열해보겠습니다. 현재 시스템 구성현재 서비스는 1개의 Nginx 웹 서버와 2개의 Tomcat 애플리케이션 서버로 구성되어 있습니다.기존요청의 흐름사용자는 로컬 또는 DNS 서버를 통해 IP를 받아와 HTTPS(443 포트)로 요청을 보냅니다.요청은 웹 서버를 거쳐 애플리케이션 서버로 전달되고, 필요한 경우 데이터베이스(DB)에서 데이터를 가져와 사용자에게 응답을 전송합니다.HTTP 요청과 응답 구조를 따릅니다.대규모 서비스 전환 단계이제 각 컴포넌트의 성능을 높이고 트래픽을 효과적으로 분산하기 위해 시스템을 확장하는 단계를 살펴보겠습니다. 1. Database 의 Scale Up현재 DB 성능이 충분하지.. 이전 1 2 3 4 ··· 8 다음 목록 더보기