전체 글

학습 정리

    @EntityListener로 생성일, 수정일 자동으로 넣기 + 프록시 활용(연관관계 Insert) - 게시판 만들기(13)

    이전에 회원가입, 로그인까지 만들었다. 나의 경우 간단하게 상세 정보도 만들어 1대 1 매핑을 했다. 이런 간단한 비즈니스들은 본인이 원하는 대로 만들면 될 것 같다. 게시글 Entity를 만들기 전에 게시글은 생성일, 수정일이 필요할 것 같아 해당 기능을 자동으로 하기 위해 JPA Auditing을 사용해보려고 한다. JPA Auditing JPA Auditing이란? JPA에서 시간 값을 자동으로 넣어주는 기능이다. Entity를 영속화 시키거나 조회를 수행한 후에 update를 하는 경우 매번 시간을 읽어와서 저장해 주는 번거로움이 있는데 JPA Auditing을 사용하면 자동으로 시간을 매핑하여 DB 테이블에 넣어준다. 사용하기 전에 이게 정말 좋을까?에 대한 생각이 들었다. 사실 자동으로 다 해..

    [JPA] 개념 정리(영속화, 영속성 컨텍스트)

    여태 spring-boot-starter-data-jpa 가 JPA의 전부인 줄 알았지만 아니었다. Java에서 대표적인 ORM이 JPA이고(표준이 되었음) 그 구현체 Hibernate가 있는 것과 객체는 객체답게, RDB는 RDB답게 설계하면 ORM 프레임워크가 자동으로 매핑해주는 것, DB에 종속적이지 않은 것 등은 알고 있었다. 그래서 JPA가 뭔지 더 찾아보니 기존에 내가 사용하던 것들의 원리를 알 수 있었다. JPA의 원리 JPA 동작 JPA는 어플리케이션과 JDBC 사이에서 동작한다. 어플리케이션에서 JPA로 명령을 하면 JPA가 해석해서 JDBC API를 사용하여 SQL을 실행하고 그 결과를 반환받는다. 그래서 findAll()과 같은 자바스러운 메소드를 사용해도 변환해서 SELECT * ~..

    [Java] 가비지 컬렉션(Garbage Collection)과 5가지 알고리즘

    가비지 컬렉션(Garbage Collection) 최근 친구가 전화로 자바에서 생긴 메모리 이슈 관련 도움을 구한 적이 있었다. 친구랑 같이 원인을 찾다 보니 계속 새로운 객체를 생성하여 참조된 객체를 Garbage Collection이 제거하지 않아 생기는 문제일 수 있음을 알게 되었다. 이런 것을 방지하기 위해 싱글톤 패턴으로 코드를 작성하고 Spring에 와서는 Bean을 생성하고 DI를 적용하여 자동으로 싱글톤 패턴이 적용되었다. 그래서 항상 하던 대로 코드를 작성하다 보니 Garbage Collection을 신경 쓰지도 않았고 어떻게 동작하는지도 몰라서 궁금하여 찾아보고 정리하게 되었다. 특히 나도 나중에 저런 메모리 이슈가 생길 수 있고 지금 공부하는 내용이 도움이 될 것 같다고 생각된다. G..

    로드밸런싱(Load Balancing)과 Nginx

    로드 밸런싱(Load Balancing) 로드 밸런싱이란? 말 그대로 서버가 처리할 일이나 요청(Load)을 여러 대의 서버로 분산(Balancing) 처리하는 것을 의미한다. 사전적인 정의로는 둘 이상의 중앙처리장치 또는 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 의미한다. 한 대의 서버로 모든 부하가 집중되지 않도록 트래픽을 적절히 관리해서 각각의 서버가 최적의 퍼포먼스를 낼 수 있도록 하는 것이 목적이다. 서비스 규모가 커지고 사용자 수가 늘어날수록 트래픽이 증가하기 때문에 기존의 서버로는 원활한 서비스 운영이 불가능하게 된다. 이에 대처하는 방식이 크게 두 가지가 있다. 기존의 서버 성능을 확장하는 Scale-up 방식 서버의 개수를 늘리는 Scale-out 방식 Scale-up의 경우..

    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는 보안과 관련하여 쳬계적으로 많은 옵션을 제공하기 때문에 개발자의 입..

    Nginx와 Docker 배포 과정 이슈 해결 및 Nginx 설치 및 proxy_pass 설정

    Nginx 간단 설명 수문장과 같은 역할로 OS의 방화벽이 1차 보호를 한다면, 그 다음으로 요청을 먼저 받아볼 수 있는 역할을 하는 웹 서버이다. 제일 먼저 요청을 받아 보기 때문에 해당 요청으로 여러가지 설정이 가능한데 proxy_pass의 경우 이 요청을 보고 분석하여 내가 원하는 곳으로 보내주는 것이다. 그리고 보안 설정, 요청 분산 등의 처리도 가능하다 이를 각각 Blacklist IP, Load Balancing이라고 한다. Blacklist IP Blacklist IP의 경우 외부 IP를 블랙리스트로 등록하여 접근을 막는 것으로 예를 들면 중국이나 러시아에서 들어오는 위험한 IP나 해외 IP등의 접근을 막는 것이다. Load Balancing Load Balancing의 경우 요청을 여러 대..