1. Thread 동기화
프로세스는 자원과 데이터, 스레드로 구성되어 있다. 따라서 프로세스는 스레드가 운영체제로부터 자원을 할당받아 소스 코드를 실행하여 데이터를 처리한다. 싱글 스레드 프로세스라면 공유 데이터에 단 하나의 스레드만이 접근하므로 문제 될 것이 없지만, 멀티 스레드 프로세스의 경우 두 개 이상의 스레드가 공유 데이터에 동시에 접근하게 되면 예상과 벗어난 결과가 나타날 수 있는데 이러한 문제를 해결해 주는 것이 바로 스레드 동기화이다.
💻 예제 코드
package pack06_Thread;
public class Ex41_Bank {
private int money = 10000; // 프로세스가 가진 자원(스레드 공유 자원)
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
// synchronized : 스레드의 동기화를 가능하게 함
// 공유자원에 lock이 걸림.
// 하나의 스레드가 공유자원을 사용하는 동안 다른 스레드는 사용 대기상태가 된다. (공유자원 충돌 방지)
public synchronized void saveMoney(int mon) { // 입금
int m = this.getMoney();
try {
Thread.sleep(2000); // 은행에서 입금시 약간의 지연 시간을 표현
} catch (Exception e) {
}
setMoney(m + mon);
}
public synchronized void minusMoney(int mon) { // 출금
int m = this.getMoney();
if(mon > m) {
System.out.println("잔고액 보다 출금액이 많아요");
// System.exit(0); // 응용 프로그램의 무조건 종료
return; // 메소드 무조건 탈출
}
try {
Thread.sleep(3000); // 은행에서 입금시 약간의 지연 시간을 표현
} catch (Exception e) {
// TODO: handle exception
}
setMoney(m - mon);
}
}
package pack06_Thread;
public class Ex41_Tom extends Thread {
// static은 메모리 할당 영역이 적으므로 많이 쓰지 말기
@Override
public void run() {
Ex41_BankMain.bank.saveMoney(5000); // 5천원 입금
System.out.println("남편 Tom 예금 후 잔고 : " + Ex41_BankMain.bank.getMoney());
}
}
package pack06_Thread;
public class Ex41_Wife extends Thread {
@Override
public void run() {
Ex41_BankMain.bank.minusMoney(2000); // 2천원 출금
System.out.println("부인 출금 후 잔고 : " + Ex41_BankMain.bank.getMoney());
}
}
package pack06_Thread;
public class Ex41_BankMain {
public static Ex41_Bank bank = new Ex41_Bank();
public static void main(String[] args) {
System.out.println("원금 : " + bank.getMoney());
Ex41_Tom tom = new Ex41_Tom(); // run() 메소드를 가지고 있는 '객체 생성'
Ex41_Wife wife = new Ex41_Wife();
tom.start();
wife.start();
}
}
💻 결과
원금 : 10000
남편 Tom 예금 후 잔고 : 15000
부인 출금 후 잔고 : 13000
스레드(Thread) - 동기화(Synchronization)
동기화(Synchronization) 여러 스레드가 한 리소스를 사용하려 할 때 사용하려는 스레드 하나를 제외한 나머지 스레드들은 리소스를 사용하지 못하도록 막는 것을 말한다. 💡 이것을 Thread-safe라고
beststar-1.tistory.com
- 출처 : beststar-1 tistory
[병렬프로그래밍] 멀티 스레드와 동기화
멀티 스레드와 동기화 스레드를 사용하게되면 필연적으로 만나게되는 문제가 바로 동기화(Synchronization)입니다. 아래는 여러개의 스레드가 실행되는 과정을 도식화한 그림입니다. 여러개의 스레
12bme.tistory.com
- 출처 : 12bme tistory
2. 동기화 도구
자바에서 Synchronized, wait(), notify(), notifyAll() 메소드는 멀티 스레드 프로그래밍에서 중요한 동기화 도구이다. 이들은 스레드 간의 상호작용을 안전하게 관리하고, 데이터의 일관성을 유지하며, 스레드 사이에서 작업의 순서를 조정하는 데 사용된다.
💡 Synchronized
Synchronized 키워드는 메소드나 블록을 동기화하는 데 사용된다. 스레드가 동기화된 메소드나 블록에 들어가려면 해당 객체의 락(Lock)을 획득해야 하며, 락을 가진 스레드만이 해당 코드를 실행할 수 있다.
이는 동시에 같은 객체의 동기화된 부분을 여러 스레드가 실행하는 것을 방지한다.
💻 동기화 메소드 예제
public synchronized void add(int value) {
this.count += value;
}
💻 동기화 블록 예제
public void add(int value) {
synchronized(this) {
this.count += value;
}
💡 wait(), notify(), notifyAll()
이 메소드들은 모두 자바 객체가 소유하고 있는 기본 메소드로, Object클래스에 정의되어 있다.
Synchronized 블록 내에서만 사용할 수 있으며, 객체의 락을 통한 스레드 간의 통신을 가능하게 한다.
- wait()
스레드를 대기 상태로 전환시키며, 해당 객체의 락을 해제한다.
다른 스레드가 notify()나 notifyAll()을 호출할 때까지 스레드는 대기 상태를 유지한다. - notify()
대기 중인 스레드 중 하나를 깨운다. 정확히 어떤 스레드가 깨어날지는 JVM에 의해 결정된다. - notifyAll()
대기 중인 모든 스레드를 깨운다.
이 메소드는 한 객체에 대해 대기 중인 모든 스레드에 신호를 보내며, 각 스레드는 락을 다시 획득하기 위해 경쟁한다.
💻 wait(), notify() 사용 예제 코드
public class WaitNotifyExample {
public synchronized void waitForProcessing() {
while (!isProcessingComplete()) {
try {
wait(); // 대기 상태로 전환
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public synchronized void doneProcessing() {
setProcessingComplete(true);
notify(); // 대기 중인 스레드 중 하나를 깨움
}
}
3. SQL
구조적 쿼리 언어(SQL) 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어이다.
관계 데이터베이스는 정보를 표 형식으로 저장하며, 행과 열은 다양한 데이터 속성과 데이터 값 간의 다양한 관계를 나타낸다. SQL문을 사용하여 데이터베이스에서 정보를 저장, 업데이트, 제거, 검색을 할 수 있다.
데이터베이스 성능을 유지 관리하고 최적화하는 데 SQL을 사용할 수도 있다.
SQL이란 무엇인가요? - 구조적 쿼리 언어(SQL) 설명 - AWS
구조적 쿼리 언어(SQL)는 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어입니다. 관계형 데이터베이스는 정보를 표 형식으로 저장하며, 행과 열은 다양한 데이터 속성과
aws.amazon.com
- 출처 : aws.amazon
4. DB (Database)
데이터베이스는 구조화된 데이터를 효율적으로 저장, 관리, 검색할 수 있도록 설계된 시스템이다. 데이터는 테이블 형식으로 조직되며, 각 테이블은 여러 열(속성)과 행(레코드)을 가진다. 데이터베이스는 정보를 중앙화하여 데이터 중복을 최소화하고, 데이터의 일관성, 무결성, 보안을 유지할 수 있도록 돕는다.
5. 데이터베이스 관리 시스템 (DBMS)
데이터베이스 관리 시스템(DBMS)은 데이터베이스와 사용자 또는 다른 애플리케이션 사이의 인터페이스 역할을 한다. DBMS는 데이터의 저장, 수정, 삭제, 검색 등을 관리하며, 데이터의 무결성 및 보안을 유지한다.
또한, 다수의 사용자가 데이터베이스에 동시에 접근할 때 발생할 수 있는 문제를 처리한다.
💡 DBMS의 종류
1️⃣ 관계형 데이터베이스 관리 시스템 (RDBMS)
데이터를 테이블로 구조화하고, 테이블 간의 관계를 통해 데이터를 조직한다.
SQL(Structured Query Language)을 사용하여 데이터를 관리한다.
(ex : Oracle, MySQL, Microsoft SQL Server, PostgreSQL 등.)
2️⃣ 비관계형 데이터베이스 관리 시스템 (NoSQL DBMS)
비정형 데이터를 저장하고 관리하는데 최적화된 시스템이다.
여러 형태로 존재: 문서(Document), 키-값(Key-Value), 그래프(Graph), 컬럼 기반(Column-based) 등.
(ex : MongoDB (문서), Redis (키-값), Cassandra (컬럼 기반), Neo4j (그래프).)
3️⃣ 객체 지향 데이터베이스 관리 시스템 (OODBMS)
객체 지향 모델을 사용하여 데이터를 저장하며, 객체들의 관계를 통해 데이터를 접근한다.
(ex : ObjectDB, db4o 등.)
4️⃣ 객체 관계형 데이터베이스 관리 시스템 (ORDBMS)
관계형 모델과 객체 지향 모델의 특성을 결합한 시스템이다.
데이터를 객체와 관계형 데이터 모두로 저장할 수 있다.
(ex : PostgreSQL (객체 관계형 기능을 지원).)
💡 DBMS의 분류
- 구조에 따른 분류
관계형, 비관계형, 객체 지향, 객체 관계형 등으로 분류한다. - 사용되는 기술에 따른 분류
SQL DBMS와 NoSQL DBMS으로 나누어진다.
SQL DBMS는 주로 관계형 데이터베이스에서 사용되며, NoSQL DBMS는 비관계형 데이터베이스에서 주로 사용된다.
DBMS 종류 | 설명 | 예시 |
관계형 데이터베이스(RDBMS) | 데이터를 테이블로 구조화하며, 테이블 간의 관계를 통해 데이터를 조직한다. SQL을 사용하여 관리한다. |
Oracle, MySQL, PostgreSql, Microsoft SQL Server |
비관계형 데이터베이스(NoSQL) | 비정형 데이터 저장에 최적화된 시스템으로서, 문서, 키-값, 그래프, 컬럼 기반 등의 형태를 가진다. |
MongoDB, Redis, Neo4j, Cassandra |
객체 지향 데이터베이스(OODBMS) | 객체 지향 모델을 사용하여 데이터를 저장하며, 객체의 관계를 통해 데이터를 접근한다. | ObjectDB, db4o |
객체 관계형 데이터베이스(ORDBMS) | 관계형 모델과 객체 지향 모델의 특성을 결합한 시스템으로, 데이터를 객체와 관계형 데이터 모두 저장할 수 있다. | PostgreSQL (객체 관계형 기능 지원) |
6. 정규화 (Normalization)
정규화는 데이터베이스 설계의 과정에서 중복을 최소화하고, 데이터의 무결성과 일관성을 유지하기 위해 데이터를 구조화하는 프로세스이다. 데이터베이스의 정규화는 일반적으로 여러 단계의 정규 형태(Normal Forms)로 구분된다. 목표는 불필요한 데이터 중복을 제거하고, 데이터베이스를 효율적으로 설계하여 삽입, 삭제, 갱신 이상(Anomaly)을 방지하는 것이다.
💡 정규화의 주요 단계
- 제1정규형 (1NF)
모든 열은 원자적 값만을 포함해야 하며, 각 행은 유일한 식별자(기본 키)를 가져야 한다. - 제2정규형 (2NF)
1NF를 만족하며, 모든 비키 속성이 기본 키에 완전 함수적으로 종속되어야 한다. - 제3정규형 (3NF)
2NF를 만족하며, 어떤 비키 속성도 기본 키가 아닌 다른 속성에 대해 이행적으로 종속되지 않아야 한다. - BCNF (Boyce-Codd Normal Form)
3NF를 만족하며, 모든 결정자가 후보 키여야 한다. - 제4정규형 (4NF), 제5정규형 (5NF) 등
더 복잡한 종속성과 중복 제거를 위해 추가적으로 정의된 정규형이다.
[DataBase] 정규화(1NF, 2NF, 3NF, BCNF)
정규화(Normalization) 정규화란 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다. 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 된다. 이를 구분하
superohinsung.tistory.com
- 출처 : superohinsung tistory
7. 엔티티와 테이블
데이터베이스 설계 시 자주 혼용되는 엔티티와 테이블은 서로 밀접한 관련이 있지만 몇 가지 주요 차이점이 있다.
💡 엔티티 (Entity)
- 개념적 모델
엔티티는 데이터베이스 설계의 개념적 또는 논리적 단계에서 사용되는 용어로,
현실 세계의 객체나 사건을 추상화한 것이다. - 특성
각 엔티티는 속성(Attributes)을 가지고 있으며, 이 속성들은 엔티티의 특징을 나타낸다. - 식별자
엔티티는 고유 식별자(Primary Key)를 통해 구별된다. - 용도
데이터베이스 설계의 초기 단계에서 엔티티-관계(ER) 모델을 사용하여 엔티티 간의 관계를 정의한다.
💡 테이블 (Table)
- 물리적 모델
테이블은 데이터베이스에서 데이터를 저장하는 물리적 구조로, 엔티티의 구현체이다. - 구조
테이블은 행(Rows)과 열(Columns)로 구성된다.
각 행은 엔티티의 인스턴스를 나타내며, 열은 엔티티의 속성을 나타낸다. - 데이터 저장
실제 데이터는 테이블에 저장되며, SQL 쿼리를 통해 접근하고 조작한다.
엔티티는 데이터베이스의 설계의 개념적 또는 논리적 표현이며, 테이블은 이러한 엔티티를 실제로 저장하는 물리적 구조이다. 설계 과정에서 엔티티를 정의하고 이를 테이블로 구현하는 방식으로 데이터베이스가 만들어진다.
We.TIL 36 : 엔티티와 테이블의 차이
엔티티는 데이터베이스나 SQL상에 존재하지 않는다. 테이블과 달리 엔티티는 실제로 존재하지 않는 아닌 일종의 개념이다.그러나 테이블은 데이터베이스나 SQL에 실제로 존재하며 물리적인 구조
velog.io
- 출처 : 코린이 기욱쓰
'에이콘아카데미 회고 > 5회차) 자바기반 풀스택 개발자 양성과정' 카테고리의 다른 글
SQL) 17번째 회고 (0) | 2024.04.23 |
---|---|
SQL) 16번째 회고 (1) | 2024.04.22 |
JAVA) 14번째 회고 (0) | 2024.04.19 |
JAVA) 13번째 회고 (0) | 2024.04.17 |
JAVA) 12번째 회고 (0) | 2024.04.16 |