❓
물음표살인마 블로그
  • README
  • ALGORITHM
    • Sieve of Eratosthenes
    • Round Up
    • Binary Search
    • Union Find
    • Sorting Array
    • Lcm, Gcd
  • TechTalk Review
    • Template
  • Books
    • CS Note for Interview
      • Ch1. Design Pattern & Programming paradigm
        • 1.1.1 Singleton Pattern
        • 1.1.2 Factory Pattern
        • 1.1.4 Observer Pattern
        • 1.1.5 Proxty Pattern & Proxy Server
        • 1.1.8 Model-View-Controller Pattern
        • 1.2.1 Declarative and Functional Programming
        • 1.2.2 Object Oriented Programming
      • Ch2. Network
        • 2.2.1 TCP/IP Four-Layer Model
        • 2.2.1-1 TCP 3, 4 way handshake
        • 2.3 Network Devices L4, L7
        • 2.4.1 ARP, RARP
        • 2.4.2 Hop By Hop Communication
        • 2.4.3 IP Addressing Scheme
      • Ch3. Operating System
        • 3.1.1 Roles and Structure of Operating Systems
        • 3.2.1 Memory Hierarchy
        • 3.2.2 Memory Management
        • 3.3.1 Processes and Compilation Process
        • 3.3.3 Memory Structure of a Process
        • 3.3.4 Process Control Block (PCB)
        • 3.3.5 Multiprocessing
        • 3.3.6 Threads and Multithreading
        • 3.3.7 Shared Resources and Critical Sections
        • 3.3.8 Deadlock
        • 3.4 CPU Scheduling Algorithm
      • Ch4. Database
        • 4.1 Database Basic
        • 4.2 Normalization
        • 4.3 Transaction and Integrity
        • 4.4 Types of Databases
        • 4.5 Indexes
        • 4.6 Types of Joins
        • 4.7 Principles of Joins
      • Ch5. Data Structure
    • Learning the Basics of Large-Scale System Design through Virtual Interview Cases
      • 1. Scalability based on user counts(1/2)
      • 1. Scalability based on user counts(2/2)
      • 2.Back-of-the-envelope estimation
      • 3. Strategies for System Design Interviews
      • 4. Rate Limiter
      • 5. Consistent Hashing
      • 6. Key-Value System Design
      • 7. Designing a Unique ID Generator for Distributed Systems
      • 8. Designing a URL Shortener
      • 9. Designing a Web Crawler
      • 10. Notification System Design
      • 11. Designing a News Feed System
      • 12. Chat System Design
      • 13. AutoComplete
      • 14. Design YouTube
      • 15. Design Google Drive
      • Loadbalancer Algorithms
      • Cache tier
      • CDN, Content Delivery Network
      • Stateless Web tier
    • Computer System A programmer's perspective
    • Effective Java
      • Item 1. Consider Static Factory Methods Instead of Constructors
      • Item 2. Consider a Builder When Faced with Many Constructor Parameters
      • Item 3. Ensure Singleton with Private Constructor or Enum Type
      • Item 4. Enforce Noninstantiability with a Private Constructor
      • Item 5. Prefer Dependency Injection to Hardwiring Resources
      • Item 6. Avoid Creating Unnecessary Objects
      • Item 7. Eliminate Obsolete Object References
      • Item 8. Avoid Finalizers and Cleaners
      • Item 9.Prefer try-with-resources to try-finally
      • Item10. Adhering to General Rules When Overriding equals
        • Handling Transitivity Issues
        • Ensuring Consistency
      • Item11. Override hashCode When You Override equals
      • Item12. Always Override toString
        • Always Override toString
      • Item13. Override Clone Judiciously
      • Item14. Consider Implementing Comparable
      • Item15. Minimize the Accessibility of Classes and Members
      • Item16. Accessor Methods Over Public Fields
      • Item17. Minimize Mutability
      • Item18. Composition over inherentance
      • Item19. Design and Document for Inheritance, or Else Prohibit It
      • Item20. Prefer Interfaces to Abstract Classes
      • Item21. Design Interfaces with Implementations in Mind
      • Item22. Use Interfaces Only to define Types
      • Item23. Prefer Class Hierarchies to Tagged Classes
      • Item24. Favor Static Member Classes Over Non-Static
      • Item28. Use Lists Instead of Arrays
      • Item29. Prefer Generic Types
      • Item30. Favor Generic Methods
    • Head First Design Patterns
      • Ch1. Strategy Pattern
      • Ch2. Observer Pattern
        • Ver1. Ch2. Observer Pattern
      • Ch3. Decorator Pattern
        • Ch3. Decorator Pattern
      • Ch4. Factory Pattern
      • Ch5. Singleton Pattern
      • Ch6. Command Pattern
      • Ch7. Adapter and Facade Pattern
      • Ch8. Template Method Pattern
    • Digging Deep into JVM
      • Chapter 2. Java Memory Area & Memory Overflow
      • Chapter 3. Garbage Collector & Memory Allocation Strategy (1/2)
      • Chapter 3. Garbage Collector & Memory Allocation Strategy (2/2)
      • Chapter 5. Optimization Practice
      • Chapter 6. Class file structure
      • Chapter 8. Bytecode Executor Engine (1/2)
  • Interview Practices
    • Restful API Practices
      • Url Shortener API
      • Event Ticket Reservation API
      • Course Management API
      • Search posts by tags API
      • Online Code platform API
      • Simple Task Management API
      • Event Participation API
      • Review System API
      • Car management API
      • Online Library
    • Tech Review
      • if(kakao)
        • Kakao Account Cache Migration / if(kakao)2022
        • Improving the Anomaly Detection System for KakaoTalk Messaging Metrics / if(kakao) 2022
        • Standardizing API Case Handling Without Redeployment / if(kakaoAI)2024
        • JVM warm up / if(kakao)2022
    • Naver Computer Science
      • Process & Thread
      • TCP & UDP
      • Spring & Servlet
      • Filter & Interceptor & AOP
      • Equals() & ==
      • Dependency Injection
      • Object Oriented Programming
  • F-Lab
    • Week1
      • Client & Server
      • HTTP
      • TCP/UDP
      • REST API
      • Questions
        • Object Oriented Programming
        • HTTP
        • Process & Thread
        • Data Structure
    • Week2
      • OSI 7 layer
      • Web vs WAS
    • Week3
      • RDB vs NoSQL
      • RDB Index
      • Cache
      • Redis
      • Messaging Queue
    • Week4
      • Project - Ecommerce
    • Week5
      • ERD - 1
    • Week6
      • Ecommerce - 2
      • Role
      • pw hashing && Salt
      • CreatedAt, ModifiedAt
      • JWT
      • Copy of ERD - 1
    • Week7
      • Vault (HashiCorp Vault)
    • Week 8
      • Api Endpoints
    • Week10
      • Product Create Workflow
  • TOY Project
    • CodeMentor
      • Implementation of Kafka
      • Project Improvement (Architectural Enhancements)
      • Communication between servers in msa
  • JAVA
    • MESI protocol in CAS
    • CAS (Compare and Set)
    • BlockingQueue
    • Producer & Consumer
    • Synchronized && ReentrantLock
    • Memory Visibility
    • Checked vs Unchecked Exception
    • Thread
    • Batch delete instead of Cascade
    • Java Questions
      • Week 1(1/2) - Basic Java
      • Week 1(2/2) - OOP
      • Week 2(1/2) - String, Exception, Generic
      • Week2(2/2) Lambda, Stream, Annotation, Reflection
      • Week3(1/2) Collections
      • Week3(2/2) Threads
      • Week4 Java Concurrency Programming
      • Week5 JVM & GC
    • Java 101
      • JVM Structure
      • Java Compiles and Execution Method
      • Override, Overload
      • Interface vs Abstract Class
      • Primitive vs Object Type
      • Identity and equality
      • String, StringBuilder, StringBuffer
      • Checked Exceptions and Unchecked Exceptions
      • Java 8 methods
      • Try-with-reources
      • Strong Coupling and Loose Coupling
      • Serialization and Deserialization
      • Concurrency Programming in Java
      • Mutable vs Immutable
      • JDK vs JRE
  • SPRING
    • DIP. Dependency Inversion Principal
    • Ioc container, di practice
    • @Transactional
    • Proxy Pattern
    • Strategy Pattern
    • Template Method Pattern
    • using profile name as variable
    • Spring Questions
      • Spring Framework
      • Spring MVC & Web Request
      • AOP (Aspect-Oriented Programming)
      • Spring Boot
      • ORM & Data Access
      • Security
      • ETC
  • DATABASE
    • Enhancing Query Performance & Stability - User list
    • Ensuring Data Consistency, Atomicity and UX Optimization (feat.Firebase)
    • Redis: Remote Dictionary Server
    • Database Questions
      • Week1 DBMS, RDBMS basics
      • Week2 SQL
      • Week3 Index
      • Week4 Anomaly, Functional Dependency, Normalization
      • Week5 DB Transaction, Recovery
    • Normalization
      • 1st Normal Form
      • 2nd Normal Form
      • 3rd Normal Form
  • NETWORK
    • HTTP & TCP head of line blocking
    • HTTP 0.9-3.0
    • Blocking, NonBlocking and Sync, Async
    • Network Questions
      • Week1 Computer Network Basic
      • Week2(1/3) Application Layer Protocol - HTTP
      • Week2(2/3) Application Layer Protocol - HTTPS
      • Week2(3/3) Application Layer Protocol - DNS
      • Week3 Application Layer
      • Week4 Transport Layer - UDP, TCP
      • Week5 Network Layer - IP Protocol
    • Network 101
      • https://www.google.com
      • TCP vs UDP
      • Http vs Https
      • TLS Handshake 1.2
      • HTTP Method
      • CORS & SOP
      • Web Server Software
  • OS
    • Operating System Questions
      • Week1 OS & How Computer Systems Work
      • Week2(1/2) Process
      • Week2(2/2) Thread
      • Week3 CPU Scheduling
      • Week4 Process Synchronize
      • Week5 Virtual Memory
    • Operating System 101
      • Operating system
        • The role of the operating system
        • The composition of the operating system.
      • Process
        • In Linux, are all processes except the initial process child processes?
        • Zombie process, orphan process
        • (Linux) Daemon process
        • Process address space
        • Where are uninitialized variables stored?
        • Determination of the size of the Stack and Heap
        • Access speed of Stack vs Heap
        • Reason for memory space partitioning
        • Process of compiling a process
        • sudo kill -9 $CURRENT_PID
      • Thread
        • Composition of a thread's address space
      • Process vs Thread
        • Creation of processes and threads in Linux
      • Multiprocessing
        • Web Browser
        • Implementation of multiprocessing
        • Application areas of multiprocessing
      • Multithreading
        • Application areas of multithreading
      • Interrupt
        • HW / SW Interrupt
        • Method of handling interrupts
        • Occurrence of two or more interrupts simultaneously
      • Polling
      • Dual Mode
        • Reason for distinguishing between user mode and kernel mode
      • System call
        • Differentiation between system calls
        • Types of system calls
        • Execution process of a system call
      • Process Control Block (PCB)
        • PCB의 구조
        • 쓰레드는 PCB를 갖고 있을까?
        • 프로세스 메모리 구조
      • Context switching
        • Timing of context switching
        • Registers saved during context switching
        • Context switching in processes
        • Context switching in threads
        • Difference between context switching in processes and threads
        • Information of the current process during context switching
      • Interprocess Communication (IPC)
        • Cases where IPC is used
        • Process address space in IPC Shared Memory technique
        • Types of IPC
  • COMPUTER SCIENCE
    • Computer Architecture 101
      • 3 components of a computer
      • RAM vs ROM
      • CPU vs GPU
      • SIMD
      • Two's complement
      • Harvard Architecture vs. von Neumann Architecture
      • The structure of a CPU.
      • Instruction cycle (CPU operation method)
      • Instruction pipelining
      • Bus
      • Memory area
      • Memory hierarchy structure
        • Reason for using memory hierarchy structure
      • Cache memory
      • L1, L2, L3 Cache
      • Locality of reference (cache)
      • Fixed-point vs Floating-point
        • epresentation of infinity and NaN (Not a Number) in floating-point
      • RISC vs CISC
      • Hamming code
      • Compiler
      • Linking
      • Compiler vs Interpreter
      • Mutex vs Semaphore
      • 32bit CPU and 64bit CPU
      • Local vs Static Variable
      • Page
  • Programming Paradigm
    • Declarative vs Imperative
  • JPA, QueryDsl
    • why fetchResults() is deprecated
  • PYTHON
    • Icecream
  • FASTAPI
    • Template Page
  • LINUX
    • Template Page
  • DATA STRUCTURE
    • Counting Sort
    • Array vs Linked List
  • GIT, Github
    • git clone, invalid path error
  • INFRA
    • Template Page
  • AWS
    • Server Log Archive Pipeline
    • Image Processing using Lambda
  • DOCKER
    • Docker and VM
    • Python Executable Environment
    • Docker commands
  • docker-compose
    • Kafka, Multi Broker
  • KUBERNATES
    • !Encountered Errors
      • my-sql restarts
      • kafka producer: disconnected
    • Kubernetes Components
    • Helm
      • Helm commands
    • Pod network
    • Service network
      • deployment.yaml
      • services.yaml
    • Service type
      • Cluster IP
      • NodePort
    • service-name-headless?
    • kube-proxy
  • GraphQL
    • Template Page
  • WEB
    • Template Page
  • Reviews
    • Graphic Intern Review
    • Kakao Brain Pathfinder Review
    • JSCODE 자바 1기 Review
  • 😁Dev Jokes
    • Image
      • Plot twist
      • Priorities
      • SQL join guide
      • Google is generous
      • Genie dislikes cloud
      • buggy bugs
      • last day of unpaid internship
      • what if clients know how to inspect
      • its just game
      • how i wrote my achievement on resume
      • self explanatory
      • chr(sum(range(ord(min(str(not))))))
