분류 전체보기

우아한테크코스/레벨1

[UnitTest] 🚗자동차 경주🚗 페어 프로그래밍 & 리팩토링 회고

우아한 테크코스의 레벨1이 본격적으로 시작되면서 첫 미션인 자동차 경주를 페어 프로그래밍으로 진행하게 되었다. 온보딩 미션인 자동차 경주에서는 단위 테스트를 학습하는 것을 주요 목표로 삼았고, 미션 진행 과정은 다음과 같이 2단계로 나뉘어져 있었다. 미션 진행 및 코드 리뷰 1단계 - 자동차 경주 (페어 프로그래밍) 2단계 - 자동차 경주 리팩터링 나는 테바와 페어가 되어 함께 1단계 자동차 경주 미션을 구현하게 되었다. 그리고 수달의 리뷰를 통해 코드를 리팩토링해보았다. 페어 프로그래밍에서 다룬 내용들 자동차 경주 미션을 수행하면서 사소한 코드부터 큰 범위의 로직까지 많은 내용을 다뤘다. 그 중에서 의문으로 남았던 몇 가지 큰 주제들에 대해서 정리해보려 한다. RandomNumberGenerator 테..

우아한테크코스/레벨1

Random 기능이 포함된 메서드를 어떻게 테스트할 수 있을까? (feat. 전략 패턴)

