전체 글 32

[JPA] JPA Entity 생성자의 접근 제어자 with @Builder

개요 아래 글에서는 lombok의 @Builder를 사용하여 JPA Entity 클래스를 구성하는 방법을 살펴 보았다. https://minjun98.tistory.com/103 [JPA] lombok @builder 위치 : Constructor vs Class 개요 해당 글에서는 다음과 같은 내용을 다룬다. - @builder의 동작 원리 - lombok의 @builder 어노테이션의 위치 선택 @builder 동작 원리 사용하려는 예시는 jpa entity 클래스를 예시로 한다. 사용하려는 Us minjun98.tistory.com - @Builder을 사용하여 빌더 패턴 적용시, inner static builder class에서 마지막에 .build() 호출 시, outer class (Enti..

JPA 2024.04.05

[JPA] lombok @builder 위치 : Constructor vs Class

개요 해당 글에서는 다음과 같은 내용을 다룬다. - @builder의 동작 원리 - lombok의 @builder 어노테이션의 위치 선택 @builder 동작 원리 사용하려는 예시는 jpa entity 클래스를 예시로 한다. 사용하려는 User Entity는 다음과 같다. 아직 @builder 패턴은 적용하지 않은 상태이다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class User extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull @Column(unique = true) priv..

JPA 2024.04.05

[Java] 기본 타입 vs 참조 타입

[개요] 자바의 데이터 타입은 기본 타입과 참조 타입으로 나눌 수 있다, 각각의 기본 타입에는 대응하는 참조 타입이 하나씩 있으며, 이를 박싱된 기본 타입이라고 한다. 기본 타입(원시 타입, primitive type) : int, double, boolean, long ... 참조 타입(박싱된 기본 타입, wrapper class) : Integer, Double, Boolean, Long ... [차이] 주된 차이는 다음과 같다. 1. 기본 타입은 값만 가지고 있으나, 참조 타입은 값에 더해 식별성이란 속성을 갖는다. 이러한 이유로, 참조 타입은 값이 같더라도, 서로 다르다고 식별될 수 있다. 그러므로, 참조 타입의 값을 비교하기 위해서는, ==을 사용하면 안된다. [예시] Comparator nat..

java 2023.09.05

세션 기반 인증 vs 토큰 기반 인증

고민지점 서버에서 로그인 기능 구현을 할 때, JWT를 이용한 토큰 기반의 인증/인가 방식을 많이 사용하게 된다. 다만, JWT 옆에 따라 붙는 키워드가 쿠키, 세션, Redis등 같이 몇 가지가 있는데, 가장 많이 언급이 되고 비교가 되는 인증/인가 방식이 쿠키 + 세션 로그인 방식이다. 하지만, 구글링을 해보았을때, JWT 기반 (+Spring Security) 글이 훨씬 많았고, 본인도 충분한 고민 없이 해당 방식으로 구현을 해본 거 같다. 그러므로, 토큰, 세션방식의 장단점을 알고, 왜 해당 방식으로 구현했는지는 알아둘 필요가 있을 필요가 있다고 생각해서 해당 글을 쓰게 되었다. 세션 기반 인증의 단점? 보통 세션 방식의 로그인 방식을 언급할 때 나오는 단점은 몇가지가 있는데, 크게 WAS 서버의..

Auth 2023.08.30

HTTP status code는 어떻게 전달하는 것이 좋을까

고민상황 프로젝트를 진행하면서 프론트 - 백엔드 사이에 여러가지 이슈가 있었지만, 가장 많이 얘기가 나왔고, 팀원들 스스로도 중요하게 생각한 부분이 "어떻게 HTTP Request - Response를 주고 받을 것인가" 이었다. 프론트 팀원들이 Response를 받은 후 어떻게 처리를 하느냐에도 영향을 미치기도 하며, 어떻게 하면 Restful 하게 이를 설계하고 구현할 수 있을지에 대해서도 고려해야하기 때문에 이러한 부분들이 주된 고민을 이뤘던 것 같다. 이번글에서는 그중에서, HTTP 응답 상태코드 (status code)에 대한 고민을 기록해보고자한다. 개발 및 프로젝트를 하다보면, 여러가지 상태코드(2xx, 4xx등) 를 사용하여, 성공/실패 여부, 성공/실패했다면 어떤 이유로 성공/실패 했는지..

