728x90
반응형

🎯 개발자라면 꼭 알아야 할 디자인 패턴! MVC란?

**MVC(Model-View-Controller)**는 소프트웨어 개발에서 **관심사의 분리(Separation of Concerns)**를 구현하는 대표적인 디자인 패턴입니다.

  • 비즈니스 로직과 화면, 입력 제어를 독립적으로 구성할 수 있어 유지보수성이 매우 뛰어납니다.

📌 MVC 구성 요소

🔹 Model (모델)

  • 앱이 다뤄야 할 데이터비즈니스 로직을 담당합니다.
  • 데이터가 변경되면 일반적으로 뷰(View)와 컨트롤러(Controller)에 알려줍니다.
  • ✅ 예: 품목 이름, 가격, 수량 등 쇼핑 리스트의 항목 데이터

🔹 View (뷰)

  • 사용자에게 보여지는 UI를 담당합니다.
  • 데이터를 직접 처리하지 않고, 모델에서 전달받은 데이터만 표시합니다.
  • ✅ 예: 쇼핑 항목 리스트를 표 형태로 보여주는 HTML 화면

🔹 Controller (컨트롤러)

  • 사용자의 **입력(클릭, 요청 등)**을 받아,
    적절한 모델을 호출하고 뷰를 갱신하는 역할을 합니다.
  • ✅ 예: "장바구니에 담기" 버튼 클릭 → 컨트롤러가 해당 품목을 모델에 추가하고, 뷰를 새로고침

🛒 MVC 예제 - 쇼핑 리스트 앱

쇼핑리스트 앱을 예로 들면 다음과 같이 MVC로 나눌 수 있어요.

역할설명
Model itemName, price, quantity 등의 데이터를 정의
View 리스트 형태로 화면에 항목을 보여주는 레이아웃
Controller 사용자의 입력을 받아 모델 업데이트 및 뷰 갱신
 

✅ MVC 패턴의 장점

  • 🔧 유지보수가 쉬움: 각 구성 요소가 독립적이라 변경이 용이
  • 🧩 협업에 유리: 역할 분리가 명확해 프론트/백엔드 개발자 협업에 이상적
  • 🚀 재사용성과 확장성 증가
MVC패턴, 디자인패턴, 모델뷰컨트롤러, Model View Controller, 백엔드기초, 소프트웨어아키텍처, 쇼핑리스트예제, Java MVC, Spring MVC, 웹개발패턴
728x90
반응형
728x90
반응형

✔️ 싱글톤이란?

싱글톤(Singleton) 패턴은 클래스의 인스턴스를 단 하나만 생성하도록 보장하는 디자인 패턴입니다.
객체가 계속해서 생성되는 것처럼 보여도, 실제로는 최초에 생성된 하나의 인스턴스만을 반환합니다.

💡 싱글톤 구현 예제 (Lazy Initialization 방식)

public class Singletone {

    private static Singletone singletone;

    // 생성자를 private으로 막아 외부에서 new로 생성 불가
    private Singletone() {}

    public static Singletone getInstance() {
        if (singletone == null) {
            singletone = new Singletone();
        }
        return singletone;
    }
}

📌 핵심 포인트:

  • private static 으로 클래스 내부에 단 하나의 인스턴스를 보관
  • 외부에서 new Singletone() 호출 불가능 (생성자 private)
  • getInstance() 메서드를 통해서만 인스턴스에 접근 가능
  • 필요할 때만 초기화하는 지연 초기화(Lazy Initialization) 방식 사용

⚠️ 싱글톤 패턴 사용 시 주의사항

  1. 객체를 2개 이상 생성하지 않도록 철저히 차단해야 함
    • 생성자를 private으로 감춰야 함
  2. 상태를 유지하지 않는 Stateless 설계가 중요
    • 필드를 통해 상태를 가지면 여러 사용자 간 충돌 위험
    • 예: 웹 애플리케이션에서 사용자별 데이터를 필드로 저장하면 큰일 남 😱
  3. Spring을 사용한다면 걱정할 필요 없음
    • 기본적으로 모든 Bean은 싱글톤 범위로 관리됨
    • @Component, @Service, @Repository 등 사용 시 자동 적용
  4. 공유되지 않는 데이터는 지역 변수 또는 ThreadLocal 사용
    • 예: 사용자 요청에 따른 데이터를 처리할 때는 필드 대신 메서드 파라미터 사용