Powered by GitBook
On this page
  • 1. 정보 은닉의 중요성
  • 1.1 모듈화와 유연성의 향상
  • 1.2 시스템의 안전성
  • 2. 자바의 접근 제어자
  • 2.1 private
  • 2.2 package-private (default)
  • 2.3 protected
  • 2.4 public
  • 3. 접근 권한을 최소화하는 방법
  • 3.1 클래스와 멤버를 가능한 한 숨기기
  • 3.2 public 클래스의 멤버는 반드시 private으로
  • 3.3 패키지 전용(private)을 적절히 활용
  • 3.4 불변(immutable) 객체 활용
  • 3.5 접근 권한 확장의 신중함
  • 4. Lombok과 자바 스프링부트 프로젝트에서의 활용
  • 4.1 Lombok을 이용한 기본 클래스 작성
  • 4.2 스프링부트 서비스 클래스에서의 접근 권한 설정
  • 4.3 리포지토리 클래스에서의 접근 권한 설정
  • 5. 결론
  1. Books
  2. Effective Java

Item15. Minimize the Accessibility of Classes and Members

클래스와 멤버의 접근 권한을 최소화하라

1. 정보 은닉의 중요성

정보 은닉은 객체 지향 프로그래밍에서 모듈 간 결합도를 낮추고, 응집도를 높이는 중요한 원칙이다. 클래스 내부의 구현 세부 사항을 외부로부터 숨기고, 필요한 부분만 외부에 노출함으로써 클래스의 재사용성과 유지보수성을 향상시킬 수 있다. 이는 코드 변경 시 영향을 받는 부분을 최소화하여 오류를 줄이고, 코드의 복잡성을 낮출 수 있다.