HTTP 2023.08.03

Get vs Post 보안상의 고찰

고민지점 회원가입시에 이미 본인이 쓰고 싶은 아이디가 사용중임을 확인하는 아이디 중복확인이나 회원가입시에 유저의 정보 중에서 이미 본인의 이메일이나 휴대전화번호가 이미 가입된 정보라는 것을 바로 알려주는 기능의 api등을 개발하는 중이었다. 애초에 회원가입 요청과 다르게 어떤 리소스를 생성하려는 요청이 아니기 때문에, Get 방식이 이용하여 처리했었다. https://example.com/usernameduplicatecheck?username= minjun https://example.com/emailduplicatecheck?email= tistory@gmail.com 하지만, 보안적으로 회원가입 이후에 회원 정보로 저장이 될 수 있는 정보이거나, 휴대폰, 이메일과 같이 개인 고유 정보이기 때문에 u..

HTTP 2023.08.03

[Spring MVC] HandlerInterceptor

인터셉터의 필요성 프로젝트에서 토큰을 이용한 인증/인가 작업을 수행하다보니, 토큰 인증이 필요한 모든 API의 경우 토큰 인증 작업이 반복적으로 필요했다. 컨트롤러에서 반복적으로 관련 작업을 진행하는 것 자체가 상당한 반복적인 코드가 발생하므로, 인터셉터를 통해 토큰 인증 작업을 구현해보고자한다. 스프링 내에서 인터셉터를 구현하기 위해선, HandlerInterceptor이라는 인터페이스를 구현해야한다. 작동 원리 Prehandle default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } 토큰 인증 작업을 할 때 실질적인 인..

Spring 2023.07.26

JJWT(Java Json Web Token) 예외 처리

Java환경에서 JJWT을 파싱하는 과정 속에서의 예외를 다뤄보고자 한다. 여러가지 파싱 함수가 있지만, JwtParser의 parseClaimsJws함수를 이용해 파싱해보고자 한다. parseClaimsJws Jws parseClaimsJws(String claimsJws) throws ExpiredJwtException, UnsupportedJwtException, MalformedJwtException, SignatureException, IllegalArgumentException; - 압축된 String 형식의 토큰을 인자로 받는다. - 파싱 후 토큰을 만들 때, 삽입했던 claims 값을 포함한 Jws 객체가 반환된다. - 파싱하는 과정 속에서 압축된 토큰의 형식이나 만료 여부등을 검증하며, ..

Auth 2023.07.26

OpenApiMethodFilter 사용하여 Swagger API 분류하기

문제 상황 Swagger을 사용하게 되면, GroupedOpenAPI를 builder 패턴으로 생성하여 Bean으로 등록하여, API들을 그룹별로 나눌 수가 있다. 보통, pathsToInclude, pathsToExclude 와 같은 메소드를 사용하여, 직접 API의 엔드포인트를 파라미터를 인자로 입력하여, 나누는 경우가 많다. @Bean public GroupedOpenApi SecurityGroupOpenApi() { return GroupedOpenApi .builder() .group("그룹1") .addOpenApiCustomiser(buildSecurityOpenApi()) .pathsToExclude("/api1, /api2") .pathsToInclude("/api3, /api4") .b..

Swagger 2023.07.20

TCP 기반 Multi-Process 서버 구현

2023-1학기 숭실대 소프트웨어학부 조효진 교수님의 네트워크 프로그래밍 수업을 재구성하였습니다. 예제코드는 글 맨 아래에 있습니다. 단일 프로세스의 한계 단일 Process로만 TCP 소켓 프로그래밍을 수행하면, 새로운 프로세스의 클라이언트와 동시에 통신을 하기 힘들어진다는 한계를 가진다. 이 한계를 극복하고자 Multi-Process 서버를 구현해보고자한다. 새로운 Process 생성 Multi Process를 생성하려면, fork()함수를 이용하여, Child Process를 새로 생성하여야한다. -fork()이전 서버는 srvSd 파일디스크립터를 이용하여 클라이언트의 요청을 accept()하고 있으며, accept()함수를 통해, 클라이언트와의 연결을 진행하게 되면 새로운 연결 소켓인 clntSd..

네트워크 2023.05.15