자바 33

Dart 공부하기

새로운 언어를 공부하게 되었다! 공식문서 https://dart.dev/ 비교적 최근에 나온 언어들이 그렇듯이 공식문서가 굉장히 잘되어있다. Dart programming language Dart is a client-optimized language for fast apps on any platform dart.dev 자바를 하다가 다트를 시작한 느낌은, 1. 객체지향 + 정적 + 컴파일러라서 접근하기 쉽다. 2. Null Safe!!!!! 3. 좀 더 간결하다(생성자의 new 등 자바에서는 반드시 써야했던 것이 많이 생략되어 있다.) DartPad DartPad를 통해 웹에서도 연습할 수 있다. https://dartpad.dev/? DartPad dartpad.dev Flutter를 위한 언어인만큼..

Language/Dart 2022.08.18

20220803 #Factory

휴가가 끝나고 돌아오니, 새로운 리펙토링이 있었다. 휴가를 가기 전에 전략패턴을 사용하면서 type에 맞는 구현체를 찾아올 때 어떤 방법이 좋을지 고민이 있었다. 컨트롤러에서 해당 구현체를 List로 주입하고 type을 비교하는 메서드를 하나 만들어서 해당 구현체를 넣어주었는데, 구현체를 찾기 위한 목적의 메서드를 하나 만든다는 것에서 좋은 방법은 아닌 것 같았다. 팩토리를 사용하자는 의견이 있었는데, 며칠 자리를 비운 사이에 리팩토링이 되어 있었다. 컨트롤러에서는 Factory에 있는 메서드를 사용하고, Factory에서는 switch문을 사용해서 type에 따라 알맞은 구현체의 해당 메서드가 실행되도록 하였다. Factory가 너무 지저분해지지 않을까, 하는 걱정도 있었는데 구현해놓고 보니 오히려 가..

회고 2022.08.07

[2022년 7월] 회고!!

이번달은 일단 생각이 많았던 것 같다. 회사와, 업무와, 좋은 코드에 대한 고민이 많았다. 아마 이직을 하게 될 것 같고, 8월에는 새로운 곳에서 시작하게 될 것 같다. 디자인패턴 : 헤드퍼스트 디자인 디자인 패턴을 읽고 있다. 전략패턴을 일부 업무에 적용해봤는데, 팀 맴버 중에 타입별로 해당하는 구현체를 컨트롤러에서 그냥 바로 주입해주는게 낫지 않냐는 의견이 있었다. 나는 해당 인터페이스를 사용하는 것만 알면되지 어떤 구현체가 들어오는지를 컨트롤러에서 알 필요가 있냐는 입장? 또 다른 추가 의견으로 구현체를 불러오는 부분을 팩터리를 하나 만들어서 다 모아 놓는 방법도 추천받았다. 자료구조 : 알고리즘 문제를 가끔 풀고 있고, 쏘카 코테를 보면서 큐를 이용해 BFS를 처음 풀어봤는데 재미있었다! 자료구..

회고 2022.07.30

20220722 TIL #리패키징 #전략패턴

계속 미루고 미루던 리패키징을 했다. 처음에 패키징 구조를 제대로 정하지 않고 시작하다 보니 패키지가 같은 뎁스에 계속 추가만 되고 있었다. 또 중간중간에 기획이 계속 바뀌다 보니 동일한 뎁스에 있어도 될 것 같은 패키지가 흩어져 있는 것도 있었다. 계층구조로 구분할 건 구분하고, 필요한 건 가까워질 수 있도록 수정하였다. 네이밍과 api 계층도 일부 수정했다. 당장 기능 구현해야되는 것도 있어서 다 수정하지는 못했지만, 크게 패키지 구조는 정리가 되서 틈틈히 더 수정하면 될 것 같다. 이와중에 main만 패키지 구조가 변경되고 test는 변경이 안되서...... 도와주는 플러그인이 있다고 하는데 왜 변경이 안됬을까?? 당연히 test도 변경이 됬다고 생각하고 확인을 안했는데 나중에 다시 살펴보니 하나도..

회고 2022.07.22

[프로그래머스] 예산

https://school.programmers.co.kr/learn/courses/30/lessons/12982?language=java 이 문제의 포인트는 두 가지이다. 1. 예산을 가장 많이 지급하려면, 신청한 금액이 적은 부서들에게 지급하면 된다. → 정렬 2. 지급한 금액이 budget 보다 크면 더 이상 지급할 수 없다. → break import java.util.Arrays; class Solution { public int solution(int[] d, int budget) { int answer = 0; int sum = 0; //1. 정렬 Arrays.sort(d); for (int i = 0; i < d.length; i++) { sum += d[i]; //2-1. 지급한 금액이 ..

