부트캠프/우아한테크코스 6기

부트캠프/우아한테크코스 6기

[DB] 트랜잭션(Transaction) 이란? (with. ACID)

트랜잭션 - 개념 이해 데이터를 저장할 때 단순히 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유는 무엇일까? 여러가지 이유가 있지만, 가장 대표적인 이유는 바로 데이터베이스는 트랜잭션 이라는 개념을 지원하기 때문이다. 트랜잭션은 데이터베이스의 상태를 변화시키기 위한 하나의 작업 단위이며, 단위 작업을 안전하게 처리하도록 보장해주는 역할을 한다. 그런데 하나의 작업을 안전하게 처리하려면 생각보다 고려해야 할 점이 많다. 예를 들어서 A의 5000원을 B에게 계좌이체한다고 생각해보자. A의 잔고를 5000원 감소하고, B의 잔고를 5000원 증가해야한다. ex) 5000원 계좌이체 A의 잔고를 5000원 감소 B의 잔고를 5000원 증가 계좌이체라는 거래는 이렇게 2가지 작업이 합쳐져서 하나의 작업처..

부트캠프/우아한테크코스 6기

[Java] Java 반복 작업 수행 시, For-Loop와 Stream 사이 성능 비교

미션 도중 생긴 고민 💭 public Cars(List carNames) { ArrayList cars = new ArrayList(); for (String carName : carNames) { cars.add(new Car(carName)); } this.cars = cars; } Cars 객체를 생성할 때, List형태의 carNames를 입력받은 뒤, For-Loop 문을 통해 cars 필드를 초기화 해주었다. 하지만 For-Loop문을 생성자 로직에 적용하니 개인적으로 생성자 로직이 지저분하다는 생각이 들었다. 때문에 Stream을 사용하여 짧고 가독성있는 코드로 리팩토링하여 사용하고자 하였다. 그리고 이때 머릿속에 한가지 고민이 생겼다 🤔 미션의 요구사항에 자동차의 수는 제한이 없는데, 그럼..

부트캠프/우아한테크코스 6기

테스트를 위한 객체, 테스트 더블(Test Double)

🧐 Test Double이란?테스트 더블이란 실제 구현체로 테스트를 진행하기 어려운 경우, 이를 대신해서 테스트를 진행할 수 있도록 만들어지는 객체이다. Test Double 이란 명칭의 유래 💭영화를 촬영하는 경우, 위험한 장면 촬영할 때 실제 배우를 대신해서 촬영하는 스턴트 더블에서 유래된 단어이다. 사용 이유 💭이전에 '테스트 주도개발 시작하기' 라는 책을 읽은 적이 있는데, 해당 책 저자의 말을 빌리자면 테스트 더블은 외부 요인에 의존하는 객체에 대한 테스트를 작성할 때 "실패하는 테스트는 항상 실패하고, 성공하는 테스트는 항상 성공한다" 라는 테스트의 일관성을 지키기 위해 사용한다고 했다. 예를 들어 DB, 외부 API 등을 사용할 때, 네트워크 연결 상태 등을 ..

부트캠프/우아한테크코스 6기

[Java] Fluent API란? (feat. JDBC에 적용해보기)

Fluent API는 API의 패턴 중 하나이다. Fluent API는 메서드 체이닝 형태로 설계된 API이며, 그 목표는 도메인별 언어 (DSL)를 생성하여 코드 가독성을 높이는 것이다. 이 용어는 Eric Evans 와 Martin Fowler 가 2005년에 만들어냈다고 한다. Fluent API를 사용하는 대표적인 라이브러리로 AssertJ가 존재한다. 이전에는 Junit을 통해 하나의 메서드로 처리해야 했던 코드를 Fluent API 패턴을 적용한 AssertJ를 통해, 직관적인 형태로 메서드를 풀어내어 테스트 코드를 작성할 수 있도록 구현되어 있다. // Junit Assertions.assertTrue(true); // assertJ Assertions.assertThat(true).isTr..

부트캠프/우아한테크코스 6기

[Java] 생성자 체이닝(Constructor Chaining) 기법

생성자 체이닝(Constructor Chaining)이란? 생성자 체이닝은 생성자가 2개 이상일 경우, 전체 인스턴스 필드의 값 초기화를 담당하는 하나의 주 생성자를 두고 이 외의 부 생성자들은, 자신보다 상위의 부 생성자를 호출하는 체이닝 구조를 거쳐 최종적으로 주 생성자를 호출하여 객체를 생성하도록 만드는 방식이다. 즉, 실제 객체 초기화를 담당하는 주 생성자 이 외에는 상위 생성자를 호출해나가는 구조인 것이다. 적용 기존 코드 public Player(final String name) { super(Cards.createEmpty()); this.name = new Name(name); } public Player(final String name, final Cards cards) { super(c..

부트캠프/우아한테크코스 6기

[Java] 자바에서 라인을 ‘잘’ 개행하는 방법

자바에서의 개행 📃 본인은 보통 자바의 문자열 내에서 라인을 개행할 때 아래와 같이 개행하곤 했다. System.out.println("안녕하세요\\n"); 그러던 중, 조원과의 대화를 통해 놓치고 있던 부분에 대한 하나의 인사이트를 얻게 되었다. 그건 바로 개행 문자는 OS별로 상이하다는 점이다. 이전에 대학 강의에서 배웠던 것이 어렴풋이 기억이 나긴 하지만 정확히는 기억이 나질 않아 찾아보았고 그 결과 개행 문자가 3종류나 존재하고 있으며, OS 별로 상이한 경우도 존재함을 알 수 있었다. 개행문자 종류 CRLF(\r\n), CR(\r), LF(\n) Windows 운영체제: CRLF(\r\n) Unix 계열: LF(\n) Mac: CR(\r) 이후 Macintosh: LF(\n) 🧐 그럼 \n 없이..

부트캠프/우아한테크코스 6기

[Java] 클래스 멤버는 각자의 위치가 존재한다

Java 클래스 멤버는 각자의 위치가 존재한다. 우테코 미션에 대해 코드리뷰를 받으면서 이런 리뷰를 듣게 되었다. 클래스 변수의 선언부를 최상단으로 바꾸는 게 어떨까요? 컨벤션에 맞춰주시면 좋을 거 같아요! 클래스 멤버가 각각의 위치를 가지고 있다는 건 알았지만 내가 컨벤션을 잘못 기억하고 있었나보다 싶었다. 때문에 다시 한 번 찾아보고, 기록으로 남겨두고자 한다. 나 외에도 필요한 사람들에게 도움이 되었으면 좋겠다! 클래스 멤버의 선언 순서 Oracle의 자바 Code Covention 문서를 보면 클래스 멤버는 각자의 선언 위치를 가지고 있음을 알려준다. Class (static) variables public → protected → default → private 순서 Instance variab..

부트캠프/우아한테크코스 6기

[우테코] LinkedHashMap을 통한 기초 캐싱

🧐 캐싱 방식 사용 시에 메모리 사용량을 최소화하는 방법은 무엇일까? @Test @DisplayName("메모리 사용량을 최소화하는 방법은 무엇일까?") void 메모리_사용량을_최소화하는_방법은_무엇일까() { // TODO: 메모리 사용량을 최소화하는 방법을 고민 후 개선해보세요. record Position(int value) { private static final Map CACHE = new ConcurrentHashMap(); public static Position startingPoint() { return valueOf(0); } public static Position valueOf(final int value) { return CACHE.computeIfAbsent(value, Pos..

PgmJUN
'부트캠프/우아한테크코스 6기' 카테고리의 글 목록