배운것들을 정리합니다.
三昧境

전체 글 49

[Spring Boot] 공통 예외 처리와 JWT 인증 예외 응답 통일, NULL 제어

회원 API를 구현하면서 회원이 존재하지 않거나, 이메일이 중복되거나, 요청 DTO 검증에 실패하는 등 다양한 예외 상황을 처리해야 했습니다.각 상황마다 서로 다른 HTTP 상태 코드와 메시지를 반환해야 했고, 조회 결과가 없을 수 있는 상황에서 null을 안전하게 다루는 방법도 함께 고민했습니다.이번에는 예외 처리 흐름을 다음 네 가지 클래스로 구성했습니다.클래스역할ErrorCodeHTTP 상태 코드, 서비스용 에러 코드, 메시지 관리BusinessException비즈니스 규칙 위반을 표현하는 커스텀 예외ErrorResponse클라이언트에 반환할 공통 JSON 응답 형식GlobalExceptionHandler예외를 한 곳에서 HTTP 응답으로 변환 ErrorCode로 에러 응답 규격 통일하기HTTP ..

[Spring Boot] 회원 CRUD 구현하기: 인증·탈퇴 처리와 API 명세까지

회원은 서비스의 핵심 도메인 중 하나입니다.이번에는 회원 정보를 관리하는 CRUD 기능을 Spring Boot와 Hibernate(JPA), Lombok을 활용해 구현했습니다.단순히 데이터를 저장하고 조회하는 데서 그치지 않고, 인증·인가와 회원 탈퇴 이후의 개인정보 처리까지 함께 고민했습니다.사용 기술Spring Data JPA (Hibernate)Spring SecurityJJWTH2 DatabaseLombokSwagger / OpenAPIPostmanBatch 회원 테이블 설계먼저 회원 테이블은 다음과 같이 ERD로 설계했습니다.ERD를 바탕으로 Member 엔티티를 작성했습니다.JPA 어노테이션을 사용하면서 데이터 타입, 기본키, 제약 조건과 같은 데이터베이스 구조를 Java 코드에서 관리할 수..

[Spring Boot] ERD 설계/작성하기

지난 글에서는 이번 프로젝트의 목적과 기술 스택, 그리고 3주간의 개발 계획을 정리를 하였습니다.이번 글에서는 실제 구현에 들어가기 전에 데이터베이스 구조를 어떻게 설계했는지 정리해보도록 하겠습니다.프로젝트 진행 과정요구사항 분석 → 설계 → 구현 → 테스트 → 배포 및 유지보수 다만 실제 개발에서는 이 과정이 한 번씩 끝나는 형태라기보다는, 구현과 테스트 과정에서 발견된 문제를 다시 설계에 반영하여 반복하는 agile 기법처럼 진행하리라 생각됩니다. 이번 단계에서는 요구사항을 바탕으로 먼저 데이터베이스 구조를 설계하고, 이 다음 단계에는 해당 구조를 기준으로 JPA Entity와 REST API를 구현해볼 예정입니다.ERD 설계 구성해본 커뮤니티 API에서 사용하는 주요 기능은 다음과 같습니다.회원가입..

[Spring Boot] 회원 인증 기반 커뮤니티 API 프로젝트

프로젝트를 시작한 이유Java 문법과 자료구조, 데이터베이스 기초를 학습한 뒤에는 단순 알고리즘 문제보다 실제 서비스에 가까운 프로젝트를 만들어 보고 싶었습니다.이번 프로젝트의 목표는 회원 인증이 있는 커뮤니티 API를 구현하며 다음 역량을 한 번에 경험하는 것.관계형 데이터베이스 설계와 SQLSpring Boot 기반 REST API 개발JPA를 이용한 CRUDSpring Security와 JWT 인증/인가입력값 검증과 예외 처리테스트, API 문서화, Docker 기반 실행 환경 구성GitHub Issue, 브랜치, PR을 활용한 작업 관리 왜 게시판 프로젝트인가?웹 백엔드의 핵심 요소를 고루 담고 있다 생각해서 진행하게 되었습니다.회원은 가입하고 로그인해야 하며, 인증된 사용자는 게시글과 댓글을 ..

