Java
[Java] 가비지 컬렉션(Garbage Collection)과 5가지 알고리즘
가비지 컬렉션(Garbage Collection) 최근 친구가 전화로 자바에서 생긴 메모리 이슈 관련 도움을 구한 적이 있었다. 친구랑 같이 원인을 찾다 보니 계속 새로운 객체를 생성하여 참조된 객체를 Garbage Collection이 제거하지 않아 생기는 문제일 수 있음을 알게 되었다. 이런 것을 방지하기 위해 싱글톤 패턴으로 코드를 작성하고 Spring에 와서는 Bean을 생성하고 DI를 적용하여 자동으로 싱글톤 패턴이 적용되었다. 그래서 항상 하던 대로 코드를 작성하다 보니 Garbage Collection을 신경 쓰지도 않았고 어떻게 동작하는지도 몰라서 궁금하여 찾아보고 정리하게 되었다. 특히 나도 나중에 저런 메모리 이슈가 생길 수 있고 지금 공부하는 내용이 도움이 될 것 같다고 생각된다. G..
Spring Security + JWT 적용하기(3) - 게시판 만들기(12)
로그인 구현 마지막 기능으로 로그아웃과 내 개인적인 보안 강화?를 적용해 보겠다. 우선 내 로그인 로직은 클라이언트가 로그인을 한다. 로그인 성공하면 accessToken, refreshToken을 건네준다. accessToken이 만료되면 로그인 유지를 위해 refreshToken으로 재발급 요청을 보낸다. refreshToken이 유효하면 accessToken을 발급한다. refreshToken이 유효하지 않다면 토큰을 만료시키고 강제 로그아웃 처리를 한다. 크게 이런 흐름이다. 내가 생각한 나름의 보안 강화는 4번에 적용시켰고, refreshToken이 유효해도 accessToken이 유효하지 않다면 비정상적인 접근으로 판단하여 강제 로그아웃 처리를 하였다. 이후 해당 accessToken은 따로 ..
Spring Security + JWT 적용하기(2) - 게시판 만들기(11)
Spring Security에 JWT를 붙이기 전에 JWT를 먼저 발급해 보겠다. 로그인 시 JWT 발급하기 먼저 JWT에 대한 작업을 할 클래스를 하나 생성한다. Security와 같은 모듈에서 utils 패키지를 만들어 관리를 할 것이다. 그러기 전에 먼저 의존성을 추가해 준다. build.gradle (common-authentication 모듈) dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' //Spring Security implementation 'io.jsonwebtoken:jjwt:0.9.1' } jjwt 가 java json web. token이라고 한다. utils/JwtUtil ..
Spring Security + JWT 적용하기(1) - 게시판 만들기(10)
코드를 작성하기 전에 Spring Security가 무엇이고 왜 사용해야 하는지 알아보았다. Spring Security란? Spring 기반으로 어플리케이션 보안(인증, 권한, 인가 등) 기능을 제공하는 스프링 하위 프레임워크. Spring Security는 인증과 권한에 대한 부분을 Filter 흐름에 따라 처리한다. 이 Filter는 Dispatcher Servlet으로 가기 전에 적용되기 때문에 가장 먼저 URL의 요청을 받는다. Interceptor와는 다른 점이 Interceptor는 Dispatcher Servlet과 Controller 사이에 위치하기 때문에 적용되는 시점이 다른 차이가 있다. Spring Security는 보안과 관련하여 쳬계적으로 많은 옵션을 제공하기 때문에 개발자의 입..
Entity 모듈 분리(멀티 모듈 프로젝트) - 게시판 만들기(9)
본격적으로 시작하기에 앞서 도메인 별로 모듈을 분리를 한다면 그에 따라 Entity도 각자 가지고 있을 것이고 만약 이 Entity들이 다른 도메인에서도 사용된다면(연관 관계 등에 의해서) 공통 모듈로 분리하는 것이 좋다고 생각이 되었다. 우선 로그인 기능을 붙이고 싶었다. 로그인, 회원 가입 등이 발생하는 Auth-API와 사용자들 관련 Member-API 두 가지를 만드려 하니 두 곳 모두 Member라는 Entity가 공통으로 사용될 것 같다고 생각이 되었다. 그래서 Entity를 분리하기로 했고 Member와 MemberInfo로 나누어서 관계 설정하여 모듈화 시켜보겠다. Auth-API , Entity 모듈 생성 이전의 멀티 모듈 프로젝트 생성 과정에서 본 것과 같이 auth-api , enti..
@Valid를 이용한 객체 유효성 검증 - 게시판 만들기(8)
@Valid란? @Valid는 JSR-303 표준 스펙(자바 진영 스펙)으로써 Bean Validator를 이용하여 객체의 제약 조건을 검증하도록 지시하는 어노테이션이다. JSR 표준의 빈 검증 기술의 특징은 객체의 필드에 달린 어노테이션으로 편리하게 검증을 한다는 것이다. Spring에서는 LocalValidatorFactoryBean을 Bean으로 등록하면 LocalValidatorFactoryBean이제약 조건 검증을 처리한다. Spring Boot에서는 아래와 같이 의존성을 추가해주면 해당 기능들을 사용할 수 있다. implementation 'org.springframework.boot:spring-boot-starter-validation' 동작 원리 Spring에서 모든 요청은 Dispatc..
Spring Entity와 DTO 구분하기 -게시판 만들기(7)
기존에 작성했던 코드를 보면 Entity와 DTO 구분이 없었다. @PostMapping("/signup") public ResponseEntity signup(@RequestBody Member member){ boolean result = memberService.createMember(member); if(result){ return new ResponseEntity(success(),HttpStatus.OK); }else{ return new ResponseEntity(failure(),HttpStatus.BAD_REQUEST); } } 처음 Spring을 배웠을 땐 그냥 분리해서 사용하다가 Entity를 재활용하면 좋지 않을까? 라는 생각에 이렇게 사용하려 했다. 하지만 이전에 분리해서 사용하던..
@ControllerAdvice를 사용한 예외 처리,에러 핸들링 - 게시판 만들기 (6)
우선 해당 어노테이션을 사용하기 전에 기존의 프로젝트들은 모두 if,else 또는 try,catch 등을 사용하여 예외 처리를 했었다. 이런 경우 제공하는 서비스의 규모가 커질수록 복잡해지고 코드도 길어져서 가독성이 떨어지고 수정하기 매우 힘들었다. 해당 문제점들을 해결하기위해 에러 핸들링 방법들을 찾아보던 중 @ControllerAdvice를 찾아 사용하게되었다. @ControllerAdvice & @RestControllerAdvice Spring은 전역적으로 예외처리를 할 수 있는 @ControllerAdvice를 Spring 3.2 부터, @RestControllerAdvice를 Spring4.3 부터 제공하고 있다. 두 어노테이션의 차이는 @Controller와 @RestController의 차..