프로그래밍/java, spring 21

카카오뱅크 해외송금 서비스 구현해 보기

간편송금업체에 개발자로 일하다보니, 타 업체들의 서비스는 어떻게 돼 있는지 분석할때가 있다. 카카오뱅크 해외송금 서비스가 어떻게 돼 있는지 궁금하여 UI를 틈틈히 분석 하여 DB설계 및 rest api를 구현해 보았다. 자세한 코드는 여기 github 코드 참고 일단, 카뱅 SWIFT 해외송금 화면은 아래와 같이 생겼고, swift 송금 중에 미국(USD)송금만을 분석해보았다. 참고로, 카뱅의 송금서비스가 서버단에서 어떻게 구현돼 있는지는 나는 전혀 알지 못한다. 단지 UI만을 분석하여 서버API를 설계해본 것이다. 기본적으로 해외송금은 고객으로부터 KRW기준으로 돈을 수령하여 환전 후 국제송금망(SWIFT)를 통해 해외로 송금을 보내는 것이다.(swift를 사용하지 않을때도 있긴하다) 국제송금망을 통해..

java - 순열(조합과의 비교)

일전에, 재귀함수를 다루면서 조합을 다룬바 있다.(참고 : https://severalpg.tistory.com/20) 조합과 순열이 무엇인지에 대한 개요는 생략하도록하겠다. 바로 재귀함수를 통해 구현된 코드를 실행시키고 결과값을 봐보도록 하자. 조합 import java.util.*; public class Combination { public static void main(String[] args) { int[] arr = {10, 20, 30, 40}; for(int i =1; i

spring boot와 gradle

gradle이란 빌드자동화도구이다. 여기서 말하는 빌드란, java를 컴파일한 후 필요한 라이브러리를 더해 실행가능한 jar, war등으로 패키징하는 일련의 과정을 말한다. gradle은 이를 편하게 자동화 시키는 도구라고 볼 수 있겠다. 개발자들은 빌드과정에 대한 고민필요 없이, intelliJ등 IDE를 통해 실행버튼 한번이면 gradle을 통해 빌드 후 실행까지를 편하게 할수가 있는 것이다. spring initializer의 gradle 프로젝트 생성시 만들어지는 기본프로젝트를 기반으로 gradle관련 주요 파일들에 대해 하나씩 살펴보고자 한다. groovy언어로 만들어진 build.gradle 등의 script를 생성하려면 groovy gradle을 만들고, kotlin으로 만들어진 스크립트를 ..

Could not find or load main class

Error: Could not find or load main class com.example.board.BoardApplication Caused by: java.lang.ClassNotFoundException: com.example.board.BoardApplication 스프링 기동중에 위와 같은 에러가 발생한다면 해볼 수 있는 조치사항에 대해 정리해보고자 한다. 참고로 본인은 mac에 intellij 사용자다. 구글링을 해봤다면 몇몇 방법들을 찾았을 것이다. 1)"Build" menu -> "Rebuild Project". 인텔리제이는 기존에 class가 존재한다면 가끔 rewrite를 못하기도 한다. 다시 빌드해보자. 2)인텔리제이를 닫고, rm -rf .idea *.iml 명령어를 실행하여 ..

Web server failed to start. Port 8080 was already in use.

intellij가 버벅일때가 자주 있는데, 비정상적으로 intellij가 종료될때 사용중이던 spring 서비스가 정상종료 되지 않는 경우가 있다. 이때에 다시 intellij를 켜서 spring서버 start를 누르면 아래와 같은 사용중인 port 에러가 발생한다. Web server failed to start. Port 8080 was already in use. 이때에는 프로세스를 강제로 종료 해줘야 하는데, PID정보가 필요하다. 아래와 같이 PORT번호를 통해 PID를 찾는 명령어를 실행 sudo lsof -i :8080 PID 정보는 root권한이 필요하므로, sudo를 사용하였고 현재 로그인된 USER 비밀번호를 입력하면 된다. 그다음에 아래와 같이 PID를 종료 시키는 명령어를 실행하면 ..

@JsonIgnore, @JsonBackReference, @JsonManagedReference의 차이 및 FetchType.LAZY와의 관계