[Java 기초] 쓰레드 Thread, Runnable, Join, MultiThread, Synchronized

쓰레드(Thread)여러작업을 동시에 수행할 때/*class 클래스명 extends Thread { // Thread 클래스 상속 public void run() { // public void run() {}메소드 정의 }}*/class MyThread extends Thread { public void run() { for (int i = 1, i thread.start() 를 호출한 쓰레드는 다음 코드를 실행하러 이동하며새로운 쓰레드는 run()메서드의 내용을 실행하는 병렬적 진행임Runnable여러 작업을 동시에 수행할 때/*class 클래스명 implements Runnable { // 인터페이스 이기에 다른 클래스 상속 가능 public void run() { }}*/c..

Java/Syntax 2024.11.29

[Java 기초] 예외처리 Exception, Try-Catch, Throw, Finally

예외처리(Try-Catch)프로그램 내에서 발생 가능한 문제 상황 처리/*try { 명령문} catch(변수) { 예외처리}*/public class Main { public static void main(String[] args) { int[] numbers = {1,2,3}; int index = 5; // 존재하지 않는 인덱스 try { // try-catch 문 int result = numbers[index]; System.out.println("결과 : " + result); } catch(Exception e) { System.out.println("예외" + e); } }}catch예외의 종류에 따른 처리/*try { 명령문..

Java/Syntax 2024.11.28

[Java 기초] 익명클래스 Anonymous, 람다 Lambda, 스트림 Stream

익명 클래스(Anonymous Class)한 번만 사용되는 이름 없는 클래스class Person { public void introduce() { System.out.println("Hi"); }}public class Main { public static void main(String[] args) { Person person = new Person(); { // 객체 생성후 중괄호 내부에 @Override // 어노테이션 public void introduce() { // 익명함수 System.out.println("Hello"); } }; person.introduce(); }}람다식(Lambda)간결한 형태의 코드 묶음메소드..

Java/Syntax 2024.11.28

[Java 기초] 리스트 list

배열 리스트(ArrayList)배열 기반 리스트빠른 접근 + 순차 저장/*ArrayList*/public class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("John"); // 리스트에 값 추가 list.add("Maggy"); fot(String s: list) { // 리스트에 있는 문자열 데이터를 하나하나 순회 System.out.println(s); } }}ArrayList list = new ArrayList(); 일때기능비고예시결과add추가list.add("John");{"John"}get가져오기list.get(0);"John"size크기lis..

Java/Syntax 2024.11.28

[Java 기초] 클래스 class

클래스(class)데이터와 기능을 포함하는 코드 묶음/*class 클래스명 {}클래스는 대문자로 시작*/class Person {// 내용}public static void main(String[] args) { Person person = new Person(); // 객체 만들기}클래스 == 틀객체 == 틀로인해서 나온 빵인스턴스 변수(instance variable)클래스 내에 선언된 변수/*class 클래스명 { 인스턴스 변수1 인스턴스 변수2 ...}*/class Person { String name; int age;}public static void main(String[] args) { Person person = new Person(); person.name = "John";..

Java/Syntax 2024.11.28

[Java 기초] 아스키코드 ascii code, 메소드 method

아스키코드(ASCII CODE)(ANSI) 미국 표준 코드메소드(method)특정 기능을 수행하기위한 코드 묶음/*접근제어자 반환형 메소드명(전달값) {명령문 1명령문 2}*/public static void print() {System.out.println("");}public static void main(String[] args) {print(); // 메소드 호출}전달값(parameter)/*접근제어자 반환형 메소드명(전달값) {System.out.println("");System.out.println("");}*/// 전달값이 없는 메소드public static void print() {System.out.println("");}// 전달값이 있는 메소드public static void prin..

Java/Syntax 2024.11.26