🧠 결론

  • 싱글톤은 자원을 절약하고, 전역적으로 동일한 인스턴스를 공유할 수 있어 유용합니다.
  • 그러나 잘못 사용할 경우 상태 공유로 인한 오류 발생 가능성이 있으므로, Stateless 설계를 철저히 해야 합니다.
  • Spring에서는 기본이 싱글톤이지만, 상태 관리만 잘 하면 안전하게 사용 가능!
728x90
반응형
728x90
반응형

📌 목차

  1. 프로그램이란?
  2. 프로세스란?
  3. 스레드란?
  4. 자바 스레드의 개념
  5. 스레드 사용 시 주의사항

1. 프로그램 (Program)

  • 사전적 의미: 어떤 작업을 위해 실행 가능한 파일
  • .exe, .jar, .py 등 사용자가 실행시킬 수 있는 상태
  • 아직 메모리에 올라가지 않은 정적인 상태

2. 프로세스 (Process)

메모리에 적재되어 실행되고 있는 프로그램의 인스턴스

✅ 정의

  • 운영체제로부터 CPU 시간, 메모리 등 시스템 자원을 할당받은 실행 단위
  • 하나의 독립된 개체로서 **자신만의 주소 공간과 메모리 구조(Code/Data/Stack/Heap)**를 가짐

✅ 주요 특징

  • 프로세스는 독립된 주소 공간을 사용
  • 기본적으로 프로세스마다 1개 이상의 스레드 포함
  • 다른 프로세스와 자원 공유 ❌ (단, IPC(Inter-Process Communication) 이용 가능)
🧱 프로세스 메모리 구조
┌────────┐
│  Code  │ ← 실행 코드
│  Data  │ ← 정적 변수
│  Heap  │ ← 동적 할당 객체
│  Stack │ ← 함수 호출/지역변수 (스레드별)
└────────┘

 


3. 스레드 (Thread)

프로세스 내부에서 실행되는 흐름의 최소 단위

✅ 정의

  • 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있는 실행 흐름
  • 프로세스의 **자원(Code/Data/Heap)**을 공유하지만,
    스택(Stack)과 레지스터는 스레드별로 독립적

✅ 주요 특징

  • 스레드는 **경량 프로세스(Lightweight Process)**라고 불림
  • 같은 프로세스 내 스레드 간에는 메모리 공유 → 속도 빠름, 통신 쉬움
  • 메모리 공유로 인한 경합 조건(race condition) 발생 가능성 있음
 
📌 스레드는 같은 Heap 공유
⟶ 스택은 독립, 힙은 공유

 


4. 자바 스레드 (Java Thread)

✅ 자바 스레드 개요

  • JVM이 운영체제처럼 스레드를 관리
  • 자바는 프로세스 개념 없음, 오직 스레드만 있음
  • JVM 내부에서 스레드는 다음을 관리:
    • 총 스레드 수
    • 각 스레드의 메모리 주소
    • 스레드 상태 (NEW, RUNNABLE, BLOCKED 등)
    • 우선순위

✅ 자바 스레드의 실행 흐름 예시

public class MyThread extends Thread {
    public void run() {
        System.out.println("스레드 실행 중!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start(); // JVM에 실행 요청
    }
}

5. 스레드 사용 시 주의사항

⚠️ 동기화 문제(Synchronization)

  • 멀티 스레드 환경에서는 같은 자원에 동시 접근하면 충돌 가능
  • 이를 방지하기 위해 동기화(synchronized) 키워드 사용
  • 예시:
synchronized void increaseCounter() {
    counter++;
}
728x90
반응형
728x90
반응형

● 클린코드로 유명한 로버트 마틴의 좋은 객체 지항 설계의 5가지 원칙

 - SRP : 단일 책임 원칙(Single Reponsibility Principle)

 - OCP : 개방-폐쇄 원칙(Open/Closed Priciple)

 - LSP : 리스코프 치환 원칙(Liskvo subsititution Principle)

 - ISP : 인터페이스 분리 원칙(Interface Segregation Principle)

 - DIP : 의존관계 역전 원칙(Dependency Inversion Principle)

 

 ● SRP 단일 책임 원칙

 - 한 클래스는 하나의 책임만 져야 한다.

 -  하나의 책임이라는 것은 모호하다.(문맥과 상황에 따라 다르다.)

 -  중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 따라야한다.

  OCP 개방-폐쇄 원칙

 - 확장에는 열려 있어야 하나 변경에는 닫혀 있어야 한다.

 - 다형성을 활용하여 가능하다.

 - 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현해야 한다.

  LSP 리스코프 치환 원칙

 - 프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 변경 할수 있어야 한다.

