spring boot .yml 파일 만으로 test 분리

이미지
spring boot에서 Test 환경을 격리하는 방법을 지원을 해주고 있다는 것을 알게 되었다. spring boot의 기본 패키지 구조는 처음에 프로젝트를 생성 하면 아래와 같이 src 밑에 main, test 를 둔다. main 밑에는 java 와 resources 는 기본적으로 있다. 하지만 test 밑에서는 resources 가 없다. 강의를 들으면서 생성했다. 보통 Test code 를 작성하면 test/java/ 밑에서 작성한다. 물론 테스트의 범위 마다 다르겠지만, 그리고 Test code 를 돌리면 main/ 하위 환경 즉 개발환경을 가져다가 사용한다. 하지만 아래의 사진과 같이 test/resources/application.yml 이 있을 경우에는, 우선권이 test 패키지 밑에 .yml 파일에 있기 때문에 test 아래의 .yml 환경으로 테스트를 진행할 수 있다. JPA 기능 테스트를 혹은 서비스 레이어의 테스트를 진행 할 때 DB connection 이 필요하다. 실제로 테스트의 경우 @Transactional 이 있는 경우 테스트 코드가 끝나면 롤백이 default 이다. 하지만 @Rollback(false)를 통해서 DB에 실제로 값이 반영 되는지는 확인을 할 수  있다. 그러나 Test 의 목적은 개발한 코드의 정상 작동이지, DB에 실제 반영이 되는 것을 눈으로 확인하는 것이 주된 목적이 아니다. 따라서 spring boot 를 사용하게 되면, h2 DB 의 인메모리 모드를 사용하게 되면 정말 편리하다. h2 DB는 spring boot 에서 DataSource 설정을 따로 필요 없이 test/ 밑에 .yml 파일의 존재 만으로도, 인메모리 모드를 사용 할 수 있다. 아래에서 확인 할 수 있듯이 .yml 파일만 있다. dependencies 에서 h2 디비를 확인 할 수 있다. 아래는 테스트 코드를 실행 했을 때의 로그이...

GitLab merge request -> fetch to Local MR 로컬에 댕기기

이미지
GitLab에서는 Pull Request를 Merge Request라고 한다. 둘 다 단어만 다르지 같은 의미이다. 요즘 스터디를 하면서 스터디 멤버분들과 gitlab을 통해서 협업을 하고 있다. 우선 git flow 전략을 채용하여서 개발을 진행하고 있다. git flow 에 대한 설명은 아래 블로그에 잘 나와 있으니 설명은 생략하겠다. http://woowabros.github.io/experience/2017/10/30/baemin-mobile-git-branch-strategy.html 협업을 하다 보면 다른 멤버분이 MR 을 올리시는데, MR 은 Merge 되기 전에 나의 local에서 돌려 보고 싶은 경우가 생긴다. 따라서 MR 자체를 나의 Local에 댕겨서 돌려 보는 과정을 블로깅 하려고 한다. 겁나 간단하다. 우선 댕겨오려는 MR은  24번 Feature/post 이다. CLI에서 아래와 같이 git fetch upstream  merge-reqeusts/{MR번호}/head:{브랜치 명} 을 해주면 upstream 에서 해당 merge request를 당겨온다. 그리고 아래 처럼 브랜치를 확인 해보면 Feature/post가 생겼다. 댕겨온 브랜치로 체크아웃해서 돌려 보든지, 사용하고 있는 브랜치로 머지 시켜서 돌려 보든지 하면 된다. 참고 : https://stackoverflow.com/questions/44992512/git-how-to-checkout-merge-request-locally-and-create-new-local-branch/44992513#44992513

Spring DI 방법

이미지
Spring을 처음 배울 때 Dependency Injection은 무조건 @Autowired 만을 사용하는지 알고 있었다. 하지만 @Autowired 이외에 여러 방법들이 있고, 각각의 방법들을 정리해보려고 한다. 1. Field Injection  - 흔히 사용하는 @Autowired 를 필드 위에 달아 줌으로써 사용하는 방법이다.  Intellij 를 사용하여 개발을 하고 있는데 @Autowired를 사용하면 아래와 같이 노란줄이 뜬다. 해석 하면 스프링 팀에서 항상 생성자 기반의 의존성 주입을 하라고 한다. : 항상 의무적인 의존성에 대해서 assertions 을 사용하라고 한다. 2. Setter Injection  Field Injection과 유사하다.  Setter 위에 @Autowired를 달아준다. 3. Constructor Injection 아래와 같이 생성자 에서 의존성을 주입한다. 생성자 위에 @Autowired 를 달아주었다. https://spring.io/blog/2016/03/04/core-container-refinements-in-spring-framework-4-3 하지만, 스프링 4.3 부터는 @Autowired 를 달아 주지 않아서 컨테이너가 알아서 처리할 수 있게 되었다. 그리고 아래와 같이 final 을 선언하여 의존성을 불변으로 할 수 있다. 3.1 @AllArgsConstructor 추가적으로 lombok 과 더불어서 생성자 방식을 사용 할 수 있다. 모든 필드에 대해서 생성자 주입 방식을 적용하는 Annotation 이다. 3.2 @RequiredArgsConstructor 또한 final 을 통한 불변으로 하고 싶을 때 final 이 붙은 모든 필드에 대해서 생성자 주입 방식을 적용하는 Annotation 이다. 결론 필드 방식 에 대해서 정확하게 왜 ...

