Springboot 프로젝트를 진행할 때 지루한 entity -> dto 변환 작업을 쉽게 도와줄 수 있는 mapping library들이 있다 대표적으로 model mapper, mapstruct, okari가 존재하는데 나는 성능 상의 이유로 mapstruct를 사용했다 mapping library의 성능 비교 글은 구글링을 하면 쉽게 찾을 수 있다 mapstruct는 롬복처럼 컴파일 시점에 annotation-processor에 의해 변환되기 때문에 성능이 가장 우수하다 다른 mapping library들은 런타임 시점에 리플렉션을 통해 매핑하기 때문에 성능에 부하가 올 수 있다 사용법은 okari는 성능이 가장 안 좋다고 하여 사용해본 적이 없어서 패스하고, mapstruct보다 model map..
개인 프로젝트에 OAuth2를 적용해봤다 Spring Security를 이용한 로그인, 회원가입 과정을 대체하기 위해서는 아니고 학습 목적이다 학습 목적이라 해보고 싶은 것 다 하려고 google, facebook, github, naver, kakao 다 연결시켰다 SpringBoot 프로젝트에 OAuth2 적용하는 과정은 자세히 설명해준 글을 첨부한다 - 1편 Spring Boot OAuth2 Social Login with Google, Facebook, and Github - Part 1 In this article, You'll learn how to add social as well as email and password based login to your spring boot applicat..
조회 성능 향상을 위해 Spring Data Redis를 도입했고 간편한 사용을 위해 캐시 추상화를 사용했다 @Cacheable, @CachePut 등을 사용한다 그런데 LocalDateTime을 변환할 때 살짝 문제가 있었다 가장 쉬운 해결 방법은 아래와 같이 변환될 형식을 지정해주는 것이다 LocalDateTime을 사용하는 모든 DTO에 annotation이 붙을 걸 생각하니 아찔해져 전역으로 형식을 바꿀 방법을 찾아봤다 아쉽게도 Redis, JacksonSerializer 에 대한 이해도가 낮아서 찾아본다고 했지만 아직 방법을 찾지 못했다 참고가 될 만한 블로그는 찾았는데 적용하지는 못 했다 Serializer / Deserializer를 Custom으로 만들어서 원하는 형식으로 파싱하고 Obje..
진행 중인 프로젝트 메서드에 slow query 분석 또는 잘못된 비즈니스 로직을 해결하기 위해 시간 측정 AOP를 활용해봤다 우선 aop 관련 package를 따로 만들어주고 시간 측정할 메서드에 적용시킬 custom annotation을 만들어 준다 AOP 활용을 위해 구글링 하면 보통의 블로그에서는 method level에 적용시키는 방법만 알려주고 있다 나는 단순히 몇 개의 메서드에만 적용시킬 게 아니라 코드 프리징과 배포를 하기 바로 직전까지 문제 해결을 위해 시간 측정을 계속할 계획을 가지고 있다 따라서 나와 같은 상황에서 시간 측정을 위해서라면 @LogExecutionTime 애너테이션을 모든 메서드에 달아줘야 한다 사실 애너테이션만 달아주면 해결되는 문제니 별 신경을 쓰지 않을 수도 있겠지..
멀티 모듈로 구성한 개인 프로젝트에서 빌드 시간이 지나치게 긴 것 같았다 test 시간에서 지연되고 있었고 우선 생각해 본 것은 @SpringBootTest를 Mockito를 이용한 단위 테스트들로 바꿔보려 했다 그러나 멀티 모듈로 나눴고 모듈 수만큼의 @SpringBootApplication을 가진 클래스가 존재한다 -> 21.09.24 현재는 api, batch 담당 모듈을 제외하고 나머지 @SpringBootApplication을 가진 클래스를 없애주었음 Test에서 @SpringBootTest를 제거하면 여러 개의 SpringBootApplication이 찾아진다고 하며 에러가 터졌다 @SpringBootTest(classes = "{Controller.class}, {Service.class}"..
2022.02.05 요즘 자바 웹 개발 인강을 찾는 분들이 많아서인지 이 글의 조회수가 높아지고 있어 노파심에 말해보자면 절대 이 강의 하나로 자바, 스프링에 대한 기본 지식을 충족할 수는 없고 다른 인강과 책도 보시길 권장 드립니다 Spring 웹 개발, JPA 기초를 공부하시려면 인프런의 김영한님 강의 초보자에게는 친절하지 않은 강의지만 기본 지식이 어느 정도 있고 다음 단계로 나아가시려면 인프런의 백기선님 강의 강의 외에 책을 보고 싶으시다면 자바 - 모던 자바 인 액션 / effective java 3판 / 오브젝트 / 클린 코드 / 클린 아키텍처 / 리팩토링 스프링 & JPA - 자바 ORM 표준 프로그래밍 / 토비의 스프링 3.1 (읽기 어렵다면 vol.1이라도) 등을 추천 드립니다 아직 전 ..
3주 차에 시작한 패스트캠퍼스의 Java/Spring 강의 중 Spring 입문 강의를 다 듣고 JPA 프로그래밍 강의를 시작했다 다 들었다고 말은 했지만 Spring 관련 강의들은 두고두고 계속 들어야 할 것 같다 스프링은 자바와 함께 웹 프로그래밍계에서 십수 년간 발전해온 프레임워크니 배워야 할 것이 많은 것도 당연하다 Spring 입문 강의 중 특히 좋았던 부분은 AOP 관련 내용이었다 나는 Java / Spring 공부를 시작하던 때에 최대한 사용법 위주로 익혀왔다 이 것이 옳고 좋은 방식인지는 모르겠으나 나에게는 최적의 방식이었다 Java / Spring을 떠나 프로그래밍 개념 자체가 익숙하지 않던 입문자 때부터 Servlet을 간략하게 배우고 Spring 공부를 시작했기 때문이다 처음부터 이론..
지난 글 중에 Gradle Multi Module에 관한 글을 올린 적이 있다 이 글은 지난 글에서 이어지는 내용으로 QueryDSL을 사용하는 멀티 모듈 세팅을 계획하고 있다면 참고할만하다 멀티 모듈 세팅에 정답은 없는 것 같다 나는 아래와 같은 형태로 나누어 봤다 module-api -> Controller module-common -> Entity, Repository module-service -> Service, DTO 프로젝트 작성자가 편한 방식으로 구성하면 되는데 한 가지 주의할 점이 있다 바로 모듈 간의 관계성을 조심해야 하는데 기껏 멀티 모듈을 구성했는데 모듈 간의 관계가 깔끔하게 정립되지 않고 실타래처럼 엉켜있다면 그건 멀티 모듈로 구성한 의미가 없다 따라서 핵심은 모듈 간의 관계에 주..
패스트캠퍼스 Java / Spring 강의의 기나긴 객체지향 파트를 다 들었다 101강을 완전히 집중하여 들은 건 아니지만 다시 듣기가 가능하니 나중에라도 이해가 안 되면 다시 들어야겠다 3주 차에는 Spring 강의를 시작했는데 객체지향의 중요성을 강조하듯 Chapter 1에서 다시 한번 객체지향에 관한 설명을 이어나갔다 Chapter 2에서는 디자인 패턴에 관한 설명을 해주셨다 정보처리기사 공부도 하고 있어서 이름만 들어본 패턴들에 대해 자세한 설명을 해주셔서 도움이 됐다 타 사이트 강의들에서는 거의 다루지 않는 내용인데 여기서는 다루는 것을 보고 굉장히 신기했다 입문자에게 당장은 도움이 안 될 수도 있지만 디자인 패턴은 분명 언젠가는 알아둬야 하고 어려운 내용일수록 처음부터 흘려듣듯이 들어보고 반복..
zookeeper와 kafka 서버를 킨 후 consumer / producer를 통한 message queueing system을 연습 중이다 KAFKA_HOME은 https://kafka.apache.org/downloads 에서 다운로드한 binary file을 두는 위치이다. 맥북의 경우 터미널에서 cd 명령어로 다운로드한 폴더 안으로 들어가서 서버를 켜면 된다 일반적인 환경에서는 평화롭게 서버를 키고 진행하면 되는데 난데없이 아래와 같은 에러 메시지를 만났다 Connection to node 0 (/ip:9092) could not be established. Broker may not be available. 이전에도 동일한 문제가 있어 구글링을 통해 문제를 한번 해결했었는데 오늘 또다시 만나..
만약 Spring Cloud를 통해 MSA를 구성하고 있다면 Micro-Service 간 통신을 위해 RestTemplate 또는 FeignClient를 이용할 것이다 그럼 이 세 가지 방식 중 어떤 것을 택해야 할까? FeignClient는 Netflix에서 RestTemplate보다 효율적인 통신을 위해 만든 것이다 RestTemplate, FeignClient는 Synchronous, Blocking 방식이고 WebClient는 Asynchronous, NonBlocking 방식이다 R / F 하고 W는 결이 다르다 WebClient는 비동기 방식이니까 러닝 커브도 있을 것이고 간단한 토이 프로젝트에 WebClient를 적용시키는 것은 공부하려는 목적이라면야 좋지만 진검으로 사과 깎아 먹는 짓이다 ..
1주 차에 자바 기초에 관한 강의를 들었고 2주 차에는 객체지향 프로그래밍 강의를 듣기 시작했다 Java & Spring을 제대로 쓰기 위해서는 근간이 되는 자바에 대해 제대로 알고 있어야 한다고 생각한다 흔히들 캡상추다로 외우는 객체지향의 핵심 개념들 캡슐화, 상속, 추상화, 다형성에 대해 한번쯤은 깊게 알고 가야 한다 2주 차 강의에서는 객체지향 입문 / 핵심, 자료구조까지 알려준다 나는 자바의 정석 책과 강의를 이용해 객체 지향 개념을 처음 익혔고, 오브젝트라는 책을 읽고 개념을 다졌다 패스트 캠퍼스의 강의는 개념에 대해 깊은 수준까지 들어가지는 않지만 전체적인 흐름을 잡기에 꽤나 괜찮은 강의인 것 같다 자바의 정석과 같이 기본적인 내용까지 모두 다루고 있으며 오브젝트와 같이 객체 간 협력을 중시한..
인프런 Spring Cloud로 개발하는 마이크로 서비스 애플리케이션(MSA) 강의를 듣고 있다 Netflix-eureka를 이용한 Spring cloud 예제를 따라 해보고 있다 스프링 클라우드에 대한 첫 느낌은 드럽게 어렵다는 것이다 부트 버전이 달라서 설정 잡기도 쉽지 않을 뿐더러 예제가 아니라면 감도 못 잡을 수준이다 물론 구글링 하면 다 나오지만 설정부터 쉽지 않으니 Spring MVC나 JPA 강의와는 또 다른 맛이 있다 원래 힘들수록 기억에 더 잘 남는 법이고 삽질을 해볼수록 깊이가 깊어지는 것일 테니 달려봐야지!! Gateway Filter, Load Balancing에 대해 배웠고 port 번호를 다르게 해 App을 실행하는 3가지 방법에 대해 배웠다 자세한 방법을 보기 전 내가 만난 에..
개인 / 사이드 프로젝트를 진행할 때는 별생각 없이 Spring initializr의 도움을 받곤 한다 Springboot, Gradle의 버전을 딱히 신경 쓰고 있지 않다는 뜻이다 https://start.spring.io 인프런에서 Spring Cloud 강의를 듣고 있던 중 Netflix Zuul 실습 과정이 있는데 이를 위해서 스프링 부트의 버전을 변경해야 한다 2.3.x 버전이 필요한데 initializr 에서는 2.4.x 까지만 적용이 가능하고 2.3.x은 바로 사용할 수가 없었다 별생각 없이 plugins {...}에서만 버전을 고쳐 빌드를 해보았는데 plugin org.springframework.boot was not found in any of the following sources e..
나는 크롬보다 사파리를 선호한다 맥북을 사용하기도 하고 크롬에서 Extension을 많이는 아니지만 몇 개 깔아 뒀더니 굉장히 느려진 것 같은 기분? 사파리에 비해 확실히 메모리도 많이 잡아먹기도 한다 최근 Rest Api 공부를 하면서 Postman 이 외에도 브라우저에서 직접 json data 들을 봐야 할 일이 생겨서 사파리에서 적용할 수 있는 json viewer를 찾아봤다 구글 검색 첫 번째 결과로는 1200원짜리 어플이 뜨던데 과연 1200원 짜리 어플에서는 뭘 제공해줄까 하는 호기심이 아니라면 구매를 참으시고 Json peep 사용을 추천드립니당 https://apps.apple.com/us/app/json-peep-for-safari/id1458969831?mt=12 JSON Peep f..
Gradle 멀티 프로젝트 관리 안녕하세요! 이번 시간에는 아시는 분들은 거의다 아시는(!?) Gradle을 이용한 멀티 프로젝트(모듈) 관리에 대해 소개하려고 합니다. 모든 코드는 Github에 있으니 참고하셔서 보시면 더 좋으실 것 jojoldu.tistory.com 이동욱 님의 블로그에서 정말 친절한 설명과 함께 Gradle 세팅을 진행해보았다 진행 중인 개인 프로젝트는 멀티 모듈로 나눌 필요가 없는 규모다 요즘 관심사가 스프링이 가진 다양한 기능들을 접해보는 데 있기 때문에 경험 삼아 시도했다 혼자 진행하고 있는 프로젝트이기 때문에 front까지 루트에서 모듈로 관리하기로 했고 현재는 api, common, service, vue로 나눠둔 상태다, 이 구조는 딱히 좋다고 말할 수 없다 편의상 fr..
프로그래밍을 공부할 때 개인적으로 책 보단 강의를 좋아한다 그 중에서도 시간과 공간의 제약이 없는 인터넷 강의를 선호하는 편이다 웹 개발에 관심이 있고 java & spring 강의를 찾던 중 패스트캠퍼스를 알게 되었다 강의 이름이 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online 인데 말 그대로 한번에 끝내려 작정한 강의인 것 같다 총 강의 시간이 무려 102 시간에 달한다 난 보통 강의를 들을 때 1배속으로 천천히 듣는 것 보다 2배속으로 2번 듣는 걸 좋아한다 프로그래밍 뿐만 아니라 무언가를 배울 때 반복보다 중요한건 없다 생각하기도 하고 누구든 한번에 학습할 수는 없다고 생각하기 때문이다 2배속으로 들어도 51시간인데 이는 분명 초심자에겐 버거울 수 있는 시간이다 그런..
4. AWS EC2 & AWS RDS 운영 환경 구축 5. EC2 수동 배포해보기 6. TravisCI & AWS CodeDeploy로 CI환경 구축하기 6) 스프링부트로 웹 서비스 출시하기 - 6. TravisCI & AWS CodeDeploy로 배포 자동화 구축하기 이번 시간엔 배포 자동화 환경을 구축하겠습니다. (모든 코드는 Github에 있습니다.) 6-1. CI? 이전 시간에 저희는 스프링부트 프로젝트를 간단하게나마 EC2에 배포해보았습니다. 스크립트를 개발자 jojoldu.tistory.com 개인 프로젝트로 EC2, RDS 를 사용하고 있기 때문에 위 4 / 5 두 챕터는 생략하고 진행했다 추후에 추가로 실습해봐야겠다 CI / CD 의 중요성은 잘 알지만 이전에 진행하던 프로젝트에서는 고려해..
어느덧 취업한지 2주째다. 원래의 계획은 교육 과정을 수료하고 2~3달 정도 더 공부를 해볼까 했는데 급하게 취업을 했다. 면접 경험이라도 쌓아두자 싶어서 본 면접에서 운이 좋게도 붙었고 초봉에 큰 욕심도 없던 차에 합격했는데 안 갈 이유도 없다 생각해 다니게 되었다. 부족한 Java / Spring 실력, 코딩 테스트 준비, CS 공부를 모두 채우기에 2~3달은 부족하다는 판단이었다. 아쉽게도 회사의 기술 스택은 jdk 1.6 ~ 1.8 & jsp라 실무에서 최신 기술, 트렌드 등을 배우긴 힘들 것 같다. 내가 배우고 싶은 기술들은 퇴근 후 독학으로 배워야지. 회사 프로젝트도 AWS 이전 계획이 있다고 들었고 이전부터 AWS에 관심이 있었기에 공부해보았다. 2주 전에도 교육 과정에서 진행했던 마지막 프..
public static void main(String[] args) { long fee = solution(2500, 100000, 322); System.out.println("fee = " + fee); System.out.println(Math.abs(-129907500)); } public static long solution(long price, long money, long count) { long answer = -1; answer = money - (price * count * (count + 1) / 2); if (answer >= 0) return 0; answer = Math.abs(answer); return answer; } 처음 문제 풀 때, parameter 를 int 형으로..