 - 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야한다는 것, 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체를 믿고 사용하려면, 이 원칙이 필요하다.

(ex. 자동차의 엑셀은 앞으로 가는 기능이지만 뒤로가게 구현하면 LSP 위반이다.)

ISP 인터페이스 분리 원칙

- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

(ex. 자동차인터페이스 -> 운전 인터페이스, 정비 인터페이스)

(ex. 사용자 클라이언트 -> 운전자 인터페이스, 정비사 인터페이스)

- 인터페이스가 명확해 지고, 대체 가능성이 높아진다.

  DIP 의존관계 역전 원칙

 - 프로그래머는 "추상화에 의존 해야한다. 구체화에 의존하면 안된다." 의존성 주입은 이 원칙을 따르는 방법 중 하나이다.

 - 즉, 인터페이스에 의존 하라는 것이다.

 - 구현체에 의존하게 되면 변경이 힘들어진다.

 

정리

 - 객체 지향의 핵심은 다형성

 - 다형성 만으로는 쉽게 부품을 갈아 끼울듯 개발할 수가 없다.

 - 다형성 만으로 구현 객체를 변경 할 때 클라이언트 코드도 함께 변경된다.

- 다형성 만으로 OCP, DIP를 지킬 수 없다.

728x90
반응형
728x90
반응형

🧭 목차

  1. 자바(Java)란?
  2. 자바의 주요 특징
  3. 자바의 객체지향 4대 특성

1. 자바(Java)란?

자바(Java)는 1995년, **썬 마이크로시스템즈(Sun Microsystems)**의 **제임스 고슬링(James Gosling)**을 비롯한 연구진들이 개발한 객체 지향 프로그래밍 언어입니다.

원래는 가전제품의 내장 소프트웨어를 위해 개발되었지만,
지금은 웹 애플리케이션, 모바일 앱(Android), 데스크톱 앱
다양한 분야에서 가장 널리 사용되는 언어 중 하나입니다.


2. 자바의 특징

● 객체 지향 언어 (Object-Oriented)

  • 절차 지향과 달리 기능 단위를 **객체(Object)**로 구성
  • 객체 간 협력으로 프로그램 동작
  • 유지보수 및 재사용에 유리

● 인터프리터 + 컴파일 언어

  • .java → 컴파일 → .class(바이트 코드) → JVM에서 실행
  • 실행 시 인터프리트 방식으로 동작

● 플랫폼 독립성

  • 한번 작성하면 어떤 OS에서도 실행 가능
  • 이유: **JVM(Java Virtual Machine)**이 각 OS에 맞게 동작

● 자동 메모리 관리 (Garbage Collection)

  • 개발자가 직접 메모리 해제할 필요 없음
  • 불필요한 객체는 GC가 자동 정리

● 멀티 쓰레딩 지원

  • 여러 작업을 동시에 처리 가능
  • 운영체제마다 쓰레드 API가 달라도, 자바는 자바 API로 일관성 유지

● 동적 바인딩

  • 필요한 객체만 생성
  • 런타임에 동적으로 클래스 및 메소드 결정

3. 자바의 객체지향 4대 특성

🔒 캡슐화 (Encapsulation)

  • 관련 데이터와 메소드를 클래스로 묶음
  • 외부 접근 제한 (정보 은닉)
접근 제어자설명
public 외부/내부 모두 접근 가능
protected 상속받은 클래스에서 접근 가능
default 같은 패키지 내에서 접근 가능
private 클래스 내부에서만 접근 가능
 

👪 상속 (Inheritance)

  • 기존 클래스(부모)의 기능을 재사용
  • 자식 클래스는 extends 키워드로 상속
  • 모든 클래스는 Object 클래스 상속
  • 자바는 단일 상속만 허용
  • Is a: 상속 관계 (예: Student is a Person)
  • Has a: 포함 관계 (예: Car has a Tire)

📦 추상화 (Abstraction)

  • 공통된 속성과 기능만 추출
  • 복잡한 구현은 감추고, 필요한 인터페이스만 공개
  • 추상 클래스 또는 인터페이스로 구현

🔄 다형성 (Polymorphism)

  • 하나의 인터페이스로 다양한 구현
  • 대표적인 두 가지 형태:

▪ 오버라이딩 (Overriding)

  • 부모 메소드를 재정의
  • @Override 어노테이션 사용
  • 조건: 이름, 매개변수, 리턴타입 동일

▪ 오버로딩 (Overloading)

