[@ModelAttribute 사용 시 nullException 해결] 1. 문제 발생 클라이언트에서 form-data형식으로 이미지(파일)과 값을 한 번에 보내는 요청이 있었다. Controller를 아래처럼 작성하고 조회를 해보니 자꾸 요소 값이 null로 들어왔다. - controller @PostMapping(value = "", consumes = {"multipart/form-data"}) public DataResponse askGPTSync(Principal principal, @ModelAttribute TalkReqDto talkReqDto) throws Exception { return openAIService.askGPTSync(principal, talkReqDto); } - Ta..
카카오페이 API 사용하기 (단건결제 - 결제 승인 요청하기) 1 단계 : 결제 승인하기 기본 정보 확인하기 결제 준비하기 요청과 마찬가지다. post방식으로 url 헤더에 Authorization과 Content-Type을 보내고, body에는 본문에 요구되는 정보를 보내면 된다. body에 들어갈 정보는 필수에 표시된 것만 보내도 된다. 2 단계 : 응답 클래스 작성하기 @ToString @Getter @Setter public class KakaoApproveResponse { private String aid; //요청 고유번호 private String tid; //결제 고유번호 private String cid; //가맹점 코드 private String sid; //정기결제용 id priva..
- 카카오페이 API 사전 설명 카카오페이 API는 다른 API와 달리 서버에서 통신을 해야 한다. 그 이유는 cors 정책 때문인데, 카카오페이는 보안과 관련하여 cors를 닫아놓아서 서버에서 우회하여 요청을 보내야 한다. 1 단계 : 클라이언트가 백엔드 서버에게 결제 요청 2 단계 : 백엔드 서버 단에서 결제 요청 정보를 카카오페이 서버에 전달 3 단계 : 카카오페이 서버에서 사용자 정보를 받아 사용자 인증 4 단계 : 백엔드 서버 단에서 사용자 인증 후 결제 승인 정보를 카카오페이 서버에 전달 5 단계 : 카카오페이 서버에서 최종 결제 처리 완료 6 단계 : 서버가 카카오페이 서버로부터 받은 응답을 클라이언트에게 전달 카카오페이 API 시작하기 1 단계 : 카카오페이 api 페이지 접속 Kakao ..
- RestTemplate이란? Spring에서 지원하는 객체로 간편하게 Rest방식으로 API를 호출할 수 있는 Spring 내장 클래스다.Spring 3.0부터 지원되었고, json과 xml 응답 모두 받을 수 있다. Rest API 서비스를 요청 후 응답받을 수 있도록 설계되어 있으며, HTTP 프로토콜의 메서드(GET, POST, DELETE, PUT)들에 적합한 여러 메서드를을 제공한다. 그래서 JAVA에서 사용되는 다른 템플릿처럼 단순 메서드 호출만으로 작업을 쉽게 처리할 수 있다! - RestTemplate의 특징 1. Spring 3.0부터 지원하는 Spring의 HTTP 통신 템플릿 2. HTTP 요청 후 JSON, XML, String과 같은 응답을 받을 수 있는 템플릿 3. Block..
- 목표 Map과 MultiValueMap을 비교해보고 MultiValueMap에 대해 알아보자! - map이란? 1. HashMap의 특징 map의 기본 형식으로, key : value의 한쌍으로 데이터를 저장한다. 여기서 가장 큰 특징은 키가 중복되지 않는다는 것! map에 있는 value값을 조회할 때, 키를 기준으로 가져오기 때문이다. key를 배열의 인덱스처럼 사용해 데이터(value)값을 가져오기 때문에 시간 복잡도가 O(1)이 된다. 2. TreeMap의 특징 HashMap과 동일한 기능에 추가 기능이 있는 map이다. TreeMap은 데이터가 추가될 때마다 key의 값에 따라 자동으로 정렬된다. 3.LinkedHashMap의 특징 HashMap과 동일한 기능에 추가 기능이 있는 map이다...
[스프링 데이터 JPA 쿼리 메서드] 목표 순수 JPA리포지토리와 쿼리 메서드 비교하기(이름과 나이를 기준으로 회원 조회하는 쿼리 비교하기) 순수 JPA 리포지토리 1. 순수 JPA 리포지토리 작성하기 public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } 이 코드는 리포지토리를 생성한 후 쿼리문을 문자열 형태로 만든다. ..
[Entity에 setter대신 생성자 활용하기] 목표 setter대신 생성자 활용해보기 setter을 사용하지 말아야 하는 이유 1. 사용자의 의도를 파악하기 어렵다. Member member = new Member(); member.setUsername("name1"); member.setAge(25); member.setTeam(teamA); 위의 코드를 보면 새로운 member객체를 생성하는 것인지, 값을 변경하는 것인지 의도를 파악하기 어렵다. 이 코드는 새로운 member객체를 생성하는 것지만, 객체의 요소가 많아질수록 더욱 복잡해질 것이다. Member member = new Member("name1", 25, teamA); 위의 코드 또한 member객체를 생성하는 것으로, 생성자를 이용해..
1. 스프링부트3 구조 살펴보기 1. 계층 이해하기 프레젠테이션 계층 HTTP요청을 받고 요청을 비지니스계층을 전송하는 역할 > 컨트롤러가 프레젠테이션 계층의 역할을 하는 클래스 비지니스 계층 서비스를 만들기 위한 로직, 즉 모든 비지니스 로직을 처리하는 계층 퍼시스턴스 계층 모든 데이터베이스 관련 로직을 처리, 리포지토리는 퍼시스턴스계층의 역할을 하는 클래스 2. 디렉터리 살펴보기 main 실제 코드를 작성하는 공간 - 1) java 프레젠테이션, 비지니스, 퍼시스턴스 계층의 코드를 담은 곳 - 2) resources js, css, 이미지 등 정적 파일을 넣을 static 디렉터리 스프링부트 설정(DB 설정, 로깅 설정)을 담은 application.yml 파일 > 스프링부트가 실행되면 자동으로 로딩..