목록Springboot (9)
co-cherry
0. 이번 주차 목표 원래는 AWS EC2를 이용해 배포를 진행하려고 했지만, 프리티어 종료로 인해 비용이 발생할 수 있어 Railway를 대체 플랫폼으로 선택했다. Railway는 GitHub Repository 연동, Docker 기반 배포, MySQL 서비스 생성, HTTPS 주소 제공을 지원하기 때문에 Spring Boot와 MySQL을 함께 배포하기에 적합했다. 최종적으로 아래와 같은 구조이다. GitHub Repository→ Railway 자동 배포→ Spring Boot Docker Container→ Railway MySQL Database→ Railway HTTPS URL 1. 왜 AWS 대신 RailWay를 사용하는지?원래는 AWS EC2를 사용해 Spring Boot 프로젝트를 배포..
왜 외부 API를 사용하는가?웹 서비스는 자체 DB만으로 모든 데이터를 제공하기 어렵다.실제 서비스에서는 다양한 외부 데이터를 활용하기 위해 외부 API를 연동한다. 날씨 정보 조회영화/도서 검색환율 정보 뉴스 데이터주소 검색공공 데이터 조회 등 하지만 외부 API는 우리 서버가 직접 관리하는 시스템이 아니므로 여러 문제가 발생할 수 있다.응답 속도 지연네트워크 장애API 호출 제한외부 서버 장애응답 구조 변경 등 따라서, 외부 API를 단순히 호출만 하는 것이 아니라 성능과 안정성을 함께 고려해야 한다.이 문제를 해결하기 위해 많이 사용하는 기술이 Redis 캐시이다. Redis 란?In-Memory 기반의 Key-Value 저장소*비 관계형 구조로서 데이터를 그저 'Key-Value' 형태로 단순하게..
@Transactional 트랜잭션(Transaction)데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위를 구성하는 연산들의 집합 여러 개의 DB 작업을 하나의 단위로 묶고 분할할 수 없음 (원자성)→ 전부 성공 또는 전부 실패만 가능 트랜잭션의 핵심 기능: ACID Atomicity (원자성) All or Nothing 전부 성공하거나 전부 실패 Consistency(일관성) 트랜잭션 실행 전후로 데이터베이스가 일관된 상태를 유지 Isolation(격리성) 동시에 실행되는 트랜잭션들이 서로 영향을 주지 않음 Durability(지속성) 커밋된 트랜잭션은 영구적으로 저장됨 왜 트랜잭션이 필요할까?트랜잭션은 데이터의 정합성을 보장한다. 여기서, 정합성이란 데이터가 모순 없이 일치하는 상태를 의미..
페이징게시글 목록 조회 API를 구현하면 이와 같은 형태로 작성하게 된다. List posts = postRepository.findAll(); 로컬에서 데이터 10개 정도로 테스트할 때는 문제 없이 잘 동작하지만, 게시글이 10,000개 정도 있다고 가정해보자. 이 API를 호출하는 순간,데이터베이스는 10,000개의 행을 읽어서 메모리에 올린다애플리케이션은 10,000개의 Post 객체를 생성한다네트워크를 통해 수 MB의 JSON 데이터가 전송된다프론트엔드는 10,000개의 게시글을 한꺼번에 렌더링하려 시도한다우리의 서버 메모리는 낭비되고 응답은 느려지며 멈춘 듯한 화면을 보게 될 것이다. 이 문제에 대한 해결책이 Paging이다. '한번에 모든 데이터를 보여 줄 필요가 없다면 필요한 만큼만 잘라서..
Spring Security Spring 기반 애플리케이션에 인증(Authentication)과 인가(Authorization)기능을 제공하는 프레임워크 인증(Authentication) 사용자가 누구인지 확인하는 과정 (로그인 폼, OAuth2, JWT, LDAP 등 다양한 방식 지원) 인가(Authorization) 인증된 사용자가 어떤 리소스에 접근할 수 있는지 제어, URL 기반, 메서드 기반으로 권한 설정 가능 보안 공격 방어 CSRF, XSS, Session, Fixation 등 일반적인 보안 취약점을 기본으로 방어 FilterChainHTTP 요청이 Controller에 도달하기 전 통과해야 하는 보안 필터들의 묶음 요청이 Controller에 도달하기 전에 인증/인가/예외 처리가 전부 ..
앞서 게시글 생성과 상세 조회를 구현했다. 이번 시간에는 게시글 삭제와 수정을 구현해보려고 한다. 게시글 삭제와 수정은 작성자만 가능하므로 작성자 권한 검증이 서비스 로직에 들어가야 함을 유의하고 API를 설계해보자. 게시글 삭제 게시글을 삭제하기 위해서는 삭제할 게시글의 Id와 권한 검증을 위해 해당 게시글을 삭제할 user의 Id가 필요하다. 게시글을 삭제하기 전에, 아래 두 가지의 검증이 필요하다.해당 아이디의 게시글이 존재하는지 확인 → 아니라면 POST_NOT_FOUND 반환 해당 게시글의 작성자가 삭제 요청을 보낸 user와 일치하는지 확인(권한 검증) → 아니라면 POST_UNAUTHORIZED 반환@Transactional public void deletePost(Long postI..
*UMC 워크북 내용을 일부 참고하였다. 기능 목록 확정게시판 기능을 구현하기 위한 기능 목록을 작성하였다.(후에 이미지 추가 및 댓글 부분 추가 예정) 게시글 생성게시글 수정게시글 삭제게시글 단건 조회 (상세 보기) 게시글 목록 조회 (페이지, 최신순) ERD 작성위 게시판 기능을 기준으로 User와 Post 엔티티를 최소로 정의하였다. Enum의 사용 예시를 보여 주기 위해 부가적으로 필드를 추가했지만... 한 명의 회원(1)은 여러 개의 게시글(N)을 작성할 수 있으므로 User와 Post는 1:N의 관계로 설정하였다.또한, Post 엔티티는 작성자의 식별을 위해 user_id를 외래키로 가진다. https://www.erdcloud.com/d/hFup7EsMsQsaM3cYJ springboot-..
공통 응답 형식 구조ApiResponse ← 실제 응답 wrapper 클래스 ├── BaseSuccessCode ← 성공 코드 인터페이스 │ └── GeneralSuccessCode (enum) └── BaseErrorCode ← 에러 코드 인터페이스 └── GeneralErrorCode (enum) ApiResponse실제 응답을 감싸는 공통 응답 *래퍼(wrapper) 클래스*Java의 기본형을 객체로 감싸는 클래스 public class ApiResponse { private final Boolean isSuccess; private final String code; private final String messa..
1. Spring Boot란?Spring 기반 웹 애플리케이션을 쉽고 빠르게 만들 수 있도록 도와주는 Java의 프레임워크 복잡한 설정을 자동으로 처리하는 Auto Configuration 기능 제공 내장 서버(Tomcat) 제공 → 별도의 서버 설치 필요 없음REST API 개발에 많이 사용됨 https://wikidocs.net/160047 1-01 스프링 부트란?**스프링 부트(Spring Boot)** 는 웹 프로그램(웹 애플리케이션)을 쉽고 빠르게 만들 수 있도록 도와주는 자바의 웹 프레임워크이다. 스프링 부트는 스프링(Spring)…wikidocs.net자세한 내용은 위 링크 참조 (개념 이해에 좋다) 2. Spring Boot 프로젝트 생성하기 IntelliJ IDEA를 사용해 Spring ..