목록전체 글 (153)
늘
1. 자료구조를 사용하자 여러 값들을 담을 때 생각없이 매번 List를 쓰는 버릇을 고쳐야겠다. 적절한 자료구조를 사용하면 코드가 많이 줄여지고 깔끔해진다. 2. 정적 팩토리 매서드 네이밍 정적 팩토리 메서드 명명 규칙 from : 매개변수 하나를 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드 ex) Date date = Date.from(instant); of : 매개변수 여러개를 받아서 적합한 타입의 인스턴스를 반환하는 집계 메서드 ex) Set cards = EnumSet.of(JACK, QUEEN, KING); valueOf : from과 of의 더 자세한 버전 ex) BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); instance o..
자바를 사용하다보면 List를 만드는데 여러가지 방법들을 사용해왔었다. 그 차이를 모르고 손에 익히는대로 사용했는데 이번에 정리를 하려고 한다. import java.util.ArrayList; // new ArrayList() import java.util.Arrays; // Arrays.asList() import java.util.List;// List.of() 차이점 1. 원소를 추가/삭제할 수 있나? 원소를 추가/삭제 set 사용 가능 new ArrayList() 가능 가능 Arrays.asList() 불가능 가능 List.of() 불가능 불가능 ArrayList()에 List값을 하나만 넣으려면 List.of()를 감싸서 넣으면 된다. 그렇지 않고 List.of()로 한 후 add를 하면 아래..
리뷰를 폭탄으로 맞았다 🤣🤣 오히려 좋다.. 배울게 너무 많아서 😬😬 이번 2주 차 미션을 진행하면서 새롭게 배운 것들이 많다. 1. 멀티 스레드 환경에서 상태 공유 바로 찾아보았다. 학교 운영체재 시간에 배운 동시성 이슈라고 생각했다. final로 완전한 불변이 안 만들어져서 아예 내부 상태를 갖지 않도록 하는 게 좋은 것 같다! 당연한 거지만 자주 까먹는 것 같다.🤣 이번에는 기억해 두자!! 2. 방어적 복사 핵심은 객체 내부의 값을 외부로부터 보호하는 것이라는 것을 유념하자. 생성자의 인자로 객체를 받았을 때 외부에서 넘겨줬던 객체를 변경해도 내부의 객체는 변하지 않아야 한다. 따라서 방어적 복사가 적절하다. getter를 통해 객체를 리턴할 때 이 상황에선 방어적 복사를 통해 복사본을 반환해도 좋..
로또 미션을 진행하면서 리뷰 폭탄에 정신없이 해결해야겠다고 생각해서 rebase를 진행하지 않고 step1 브랜치에 바로 진행을 했다. 열심히 코드를 리펙토링 하고 마지막에 리뷰 요청을 보냈는데 충돌이 발생해서 충돌을 해결하고 요청을 보내라고 했다.. git cherry-pick vs git rebase 간단히 다른 브랜치의 커밋 기록을 현재 브랜치로 가져올 수 있는 기능이다. git rebase와 비슷한 성격이지만 조금 다르다. rebase는 현재 브랜치에서만 가능하고 다른 브랜치에서 commit을 가져오려면 merge를 한 후 rebase를 해야 한다. 반면에 cherry-pick은 이러한 과정 없이 바로 다르 브랜치의 commit#만 알면 가능하다는 장점이 있다. 하지만 cherry-pick은 같은..
서론 우아한테크코스를 진행하면서 강의도 도움이 되고 좋았지만 코드 리뷰 또한 몰랐던 내용을 알게 되고, 바로 접목시켜볼 수 있어서 좋았다. 코드 리뷰를 받으면서 배운 점이 많기 때문에 블로그에 글을 작성하면서 정리하기 좋다고 생각되어 우테코를 진행하면서 받은 코드 리뷰들을 정리할 생각이다. 자동차 구현 프리코스때 진행했던 내용과 같지만 페어프로그래밍을 하면서 진행하다 보니 어렵게 느껴졌다. 처음으로 페어프로그래밍을 하면서 (+ TDD) 어색했지만 나의 첫 페어이자 성격좋은 조시덕분에 큰 갈등 없이 무난하게 처리했다. 랜덤 매서드 테스트 항상 궁금했던 랜덤 매서드 테스트! 방법은 크게 2가지로 나뉠 수 있다. 1. 랜덤한 값을 매개변수로 받도록 구현(의존 관계를 상위로 옮김으로써 응집도가 낮아진다.) 2...
오랜만에 글을 작성하네요.. ㅎ🤣🤣 우테코 전에는 스프링으로 프로젝트를 하면서 필요한 자바 문법들을 찾아서 공부했다면, 우테코를 시작하면서는 자바 본연에 대해 공부를 하고 있는데요. 오늘은 java8 람다식과 스트림에 대해 알아보려고 합니다. 사실 자동차 경주 미션을 진행하면서 오랜만에 람다를 사용하면서 매번 찾아보면서 사용했던 람다를 한번 공부해보자는 생각으로 작성합니다. 람다식(Lambda Expression)🤡 문법 문법은 간단합니다. 코드를 보는게 이해가 더 빠를 것이라고 생각됩니다. public int sum(int a, int b) { return a + b; } //람다식 변환 (a, b) -> a + b; 장점 매우 깔끔하고 알아보기도 쉽다. 동작을 사용하기 위해서 클래스를 정의할 필요도 ..
동시성 내용이 어려워서 개인적으로 따로 한 번 정리를 해보았다. 13장 동시성📌 동시성과 깔끔한 코드는 양립하기 어렵다. 👀 여러 스레드를 동시에 돌리는 이유 & 어려움 이런 어려움에 대처하여 깨끗한 코드를 작성하는 방법 동시성을 테스트하는 방법과 문제점 동시성이 필요한 이유? 동시성은 결합을 없애는 전략이다. 무엇(what) 과 언제(when)를 분리하는 전략이다. 서블릿은 웹 혹은 EJB라는 컨테이너 아래서 돌아간다. 이들 컨테이너는 동시성을 부분적으로 관리한다. 웹 요청이 들어올 때마다 -> 웹 서버는 비동기식으로 서블릿을 실행한다. 프로그래머는 모든 웹 요청을 관리할 필요가 없다. 원칙적으로 각 서블릿 스레드는 다른 서블릿 스레드와 무관하게 자신만의 세상에서 돌아가기 때문이다. 동시성에 대한 오해..
계층형 아키텍처(Layered Architecture) or 멀티 티어(tier) 아키텍처 - 책임과 성격이 다른 것을 크게 그룹으로 만들어 분리해두는 것 - 유사한 관심사들을 layer로 나눠서 수직적으로 배열한 것 보통 웹 기반의 엔터프라이즈 애플리케이션은 3개의 계층을 갖는다고 해서 3계층 애플리케이션이라고도 한다. 3계층 아키텍처와 수직 계층(토비의 스프링) Presentation Layer: 웹 기반의 UI를 만들어내고 그 흐름을 관리하는 계층 Service Layer: 비즈니스 로직을 담고 있는 계층 DataAccess Layer: 백엔드의 DB나 레거시 시스템과 연동하는 인터페이스 역할을 하는 계층(infrastructure 계층) 3계층 아키텍처(조영호 개발자님) Presentation: ..
왜 스프링은 싱글톤으로 Bean을 만드는가? 스프링은 was 시작과 동시에 Ioc컨테이너에 빈을 생성하고 관리한다. 따라서 서버의 성능을 좋게 하기 위해서 싱글톤 방식을 취한다. 싱글톤 방식을 사용하지 않는다면 매번 Bean을 생성해야 하므로 성능이 안 좋다. 하지만 싱글톤을 사용하면 한 번에 Bean을 여러 개 만들어서 요청이 들어올 때마다 사용하면 되기 때문에 성능이 좋아진다. 저번 게시물에 디자인 패턴에서 싱글톤 패턴을 학습해서 정리했었다. 그런데 이번 스프링 컨테이너의 싱글톤을 공부하면서 같은 싱글톤이라고 생각했는데 스프링의 싱글톤 레지스트리와 자바의 싱글톤 패턴은 다르다고 한다! 싱글톤 레지스트리는 자바의 싱글톤 패턴의 단점을 보완한 것이라고 한다. 자바의 싱글톤패턴의 단점은 아래와 같다. pr..
대표적으로 외부 api를 호출하는 방식에 resttemplate이 있는데 이것은 동기 방식을 이용한 방법이고, WebClient가 비동기를 이용한 방식이다. 공식문서를 보면 스프링 5부터는 webClient사용을 더 추천하고 있다. 또한 restTemplate은 곧 deprecated 된다고 한다. 공통점으로는 둘 다 Http client에서 사용된다는 것이다. RestTemplate RestTemplate은 Multi-Thread와 Blocking방식을 사용합니다. Thread pool은 요청자 어플리케이션 구동 시에 미리 만들어 놓습니다. Request는 먼저 Queue에 쌓이고 가용한 스레드가 있으면 그 스레드에 할당되어 처리됩니다. 즉, 1 요청 당 1 스레드가 할당됩니다. 각 스레드에서는 Blo..