한 달간 Java와 Database 기본을 배우고 이번 주부터 Spring에 대해 기본적인 내용을 배웠다. Spring MVC에 여러 내용을 알게 되어서 기쁜 마음으로 정리해 본다!스프링 프레임워크애플리케이션 개발에 필요한 가치를 제공해 개발자가 비즈니스 로직 구현에만
Object Relational Mapping(객체 - 관계 - 매핑)을 말한다.어플리케이션 객체와 관계형 데이터베이스의 데이터를 매핑해주는 도구이다.대표적인 ORM으로는 Hibernate, JPA 등이 존재한다.객체 모델과 관계형 모델간의 불일치가 존재한다. 객체 지
로그를 사용하는 이유는 애플리케이션 동작을 감시하여 문제가 발생했을 때 신속하게 대응하기 위해서이다. 로깅 사용 위처럼 로거 인스턴스를 생성할 수도 있고, @SLF4J 어노테이션을 이용할 수도 있다. 로깅 레벨 TRACE < DEBUG < INFO < WAR...
Junit이란 Java를 위한 대표적인 단위 테스팅 프레임워크이다. 테스트란 소프트웨어 개발 핵심 과정 중 하나로 코드의 안정성과 기능성 및 성능을 검증하는 데 필수적이다. 테스트를 통해 재배포, 재개발 비용 감소하며 코드 품질이 높아져 유지보수
테스트 관련 용어는 이전 포스팅을 참고하자. 테스트를 어떻게 작성할까? 프로덕션 코드가 완성되고 나서 테스트 코드를 하나씩 작성한다는 건 꿈만 같은 일이다. 실제 서비스는 여러 기능이 복잡하게 얽혀 작동되기 때문에 중간에 어느 하나가 제대로 동작하지 않는다면 디버깅에 오랜 시간이 걸린다. 따라서 핵심 기능 단위로 테스트 코드가 작성되어 무결성을 보장해야...
Repository 계층 테스트는 데이터베이스가 제대로 동작하는지 확인해야 한다. 직접 작성한 쿼리 또는 복잡한 쿼리에 대해서만 검사하면 된다고 생각한다. 또한 게시글 수정처럼 Database가 제공하는 기능이 아니라 Service 계층에서 구현되는 기능에 대해선 중복
객체 유효성을 어노테이션으로 손쉽게 적용할 수 있는 API를 제공한다.DTO(Data Transfer Object)는 순수하게 데이터 전송을 위해 객체이지만 요청 데이터의 유효성을 검증하는 것이 더 중요하므로 DTO도 검증 대상이 된다.@Valid 어노테이션을 붙이면
객체마다 보안, 로깅, 트랜잭션 등 특정한 기능을 구현한다면 너무나 많은 중복이 발생한다. 핵심 비즈니스 로직에 다양한 관점의 로직을 추가하게 되면 코드가 복잡해지고, 유지보수하기 어려워진다.AOP(Aspect Oriented Programming)는 관점 지향 프로그
build.gradle에 spring security 의존성을 추가하면, 다음과 같은 기본 필터들을 볼 수 있다. spring-security-core:6.2.3 기준으로 알아본다.OncePerRequestFilter를 상속하여 여러 필터를 만들 수 있다. 보안 뿐만
사용자가 만든 CustomLogoutSuccessHandler 여부에 따라 logoutFilter가 생성된다. 여기에서 기본 검증이 진행되는 걸 볼 수 있다.로그아웃이 성공하면, logoutSuccessHandler가 요청에 맞는 requestMather에 위임하여 특
스프링 시큐리티도 서블릿 필터로 구현되기에 먼저 기본 필터에 대해서 알아본다. 요청이 서버에 도착하면 서블릿 컨테이너는 서버에 등록된 필터들로 필터 체인을 만든다. 요청은 먼저 모든 필터들을 거친 후에 DispatcherServelet에 의해 처리된다.Spring Bo
SpringSecurityFilterChian은 들어오는 요청을 처리하고 인증 및 권한 부여 작업을 편리하게 수행할 수 있도록 기본 필터들을 제공한다.인증(Authentication)은 사용자가 누구인지 확인하는 과정이고, 인가(Authorization)란 사용자가 무
스웨거를 적용하면서 만난 문제들을 정리해본다! swagger는 코드에 설정이 들어간다는 단점이 존재한다. 이 단점을 상쇄하리만큼 큰 장점이 있는데, 바로 코드를 작성하기만 하면 자동으로 명세를 만들어준다는 것이다.
왜 액세스 토큰과 리프레시 토큰이 등장했을까? 1. 초기 토큰 인증 방식의 등장 HTTP는 무상태 프로토콜이고 서버에서 상태를 저장하지 않으니 확장에 유리하다. 하지만, 특정 권한이 필요한 서비스(회원 정보 수정, 주문 서비스 등)에서는 서버가 사용자를 기억할 필요가
서버에서 발행한 토큰들은 http로 응답하면 되는 거 아닌가? 전달하는 과정에서 무슨 문제가 있지? 먼저 rfc6749에 나와있는 Authorization Code 인증 방식을 살펴본다. {도메인}/oauth2/authorization/google, 302 Found소
프론트앤드와 협업하게 되면 자주 만나게 되는 문제이다. 배포단계에선 앞단에 nginx로 라우팅하게 되면 둘 다 동일 출처로 보기에 CORS 설정이 필요 없다. 하지만 개발 단계에서는 필요한 경우가 많다. 백엔드 서버(ex: localhost:8080)와 프론트 서버(e
1조 개의 UUID를 생성해도 중복될 확률이 굉장히 낮다고 한다. 분산 시스템에서 고유한 식별자를 보장하기 위해서 또는 사람이 알아보기 힘들고, 다음 번호를 예측할 수 없으므로 약간의 보안 목적으로 사용한다. 기존 Jwt 토큰에는 이메일이 담겨있었다. 보안에 취약하므로
2주간 프로젝트를 진행하면서 구현한 기능은 다음과 같다. 아래 기능을 구현하면서 헤맸던 부분과 새롭게 적용한 경험을 공유하려고 한다! 검색 쿼리가 제대로 실행되는지 확인하기 위해 더미 데이터가 필요했다. 공간을 시도, 시군구, 읍면동으로 검색할 수 있어야 한다. 서
실제로 취업하고 싶은 도메인을 선택해라 이번 주 월요일부터 2주간 간단한 게시판 CRUD를 구현하는 1차 프로젝트를 진행했다. 처음에는 견주끼리 산책할 수 있는 게시판을 구현하려고 했으나 코치님은 실제 내가 취업하고 싶은 도메인을 선택해야 한다고 했다. 어떤 도메인이든
한달 간 쇼핑몰 프로젝트를 진행했다. 백엔드는 Java, Spring, JPA, Mysql을 사용했다.프론트는 html, js, css만 사용하려 했지만, react를 권장한다고 해서 한번 사용해보기로 했다!크게 회원, 카테고리, 상품, 장바구니, 주문 도메인을 개발해
기존 세션 로그인 방식과 달리 토큰 로그인 방식은 백엔드 서버에서 클라이언트 로그인 상태를 세션에 저장하지 않는다. 서버는 JWT 토큰만으로 사용자 인증 상태를 알 수 있기 때문에 확장성이 좋다.하지만 보안적인 측면에서 해당 토큰이 탈취되었을 경우를 대비하는 다중 토큰
현재 인증 로직은 위와 같다. 2차 인증 필터를 적용해서 사용자가 Totp인증을 활성화한 경우 로그인 후 Totp 인증을 진행하고, 새로운 IP에서 로그인했을 때는 이메일 추가 인증을 진행하는 기능을 구현하기로 했다.LoginFilter 뒤에 두어 로그인이 완료되고,
mapstruct에서 is 접두사가 붙은 필드를 인식하지 못한다. 왜 필드 이름이 같은데도 mapstruct에서는 인식하지 못할까? mapstruct가 LomBok이 만들어준 getter를 인식하지 못해서 발생하는 문제인데, 먼저 Lombok의 동작 방식을 알아보자.
기본적으로 DB 테이블과 객체지향 관점의 불일치에서 문제가 발생한다. 테이블은 외래키 하나로 두 테이블 간 데이터가 조인되어 사용되지만, 객체에서 관계는 두 개의 참조가 존재하고 외래키를 관리하는 주인 쪽에서 데이터를 관리한다. 이때, 주인이 아닌 객체와 데이터 간에
동기 방식과 비동기 방식을 비교하고, 이벤트 방식으로 무엇을 개선할 수 있는지 살펴본다.사용자가 회원가입을 완료하면, 다음 작업을 한다고 가정해 보자.사용자에게 가입 축하 및 마케팅 이메일을 보낸다. (외부 Gmail Service)사용자에게 가입 축하 쿠폰을 보낸다.
과거 작성한 코드를 보니, 값 타입 컬렉션을 잘못 사용하고 있었다. 왜 잘못 사용했는지 알아보고, 언제 사용하면 좋을지 알아본다.식별자가 없고, 단순한 값들의 모음이다. 즉, 값을 변경해버리면 데이터베이스에 저장된 원본 데이터를 찾을 수 없는 상황이 발생할 수 있다.
공간 정보와 연관된 엔티티를 조회하면서 페이징 처리를 했는데 JPA가 만들어주는 쿼리는 심히 당황스러웠다. 페이징을 위한 쿼리 2개, 연관된 엔티티(5개)를 각각 조인해서 가져오는 쿼리 5개, 총 7개를 예상했지만 실제로는 52개의
배치란 주기적으로 의 반복적인 데이터 작업을 처리하기 위해 사용하는 방식 배치가 필요한 상황은 대량의 집계 데이터 생성(ex: 월별 매출, 월별 환불액, 한 달 동안 신규 회원 수, 월간 상품별 판매량 …) DB에 있는 대량의 데이터를 백업 용도로 새로운 서버
JDBC는 자바 코드로 데이터베이스와 직접 통신하는 저수준 API를 말한다.아래 코드처럼 스프링 프레임워크 없이도, Database와 통신할 수 있다.JDBC를 사용하며 개발하던 시기는 거의 20년 전이라고 한다. 현재는 Mybatis 또는 Spring JPA를 통해
MSA(MicroService Architecture) 기존 Monolithic Archiecture 모놀리식 구조란 소프트웨어를 하나의 시스템으로 구축하여 개발하는 방식을 말한다. 하나의 시스템에 모든 설정과 비즈니스 로직이 포함된다. 간단한 프로젝트에는 적