  • 같은 이름의 메소드를 여러 버전으로 정의
  • 조건: 매개변수의 수나 타입이 달라야 함

✅ 마무리

자바는 배우기 쉬우면서도, 실무에서 가장 강력한 도구 중 하나입니다.
웹 백엔드, 안드로이드 앱, 클라우드 서비스 등 어디서나 만나볼 수 있죠.
객체지향의 강력한 특성과 다양한 기능들 덕분에 오늘날도 여전히 인기 있는 언어입니다.

 

💡 다음 포스팅 예고


✅ JVM, JDK, JRE 차이 완전 정리

728x90
반응형
728x90
반응형

🧭 목차

  1. 객체지향 언어란?
  2. 클래스, 객체, 인스턴스의 차이
  3. 객체지향의 3대 특징
  4. 객체지향의 장단점
  5. 대표적인 객체지향 언어

1. 객체지향 언어란?

**객체지향 언어(Object-Oriented Language)**는
현실 세계의 **모든 객체(자동차, 사람, 문 등)**가
자신만의 속성과 기능을 가지고 상호작용한다는 개념을
프로그래밍에 적용한 언어입니다.

  • 객체 간의 관계와 역할에 중점을 둠
  • 각 객체는 고유한 속성과 기능을 가지고 있음
  • 이 객체들이 협력하며 동작하는 구조로 소프트웨어를 구성

2. 클래스(Class), 객체(Object), 인스턴스(Instance)

구분설명
객체 프로그램에서 구현하고자 하는 대상 (예: 자동차, 회원, 게시물 등)
클래스 객체의 속성과 기능을 정의한 설계도
인스턴스 클래스를 기반으로 실제 메모리에 생성된 객체 (현실 세계의 실체)
 
 
class Car {
    String color;
    void drive() {
        System.out.println("주행 중");
    }
}

Car myCar = new Car();  // ← 이게 바로 인스턴스!

3. 객체지향 언어의 3대 특징

🔒 캡슐화 (Encapsulation)

  • 객체의 내부 구조를 외부에 은닉
  • 필요한 정보만 외부에 public으로 노출
  • 자바에서는 private, protected, public 등 접근 제어자로 구현

➡ 예:

private int age;  
public void setAge(int a) { age = a; }

👪 상속 (Inheritance)

  • 자식 클래스가 부모 클래스의 속성과 기능을 물려받는 것
  • 코드의 재사용성 높이고, 유지보수 편리
class Animal { void eat() { } }
class Dog extends Animal { void bark() { } }
  • 부모 클래스 → 슈퍼 클래스(Super Class)
  • 자식 클래스 → 서브 클래스(Sub Class)

🔄 다형성 (Polymorphism)

  • 하나의 메소드나 객체가 다양한 방식으로 동작

▪ 오버라이딩 (Overriding)

  • 부모 메소드를 자식 클래스에서 재정의
  • 메소드명, 매개변수, 반환형 동일
@Override
public void run() {
    System.out.println("자식 클래스에서 실행");
}

▪ 오버로딩 (Overloading)

  • 같은 이름의 메소드지만 매개변수 다름
@Override
public void run() {
    System.out.println("자식 클래스에서 실행");
}

4. 객체지향 프로그래밍의 장점과 단점

✅ 장점

  • 재사용성: 상속으로 기존 코드 활용
  • 생산성 향상: 독립적인 객체 개발
  • 자연스러운 모델링: 현실 세계와 유사
  • 유지보수 우수: 캡슐화로 영향 최소화

❌ 단점

  • 설계 복잡: 개념 파악 및 초기 설계 시간 소요
  • 실행 속도 저하: 절차형 언어보다 느릴 수 있음
  • 코딩 난이도: 복잡한 구조로 인한 학습 장벽

5. 대표적인 객체지향 언어

언어특징
Java 가장 널리 쓰이는 객체지향 언어, 플랫폼 독립적
C++ C 언어의 확장, 다중 상속 지원
C# 닷넷(.NET) 기반 객체지향 언어
Python 인터프리터 기반, 동적 타이핑, 강력한 객체지향 지원
 

 

728x90
반응형
728x90
반응형

“ArrayList? Set? Hash 뭐시기? 그냥 배열에 때려 넣으면 안 돼요?”


1. Java Collections Framework(JCF)란?

JCF는 자바에서 데이터를 그룹으로 관리하기 위한 자료구조 라이브러리 집합입니다.
배열을 대체하고, 더 강력하게 데이터를 처리할 수 있게 해줍니다.


2. 컬렉션 상속 구조도