우아한테크코스 레벨 1 미션을 진행하면서 무작위로 숫자를 생성하는 기능이 사용된 메서드를 테스트 하는 것에서 난항을 겪었다. 우여곡절 끝에 1단계 미션의 기능을 구현했지만, 2단계 미션에서 아래와 같이 테스트 가능한 부분과 불가능한 부분을 분리해 테스트 가능한 부분에서 단위 테스트를 진행하라는 요구사항이 나왔다. 그래서 이번 포스팅에서 내 나름대로 이 방법을 고민하고 반영한 과정에 대해서 기록해보려 한다. 메서드 시그니처를 수정하기 public CarStatus move() { int power = RandomNumberGenerator.generate(); if (power >= POWER_LOWER_BOUND) { position++; } return new CarStatus(carName.getNa..

우아한테크코스/레벨1

[회고] 우아한테크코스 6기 백엔드 레벨1 1주차 회고

우아한 테크코스 1주차 요약 2월 13일 : 오리엔테이션 / 연극 조 팀원들과 친해지는 시간 2월 14일 : 단위 테스트 학습 / 자동차 경주 미션 진행 (feat. 페어 프로그래밍) 2월 15일 : 자동차 경주 미션 마감 (feat. 페어 프로그래밍) 2월 16일 : 자동차 경주 미션 피드백 / 연극 리허설 1주차 소감 [최적의 루틴 찾기] 1주차는 정말 정신 없이 지나갔다. 정말 정말 정신없이 .. 😶 뭔가 새로운 걸 해내기보다는 우아한테크코스라는 공간, 시간에 적응하면서 나의 생활 리듬을 찾아가는 것이 1주차의 목표였다. 자취를 새로 시작했기 때문에 환경에 대한 적응 시간을 가지고, 나의 생활 패턴을 계획하고 이것 저것 테스트해보았다. 결과적으로 내가 가장 편안할 수 있으며 내가 해야 할 일을 해낼..

DEV book/객체지향의 사실과 오해

[OOP] 객체지향의 사실과 오해 5, 6장 - 자율적인 객체와 도메인 모델링

책임과 메시지 객체지향 패러다임이 전통적인 패러다임에 비해 우월한 이유는 뭘까? 객체지향에서는 명확한 책임을 가진 객체들이 협력에 참여해야 한다. 그러나 책임은 ‘어떻게’가 아닌 ‘무엇을’ 이라는 형태로 나타나야 하며, 객체가 책임을 수행하는 방식의 자율성을 보장해주어야 한다. 객체는 메세지를 전송하여 다른 객체에게 접근할 수 있다. 이 메시지에 추가적인 정보가 필요하면 인자(argument)로 이를 표현할 수 있다. 메서드 객체에게 메시지를 전송하면 결과적으로 메시지에 대응되는 메서드가 실행된다. 어떤 메서드를 호출할 지 실행 시간에 결정할 수 있는 것은 객체지향의 핵심이다. 다형성 다형성은 서로 다른 타입에 속하는 객체가 동일한 메시지를 수신할 경우, 서로 다른 메서드로 이를 처리할 수 있는 메커니즘..

DEV book/객체지향의 사실과 오해

[OOP] 객체지향의 사실과 오해 3, 4장 리뷰 - 역할, 책임, 협력

타입과 추상화 개념 개념(concept)이란 공통점을 기반으로 객체들을 하나로 묶기 위한 그릇이다. 개념을 이용하면 서로 다른 객체를 여러 그룹으로 분류할 수 있다. 이렇게 분류된 그룹 안에 속한 하나의 객체를 그 개념의 인스턴스 (instance) 라고 한다. 즉, 객체는 특정 개념에 적용되었을 때 ‘인스턴스’라고 부를 수 있다. 따라서 우리가 많은 사물들의 공통점을 통해 개념을 확립하고, 분류하였을 때 비로소 하나의 객체는 인스턴스로 사용될 수 있는 것이다. 개념은 세 가지 관점으로 해석할 수 있다. 심볼 (symbol) - 개념을 지칭하는 명칭 내연 (intension) - 개념의 정의 외연 (extension) - 개념에 속하는 모든 객체의 집합 타입(type) 객체를 분류함으로써 우리는 객체들의..

DEV book/객체지향의 사실과 오해

[OOP] 객체지향의 사실과 오해 1, 2장 리뷰 - 객체지향의 본질

협력하는 객체들의 공동체 객체지향이라는 예술은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다. 객체지향 설계를 하기 전, 객체의 역할을 확립하자. 객체의 역할은 아래와 같은 특징을 가진다. 여러 객체가 동일한 역할을 수행할 수 있다. 하나의 객체가 여러 역할을 수행할 수 있다. 역할은 대체 가능성을 의미한다. 객체는 책임을 다하는 방법을 선택할 수 있다. 협력하는 객체의 덕목 다른 객체의 요청한 것 (what)에 협력적으로 응답한다. 객체가 어떻게 (how) 응답하는 지에 대해 충분히 자율적이다. 객체는 자율적이기 위해서 어떤 행동(behavior)을 하기 위해 필요한 상태(state)를 알고 있어야 한다. 예를 들어, 바리스타는 커피 제조를 위한 방법을 기억하는 상태에 있고, 그렇기 때문에 이..

DEV book/토비의 스프링 3.1

[토비의 스프링 3.1] 6장 - AOP (1) 직접 구현하는 고립된 단위 테스트

앞서 트랜잭션 경계를 설정하기 위해 서비스 추상화 기법을 사용하였고, UserService안에 트랜잭션 관련한 코드를 기입하였다. AOP를 사용하는 이유 중 가장 대표적인 것은 선언적 트랜잭션 기능이다. 트랜잭션 경계 설정을 조금 더 세련되게 수정하는 과정에서 AOP를 사용해보는 파트이다. 우선, 이전 시간에서 UserServiceTest에서 UserDao와 MailSender 오브젝트를 호출하여 통합 테스트를 진행하는 것을 실습하였다. 각각의 오브젝트를 직접 고립시켜보고, 외부 DB 등과 같은 환경에 종속되지 않는 단위 테스트를 구현해보자. 트랜잭션 코드의 분리 public void upgradeLevels() throws Exception { // 트랜잭션 시작 TransactionStatus sta..

DEV book/토비의 스프링 3.1

[토비의 스프링 3.1] 5장 서비스 추상화 - UserService, TransactionService 추상화

4장에서 데이터베이스에 접근하는 기술이 다양함을 볼 수 있었듯이, 여러 환경이나 상황에서 기술이 바뀌고 다른 API를 사용하기 때문에 성격이 비슷한 여러 기술을 추상화하고 이를 일관되게 사용할 수 있도록 하는 것은 중요하다. 데이터를 가져오고 입력하는 역할을 하는 UserDao에 사용자의 레벨을 관리하는 기능을 추가하고 싶다. 그러나 레벨 관리와 관련한 복잡한 비즈니스 로직은 UserDao가 아닌 비즈니스 로직 서비스를 제공한다는 의미에서 UserService에서 관리한다. UserService는 UserDao의 빈을 DI 받아 사용한다. UserDao의 구현 클래스가 바뀌어도 UserService는 영향을 받지 않는다 public class UserService { UserDao userDao; pub..

DEV book/토비의 스프링 3.1

[토비의 스프링 3.1] 4장 예외 - 예외 처리 전략과 DataAccessException을 사용한 JDBC 한계 극복

모든 예외는 적절하게 복구되거나 작업을 중단시키고 개발자에게 통보되어야 한다. 자바에서 프로그램 상에 Throw 할 수 있는 예외는 총 세가지 종류가 있다. 예외의 종류 java.lang.Error의 서브 클래스 OutOfMemoryError나 ThreadDeath와 같이 자바 VM에서 발생시키는 에러를 말한다. Exception과 Checked Exception 개발자의 애플리케이션 코드에서 발생한 에러이다. Checked Exception이란 Exception의 서브 클래스이면서 RuntimeException을 상속하지 않은 것을 의미한다. 체크 예외가 발생하는 코드를 작성할 때는 예외를 처리하는 코드를 반드시 함께 작성한다. 예를 들어, 존재하지 않는 파일의 이름을 입력한 FileNotFoundEx..

MINGYUM
'분류 전체보기' 카테고리의 글 목록 (4 Page)