분류 전체보기
[Spring] Bean 등록의 이점
스프링 Bean의 이점 저번 시간에는 스프링의 탄생 목적에 대해 알아보았습니다. 2022.04.28 - [Web/Spring] - [Spring] 스프링의 탄생목적 - SOLID, DI 컨테이너 저번시간의 내용을 짧게 정리해보겠습니다. 스프링은 좋은 객체지향 프로그래밍을 위해서 탄생했고, 좋은 객체지향 프로그래밍을 위해서는 의존성을 주입해주는 IoC 컨테이너가 필요했습니다. 스프링은 IoC컨테이너를 자동으로 생성해줌으로써 객체지향 프로그래밍을 도와줍니다. 하지만 단지 의존성 주입을 자동으로 해주는 것만으로 스프링을 사용하는 것은 아닌데요. 이번 시간에는 객체를 스프링 Bean으로 등록하면 어떤 이점이 있는지 알아보도록 하겠습니다. 의존성 주입 스프링이 어떻게 의존성 주입을 해줄까요? 스프링은 설정 정보가..
Spring Bean Validation 적용하기
기존의 미션들에서 검증기능을 구현하려면 하나하나 다 짜주어야 했습니다. 이제 스프링 부트 프로젝트에서는 @Validated 를 이용해 쉽게 유효성 검증을 수행할 수 있습니다. 이번 시간에는 간단하게 Bean Validation을 내 프로젝트에 적용시켜봅니다. Bean Validation 스프링의 Bean Validation은 클래스 필드에 annotation을 적용하여 해당 필드에게 제약조건을 정의하는 구조입니다. public class LineRequest { @NotBlank(message = "이름을 입력해주세요.") private String name; 앞으로 위의 코드처럼 필드에선 @NotBlank 어노테이션 만으로도 검증이 가능합니다. 적용 방법 순서는 간략하게 아래와 같습니다. 의존성 추가 ..
[Spring] 스프링의 탄생목적 - SOLID, DI 컨테이너
이번 포스팅은 앞으로 스프링을 제대로 학습하기에 앞서, 스프링이 어떤 목적을 가지고 탄생했는지 알아보려고 합니다. 스프링을 왜 만들었을까 스프링은 좋은 객체지향 어플리케이션을 개발할 수 있도록 도와주는 프레임워크 입니다. 개발자들은 객체지향 프로그래밍을 통해 유지보수에 좋은 코드를 작성하려고 노력했습니다. 그래서 좋은 객체지향을 위한 5가지 원칙 (SOLID) 가 탄생했습니다. 객체지향프로그래밍의 5가지 원칙 SRP (Single Responsibility Principle) 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. ‘한 클래스가 하나의 책임만 가져야 한다’ 라는 말만 보면 의미가 모호할 수 있습니다. 그래서 SRP의 중요한 기준은 변경이 있을 때 파급 효과가 적도록 만드는 것입니다. 예..
우테코 레벨1 생활기
시작 올해는 함께 자라기라는 목표를 세우고 달리기로 결심했었다. 우아한테크코스에 합류하기 전 1년간은 혼자서만 열심히 공부했다. 누군가와 프로젝트를 하기엔 아직 부족하다고 생각했다. 잘하는 사람과 같이 하고 싶으면 내가 먼저 잘해져야겠다고 생각했다. 한참을 혼자 공부하다 보니 내가 공부하고 있는 속도가 맞는지 궁금했고, 공부하는 방향이 맞는지도 궁금했다. 하지만 이제는 다르다. 우아한테크코스에서 함께 자라기의 성장 속도는 지난 1년간의 혼자 자라기와는 차원이 다르게 빠르다. 그래서 지난 한 달간, 아니 약 두 달간 경험했던 우테코가 함께 자라는 방식을 적어보고자 한다. 아싸인 내가 사람들과 잘 어울릴 수 있을까 지난 일 년간 아싸코딩을 해왔다. 우테코 합격 메일을 받은 날 정말 날아갈 듯이 기뻤다. 동시..
나는 체스 미션을 통해 무엇을 얻었을까
상태패턴 2022.03.27 - [회고/우아한테크코스] - 나는 블랙잭 미션을 통해 무엇을 얻었을까 지난번 블랙잭 미션에서 네오의 상태패턴 강의를 듣고 다음 미션에 꼭 적용해야겠다고 생각했습니다. 체스미션에서는 기물마다 행마법이 달라야 합니다. 그리고 기물이 한번 움직였는지 아닌지에 따라서도 행마법이 다릅니다. 룩, 비숍, 나이트, 퀸, 킹, 폰 은 "기물"이라는 객체이지만 체스판 위에서 움직일 수 있는 행마법이 다릅니다. 게다가 폰은 한번도 움직이지 않았을 때만 앞으로 2칸을 움직일 수 있고, 한번이라도 움직였으면 1칸만 움직일 수 있습니다. 그래서 저는 기물들이 상태를 갖고있고 상태에다가 어디로 갈 수 있는지 물어보면 되겠다고 생각했습니다. 네, 현재 상태에 메서드를 요청하고 객체가 다음 상태를 갖도..
나는 블랙잭 미션을 통해 무엇을 얻었을까
시간이 좀 지나고 회고하는거라 큼지막한 피드백 위주로 회고를 작성해보려 합니다. 상속하는 객체들과의 관계설정, feat. 추상클래스 Gamer 클래스를 Player, Dealer가 상속받고 있었습니다. Gamer 클래스를 통해 인스턴스를 생성할 수 있지만 이 행위는 제가 의도하지 않은 행위였습니다. abstract를 모르고 상속을 사용했기 때문에 이러한 피드백이 왔다고 생각합니다. 객체간의 공통점이 보인다면 묶을 수 있습니다. 묶는 방법은 대표적으로 상속 : 동일하게 행동하는 인스턴스를 그룹화해 계층적으로 설계하고 싶다면 사용한다. 조합 : 단순히 공통메서드를 묶고 싶을 때 사용한다. 이 있습니다. 상속을 이용한다면 상위클래스 자체로 인스턴스를 생성하는 것을 막기 위해 상위 클래스를 abstract로 선..
[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만 사용해봤기 ..