         ┌──────────┐
         │Collection│
         └────┬─────┘
      ┌────────┼────────┐
     List      Set     Queue
      │         │        │
┌─────┴─────┐  ┌┴┐     ┌─┴─┐
ArrayList  ... HashSet ...

※ Map은 Collection을 상속하진 않지만, 함께 묶어서 취급합니다.


3. 주요 인터페이스와 특징

✅ Set (중복 ❌, 순서 ❌)

구현체특징
HashSet 가장 빠른 접근 속도, 순서 없음
TreeSet 자동 정렬 가능 (오름차순/내림차순 설정 가능)
 

✅ List (중복 ⭕, 순서 ⭕)

구현체특징
ArrayList 인덱스 기반, 조회 성능 우수
LinkedList 삽입/삭제에 유리
Vector 동기화 지원. 구식이라 거의 안 씀
 

✅ Queue (선입선출 구조)

구현체특징
LinkedList 양방향 연결 구조
PriorityQueue 우선순위 기반 처리 가능
 

✅ Map (Key 중복 ❌, Value 중복 ⭕

구현체특징
HashMap 가장 자주 쓰이며, null 허용
TreeMap 자동 정렬
Hashtable 동기화 지원. null 금지, 구식
 

4. 언제 어떤 컬렉션을 써야 할까?

상황추천 컬렉션
중복 없이 저장 HashSet
인덱스 접근, 조회 위주 ArrayList
삽입/삭제 잦음 LinkedList
Key-Value 저장 HashMap
정렬된 데이터 필요 TreeSet, TreeMap
스레드 동기화 필요 Vector, Hashtable (하지만 잘 안 씀)
 

5. 한줄 요약

"Java 컬렉션은 목적에 맞게 잘 골라 써야 성능이 살아납니다!"

 

728x90
반응형
728x90
반응형

인프런 강의를 듣던 중 회원 도메인 설계를 하다가 동시성 이슈 때문에 HashMap보다는 ConcurrentHashMap을 사용한다라고 배웠습니다. 과연 두 개의 차이점은 어떤 점 있는지, 각 각의 장단점을 깊게 파보고 싶어서 정리해보았습니다.

출처:  https://javaconceptoftheday.com/hashmap-vs-concurrenthashmap-in-java/


 해외 문서를 찾아보다가 잘 정리되어 있는 문서를 발견하고 정리해보았습니다.


HashMap과 ConcurrentHashMap의 차이점


1) Thread Safe

주요 차이점은 ConcurrentHashMap는 내부적 동기화 때문에 스레드가 Safe합니다. 

HashMap는 내부적으로 동기화되지 않고 스레드로부터 안전하지 않습니다. HashMap 메서드를 사용하여 외부에서 동기화 할 수 있습니다.

 

2) Internal Structure(내부구조)

ConcurrentHashMap의 모든 작업이 동기화되는 것은 아닙니다. 추가 및 삭제와 같은 수정 작업만 동기화됩니다. 읽기 작업은 동기화되지 않습니다. 이렇게 하면 ConcurrentHashMap이 외부에서 동기화된 HashMap보다 동시 다중 스레드 응용 프로그램에 대한 첫 번째 선택 맵이 됩니다.

 

3) Null Keys And Null Values

HashMap은 최대 하나의 null 키와 임의의 수의 null 값을 허용합니다.ConcurrentHashMap은 null 키와 null 값도 허용하지 않습니다.

 

4) Fail-Fast Vs Fail-Safe

HashMap에 의해 반환된 반복자는 본질적으로 빠른 속도입니다. 반복자 생성 후 맵이 수정되면ConcurrentModificationException이 발생하기 때문입니다. ConcurrentHashMap에 의해 반환된 반복자는 본질적으로 안전합니다. iterator 생성 후 맵이 수정되면 예외가 발생하지 않습니다.

 

5) Performance(성능)

ConcurrentHashMap에 대한 수정 작업만 동기화됩니다. 따라서 ConcurrentHashMap에 대한 추가 또는 제거 작업은 HashMap보다 느립니다. ConcurrentHashMap 및 HashMap 모두에 대한 읽기 작업은 두 맵의 읽기 작업이 동일한 성능을 제공합니다.

결론적으로 ConcurrentHashMap는 내부적으로 동기화 함으로, 동시 멀티 쓰레드 어플리케이션에 적합합니다. HashMap은 내부적으로 동기화 되지않습니다. 따라서 단일 쓰레드 프로그램에 적합합니다.

 

https://applepick.tistory.com/124

 

[동시성 이슈해결] HashMap보다는 ConcurrentHashMap을 쓰자!

인프런 강의를 듣던 중 회원 도메인 설계를 하다가 동시성 이슈 때문에 HashMap보다는 ConcurrentHashMap을 사용한다라고 배웠습니다. 과연 두 개의 차이점은 어떤 점 있는지, 각 각의 장단점을 깊게 파

applepick.tistory.com

 

728x90
반응형

+ Recent posts