우리는 스프링부트로 프로젝트를 할 때 습관적으로 @Transactional 어노테이션을 적용하고 있다. 이 어노테이션을 왜 사용하는지, 언제 사용하는지 알고 사용하면 로직의 흐름을 좀 더 이해하기 수월할 것이다. 그럼 같이 알아보자. 보안 여기서 이야기 하는 보안은 안정성이라고 보면 된다. 어떤 프로젝트나 기능을 만들 때 가장 걱정하는 것이 보안일 것이다. 실제로 보안을 강화하기 위해 다양하게 지원하고 있다. HTTP에서 HTTPS, CSRF 문제, UDP와 TCP, Spring Security, 쿠키와 세션 대신 토큰을, 토큰을 더 강화하기 위한 Refresh 토큰 등등.. 지금 생각나는 것들만 적었지만 훨씬 더 많을 것이다. 트랜잭션도 보안 때문에 생겨난 것이라고 보면 된다. 데이터베이스를 신뢰할 수..
컴퍼넌트 스캔 컴퍼넌트 스캔이란 스프링에서 자동으로 의존성을 주입해주는 것을 말한다. 실제로는 자동이 아니라 @Component 어노테이션이 붙은, 혹은 확장 어노테이션을 붙이면 스프링 컨테이너에 자동으로 객체가 저장되어 연결하는 방식이다. 자세한 내용은 자동 의존관계 포스팅을 참고하자. 우리는 정형화된 패턴인 컨트롤러, 레파지토리, 서비스단에서 @Controller, @Service를 붙여준다. Spring Data Jpa JpaRepository를 상속받은 인터페이스에서 @Repository를 붙여주지 않아도 되는 이유는 @Repository 없어도 빈으로 등록된다. 하지만 컴퍼넌트 스캔 방식으로 동작하는 것이 아니다. 스프링 데이터에서 해당 인터페이스(JpaRepository를 상속한 인터페이스)를..
Refresh Token이란 ? 사용자의 인증을 위한 토큰이 아닌 새로운 에세스 토큰을 생성하는 용도로 사용한다. 사용자의 인증은 access 토큰으로 하되, access 토큰의 만료시간이 끝나면 refresh 토큰으로 다시 access토큰을 생성해준다. 나는 여기서 궁금한 점이 3가지 있었다. 왜 만료시간을 정해둘까 ? refresh Token을 사용하는 이유는 뭘까 ? refresh Token도 만료시간이 있을텐데, 이 이슈는 어떻게 처리할까 ? 하나하나씩 알아보자. 토큰 만료시간을 정해두는 이유 이유는 간단하다. 토큰을 빼앗기면 사용자의 정보가 다 털리기 때문이다. 이 때 토큰의 만료시간을 정해두면 토큰을 빼앗아가도 만료시간이 다 되면 더 이상 토큰이 아닌 아무 의미가 없는 문자열이 되기 때문에 토..
디버깅이란 ? 말 그대로 디버깅하는 것이다. 우리가 개발을 할 때나 테스트 코드를 작성하고 실행해봤을 때, 의도하지 않은 결과가 나오거나 실패했을 때 비정상적인 연산(버그)를 찾아서 해결하는 과정을 말한다. 언제 디버깅을 할까 ? 앞서 말했지만, 테스트코드를 짰을 때 의도한 대로 동작하지 않을 때, 새로운 기술을 학습중인데 도대체 어떻게 흘러가는지 모를 때, 아니면 어떠한 버그가 있는데 이 버그가 어느 지점에서 무슨 값이 어떻게 들어가있길래 이런 문제가 발생하는지 잘 모를 때 등등, 즉 의도한대로 나오지 않거나 버그가 발생해서 해결해야할 때 뿐만 아니라 어떠한 기술의 동작과정을 알고싶을 때도 디버깅을 사용한다. 디버깅을 제대로 공부하기 전에는 로그를 이용해서 변수들을 하나하나 찍어본뒤 어떤 변수가 어떠한..
QueryDSL 문법들은 직관적이기 때문에 해석하기 쉬울 것이다. 그럼 한번 알아보자. 제목이 테스트인 게시글들 조회 쿼리 public List findByTitle_Querydsl() { return query .selectFrom(board) .where(board.title.eq("테스트")) .fetch(); } selectFrom : select와 from하는 엔티티가 같으면 selectFrom으로 합칠 수 있다. board.title.eq : 해석 그대로 게시글의 제목이 equals, 즉 테스트와 같다면 이다. fetch : 데이터가 없으면 빈 값을, 있다면 리스트 조회 제목으로 검색하는 쿼리 public List findByTitle_Querydsl(String title) { return ..
한번 QueryDSL을 어떻게 사용하는지와 기본적인 사용방법에 대해서 알아보자. 코드는 현재 만들고 있는 게시판 API에다가 추가할 예정이다. 코드는 깃허브에 있다. 환경설정 먼저 queryDSL의 버전을 나타내는 코드를 추가하자. buildscript { ext { queryDslVersion = "5.0.0" } } 그리고 플러그인에 아래코드를 추가하자. id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" dependencies에 아래코드를 추가하자. implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" implementation "com.querydsl:querydsl-apt:${queryDsl..
QueryDSL이란 ? 먼저 JPQL에 대해서 뭔지 알아야 한다. JPQL은 엔티티를 조회하기 위한 객체지향 쿼리로, 특징은 문자로 쿼리를 작성한다는 점이다. 한번 회원 이름이 kim인 엔티티를 조회하는 쿼리를 작성해보자. String jpql = "select m from Member as m where m where m.username = 'kim'"; 이런식으로 SQL을 추상화해서 특정 데이터베이스(h2, mysql 등등)에 의존하지 않는다. 여기까지만 알아보고, 그럼 왜 QueryDSL이 탄생했는지 알아보자. 어떠한 새로운 것이 탄생하게 된 배경은 기존의 것이 문제가 있기 때문이다. JPQL은 문자로 작성한다는 점이 단점이다. 예를 들어 JPQL에서 다음과 같은 코드를 작성해봤다고 가정해보자. s..
나는 대부분 프로젝트를 생성할 때 Spring Initalizr 라는 사이트를 이용한다. 이때 패키징으로 Jar와 War중 정하는 부분이 있는데 둘 중 무엇을 골라야 할지 몰라서 default값인 Jar로 사용하였다. 그럼 Jar와 War가 뭔지 알아보자. JAR Java Archive의 약자로, 자바의 리소스와 속성 파일, 라이브러리 및 기타 부가적인 파일들이 담겨있다. 쉽게 생각해서 자바 에플리케이션이 동작할 수 있게 자바 프로젝트를 압축한 파일이라고 생각하면 된다. WAR Web Application Archive의 약자로, 쉽게 말해서 jar파일에다가 웹 컨테이너, Servlet Context 등 웹 관련 자원을 포함한다. 정리 결론은 꼭 외부 WAS를 쓴다던가 JSP로 뷰를 만들어야 한다면 WA..
이번 포스팅에서는 완성된 예제를 가지고 하나하나 돌려보면서 동작과정을 알아보겠다. 완성된 예제는 깃허브링크에 있어 동작과정에서 놓친 코드가 있다면 참고하자. 그리고 꼭 코드를 구현하고 어떻게 동작되는건지 이해가 가지 않을 때 이 포스팅을 참고하는 것이 좋다. 코드를 구현하는 포스팅은 여기로 가면 된다. 먼저 회원가입이다. localhost:8080/member/join에서 이메일과 닉네임, 나이, 비밀번호를 입력한다. Send를 누르면 만들어놓은 컨트롤러에서 저장을 한다. 서비스로직은 다음과 같다. 먼저 Postman에서 요청한 DTO중에 이메일을 findByEmail로 DB에 비어있는지 확인한다. 비어있지 않다면 이미 가입한 계정이라는 뜻이기 때문에, 또 가입할 수 없게 처리한 것이다. 그리고 이메일은..
이번 포스팅에서는 실제로 코드를 통해 회원가입 및 JWT를 이용해 토큰을 발급해주고, 페이지 권한까지 해보는 시간을 가지도록 하겠다. 메인 기능인 로그인 구현을 하기 전에 간단하게 회원가입 로직을 짜보자. 로그인 구현에 중점을 두기 때문에 설명은 생략하고 코드만 보여주도록 하겠다. 회원가입 패키지 구조 Member public class Member extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; private String nickname; private int age; private String password; @Enumerated(En..
- Total
- Today
- Yesterday