@JsonIgnore@JsonIgnore는 사실 OneToMany ManyToOne 등 객체간 참조관계를 원천적으로 차단하는데 사용되기 위해 설계된 것은 아니다. 이 어노테이션은 말그대로 return 해주는 json에서 지정된 컬럼을 제외하겠다는 어노테이션이다. 그래서, password와 같은 민감한 정보가 return값으로 나가지 않도록 사용되기도 하고, json에서 제외되다 보니, 순환참조를 끊는데 사용되기도 하는 것이다. @JsonManagedReference과 @JsonBackReference두 어노테이션은 두순환참조를 끊기 위해 설계되었다. @JsonManagedReference은 조회된 데이터를 정상적으로 serialize(직렬화)시킨다. 즉, 참조되는 데이터를 가져온다는 것이다. @Jsonb..

jpa - N+1문제 원인과 fetch를 통한 해결

N+1 문제란 일단 2테이블에 대한 join에서 발생하는 문제이다. left join 1번으로 끝낼수 있는 쿼리조회가 N번이나 더 추가적으로 더 발생하는 상황을 말한다. 상황 글쓴이테이블(author)과 게시글테이블(post)이 존재한다. jpa의 findAll()을 통해 모든 글쓴이에 대한 모든 게시글 정보를 JSON형태로 조회하고자 한다. 문제발생 아래와 같이 글쓴이테이블(author)이 존재한다. 글쓴이는 여러개의 글을 쓸수가 있고, 글쓴이에 대한 글 목록들을 조회하기 위해서는 post(글목록)테이블과 1 : N의 관계인 oneToMany를 설정해줘야 한다. 즉, author테이블과 post테이블을 join 해야 한다는 말이다. @Data @Entity @Table(name="author") pub..

spring 세션에서 email정보, 권한정보 꺼내기

spring security를 이용하여 회원가입, 로그인을 구성했을때, 어떻게 로그인에 성공한 USER의 email, 권한정보(admin/일반user등)을 세션을 통해 담고, 꺼낼 수 있는지 살펴보자. spring에서 로그인처리는 일반적으로 아래의 코드와 같이 UserDetailsService클래스의 loadByUserName이라는 메소드를 구현하게 된다. user정보가 있는 DB에서 가져온 emai, password정보가 사용자가 입력한 그것과 일치한다면 로그인에 성공하게 된다. 로그인 성공시에 UserDetails객체를 만들어 return하게 되는데, 여기에 email, password, 권한정보 등을 담아서 return을 하게 된다. @Service @Transactional public class..

spring 예외처리 정리(exception기본, 중첩된 예외, 멀티서버간 예외처리)

클라이언트에서 api서버에 데이터를 요청했을때 예외가 발생하면, 서버에서는 적절한 예외처리와 이와 관련된 http response를 클라이언트에 내려줘야 한다. 그래야지, 사용자가 어떤 요청을 잘못했는지에 대해 알수 있을것이고, 팝업을 띄우거나 관련된 에러화면을 보여줄 수 있을것이다. 그래서 오늘은 3가지 정도의 category로 예외처리에 대해 정리해보고자 한다. 먼저, 기본적인 예외처리, ControllerAdvice의 사용, ResponseEntity, JSON형태의 예외메시지 등 기본적인 1대의 API서버에서 발생할 수 있는 여러 상황에 대해서 알아보고자 한다. 두번째로는 예외 message중에 예외에 예외가 감싸져 wrapping되어 넘어오는 경우 또한 종종 있다. 예외에 예외가 wrapping..

Spring JWT 토큰 서버 구현(+ ajax 프론트테스트)

회원가입/로그인, 회원정보를 조회 기능을 가진 Spring서버에서 jwt token을 통해 인증처리를 하도록 서버구현을 하고자 한다. 구현 후 테스트는 html에서 ajax를 통해 로그인 및 토큰을 발급받고자 한다. 토큰을 획득한뒤에 회원정보조회 api호출도 잘 되는지를 확인해보겠다. 참고로 본인은 백엔드 개발자이다보니, html과 ajax로 간단히 만들었다. 현업에서는 주로 react, vue.js 등 프론트엔드 프레임워크를 통해 구성할테니 양해 바란다. *사용기술 :타임리프, mysql, jpa, springboot 2.7.x, jwt, 타임리프 *github : https://github.com/kimseonguk197/spring_jwt_server 토큰과 세션이란 토큰과 세션은 인증을 위한 기술..