😀
Hyune's Wiki
  • Welcome
  • Article
    • Link
  • Mentor & Code Reviewer
    • 진행하기에 앞서..
    • Code Review History
      • 한방 쿼리 vs 애플리케이션에서 조립
      • DB에서 TIMESTAMP와 DATETIME 타입의 차이
      • Service는 어떤 dto를 반환해야 할까?
        • 확장 질문
  • Legacy
    • 실무 경험 & 팁
      • Kotlin
        • 파일 조작하기
      • Infra
        • Lightsail
          • 인스턴스 구성 예제
        • 공인 ip 확인하기
      • Database
        • INSERT INTO SELECT SHARED LOCK(row LOCK)
      • API Document
        • OpenAPI (Swagger 3.0)
          • 정적 문서 내보내기
      • Side Project
        • Codesquad
      • ETC
        • HTTP Request 추적하기 with HAR File
    • Study
      • Language
        • Java
          • Copy
          • 메모리 관리
          • Garbage Collection
          • 자료구조
          • Java 17
        • Kotlin
          • Coroutine
      • Framework & Library
        • Spring
          • Spring Security
          • @Component vs @Configuration
        • JPA
          • show-sql 설정의 단점
          • @GeneratedValue strategy
          • Entity의 field type
        • Logback
          • 기본 설정
        • Monitoring
          • VisualVM
            • 설치
            • 문자열 생성으로 테스트
          • nGrinder
      • Database
        • MySQL
          • SQL 문 수행 절차
          • 트랜잭션과 잠금
          • 인덱스
      • Infra
        • AWS
          • S3
            • 용어
            • Amazon SDK 1.x with Spring
          • DynamoDB
            • Get vs Query vs Scan
        • Docker & Kubernetes
      • Computer Science
        • OS
          • Process vs Thread
          • Process
        • Web
          • HTTP
            • HTTP vs HTTPS
            • HTTP 구성
            • HTTP 그외
          • REST API
            • GET 메서드에 payload를 사용해도 되는가?
            • 특정 목적의 API는 어떻게 만들어야 할까?
          • TCP / UDP
          • 인터넷의 작동 원리
          • OAuth 2.0
        • Design Pattern
          • Builder Pattern
        • MSA
        • DDD
      • Test
        • Test Doule
      • Book & Online Class
        • 한 번에 끝내는 Spring 완.전.판 초격차 패키지 Online
          • AOP, Aspect Oriented Programming
          • Data Binding
          • IoC(Inversion of Control), DI(Dependency Injection)
          • Null Safety
          • Spring Resource
          • Spring Boot 버전별 변화
          • SpEL, Spring Expression Language
          • Validation
        • 이펙티브 자바 3판
          • 2장 객체 생성과 파괴
            • 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라
            • 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라
            • 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라
            • 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
            • 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
            • 아이템 7. 다 쓴 객체 참조를 해제하라
          • 3장 모든 객체의 공통 메서드
            • 아이템 11. equals를 재정의하려거든 hashCode도 재정의하라
            • 아이템 12. toString을 항상 재정의하라
            • 아이템 14. Comparable을 구현할지 고려하라
          • 4장 클래스와 인터페이스
      • Webinar
        • 요즘 힙한 스타트업의 DBDB DEEP한 이야기
Powered by GitBook
On this page

Was this helpful?

Edit on GitHub
  1. Legacy
  2. Study
  3. Book & Online Class
  4. 이펙티브 자바 3판
  5. 3장 모든 객체의 공통 메서드

아이템 12. toString을 항상 재정의하라

내가 사용하는 방법

  • 책에서는 toString 를 구현함을 통해 객체의 내부가 변해도 유연하게 대응할 수 있다고 말합니다.

  • 하지만 저는 View 에서 사용할 출력용 객체를 명시적으로 만드는 것이 좋다고 생각합니다.

    • REST API 에서의 개발은 객체의 내용을 추상화하여 간결히 표현하는 것은 거의 필요가 없기 때문입니다.

    • 반면에 View 에 맞는 객체로 포장하는 경우는 비교적 많기 때문에 하위 호환성을 위한 toString 을 구현하는 일은 적었습니다.

    • 객체의 내부를 알아야하는 단점은 존재합니다.

      • 어쩌면 리소스 기반의 설계가 아닌, RDB 기반의 설계 환경에서만 일해서 이런 습관이 들었는지도 모르겠습니다.

  • 아래의 예시는 front 에서 신경써야하는 부분일 수도 있지만, 보안 등의 이유로 back-end 에서 하는 경우도 많았습니다.

public class PhoneNumber {

	private final String number1;
	private final String number2;
	private final String number3;
}

// 일반 전화번호가 필요한 화면에서의 출력 객체 - 고객센터 화면에서는 전화번호가 보여야함 
public class NormalResponse {

	private final String printString;

	public NormalResponse(final PhoneNumber phoneNumber) {
		printString = String.format("%s-%s-%s", phoneNumber.getNumber1(), phoneNumber.getNumber2(), phoneNumber.getNumber3());
	}
}

// 가운데 자리수가 마스킹된 전화번호가 필요한 화면에서의 출력 객체 - 일반 웹에서는 전화번호가 모두 노출되면 안됨
public class MaskedResponse {

	private final String printString;

	public MaskedResponse(final PhoneNumber phoneNumber) {
		printString = String.format("%s-****-%s", phoneNumber.getNumber1(), phoneNumber.getNumber3());
	}
}

// 국제번호가 필요한 전화번호가 필요한 화면에서의 출력 객체 - 외국인이 들어오는 페이지에는 국제번호가 보여야 됨
public class InternationalResponse {

	private final String printString;

	public InternationalResponse(final String internationalNumber, final PhoneNumber phoneNumber) {
		printString = String.format("%s-%s-%s-%s", internationalNumber, phoneNumber.getNumber1(), phoneNumber.getNumber2(), phoneNumber.getNumber3());
	}
}
Previous아이템 11. equals를 재정의하려거든 hashCode도 재정의하라Next아이템 14. Comparable을 구현할지 고려하라

Last updated 3 years ago

Was this helpful?