객체지향 설계(Object-Oriented Design, OOD)
키오스크 프로그래밍
https://velog.io/@alsem17/%ED%82%A4%EC%98%A4%EC%8A%A4%ED%81%AC-%EA%B3%BC%EC%A0%9C-Lv14
객체지향 설계는 객체(Object)와 클래스(Class)를 기반으로 소프트웨어를 설계하는 방법론이다.
소프트웨어를 여러 개의 독립적인 객체로 나누고, 객체 간 관계를 정의하여 유지보수성과 확장성을 높이는 게 목표이다.
- 캡슐화(Encapsulation)
- 데이터(속성)와 기능(메서드)을 하나의 객체 안에 묶는 것
- 객체 내부의 데이터를 외부에서 직접 접근하지 못하도록 보호(private, protected 사용)
- getter/setter 메서드를 통해 데이터에 접근
class Car {
private String model;
public Car(String model){
this.model = model;
}
public String getModel() { // 데이터 보호(Getter 사용)
return model;
}
}
장점: 데이터 보호, 코드 변경 최소화
- 상속(Inheritance)
- 기존 클래스를 확장하여 코드를 재사용하는 개념
- 부모 클래스(슈퍼 클래스)의 속성과 메서드를 자식 클래스(서브 클래스)가 상속받음
class Animal {
void makeSound(){
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
void bark() {
System.out.println("멍멍!");
}
}
장점: 코드 재사용, 유지보수 용이
- 다형성(Polymorphism)
- 같은 메서드를 여러 클래스에서 다르게 구현 가능
- 메서드 오버라이딩(Method Overriding) → 부모 클래스의 메서드를 자식 클래스에서 재정의
- 메서드 오버로딩(Method Overloading) → 같은 이름의 메서드를 다른 매개변수로 여러 개 정의 가능
- 추상화(Abstraction)
- 불필요한 정보를 숨기고 핵심 기능만 노출하는 것
- 추상 클래스(Abstract Class)와 인터페이스(Interface)를 활용하여 구현
interface Animal {
void makeSound(); // 메서드만 정의(구현 x)
}
class Dog implements Animal {
public void makeSound() {
System.out.println("멍멍!");
}
}
장점: 코드의 의존성을 낮추고, 유지보수 용이
ELK 서버 구성하여 AWS와 연동
ELK 서버는 Elasticsearch, Logstash, Kibana의 약자로 로그 및 데이터 분석을 위한 오픈 소스 스택을 의미한다.
이 3가지 도구를 조합해 로그 수집, 저장, 검색, 시각화를 수행할 수 있다.
- ELK 스택 구성 요소
ELK는 크게 3가지 주요 컴포넌트로 구성된다.
구성요소 | 설명 |
---|---|
Elasticsearch | 검색 및 데이터 저장(빠른 검색 & 분석) |
Logstash | 로그 수집 및 처리(데이터 변환 및 전처리) |
Kibana | 데이터 시각화(대시보드 및 그래프) |
- ELK 스택 동작 과정
ELK 서버의 기본 동작 과정은 다음과 같다.- Logstash
- 로그 파일, 데이터베이스, 애플리케이션 로그 수집
- 필터링, 파싱(Parsing), 변환 후 Elasticsearch로 전달
- (예: 웹서버 로그, 시스템 로그 등)
- Elasticsearch
- Logstash에서 전달받은 데이터를 색인(Indexing) 및 저장
- REST API로 검색 및 조회 가능
- Kibana
- Elasticsearch의 데이터를 대시보드 형태로 시각화
- 검색 및 분석 가능
Spring JPA 영속성 컨텍스트(Persistence Context)
JPA 엔티티의 생명주기(Lifecycle)
JPA 엔티티는 4가지 상태를 갖는다.
- New(비영속 상태)
- JPA가 관리하지 않는 상태
- new 키워드로 엔티티 객체를 생성했지만 아직 DB와 연결되지 않은 상태
- persist()를 호출하면 Managed(영속 상태)로 변환됨
Member member = new Member(); // 비영속 상태 (New)
member.setName("홍길동");
- Managed(영속 상태)
- JPA가 관리하는 상태
- persist()를 호출하면 영속성 컨텍스트에 저장되고, 이후 자동으로 DB와 동기화 가능
- find()나 JPQL을 사용하면 DB에서 조회한 객체도 Managed 상태
상태 변화 - persist() -> New -> Managed(DB엔 아직 반영되지 않을 수도 있음)
- find(), JPQL -> DB에서 조회하면 자동으로 Managed 상태
- 변경 감지(Dirty Checking): Managed 상태의 객체는 값이 변경되면 자동으로 DB에 반영됨
em.persist(member); // Managed 상태
member.setName("김철수"); // 값 변경 → 트랜잭션 커밋시 자동 반영(Dirty Checking)
- Removed(삭제 상태)
- remove()를 호출하면 Removed 상태가 됨
- 트랜잭션이 커밋될 때 실제로 DB에서 삭제됨
em.remove(member); // Removed 상태
아직 flush() 또는 commit()을 실행하지 않았다면 DB엔 반영되지 않음
- Detached(준영속 상태)
- JPA의 관리에서 벗어난 상태
- 영속성 컨텍스트에서 분리된 상태이므로 변경해도 DB에 반영되지 않음
- detach(), clear(), close() 등을 호출하면 Detached 상태가 됨
- merge()를 호출하면 다시 Managed 상태로 복귀 가능
em.detach(member); // Detached 상태 → 변경 감지 안 됨
member.setName("이순신"); // 변경해도 DB 반영되지 않음
정리하면
New → persist() → Managed
Managed → remove() → Removed
Managed → detach()/clear()/close() → Detached
Detached → merge() → Managed
Spring JPA에서 트랜잭션 관리시, 대부분의 객체는 자동으로 Managed 상태에서 관리됨
변경 감지(Dirty Checking)로 Managed 상태에선 값을 변경하면 자동으로 반영됨
Detached 상태에선 변경해도 DB에 반영되지 않음(merge 필요)
'프로그래밍' 카테고리의 다른 글
개인용 컴퓨터의 종류와 운영체제 (0) | 2025.03.23 |
---|---|
정보사회와 컴퓨터 (0) | 2025.03.20 |
네트워크, 라우팅 주요 용어 (0) | 2025.03.19 |
라우팅 프로토콜 정리: IGP, EGP, 그리고 사설 IP 주소의 이해 (0) | 2025.03.19 |
비둘기로 패킷을 보낸다고? 만우절 RFC가 알려주는 인터넷의 유머 (0) | 2025.03.19 |