Skip to content

Latest commit

 

History

History
120 lines (93 loc) · 5.49 KB

2.20191116_KSUG_자바한정_null서바이벌가이드_박성철.md

File metadata and controls

120 lines (93 loc) · 5.49 KB

2.20191116_KSUG_자바한정_null서바이벌가이드_박성철

코드에 책임을 지나요

  • 전문가로써 자신의 코드에 자부심을 가지는가
    • 예전의 코더란
      • 위에서 설계를 하면 그대로 찍어내는 형태로 '코더'라고 불렀음.
    • 최근의 코딩이란 단순히 설계를 코드로 찍어내는게 아닌, 설계를 하면서 개발을 병행하는 형태임. 찍어내는 형태라면 좋은 코드라고 할 수 없다.

1.null과 null안정성

  • null참조의 기원: 레코드 핸들링

  • 참조(Reference) - 레코드관의 관계를 표현

  • null : 관계가 없음을 나타내는 특수 값

  • null인 값을 사용하려고 하면 오류를 발생시킴

  • Null이 문제인 이유

    • 모호한 null의 의미
    • 초기화되지 않음, 정의디지 않음, 값이 없음. null이라는 값?
    • 모든 참조의 기본 상태 또는 값 -모든 참조는 null일 가능성이 있음
  • 자바가 아닌 다른 언어들은 Null의 존재를 인지하여 처리할 수 있는 다양한 연산자들을 지원함

    • Null Type이 존재
    • Null을 병합하거나, 조건으로 쓸 수 있는 연산자들을 지원함

2.null을 안전한 코딩법

1.null에서 안전한 좋은 코딩법

  1. 기본적으로 null을 쓰지 말자

    • 무조건적인 null 사용을 지양하자

    • 객체필드, 매개변수, 반환값은 가능한 null 타입을 허용하지 않도록 하자

      intelliJ
      @ParameterAreNonnullByDefault
      
  2. null 문맥을 제한된 범뮈 안에 가두자

    OOP to me means only messaging, local retention and protection and. hiding of state-process, and extreme late-binding of all things.- Dr. Alan Kay

    • 설계를 잘하면 null의 위험에서 안전해 질 수 있다.
    • 좋은 캡슐화
      • 높은 응집성 :SRP
        • 모든 필드는 객체와 생애주기가 같다
        • 모든 매서드가 모든 필드를 대상으로 작업한다.
      • 낮은 결합도
        • 디미터법칙, 묻지 말고 시켜라

          디미터 법칙 예 ) DDD Agreegate

        • 인터페이스의 사용
  3. API에 Null을 최대한 쓰지 말아라.

    • Null로 지나치게 유연한 메서드를 만들지 말고 명시적인 메서드를 만들어라
    • Null을 반환하지 말라
      • 빈 컬렉션이나 null객체를 활용하라.
      • 반환값이 없을 수도 있으므로 명시적으로 Optional로 표현하라.
      • 오류상황에서는 null을 반환하지 말고 예외를 던저라.
    • 선택적인 매개변수는 정적 다형성 (overload)를 사용해서 표현하라.
  4. null객체를 활용하자

    • null 객체(특수사례패턴 : Special Case Pattern)
      • 인터페이스는 동일하지만 아무 일도 하지 않는, 일종의 더미 객체
      • 이 객체와 협력하는 객체는 더미라는 사실을 몰라야함
      • 타입이 안전하면서 의미를 표현할 수 있는 동일 타입의 특수 상황용 객체를 null 대신 반환
      • 리스코프 치환 원칙 주의
      • 디미터 법칙과 '묻지 말고 시켜라'를 잘 지켜야 유용

    이종립님

  5. null을 명시적으로 표현하자

    • null은 참조 값이 없음을 나타내는 암시적인 표현 방법
    • java.util.Optional은 값이 없음을 명시적으로 표현하는 컨테이너 객체
  6. 계약에 의한 설계를 적용하자(design by contract)

    • API 규약을 소비자와 제공자 사이에 지켜야 할 엄격한 계약으로 여기는 설계방법
    • 형식적 규약 외에 사전 조건과 사후 조건과 유지조건(불변식)을 포함
    • 오브젝트 부록 A 계약에 의한 설계 -조영호
    • 자바는 대표적으로 Assert class를 통해서 설계를 적용할 수 있다.
  7. 구초체에는 functor를 활용하자

    • 자바는 순수 OOP언어가 아니다.
    • 자바 클래스는 데이터 구조체로 적절히 사용 가능 (DTO)
    • 구조체는 객체가 아니므로 디미터 법칙 적용 대상이 아님
  8. 객체의 기본값을 유용하게 만들자

    • 객체를 생성했을 때 갖는 기본 값이 쓰기에 문제 없어야 한다.
    • 실행 전에 모든 필드가 초기화되어야 한다.(지연 초기화 제외)
    • 실행 시점에 null인 필드는 초기화되지 않았다는 의미가 아닌, 값이 없다는 의미로 전달되어야 한다.
    • 객체 필드의 생명주기는 모두 객체의 생명 주기와 같아야 한다.

2. null에 안전하다고 점검해주는 도구

1. 정적분석 : IDE나 CI/빌드도구에서 코드의 문제점을 확인
  • JSR305
    • 중단된 미완성 표준
    • 각종 정적 분석 도구에서 비표준 어노테이션 제공
    • 정적분석도구 (find bugs / spot bugs)
    • intelliJ 제공 어노테이션
      • 매개변수를 기본으로 Null이 아닌 것으로 설정
    • 이클립스 제공 어노테이션
      • @NonNull, @Nullable
      • @NonNullByDefault
      • 외부 어노테이션 적용
    • 스프링 제공 어노테이션
      • @NonNull, @Nullable : 매개변수, 반환값, 필드에 지정 가능
      • @NonNullApi, @NonNullFields : 패키지에 지정 가능, 지정된 범위의 매서드 매개변수, 반환값, 필드가 기본 Null이 아님
2. 타입 시스템 확장 : 컴파일타임에 확인
  • JSR308
    • check framework와 동시에 진행
      • null 안정성 확인 @Nullable, @NonNull, @PolyNull
      • 패키지, 클래스 수준 기본 정책 설정 가능