1.1 모듈화와 유연성의 향상

정보 은닉을 통해 각 모듈(클래스)은 자신의 내부 구현에 대한 책임만을 가지며, 외부에 제공하는 인터페이스만을 통해 상호작용하게 된다. 이렇게 하면 모듈 간의 결합도가 낮아져 유연한 설계가 가능해지고, 개별 모듈을 독립적으로 개발하거나 수정할 수 있다.

1.2 시스템의 안전성

접근 권한을 적절히 설정함으로써 클래스의 내부 상태가 외부에서 임의로 변경되는 것을 방지할 수 있다. 이는 시스템의 안전성을 높이는 중요한 방법 중 하나이다.

2. 자바의 접근 제어자

자바에서는 클래스, 메서드, 필드 등의 접근 범위를 제어하기 위해 네 가지 접근 제어자를 제공한다.

2.1 private

private 접근 제어자는 가장 강력한 접근 제한을 부여한다. private로 선언된 멤버는 해당 클래스 내에서만 접근할 수 있으며, 외부에서는 접근이 불가능하다. 이를 통해 클래스 내부 구현을 완전히 숨길 수 있다.

public class Example {
    private int value;

    private void calculate() {
        // 내부에서만 사용 가능
    }
}

2.2 package-private (default)

접근 제어자를 명시하지 않으면 해당 멤버는 '패키지 전용'으로 설정된다. 같은 패키지 내의 다른 클래스에서는 접근할 수 있지만, 다른 패키지에서는 접근이 불가능하다.

