Static block And Instance Initialization Block (IIB) in Java

이미지
전 회사를 다니면서, 교육 받을  때 풀었던 문제랑 비슷한 문제를 최근에 페이스북 에서 봤는데 스태틱 블락과 인스턴스 초기화 블락에 관한 문제 이다. 아래와 같다. 아래와 같이 StaticBlock 의 클래스가 있을 때, 아래의 staticBlockTest 메서드 실행 시 출력 결과를 묻는 문제 였다. aField 는 클래스 스태틱 변수로 첫 출에서 SysOut을 찍을 경우, static block 에 의해 A 가 출력 된다. 두 번째 줄에서 StaticBlock 의 인스턴스를 new 연산자를 통해서 생성하는데, 이때 인스턴스 초기화 블록이 실행되며, aField 에는 "B"가 concat 되며, bField에도 동시에 "B" 가 concat 된다. 그리고 생성자에서 "C" 를 aField 와 bField 에 모두 concat 하고 있다. 따라서 line 별로 aField 와 bField 의 변수 값을 확인하면,  1 line aField = "A", bField = "" 2 line aField = "ABC", bField = "BC" 가 된다. 이제 세 번째 line 에서 생성한 인스턴스가 addD() 메서드를 호출한다. 3 line aField = "ABCD", bField = "BCD" 정답 : 

spring boot devtools (With. IntelliJ)

이미지
Spring 쓰다가, Spring boot 쓰니까 너무 좋다..!!! 너무 편하다!! Spring에서 설정해줘야 하는 것들을 boot가 알아서 기본적으로 해주는 것들이 너무 많다. 편한 것들 중에서 왜 이런걸 몰랐지 하는게 있어서 블로깅 한다. 누구나 알듯이 Spring Initializr 로 프로젝트를 생성하는 과정에서, dependencies 를 추가할 수 있다. 바로 요놈이다. 이놈이 해주는 일은 바로 이거다. 개발하는 과정에서 정말 간단한 변경사항이 있어서, 예를 들어 오타 한 글자 때문에 was를 내렸다가 올리는 경우가 있었을 것이다. 속으로 아 씨박.. 하믄서 그래도 spring boot 는 Rerun 하는데 어느정도 빠르기라도 하지, spring은... 노답이다. 더군다나 프로젝트가 크면 클수록 오래 걸린다. JREBEL이 왜 유료인지 알 것 같다. 암튼 여담은 집어치우고, 바로 DevTools를 넣어주면, Rerun 할 필요 없이, Recompile '어쩌구저쩌구.확장자' 를 해주면  변경 된 부분만 싸악 적용해 준다. 단축키는 보는바와 같이 쉬프트 커맨드 에프9 물론 맥 기준이다. DevTools를 쓰면 자체적으로 캐싱 기능을 끈다고 한다. 자세한 건 모른다. 들은 얘기이다. 써보니까 개꿀띠 아! 그리고 DevTools 를 사용하면 아래와 같이 restartedMain 으로 출력 된다.  아래는 DevTools를 사용 안 할 때!!

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...