스프링 부트 애플리케이션을 실행할 때, 명령어 뒤에 붙는 인자(argument)는 애플리케이션에 전달되는 값으로 사용됩니다. 이 인자 중에서 --가 붙는 인자는 애플리케이션의 실행 옵션을 지정하는 것이며, --가 붙지 않는 인자는 애플리케이션에 전달되는 인자 값으로 사용됩니다. --가 붙는 인자는 애플리케이션의 실행에 영향을 미치는 설정을 지정할 수 있습니다. 예를 들어, --server.port=8080과 같이 HTTP 포트 번호를 설정하거나, --spring.profiles.active=dev와 같이 애플리케이션 프로파일을 설정할 수 있습니다. 반면, --가 붙지 않는 인자는 애플리케이션에 전달되는 값으로 사용됩니다. 예를 들어, java -jar myapp.jar arg1 arg2와 같이 애플리케이..
Spring Boot에서는 Jackson 라이브러리를 사용하여 JSON 데이터를 처리합니다. Jackson은 Java 객체와 JSON 데이터 간의 변환을 수행하는 라이브러리로, Java 객체를 JSON으로 직렬화(Serialize)하거나, JSON 데이터를 Java 객체로 역직렬화(Deserialize)할 수 있습니다. Spring Boot에서는 Jackson 라이브러리의 ObjectMapper 클래스를 사용하여 JSON 데이터를 처리합니다. Jackson에서는 직렬화와 역직렬화를 수행할 때 사용하는 Serializer와 Deserializer를 지정할 수 있습니다. Serializer는 Java 객체를 JSON 데이터로 변환할 때 사용되고, Deserializer는 JSON 데이터를 Java 객체로 변..
Bean을 생성하는 3가지 방법 1. @Component 애노테이션으로 생성하기 스프링부트에서 가장 보편적으로 사용하는 방법으로 @Component 애노테이션을 사용할 수 있다. 개발자가 직접 작성한 Class에만 사용할 수 있다. @Component public class MyComponent1 implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("MyComponent1.afterPropertiesSet"); } } 2. @Bean 애노테이션으로 생성하기 주로 외부 라이브러리의 객체들을 Bean으로 만들때 사용하거나, 같은 타입의 빈을 여러개 생성하고 싶을 ..
방법1. 특정 컨트롤러나 요청에 대해서 Cross Origin 허용하기 @CrossOrigin 애노테이션 사용하기 @RestController @CrossOrigin(origins = "http://localhost:63342") //해당 origin 승인하기 @RequestMapping("/api/books") public class VocaTestApiController { ... } 방법2. 전역설정을 통해서 Cross Origin 허용하기 WebMvcConfigurer의 addCorsMappings 메소드 활용하기 import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.con..
※이 포스팅은 https://www.baeldung.com/spring-graphql 을 번역하고, 예제 코드와 내용을 각색한 포스팅입니다. 1. 개요 GraphQL은 REST API의 대안으로 Facebook에서 제시한 새로운 Web API 컨셉입니다. 이 포스팅에서는 스프링 부트(Spring Boot)를 사용하여 웹 애플리케이션에 GraphQL서버를 구축하는 방법을 소개하겠습니다. (개인적으로 사용한 예제는 스프링 부트 2.1.8버전, 자바 8버전, JPA를 사용하였습니다.) 2. GraphQL이 뭐지? 기존 REST API는 다양한 HTTP Method가 서버에 존재하는 리소스(Resource)와 대응되어서 동작합니다. 이는 클라이언트의 요청사항과 리소스(Resource)가 잘 들어맞지 않는다면 (..
스프링 프레임워크에서 하나의 인터페이스 (혹은 상위 클래스)를 구현(상속)한 여러개의 빈이 존재하고, 그 빈들을 모두 다뤄야 하는 경우에 예제를 보겠습니다. 예제로 사용할 빈들은 다음과 같습니다. public interface Music { void playing(); } @Component public class Music1 implements Music{ @Override public void playing() { System.out.println("뮤직1의 흥겨운 노래"); } } @Component public class Music2 implements Music{ @Override public void playing() { System.out.println("뮤직2의 즐거운 노래"); } } @..
스프링 부트(Spring Boot)에서 컨트롤러(Controller)를 테스트 하는 방법에 대해서 기록해보겠습니다. 컨트롤러 테스트를 쉽게 하기 위해서 요청을 수행하고 응답을 만들어내는 Servlet API 모조(mock)객체를 사용합니다. 테스트에 사용되는 객체가 여러가지 존재하지만 대표적으로 MockMvc를 많이 사용합니다. (그리고 컨트롤러를 테스트 한다는 표현보다는 MVC를 테스트 한다는 표현을 주로 사용합니다.) 부트버전은 2.1.6을 사용했으며, Spring Web Starter이외에 별다른 의존 설정은 하지 않았습니다. (Spring Web Starter만 추가하면 아래와 같이 2가지 의존설정이 들어갑니다.) org.springframework.boot spring-boot-starter-w..
스프링 빈(bean)은 쓰레드 세이프.. 하겠..지?? 빈(bean)은 개발자 입장에서 편리합니다. 스프링이 생성하고 관리하고 조립도 해주고 많은 제어를 많이 해주니까 말이죠. (어제까지만 해도) 저는 스프링 빈(bean)이라면 쓰레드 세이프 할 것이라는 무지에서 비롯된 믿음이 있었습니다. 하지만 스프링 빈(bean)은 근본적으로 쓰레드 세이프 하지 않습니다. 왜 쓰레드 세이프 하다고 오해했을까? 같이 공부하는 (주니어 개발자) 친구들에게 질문해봐도 이 부분에서 같은 오해를 하는 친구들이 많다는 걸 알 수 있었습니다. 왜 이런 오해를 하고 있을까요? 첫번째 이유는 많은 요청을 받는 멀티 쓰레드 환경에서 학습해보지 못한 경험상에 이유입니다. 두번째 이유는 (놀랍게도) 쓰레드 세이프하게 빈(bean) 클래스..