class PackageExample {
    int value; // package-private
}

2.3 protected

protected 접근 제어자는 package-private 범위에 더해, 해당 클래스를 상속받은 하위 클래스에서도 접근할 수 있도록 한다. 상속 관계에서 부모 클래스의 중요한 기능을 하위 클래스에서 사용할 수 있게 해준다.

public class Parent {
    protected int value;

    protected void display() {
        // 자식 클래스에서 접근 가능
    }
}

2.4 public

public 접근 제어자는 가장 넓은 접근 범위를 허용한다. 어디서든 접근이 가능하므로, 반드시 외부에 공개해야 할 멤버에만 사용해야 한다.

public class PublicExample {
    public int value;

    public void printValue() {
        System.out.println(value);
    }
}

3. 접근 권한을 최소화하는 방법

접근 제어자를 사용할 때는 다음과 같은 원칙을 준수해야 한다.

3.1 클래스와 멤버를 가능한 한 숨기기

모든 클래스와 멤버는 기본적으로 private으로 선언하고, 필요할 때만 접근 권한을 확장하는 것이 좋다. 이렇게 하면 클래스의 내부 구현을 숨길 수 있고, 외부 코드와의 불필요한 결합을 방지할 수 있다.

3.2 public 클래스의 멤버는 반드시 private으로

