Web

    [Spring] 스프링의 탄생목적 - SOLID, DI 컨테이너

    이번 포스팅은 앞으로 스프링을 제대로 학습하기에 앞서, 스프링이 어떤 목적을 가지고 탄생했는지 알아보려고 합니다. 스프링을 왜 만들었을까 스프링은 좋은 객체지향 어플리케이션을 개발할 수 있도록 도와주는 프레임워크 입니다. 개발자들은 객체지향 프로그래밍을 통해 유지보수에 좋은 코드를 작성하려고 노력했습니다. 그래서 좋은 객체지향을 위한 5가지 원칙 (SOLID) 가 탄생했습니다. 객체지향프로그래밍의 5가지 원칙 SRP (Single Responsibility Principle) 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. ‘한 클래스가 하나의 책임만 가져야 한다’ 라는 말만 보면 의미가 모호할 수 있습니다. 그래서 SRP의 중요한 기준은 변경이 있을 때 파급 효과가 적도록 만드는 것입니다. 예..

    [Java] Optional 반환값 도대체 어떻게 사용하라는 걸까?

    Optional에 대한 기본적인 정의나 상세한 설명은 다른 블로그에도 설명이 잘 되어있습니다. Optional에 대해 기본적인 숙지를 하시고 보시길 추천드립니다. 블랙잭 미션에서는 로또미션과 다르게 Enum에 쓸모 없는 인스턴스를 두지 않았습니다. 그래서 반환타입에 처음으로 Optional을 사용했는데 get()을 사용해야할 지 orElse()를 사용해야할 지 orElseThrow()를 사용해야할 지 Optional로 반환해 클라이언트에게 책임을 넘기고, 클라이언트는 어떻게 사용해야할 지 앞으로 사용할 방법을 정형화 하기 위해 포스팅을 했습니다. 로또미션 OTHER (나머지) 라는 인스턴스가 존재합니다. public enum Rank { OTHER(0,false, 0), FIFTH(3, false, 5_..

    [Java] for-loop 와 stream.forEach() 는 다르다.

    Java8 에서 Stream이 도입되었습니다. Stream으로 인해 기존의 코드를 더 깔끔하고 가독성있게 바꿀 수 있게 되었습니다. // for-loop for (String item : list) { System.out.println(item); } // stream forEach list.stream().forEach(System.out::println); 하지만 모든 for-loop를 Stream의 forEach로 바꿔도 될까요? " 아닙니다. " 크게 세가지로 모든 for-loop를 forEach로 바꾸지 말아야 할 이유를 소개합니다. 첫번째로 확인해야 할 것은 "굳이 forEach를 사용해야 하는가" 입니다. list.stream().forEach(item -> { if (item.equals(..

    [Java] java.lang.String의 isEmpty() vs isBlank()

    java.lang.String 에는 isEmpty() 와 isBlank() 가 있습니다. 두 메서드는 메서드명만 봤을 때 언뜻 비슷해보이지만 분명한 차이가 있어서 사용할때 정확히 알고 사용하면 좋습니다. isEmpty() 문자열의 길이가 0인 경우에, true를 리턴합니다. isBlank() 문자열이 비어 있거나, 빈 공백으로 이루어져 있으면 true를 리턴합니다. (java 11 이후에 사용이 가능합니다.) isBlank()의 동작방식을 보면 어떤 역할을 하는지 이해하기 쉽습니다. isBlank()는 whitespace(공백)이 아닌 문자의 인덱스와 문자열의 길이를 비교합니다. 빈문자로만 이루어져있는 경우에 nonWhitespace() == length() 이기때문에 true가 리턴됩니다. 마찬가지로,..

    [우테코 프리코스] 최종시험 + 최종합격

    최종시험 일시 : 2021.12.18(토) 13시 ~ 18시 난이도 : 3주차보다 약간 쉬웠던 수준 3주차 과제를 쉽게 변형시켜낼 것이라는 예상과 다르게 아예 새로운 문제가 나왔습니다. 최종시험문제보기 상심할 시간도 없이 문제 이해하고, 설계하고, 기능목록을 작성했습니다. 최종시험 보기전까지 탑다운 방식으로 개발하는 것을 연습했기 때문에 연습한 대로 진행했습니다. 스트림 사용법도 공부해서 바로 실전에 적용했습니다. 시작하자마자 당황했던건 파일입력을 받아야하는 것이었습니다. 파일입력을 직접 구글링하며 방법을 찾고 적용해야했는데, 여기서 시간을 굉장히 많이 썼습니다. 생각보다 Enum 클래스를 만들어서 사용할 일이 많았는데 지난 프리코스 3주차동안 enum은 문제에서 제공해준 Coin enum만 사용해봤기 ..

    [우테코 프리코스] 3주차: 자판기

    🚀 기능 요구사항 반환되는 동전이 최소한이 되는 자판기를 구현한다. 자판기가 보유하고 있는 금액으로 동전을 무작위로 생성한다. 투입 금액으로는 동전을 생성하지 않는다. 잔돈을 돌려줄 때 현재 보유한 최소 개수의 동전으로 잔돈을 돌려준다. 지폐를 잔돈으로 반환하는 경우는 없다고 가정한다. 상품명, 가격, 수량을 입력하여 상품을 추가할 수 있다. 상품 가격은 100원부터 시작하며, 10원으로 나누어떨어져야 한다. 사용자가 투입한 금액으로 상품을 구매할 수 있다. 남은 금액이 상품의 최저 가격보다 적거나, 모든 상품이 소진된 경우 바로 잔돈을 돌려준다. 잔돈을 반환할 수 없는 경우 잔돈으로 반환할 수 있는 금액만 반환한다. 반환되지 않은 금액은 자판기에 남는다. 사용자가 잘못된 값을 입력할 경우 Illegal..

    [우테코 프리코스] 2주차: 자동차 경주 게임

    🚀 기능 요구사항 초간단 자동차 경주 게임을 구현한다. 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는..

    [우테코 프리코스] 백엔드 프로젝트 초기설정 (Mac OS)

    1. java 버전 변경 일단 우아한 테크코스에서는 java 8.0 (JDK 1.8) 버전을 사용합니다. 자바8이 설치되어있지 않으시다면 설치먼저 하셔야합니다. 1.1 Java 8 설치 (설치가 되어있다면 1.2로 넘어가세요) 아래는 다른 분의 링크입니다. 이 포스팅에는 자바설치하는 과정까지는 담지않을게요! https://gilu-world.tistory.com/72 OS X(맥 OS) - Java 다운로드 및 환경변수 설정(JDK 1.8 - 8u251) 자바 환경변수 설정 안녕하세요. 이번 글에서는 자바를 사용하기 위해 가장 먼저 해야 하는 JDK 환경변수를 맥 OS에서 설정하는 방법을 소개하도록 하겠습니다. 준비물 - JDK 파일 - 오라클 gilu-world.tistory.com 1.2 터미널 Ja..

    [우테코 프리코스] 1주차: 숫자 야구 게임

    🚀 기능 요구사항 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. 예) 상대방(컴퓨터)의 수가 425일 때 123을 제시한 경우 : 1스트라이크 456을 제시한 경우 : 1볼 1스트라이크 789를 제시한 경우 : 낫싱 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다. 이 같은 과정을 반복해 컴퓨터가 선택한 ..

    EP4. 검증2 - Bean Validation

    EP3. 검증1 에서 검증로직 구현은 개발자가 직접 작성했습니다. 사실 이 검증 로직은 여러 프로젝트에서 공통적으로 쓰이는 로직입니다. 그래서 검증 로직을 모든 프로젝트에서 공통적으로 쓰일 수 있게 공통화하고, 표준화 한 것이 바로 "Bean Validation" 입니다. Bean Validation 이란? Bean Validation 자체는 어떠한 구현체가 아니라 '기술 표준'입니다. 그래서 우리는 일반적으로 Bean Validation을 구현한 구현체 "하이버네이트 Validator"를 사용합니다. (앞에 붙은 하이버네이트는 ORM과는 관련이 없는 이름입니다.) (마치 기술 표준 JPA가 있고 구현체로 Hibernate 를 사용하는 것과 같은 맥락입니다.) Bean Validation 적용 1. va..