전체 글 82

[Effective Java] 2. 생성자에 매개변수가 많다면 Builder를 고려하라

문제 상황 오 딱 요즘 고민인 상황에 걸맞은 지식인듯하다. 정적 팩토리를 쓰던, 생성자를 사용하던 매개변수가 달라지면 메서드가 너무 많이 추가되는 어려움이 있었다. 예를 들면 public static Question newQuestion(long id, String title, String contents) { return new Question(id, title, contents,null); } public static Question newQuestionWithDeleted(Long id, String title, String contents, boolean status) { return new Question(id, title, contents, status); } private Question(L..

도서 2022.11.14

[Effective Java] 1. 생성자 대신 팩터리 메서드를 고려하라

클래스는 생성자와 별도로 정적 팩터리 메서드를 가질 수 있다. 예를 들어 다음과 같이 public생성자 대신 정적 팩토리 메서드를 제공할 수 있다. //정적 팩토리 메서드 public static Question newQuestion(Long id, String title, String contents) { return new Question(id, title, contents); } //생성자 private Question(long id, String title, String contents) { super(id); this.title = title; this.contents = contents; } 장점 이름을 가질 수 있다. 딱 보기에도 생성자로 인스턴스를 생성하려면 new Qustion()으로만 ..

도서 2022.11.12

[TDD,클린코드 with 자바] 1,2차 라이브 강의 정리

[TDD, 클린 코드 with 자바 15기]에 참여하고 종강이 일주일 앞으로 다가왔다 차차 배운것들을 정리해보려고 한다. OOP와 TDD에 무지했던 나로서는 정말 배운 게 많은 것 같다. 앞으로 카테고리당 세부적으로 포스팅을 해볼 예정이다! 1차 라이브 강의 TDD 사이클 팁 기능 목록을 먼저 작성하세요 Util성격의 기능이 TDD로 도전하기 좋음 로직의 복잡도가 낮으면서 단위 테스트가 가능한 기능을 TDD로 도전한다. 로직의 복잡도가 높으면서 단위 테스트 가능한 기능을 TDD로 도전 여기뿐만 아니라 코드 리뷰에서도 Util성격으로 바꿔 보자는 코멘트를 많이 받아서 Util코드란 무엇인지는 따로 포스팅하겠다. 마지막 상태를 알면 TDD하기가 쉬워진다. ex ) new Car()로만 생성하면 Car car..

[객체 지향의 사실과 오해] 4. 역할 ,책임,협력

4장 인간의 행동을 결정하는 것은 그 사람이 어느 상황에 처해있느냐. 인간의 행동을 결정하는 문맥은 타인과의 협력이다. 객체 지향의 세계에 입문한 사람들이 가장 흔히 하는 실수 → 객체가 가져야할 상태와 행동부터 고려한다는 것이다. 중요한 것은 객체들 사이에 이루어지는 협력이다. 협력 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작된다. ex ) 재판 속에서의 협력 재판장은 증인을 부를 것을 요청,증언할 것을 요청 왕 - 토끼 - 증인 사이의 협력 특정한 요청을 받아들일 수 있는 것은 , 객체가 그 요청을 수행할 수 있는 지식과 행동 방식을 가지고 있기 때문이다. = 해당 객체가 책임을 가지고 있다. 요청과 의무는 객체의 책임을 결정한다 책임 요청과 응답을 할 의무가 있는 경우 책임이 있다. 무엇..

도서 2022.11.03

[객체 지향의 사실과 오해] 3. 타입과 추상화

땅은 구불 구불 하지만 지하철 노선도는 직선으로 이루어져있다 . 이렇듯 승객이 꼭 알아야하는 사실만 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하게 만듬. -> 추상화 추상화란? 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정. 복잡성을 다루기 위해 추상화는 두 차원에서 이루어짐. 1. 공통점은 취하고 차이점은 버리는 단순화 2. 중요한 부분을 강조하기 위한 불필요한 세부 사항 제거 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념이라고 한다. 인간,자동차,모니터,글자,책 .. 개념을 이용하여 여러 객체로 classfication(분류) 가능 개념 그룹의 일원이 될 때 인스턴스라고 할 수 있다. 개념 1. 심볼 -> 말 그대..

