배포 후 마주한 CORS와 쿠키 이슈, Spring Security로 해결
·
Backend Engineering/Java & Spring
지난 포스팅에서는 백엔드와 프론트엔드 플랫폼의 차이, HTTPS의 중요성, 그리고 "Swagger는 잘 되는데 왜 프론트는 안 될까?"라는 의문까지 다뤘다.핵심은 Origin(출처)의 차이였다.Swagger: https://my-backend.koyeb.app (Same-Origin) → 문제없음로컬 프론트: http://localhost:3000 (Cross-Origin) → 브라우저가 차단이론적으로는 모든 준비가 끝났다고 생각했지만, 막상 로컬 프론트엔드에서 배포된 백엔드로 요청을 보내자 브라우저 콘솔은 빨간색 에러로 도배되었다.Access to fetch at 'https://api.myproject.koyeb.app/api/users' from origin 'http://localhost:3..
HttpServletRequest, 구식 기술일까? - 현업에서 만난 진실
·
Backend Engineering/Java & Spring
고민의 시작: @Annotation vs HttpServletRequest최신 스프링 부트에선 HttpServletRequest를 직접 주입받아 사용하는 경우가 눈에 띄게 줄었다.(레거시 프로젝트는 아직 대부분 HttpServletRequest를 쓰겠지만.. 예를 들면 지금 회사?) 대부분 @RequestParam이나 @RequestBody로 데이터를 처리한다.그렇다면 이제 HttpServletRequest는 아예 안 써도 되는 구식 기술일까? // 요즘 스타일@PostMapping("/users")public User createUser(@RequestBody UserDto userDto) { return userService.create(userDto);}// 옛날 스타일?@PostMapping..
Swagger 사용 중 415 에러(application/octet-stream) 해결 과정
·
Backend Engineering/Java & Spring
{ "timestamp": "2025-12-30T06:00:45.658Z", "status": 415, "error": "Unsupported Media Type", "trace": "org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/octet-stream' is not supported\r\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodA..
Spring Boot JAR 배포 시 application.yml 설정 적용 우선순위
·
Backend Engineering/Java & Spring
Spring Boot 프로젝트를 JAR 파일로 배포할 때 application.yml 설정이 어떻게 적용되는지 헷갈릴 수 있다. 이번에 개발망 JAR를 실행시키려 했는데 실행이 되지 않았고 JAR 내부에 application.yml이 포함되어 있는 경우, 또는 외부 설정 파일을 사용할 경우 Spring Boot는 특정 우선순위에 따라 설정을 로드한다는 걸 몰랐었다. 이번 글에서는 Spring Boot의 설정 파일 적용 원리와 우선순위를 정리해보았다. 1. Spring Boot에서 설정 파일 적용 원리Spring Boot는 application.yml 또는 application.properties 파일을 이용해 애플리케이션 설정을 관리한다. JAR 배포 시, Spring Boot는 설정 파일을 다음과 같은..
파일 다운로드: POST 방식과 location.href의 차이점과 구현 방법
·
Backend Engineering/Java & Spring
웹 개발 중 사용자에게 파일을 다운로드하도록 제공해야 하는 경우가 많습니다. 제가 이번 프로젝트에서 똑같은 파일 다운로드였으나 어떤 곳에선 되고, 어떤 곳에선 안되는 문제가 발생했었고, 1차적으로 POST방식을 썼기 때문에 다운로드가 부분적으로만 가능했었습니다. 이번 글에서는 POST 방식과 location.href를 이용한 파일 다운로드 방식의 차이점을 설명하고, 파일 다운로드를 구현하는 Java 컨트롤러 코드를 분석해 보겠습니다.  1. POST 방식 vs. GET 방식(location.href)POST 방식의 파일 다운로드POST 방식으로 파일 다운로드를 구현하려면, 서버에서 파일을 처리하고 응답으로 파일 데이터를 전송해야 합니다. 일반적으로 POST 방식은 데이터를 서버로 전달하는데 사용되며, 파..
세션(Session)과 쿠키(Cookie)의 차이점과 사용 사례
·
Backend Engineering/Java & Spring
지난 포스팅에 이어 웹 애플리케이션 개발에서 **세션(Session)**과 **쿠키(Cookie)**는 사용자 상태를 관리하는 데 중요한 역할을 합니다. 이번 포스팅에서는 세션과 쿠키의 차이점, 각각의 사용 사례, 그리고 Java Spring Framework를 활용한 대표적인 예제를 통해 개념을 명확히 정리해보겠습니다.  세션(Session)과 쿠키(Cookie)의 차이점특징세션 (Session)쿠키 (Cookie)저장 위치서버에서 관리클라이언트(브라우저)에 저장보안상대적으로 안전 (데이터가 서버에 저장됨)보안에 취약 (클라이언트에서 접근 가능)데이터 크기제한 없음 (서버 메모리나 데이터베이스 의존)4KB 제한유지 시간기본적으로 브라우저 종료 시 만료 (설정에 따라 유지 가능)만료 시간을 설정하여 브라..
동일 Host에서 다른 포트의 두 프로젝트 간 POST 요청 시 세션 충돌 문제 해결 방법 도메인 변경
·
Backend Engineering/Java & Spring
문제 상황개발 환경에서 localhost를 기반으로 두 개의 프로젝트를 실행하고 있었습니다:Frontend 프로젝트: localhost:8081Admin 프로젝트: localhost:8080이 두 프로젝트에서 POST 방식으로 데이터를 전송할 때마다 사용자가 강제로 로그아웃되는 현상이 반복되었습니다.문제 원인브라우저는 기본적으로 쿠키를 도메인 + 포트 단위로 관리합니다.localhost는 브라우저에서 특별한 호스트로 처리되며, 같은 localhost에서 포트가 다른 경우에도 쿠키가 공유되지 않습니다.때문에 POST 요청을 보낼 때마다 세션이 초기화되었습니다.  문제 해결 방법이 문제를 해결하기 위해 아래 두 가지 접근 방식을 사용할 수 있습니다방법 1: 도메인 분리를 통한 세션 충돌 해결방법 설명두 프로..
@Controller: return redirectUrl vs return ModelAndView
·
Backend Engineering/Java & Spring
@Controller에서 return redirectUrl (String)과 return ModelAndView는 반환값 처리 방식과 용도에서 차이가 있습니다. 아래는 이 두 가지 방법의 차이점을 정리한 내용입니다.1. return redirectUrl (String)설명문자열을 반환하며, 반환된 값이 리다이렉트 경로로 간주됩니다.Spring MVC에서 redirect:로 시작하는 문자열은 클라이언트에게 HTTP 리다이렉트 응답을 보냅니다.특징리다이렉트 처리:브라우저가 지정된 경로로 새로운 요청을 보냅니다.클라이언트가 새로운 요청을 보내므로 URL이 변경됩니다.사용법: 주로 폼 제출 후 특정 페이지로 이동하거나 다른 컨트롤러 경로로 리다이렉트할 때 사용됩니다.데이터 전달 제한: 리다이렉트에서는 데이터..
Spring Framework: @RestController vs @Controller – 차이점 이해하기
·
Backend Engineering/Java & Spring
Spring 개발자로서 @RestController와 @Controller 애노테이션을 모두 사용해본 적이 있을 것입니다. 이 둘은 비슷해 보이지만, 서로 다른 목적을 가지고 설계되었습니다. 이번 글에서는 두 애노테이션의 차이를 살펴보고, Spring 버전에 따른 변화와 실제 활용 예제를 통해 언제 어떤 것을 사용하는 것이 적합한지 알아보겠습니다. @RestController란?@RestController는 **Spring 4.0 (2013년 12월 출시)**에서 RESTful 웹 서비스를 쉽게 만들 수 있도록 도입된 애노테이션입니다. 이 애노테이션은 @Controller와 @ResponseBody를 결합한 형태로, 클래스에 적용하면 해당 클래스의 모든 핸들러 메서드가 HTTP 응답으로 데이터를 반환하도..
[IntelliJ]Junit 기본 설정 중 에러 (Spring Boot 2, Junit4)
·
Backend Engineering/Java & Spring
기본 Junit에 대한 설명(Spring Boot 버전)https://perfectacle.github.io/2020/12/25/dependency-injection-in-junit/ Spring Boot + JUnit에서 의존성 주입하기JUnt 4Field Injection 밖에 되지 않음.Spring Boot 2.2.0부터 JUnit 5가 기본으로 탑재되기 시작했고,Spring Boot 2.4.0부터는 아예 JUnit 4 의존성이 제거됐기 때문에 JUnit 4의 사용은 하지 말아야한다. 12345678@RunWithperfectacle.github.io 이것이 왜 중요하냐면..회사에서 Junit을 쓰진 않지만, 백엔드 책에서 배운 단위테스트를 하고 싶어서 도전했는데 이틀을 Junit5로 하다가 포기했..