본문 바로가기

웹 개발

(19)
[Spring] Spring Rest Docs [참고] Spring REST Docs Documentation (Spring REST Docs 공식 문서) Spring REST Docs Document RESTful services by combining hand-written documentation with auto-generated snippets produced with Spring MVC Test, WebTestClient, or REST Assured. docs.spring.io 백기선님 강의 - 스프링 기반 REST API 개발 (섹션 3) 스프링 기반 REST API 개발 - 인프런 | 강의 다양한 스프링 기술을 사용하여 Self-Descriptive Message와 HATEOAS(Hypermedia as the engine of ap..
[Docker] Unable to prepare context Docker 이미지를 build 할 때 Context folder가 정해지지 않아, Dockerfile을 찾지 못해 발생하는 에러 docker build -t docker-whale . 와 같이 .(현재 경로) 등의 Context folder를 정해줘야 함. 참고: stackoverflow.com/questions/35511604/docker-unable-to-prepare-context-unable-to-evaluate-symlinks-in-dockerfile-pat?page=1&tab=votes#tab-top Docker: unable to prepare context: unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx I jus..
[Jenkins] JAVA_HOME should point to a JDK not a JRE Jenkins 프로젝트 빌드 중 해당 빌드의 Console Output에서 "JAVA_HOME should point to a JDK not a JRE" 라는 메시지를 보게 되었다. 처음에는 Jenkins 오류겠거니 했는데 로그를 자세히 살펴보니 Maven 오류였다. www.baeldung.com/maven-java-home-jdk-jre JAVA_HOME should point to a JDK not a JRE | Baeldung Learn about the root cause of the Maven error 'JAVA_HOME should point to a JDK not a JRE' and how to resolve it www.baeldung.com 즉, Maven goal을 실행 시 javac..
[Jenkins] GitHub Webhook 설정 시 "Polling has not run yet" 메시지 Jenkins에 Webhook을 설정하여, GitHub Repository에 푸시가 발생했을 때 자동으로 빌드 및 배포를 실행하려 했다. 여러 설정을 마치고 해당 GitHub Repository의 Settings > Webhooks > Recent Deliveries 를 확인해보니 push 후 Jenkins 서버로 요청을 보냈고 200 status code를 받은 것을 알 수 있었다. 하지만 Jenkins의 해당 프로젝트 GitHub Hook Log를 보니 "Polling has not run yet" 라는 메시지가 떴다. 즉, GitHub Repository에서는 요청을 보냈으나 Webhook이 일어나지 않은 것이다. 사람들마다 여러 이유가 있겠지만 나의 경우에는 GitHub Repository의 Se..
[Spring] JPA - 테이블 생성시 컬럼 순서 정렬 결론부터 말하자면 1. 간단히 애노테이션이나 설정값 변경으로 할 수는 없다. 2. 또한, Hibernate에서도 장려하지 않는다. 간단히 할 수 없다고 한 것은, Hibernate의 DDL 생성 부분을 깊이 있게 파서 어떻게 해결할 수는 있을 것이라는 뜻이다. 참고: www.inflearn.com/questions/17359 hbm2ddl 를 이용해 테이블 생성시 컬럼 순서 수정 방법 - 인프런 | 질문 & 답변 안녕하세요. Kyeongseok Ko님^^ 사실 저도 처음 JPA를 사용할 때 이것 때문에 고민을 좀 했었는데요. 아쉽지만 현재로써는 단순하게 해결할 수 있는 방법은 없습니다. 하이버네이트의 DDL 생성 부분을 www.inflearn.com Hibernate에서도 장려하지 않는다는 것은, hbm..
[Spring] JPA - How to fix “Error executing DDL ”alter table events drop foreign key {foreign key} “ via JDBC Statement” alter 명령어로 특정 테이블의 foreign key를 drop할 때 발생하는 에러이므로 에러가 발생하는 여러 경우가 있겠지만 이번에는 DDL에 RDBMS의 keyword가 포함되어 있는 경우였다. RDBMS의 keyword란 MySQL의 state, PostgreSQL의 user와 같이 기능이 정의되어 있는 명령어를 말한다. 참고: stackoverflow.com/questions/54504230/how-to-fix-error-executing-ddl-alter-table-events-drop-foreign-key-fkg0mkvgsqn How to fix "Error executing DDL "alter table events drop foreign key FKg0mkvgsqn8584qoql6a2rx..
[Spring] JPA - @OneToOne 조인 전략을 left join -> inner join 으로 변경하기 Entity 객체 조회 시 Hibernate SQL 로그를 확인해보니, @OneToOne으로 매핑한 객체에 left join(= left outer join)이 사용되는 것을 확인했다. 경험해본 RDBMS들의 Optimizer는 모두 left join보다 inner join을 사용했을 경우 성능이 더 좋았기 때문에 필수적인 경우가 아니면 left join을 모두 inner join으로 바꾸고 싶었다. 생각해보면 연관된 외래키가 nullable인 경우에는 left join으로 가져와야 하는 것이 당연하기 때문에 @ManyToOne, @OneToOne의 default 조인 전략이 left join인 것 또한 당연하다. 참고: siyoon210.tistory.com/57 JPA 조인 전략 변경하기 JPA 조인..
[Spring] JPA - Could not write JSON: Infinite recursion (StackOverflowError) 처음 이 에러를 맞닥뜨렸을 때는 "Infinite recursion"라는 메세지만 보고 단순한 순환 참조 에러인 줄 알았다. 그런데 디버깅을 해보니 에러가 발생하는 시점이 데이터를 조회하는 시점이 아니라, ResponseEntity로 조회한 객체를 리턴할 때, 즉 Entity 객체를 JSON으로 Serialize할 때라는 것을 알게 되었다. 즉, ResponseEntity가 Jackson 라이브러리를 사용하여 객체를 JSON으로 Serialize할 때 순환 참조가 일어나 JSON String이 무한정 늘어나기 때문에 StackOverflowError가 발생하는 것이다. 이에 대한 해결책은 다음 세 개이다. - JPA Entity 클래스 내에 jackson 애노테이션을 사용하는 방법(@JsonIgnore,..
[Spring] Spring REST Docs 호스트 변경 Spring REST Docs를 사용하다 보면, 위 사진처럼 default로 되어 있는 호스트(localhost)와 포트(8080)를 확인할 수 있다. 그런데, 프론트엔트나 모바일 개발자 분들의 요청으로(예를 들어, HATEOAS를 적용했을 때 호스트와 포트가 localhost:8080으로 되어 있을 경우) 이 부분을 수정해야 할 때가 종종 있다. 이 때, @AutoConfigureRestDocs 애노테이션으로 Spring REST Docs의 설정 사항들을 자동 설정했다면 호스트와 포트를 간편하게 바꿀 수 있다. @SpringBootTest @RunWith(SpringRunner.class) @AutoConfigureMockMvc @AutoConfigureRestDocs(uriHost = "myhost"..
[Spring] @Bean와 @Component의 차이 @Bean의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다. 예를 들어, 다음과 같이 사용할 수 있다. @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); return objectMapper; } 애노테이션 내부를 보면 @Target이 METHOD, ANNOTATION_TYPE으로 되어 있다. @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Bean { @AliasFor("n..