도서 2022.11.02

[객체 지향의 사실과 오해] 2.이상한 나라의 객체

세상을 더 작은 객체로 분해하는 것은 본질적으로 세상이 포함하고 있는 복잡성을 극복하기 위한 인간의 작은 몸부림이다. 객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다. 앨리스의 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태이다. 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적이다 (158 인 사람이 10을 먹으면 168이지만 198인 사람이 10이 크면 208이겠지) 행동의 결과는 앨리스의 위치라는 상태를 이용해 쉽게 설명할 수 있다. 객체는 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별 가능한 식별자,특징적인 행동 변경가능한 상태를 가진..

도서 2022.10.27

[한이음 프로젝트]OAuth2 - Google 구현(+Spring Security 동작 원리)

google Oauth2를 구현해보겠다. 1. 일단 google에 사용자 인증 정보를 등록한 뒤, 정보를 받아온다.(이 부분은 구글링을 하면 더 자세하게 많이 나온다) 2.build.gradle spring-security Spring Security는 스프링 기반의 어플리케이션 보안을 담당하는 프레임워크입니다. Spring Security를 사용하면 사용자 인증, 권한, 보안처리를 간단하지만 강력하게 구현 할 수 있습니다. implementation 'org.springframework.boot:spring-boot-starter-security' jwt 모듈 implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken..

[객체 지향의 사실과 오해] 1. 협력하는 객체들의 공동체

최근 클리코드와 한이음 프로젝트에서 OOP에 대해 많이 언급되고 있다. 따라서 멘토님이 추천해준 책을 사서 읽어보고 있다. 주절주절 설명은 하지 않고 내가 밑줄 친 부분만 끄적끄적 해보겠다. 객체지향의 목표는 실세계를 모방하는 것이 아니라 오히려 새로운 세계를 창조하는 것이다. 그럼에도 왜 실세계를 모방한다고 할까? 객체를 스스로 생각하고 스스로 결정하는 현실세계의 생명체에 비유하는 것은 상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명하는데 효과적이기 떄문이다. 객체 지향의 개념을 훌룡한 프로그램을 설게하고 구혆는데에는 부적합하지만 객체 지향의 관점을 설명하기에는 실세계를 모방했다고 해도 goodd 요청과 응답으로 구성된 협력 일상에서 혼자 힘으로 해결하기 힘든 것을 다른 사람에게 도움을 요청한..

도서 2022.10.06

[TDD,클린코드 with 자바]모든 원시값과 문자열을 포장하여라

넥스트스텝 [클린코드]를 수강하며 얻은 인사이트들을 끄적끄적 메모해봅니다. 전역 변수에서 이렇게 선언해서 사용하는 경우가 많다. private int position = 0 ; 이때 이런 원시값을 포장해서 사용하자 포장이란 원시값을 가지는 객체를 만든다는 의미이다. TDD부터 시작해보자. 보통 변수명이 클래스명으로 가는 경우가 많다. 뭘할지 모르겠으면 일단 생성자를 만들고 Postition postition = new Position(3); 비교해주는 assert문을 써야한다. 객체의 값을 꺼내오는 getter를 지양해보자.(도메인 객체에서는 setter와 getter 지양) 어떻게 검증할까? position.getPosition() 이렇게 하지 말고 객체와 객체를 비교해보는 것이다. assertThat..

JAVA - 스트림 가공하기

전체 요소중에서 내가 원하는 것만 뽑아낼 수 있습니다 filter은 스트림 내 요소들을 하나씩 평가해서 걸러내는 작업입니다. Stream stream = names.stream() .filer(name -> name.contains("a")); Map map은 스트림 내 요소들을 하나씩 특정한 값으로 변환해줍니다.이떄 값을 변환하기 위해 람다를 인자로 받습니다. 스트림에 들어간 값이 input이 되어서 특정 로직을 거친 후 output이 되어 리턴되는 새로운 스트림에 담기게 됩니다. 이러한 작업을 매핑이라고 합니다. 간단한 예제입니다. 스트림 내 String의 toUpperCase메소드를 실행해서 대문자로 변환한 값들이 담긴 스트림을 리턴합니다. Stream stream = names.stream() ...

728x90