좋아요 👍그럼 Spring Boot에서 API 호출 + JSON 응답을 DTO로 매핑하는 완성형 예제로 정리해서 블로그에 바로 쓸 수 있게 드릴게요.📌 Spring Boot에서 API 호출하고 JSON 응답을 DTO로 매핑하기Spring Boot에서 외부 API를 호출할 때, 응답이 JSON이면 문자열 그대로 쓰는 것보다 DTO로 변환해서 사용하는 것이 안전하고 유지보수에 유리합니다.아래는 RestTemplate과 WebClient 두 가지 방식 모두 예제를 보여드립니다.1. RestTemplate (동기 방식)① DTO 클래스 만들기import com.fasterxml.jackson.annotation.JsonProperty;public class FloorInfoDto { @JsonPrope..
📌 Spring Boot에서 API 호출하기Spring Boot에서는 외부 API를 호출할 때 RestTemplate(동기)와 WebClient(비동기, 최신 권장) 방식을 주로 사용합니다.1. RestTemplate (동기 방식)① Bean 등록import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class AppConfig { @Bean public RestTemplate restTemplate() { re..
@CrossOrigin은 Spring Boot에서 CORS(Cross-Origin Resource Sharing) 문제를 해결하기 위해 사용하는 애노테이션입니다. 브라우저가 보안상 같은 출처(origin)가 아닌 요청은 기본적으로 차단하는데, 이 제약을 풀어주기 위한 것입니다.✅ 기본 개념CORS란?CORS는 웹 브라우저가 다른 출처(origin)의 서버로 요청할 때 보안상의 이유로 막히는 것을 해결하기 위한 메커니즘입니다.예시:프론트엔드가 http://localhost:3000 (React)백엔드가 http://localhost:8080 (Spring Boot)이때 React에서 Spring Boot로 API 요청을 보내면 브라우저는 다른 origin 간 요청이라고 판단하고 CORS 에러를 발생시킵니다..
Spring Boot와 JavaScript로 로컬 PDF 파일 팝업 창에서 띄우기 📄💻웹 애플리케이션에서 로컬 PDF 파일을 팝업 창으로 띄우는 방법을 소개합니다. 이 방법은 Spring Boot 서버를 사용하여 로컬 PDF 파일을 제공하고, JavaScript를 이용해 해당 파일을 팝업 창으로 열 수 있도록 구현하는 방식입니다.1. Spring Boot 서버에서 로컬 PDF 파일 제공 🖥️먼저, Spring Boot 서버에서 로컬 PDF 파일을 HTTP 경로를 통해 제공하는 방법을 설명합니다. PDF 파일을 로컬 경로에서 읽어와 웹에서 제공하는 방식입니다.1.1. Spring Boot Controller에서 PDF 파일 제공import org.springframework.core.io.FileSy..
제목: Spring Boot에서 WebApplicationContext를 사용해 빈 가져오기Spring Boot 애플리케이션에서 Spring 관리 빈을 가져오는 방법 중 하나는 WebApplicationContext를 사용하는 것입니다. WebApplicationContext는 웹 애플리케이션의 컨텍스트를 나타내며, 애플리케이션에 등록된 빈들을 관리합니다. 이번 글에서는 WebApplicationContext를 사용해 Spring Boot에서 등록된 빈을 가져오는 방법에 대해 설명하겠습니다.1. WebApplicationContext란?WebApplicationContext는 Spring의 ApplicationContext의 하위 인터페이스로, 웹 애플리케이션의 환경에서 빈을 관리하는 컨테이너 역할을 합..
[문제 상황]intelliJ에서 war 파일을 생성하려고하는데 계속 해당 오류가 발생하는 상황Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream. [해결 방법]pom.xml에 아래 플러그인 쪽에 아래 내용 추가 org.apache.maven.plugins maven-surefire-plugin true
| Validation 어노테이션이 작동이 안된다면? spring boot 2.3 version 이상부터는 spring-boot-starter-web 의존성 내부에 있던 validation이 사라졌습니다. 때문에 사용하시는 spring boot version이 2.3 이상이라면 validation 의존성을 따로 추가해주셔야 사용할 수 있습니다. Gradle // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: '2.5..
package hello.core.beanfind; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annota..
package hello.core.beanfind; import hello.core.AppConfig; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigAppli..
BoardRepository.java public List findPage(int start, int total) { return em.createQuery("select b from Board b", Board.class) .setFirstResult(start) .setMaxResults(total) .getResultList(); } setFirstResult : 시작위치 setMaxResults : 출력개수 setFirstResult(10).setMaxResults(10)의 결과는 10번째부터 10개가 출력된다는 의미이다. BoardService.java public List findPage(int start, int total) { return boardRepository.findPage(sta..
ImageController package com.kyhslam.controller; import com.kyhslam.domain.UploadFile; import com.kyhslam.service.FileService; import com.kyhslam.service.ImageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.R..
Domain package com.kyhslam.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; @Entity @Setter @Getter @Table(name = "voc_article") public class Article { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "article_id") private Long id; private String subject; @Lob private String content; private LocalDateTime regDat..