목록전체 글 (99)
Java / Spring

개인 프로젝트를 진행하면서 MultiPartFile 을 저장하는 api 가 계속해서 실패하는 문제가 발생하였다.해당 오류를 구글링 해보니 대부분 경로 설정에 문제로 경로를 재설정 하거나 gradle 을 다시 빌드하여 해결하신 분들이 많았지만, 현재 경로에는 문제가 없는 것을 몇번이고 다시 확인했다. 문제는 해당 데이터를 처리하는 DTO 의 필드명 문제였다.문제를 해결하기 전의 DTO 는 아래와 같이 정의 되어 있다. (* 게시글을 등록하기 위한 CreateBoardDTO)@Data@NoArgsConstructor@AllArgsConstructorpublic class CreateBoardDTO { private Long boardId; private String boardPass; pri..

JWT 를 공부하면서 Access Token 과 Refresh Token 의 흐름에 대해 이해한 내용을 기록하고자 한다. 먼저 사용자가 로그인을 시도하면 클라이언트에서 사용자 인증을 위해 서버로 ID 와 PASSWORD 등의 데이터를 보내 인증 요청을 한다. 서버에서는 클라이언트가 요청한 데이터를 여러 검증을 거쳐 jwt Token 을 응답하게 된다. 이 때, 서버는 두개의 토큰을 클라이언트로 전달하는데 이때 전송되는 Token 이 바로 Access Token 과 Refresh Token 이다. 1. Access Token (생명 주기 : 10min ~ 1hour)- Access Token 은 사용자의 요청을 인증하기 위해 클라이언트에서 자주 사용되며, 상대적으로 짧은 시간 동안만 유효하도록 설계한다.-..

인텔리제이를 사용하여 스프링부트의 내부 서버를 구현하고 REST API 통신을 위해 vscode 로 구현한 로그인 데이터를 백엔드 서버로 요청을 보내고 응답을 받는 테스트를 진행하였다. 나중에도 많이 사용하고 기본적으로 알고 있어야 될 내용이라고 생각해서 기록을 하기로 하였다. 먼저, 프로젝트 구조 상 별도의 webconfig 를 구현할 필요 없이 Spring Security 를 사용하고 있기에 이미 구현해놓은 SecurityConfig 라는 클래스 내부에 백엔드 서버에서 데이터를 보낼 프론트엔트 PORT 번호를 설정한다. 스프링 컨테이너에 등록한 아래의 클래스 내부 CorsConfigurationSource() 메서드 내부에 정보를 입력해준다.(프론트엔드 PORT 번호 : localhost:3000 )..

Object Mapper 란 ? Jackson 라이브러리에서 제공하는 클래스로 클라이언트에서 전송한 JSON 데이터를 Java 객체로 변환해주는 기능이다. - JSON의 키와 Java 객체의 필드를 매칭하여 데이터를 역직렬화한다. 이 과정에서 ObjectMapper 가 사용되는 것이다. 그럼 ObjectMapper 는 내부적으로 어떻게 데이터를 읽는것일까?1. 클라이언트의 JSON 요청 : - 예를 들어 클라이언트에서 Login 을 시도할 때 username 과 password 데이터를 서버에 전송 후 검증을 해야할 때 클라이언트가 서버에 보내는 데이터는 보통 JSON 형식으로 보낸다. 이 데이터를 서버에서는 바로 읽을 수 없다. 해당 데이터를 Java 객체로 변환해야 된다. @Overridepublic..

에러코드 : java.lang.TypeNotPresentException: Type cohttp://m.hyeobjin.domain.entity.FileBox not present 프로젝트의 join 테이블의 데이터를 조회하는 API 테스트 도중 위와 같은 에러가 발생하였다. DB에서 Item 테이블의 file 데이터를 List로 가지고 오는 쿼리에서 문제가 발생하였고, 처음에는 뭔가 타입에러 라고 생각해서 엔티티와 DB 타입 매핑쪽을 확인해보았지만 아니였다. 에러코드를 좀 더 확인해본 결과,com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class 뭔가 직렬화와 관련된 문제라고 하는데 @Jo..

vscode 에서 axios 를 사용하여 비동기 처리하는 방식은 위와 같이 터미널 실행 후 npm 으로 axios 라이브러리를 다운받는다. template>script>import axios from 'axios'; 추가로 vue 스크립트 태그 내부에 위에서 설치한 axios 라이브러리를 import 시켜준다(* 전체 App,vue 스크립트 로직)script>import axios from 'axios';import dataItem from './assets/dataItem';import ContainerItem from './components/ContainerItem.vue';export default { name: 'App', data() { return { dataItem: da..

개인 프로젝트에서 처음 네이티브 쿼리에 대해 알고 사용하게 되었다. 개인적으로 네이티브 쿼리의 경우 데이터베이스 종속적인 특성을 가지고 있기 때문에 사용을 지양하려고 했고, 프로젝트 내의 대부분의 쿼리는 ORM 기술을 사용하고 활용하는데 초점을 두고 있었다. 네이티브 쿼리의 장점복잡한 조인이나 서브쿼리를 작성할 때 유용데이터베이스에 최적화된 쿼리 작성 (개발자 의도대로 성능 최적화 및 튜닝 가능) 네이티브 쿼리의 단점 코드 가독성이 너무 떨어진다데이터베이스 종속적 (유지보수성 ↓)오타가 많이 발생한다MySql 에서 읽지 못하는 타입은 강제로 형변환을 해주야 한다. - 형변환을 하면서 로직이 더 복잡해진다(LocalDateTime -> TimeStamp) * 프로젝트에서 사용자에게 메일을 전송했을 때 ..
로그인 후 JWT 토큰을 발급 받아 쿠키에 저장하고 이를 @CookieValue 를 통해 사용하는 로직을 구현 하였다. 토큰 발급 시간을 24시간으로 설정하였지만 1분이 조금 지나면 계속해서 토큰이 만료 되었다. error message : There was an unexpected error (type=Internal Server Error, status=500). JWT expired 106942 milliseconds ago at 2024-12-13T03:22:16.000Z. Current time: 2024-12-13T03:24:02.942Z. Allowed clock skew: 0 milliseconds. io.jsonwebtoken.ExpiredJwtException: JWT expired 1..

JWT 구현 후 로그인 폼에 사용자의 E-MAIL 정보와 PASSWORD 정보를 empEmail, empPass 라는 프로젝트 내의 Entity 의 변수명으로 바인딩 하려고 하자 계속해서 오류가 발생하였다 다음부터 같은 실수를 하지 않기 위해 기록 하였다. 오류 내용 : An internal error occurred while trying to authenticate the user.(인증 과정 내부 예외) User E-mail : Password : 공부를 하면서 작성했던 LoginFilter 의 내부 메서드는 아래와 같다public class LoginFil..
querydsl 을 사용하여 프로젝트를 진행하면서 이해가 되지 않았던 부분 복습을 위한 기록@Repository@Transactionalpublic class EmployRepositoryImpl extends QuerydslRepositorySupport implements EmployeeRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; public EmployRepositoryImpl(EntityManager entityManager) { super(Employee.class); jpaQueryFactory = new JPAQueryFactory(entityManager); } 먼저 Query..