MariaDB 한글 insert 안 될 때

이미지
charset을 확인 하는데 먼저 글로벌 확인하기. 보는것과 같이 퍼킹하게 character_set_database 가 latin1으로 되어있다. 그리고 해당 테이블도 확인 해보자. 역시 퍼킹하게 테이블도 latin1로 되어있다. 먼저 글로벌 charset 설정을 바꿔준다.. /usr/local/etc 밑으로 가서 my.cnf를 바꾼다. 그리고 재시작 해주고 다시 글로벌 charset 확인하기 mysql.server stop mysql.server start server가 잘 안 꺼질땐 sudo mysqladmin shutdown 글로벌설정을 바꿔주어도 테이블은 영향 받지 않기 때문에 테이블 레벨에서 해당 테이블의 charset도 변경해준다. 변경이 잘 된 것을 확인할 수 있따리!

Mac MariaDB 서버 시작 시 뜨는 에러

이미지
우선 Mac 에 brew와 mariaDB가 설치 되어 있다는 전제가 깔려있다. $ brew list 하면 내가 설치한 목록이 나온다. mysql.server status - DB 서버가 돌고 있는지 확인하기 mysql.server start - DB 서버 시작시키기 mysql.server stop - DB 서버 중지시키기 이다. 시작 시키려고 하는데 아래와 같이 에러 메시지가 나온다. namdong-gil-ui-MacBookPro:~ namdong-gil$ mysql.server start /usr/local/Cellar/mariadb/10.3.13/bin/my_print_defaults: Can't read dir of '/usr/local/etc/my.cnf.d' (Errcode: 2 "No such file or directory") Fatal error in defaults handling. Program aborted Starting MariaDB /usr/local/Cellar/mariadb/10.3.13/bin/my_print_defaults: Can't read dir of '/usr/local/etc/my.cnf.d' (Errcode: 2 "No such file or directory") Fatal error in defaults handling. Program aborted ./usr/local/Cellar/mariadb/10.3.13/bin/my_print_defaults: Can't read dir of '/usr/local/etc/my.cnf.d' (Errcode: 2 "No such file or directory") Fatal error in defaults handling. Program aborted 190914 15:07:41 mysqld_safe L...

Spring cloud zuul proxy - API gateway

이미지
요즘 MSA(Micro Service Architecture) 에 빠져서 이것 저것 건드려 보고 있다. 그러다가 zuul proxy라는 걸 알게되어서 끄적끄적 대다가 만져봤는데, 재미있어서 오랜만에~ 블로깅하려고 한다. 원래 그동안 한 건 많은데 뭔가 정리하기 너무 귀찮은데 이건 방금 해서 아 이참에 다시 블로깅 시작해야지 하는 맘에 올린다. 간단하게, zuul 이 뭐하는 놈인가 봤더니, 일단 proxy가 뭐냐? 대략 위키나 구글링 해보면, 서버와 클라이언트 사이에서 중계기 역할을 한다고 한다. proxy 서버의 역할은 캐싱 및 라우팅 역할이 제일 큰 것 같다. 클라이언트로 부터 요청이 들어왔을 때 수많은 서비스들 중에 어디 서비스로 찔러줄건지 교통정리 해주거나(?) 여러 번 요청 들어온 거는 캐싱해놨다가 뭐 빠르게 응답을 주는 등 리소스 관리에도 도움을 줄 수 있는 것 같다. 짧고 짧은 나의 생각에서 정리해 보았다. 그래서 zuul이 뭔가 했더니 대략 위에 것들을 쉽게(?) 해줄 수 있도록 해주는데 넷플릭스에서 만들었다고 했나? 암튼 많이들 쓰는 것 같다. 더 공부 해야 겠다. 지금 부터는 대략 끄적여 본 것을 나열 해봐야겠다. 먼저 spring boot Maven 프로젝트 2개를 만든다. 하나는 zuul proxy server 로 port 는  8080 나머지 하나는 레알 찐탱 간단하게 REST API(?)라고 하기에 민망한 서버로 port 는 8081 로 만든다. 먼저 proxy server에서 Maven에 디펜던시 추가 그 다음에는, application.yml 에다가 라우팅 설정을 해준다. /foos/** 에 매칭되는 path는 전부 http://localhost:8081/foos 로 라우팅 해주겠다는 설정이다. 그리고 @EnableZuulProxy 붙여주고 마지막으로 ZuulFilter를 상속받아 컴포넌트를 만들어 준다. type 설정해주고, order...

org.apache.jasper.JasperException: JSP를 위한 클래스를 컴파일할 수 없습니다.

이미지
블로깅을 쉰 지 너무 오래되서 그런가... 그동안 공부한 건 많은데 왜이리 정리하기가 귀찮은지 다시 시작하려고 새로운 환경설정 잡다가 가끔씩 마주치는 경우 때문에 블로깅을 해보려고 한다. 아래 메세지가 뜨면서 jsp를 컴파일 할 수 없다고 할 경우 The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit tomcam 경로에 web.xml 에 org.apache.jasper.servlet.JspServlet가 잘 등록? 되어 있는지 확인한다. 그리고 있다면, 아래의 설정이 없어서 그렇다. 아래의 설정을 추가 해준다. <init-param> <param-name>mappedfile</param-name> <param-value>false</param-value> </init-param> 아래의 링크에 mappedfile 설정 true / false를 잘 비교해 주고 있다. https://dololak.tistory.com/478