public 클래스를 작성할 때는 멤버 변수와 메서드를 기본적으로 private으로 선언해야 한다. 이를 통해 외부에서 접근할 수 있는 경로를 최소화하고, 클래스 내부 구현의 변경이 외부에 영향을 미치지 않도록 할 수 있다.

public class Account {
    private String owner;
    private double balance;

    public double getBalance() {
        return balance;
    }
}

3.3 패키지 전용(private)을 적절히 활용

패키지 전용 접근 제어자(package-private)는 같은 패키지 내에서만 접근이 필요할 때 유용하다. 단, 패키지가 커지면 모듈 간 결합이 증가할 수 있으므로, 가능하면 private을 우선적으로 사용하고 필요할 때만 범위를 확장하는 것이 좋다.

3.4 불변(immutable) 객체 활용

접근 권한을 최소화하는 또 다른 방법은 불변 객체를 사용하는 것이다. 불변 객체는 상태를 변경할 수 없으므로, 외부에서 객체를 수정하려는 시도를 원천적으로 차단할 수 있다. 이를 통해 객체의 안정성과 예측 가능성을 높일 수 있다.

public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

3.5 접근 권한 확장의 신중함

특정 상황에서는 클래스나 멤버의 접근 권한을 protected 또는 public으로 확장해야 할 수 있다. 그러나 이때는 반드시 그 이유를 명확히 하고, 향후 유지보수에 미칠 영향을 고려해야 한다. 불필요한 접근 권한 확장은 클래스의 응집도를 떨어뜨리고, 오류 가능성을 높일 수 있다.