Language/JAVA 2022.07.15

20220707 TIL #트랜젝션 에러 @Transactional

어제 퇴근 직전에 새로운 에러를 발견했다. 다행히 오늘 오전에 배포할 때 수정해서 같이 적용하면 될 것 같다고 하셔서, 야근은 하지 않아도 됬다. 데이터 업로드 중에 오류가 발생하면 롤백이 되어야 하는데 롤백이 되지 않고 생성된 데이터가 그냥 저장되는 문제였다. 이전에는 1) Exception 발생 지점 2) 히스토리 데이터 생성 순서였기 때문에 문제가 발생하지 않았는데(엄밀히 말해서 문제를 인지하지 못한 거라고 하는게 맞는 것 같다.) 로직이 수정되면서 1) 히스토리 데이터 생성 2) Exception 발생 지점 으로 순서가 변경되면서 exception 발생 시 롤백이 안되고 1)에서 생성된 데이터가 그대로 저장되었다. 이 모든 과정을 하나의 트랜젝션 단위로 묶었어야 했다. 또, 이 로직 중간에 del..

회고 2022.07.08

20220703 TIL #불변 객체를 사용하는 이유

개발을 시작하고 코딩을 하면서, 이 책에서는 몇 번을 읽어도 이해가 안되던 설명이 우연히 다른 걸 공부하다가 '아, 이런 뜻이었구나' 할 때가 있다. 자바를 공부하면서 이해가 잘 안되는 용어 중 하나가 '불변 객체'를 사용하는 것이었다. 그런데 김영한님의 JPA 강의를 듣다가 왜 불변객체를 권장하는지 조금 이해하게 된 것 같다. 모두 다 정확하게 이해한 건 아니지만, 앞으로 공부하는데 실마리가 될 것 같아서 기록해둔다. primitive type과 달리 객체는 참조가 가능하다. 즉, 각각의 변수들이 같은 객체를 참조하고 있을 수 있다. 예를 들어, 새로운 Value a를 만들고, b가 a를 가리킨다면 둘은 같은 객체를 참조하게 된다. public static void main(String[] args) ..

회고 2022.07.05

[프로그래머스] K번째수 #Arrays.copyOfRange

https://programmers.co.kr/learn/courses/30/lessons/42748?language=java 주어진 조건에 따라 배열에서 원하는 값을 찾아서, 배열로 출력하는 문제이다. int배열을 주어진 범위를 index로 잘라서 복사하는 메서드를 새로 알게 되었다. java.util.Arrays에 있는 메서드이다. 배열이기 때문에 from과 to가 배열의 범위를 벗어나면 에러가 발생한다. public static int[] copyOfRange(int[] original, int from, int to) { int newLength = to - from; if (newLength " + to)..

Language/JAVA 2022.07.01

20220630 TIL #객체에게 메시지를 보내자

넥스트스탭에서 과정을 수강하고 있는데, 최근에 굉장히 인상깊은 내용이 있었다. 객체를 가져와서 그 값을 처리하는게 아니라, 해당 객체에게 메시지를 보내라는 것이다. 예를 들어서, 이런 식으로 if문에 원하는 조건을 검증하기 위해 해당 객체의 값을 getter로 가져와서 비교하는 것이 아니라 for (int i = 0; i < QUANTITY_OF_BALL; i++) { if (Integer.parseInt(inputs[i]) == answer.getBalls().get(i)) { strikeCnt++; continue; } for (int j = 0; j < QUANTITY_OF_BALL; j++) { if (Integer.parseInt(inputs[i]) == answer.getBalls().get(..

회고 2022.07.01

20220627 TIL #테스트코드의 중요성

프로젝트를 하면서 최소한 서비스에서 단위테스트는 만들고 있지만, 이것만으로는 부족한 것 같아서 통합테스트도 추가하기로 했다. 특히 우리 프로젝트는 주요 로직들이 모두 특정조건에서 데이터베이스에서 데이터를 조회하거나, 업데이트를 하는 것이라서 Repository에 Fake 객체를 만들어서 특정 값을 리턴하는 방식으로 Repository를 분리한 단위테스트만으로는 한계가 있는 것 같다. 그래서 DB connection을 갖는 통합테스트를 통해 특정 데이터를 DB에 저장해서 테스트를 하기 위한 상황을 만들고, 해당 데이터를 조회하거나, 원하는 경우에 의도한 에러가 잘 나타나는지 확인하였다. 그리고 테스트가 끝나면 테스트를 위해 저장한 데이터들은 모두 롤백하였다. 이미 일부 파트는 운영을 하고 있는 프로젝트이고..

회고 2022.06.29