4. Lombok과 자바 스프링부트 프로젝트에서의 활용

이제 앞서 설명한 원칙들을 실제 자바 스프링부트 프로젝트에 적용하는 방법을 살펴보겠다. Lombok을 활용하여 코드를 간결하게 유지하면서도, 접근 권한을 최소화하는 설계를 구현해보자.

4.1 Lombok을 이용한 기본 클래스 작성

Lombok을 사용하면 반복적인 코드 작성을 줄일 수 있다. 하지만 Lombok을 사용할 때도 접근 권한에 대한 원칙을 준수해야 한다.

import lombok.Getter;
import lombok.Setter;

public class User {
    @Getter
    private final String username;

    @Getter @Setter
    private String email;

    public User(String username) {
        this.username = username;
    }
}

위 코드에서 username 필드는 final로 선언되어 생성 시점 이후에는 변경할 수 없으며, email 필드는 외부에서 변경 가능하지만, 접근 권한을 private으로 설정하여 직접 수정할 수 없도록 하였다. Lombok의 @Getter와 @Setter 애너테이션을 사용하였으나, 클래스 외부에서 직접 접근할 수 없도록 private 필드로 제한하였다.

4.2 스프링부트 서비스 클래스에서의 접근 권한 설정

서비스 클래스는 비즈니스 로직을 처리하는 핵심 역할을 하므로, 접근 권한을 철저히 관리해야 한다. 서비스 클래스 내에서의 멤버 변수나 메서드는 기본적으로 private으로 설정하고, 외부에서 호출해야 하는 메서드만 public으로 선언하는 것이 좋다.

import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findUserByUsername(String username) {
        return userRepository.findByUsername(username)
                .orElseThrow(() -> new UserNotFoundException("User not found"));
    }

    private void validateUser(User user) {
        // 내부에서만 사용
    }
}

위 코드에서 validateUser 메서드는 외부에 노출될 필요가 없으므로 private으로 선언하였다. 반면 findUserByUsername 메서드는 외부 요청에 의해 호출될 가능성이 있으므로 public으로 설정하였다.

4.3 리포지토리 클래스에서의 접근 권한 설정

리포지토리 클래스는 데이터베이스와의 상호작용을 담당한다. 이 클래스 역시 필요한 메서드만 외부에 공개하고, 내부 구현 세부 사항은 숨겨야 한다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByUsername(String username);

    private void logQuery(String query) {
        // 내부에서만 사용
    }
}

JpaRepository를 상속받은 UserRepository는 기본적으로 외부에서 사용될 가능성이 있는 메서드만 제공하며, 내부적인 로깅 기능과 같은 세부 사항은 private으로 제한하여 외부에 노출되지 않도록 한다.

5. 결론

아이템 15에서는 클래스와 멤버의 접근 권한을 최소화하는 것이 얼마나 중요한지 설명한다. 접근 권한을 신중하게 설정함으로써 모듈 간의 결합도를 낮추고, 코드의 유지보수성을 높일 수 있다. 이러한 원칙은 자바 프로그래밍에서 특히 중요하며, 실제 프로젝트에서 이를 실천하기 위해 Lombok과 스프링부트를 적절히 활용하는 방법을 살펴보았다.

클래스와 멤버의 접근 권한을 최소화하는 것은 단순히 코드의 구조를 개선하는 것이 아니라, 장기적으로 시스템의 안정성과 유연성을 확보하는 중요한 전략임을 명심해야 한다. 이 글을 통해 자바 개발자들이 정보 은닉과 접근 권한 관리의 중요성을 더욱 깊이 이해하고, 실무에 적용할 수 있기를 바란다.

PreviousItem14. Consider Implementing ComparableNextItem16. Accessor Methods Over Public Fields

Last updated 9 months ago