🐯[TIL] 250710-029

byoΒ·2025λ…„ 7μ›” 10일

πŸ’« CS

🧠 λ©€ν‹°μ½”μ–΄ & λ©€ν‹°μŠ€λ ˆλ”©

βœ… 1. λ©€ν‹°μ½”μ–΄λž€?

μ—¬λŸ¬ 개의 CPU μ½”μ–΄λ₯Ό ν•˜λ‚˜μ˜ 칩에 λ‚΄μž₯ν•œ ꡬ쑰.
각 μ½”μ–΄κ°€ λ…λ¦½μ μœΌλ‘œ λ™μž‘ β†’ 병렬 처리 κ°€λŠ₯.

πŸ‘μž₯점:

  • μ„±λŠ₯ ν–₯상
  • μ „λ ₯ 효율

β—μ£Όμ˜ν•  점:

  • 경쟁 쑰건: λ™μ‹œμ— ν•˜λ‚˜μ˜ 데이터λ₯Ό λ³€κ²½ν•  λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜
  • μΊμ‹œ 일관성: μ½”μ–΄ κ°„ 데이터 동기화 ν•„μˆ˜

βœ… 2. λ©€ν‹°μŠ€λ ˆλ”©μ΄λž€?

ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ—¬λŸ¬ μ‹€ν–‰ 흐름(Thread)을 λ§Œλ“€μ–΄ λ™μ‹œμ„±/병렬성 κ΅¬ν˜„

  • λ™μ‹œμ„±: ν•œ μ½”μ–΄κ°€ μ—¬λŸ¬ μž‘μ—…μ„ λ²ˆκ°ˆμ•„ μ‹€ν–‰
  • 병렬성: μ—¬λŸ¬ μ½”μ–΄κ°€ λ™μ‹œμ— μž‘μ—… μ‹€ν–‰

🧩 λΉ„μœ 

  • λ™μ‹œμ„±: ν•œ λͺ…이 μ—¬λŸ¬ 일을 λΉ λ₯΄κ²Œ λ²ˆκ°ˆμ•„ 처리
  • 병렬성: μ—¬λŸ¬ λͺ…이 각각 일을 λ™μ‹œμ— 처리

βœ… 3. Java λ©€ν‹°μŠ€λ ˆλ”© μ‹€μŠ΅ 핡심

ExecutorService pool = Executors.newFixedThreadPool(μ½”μ–΄ 수);
pool.submit(() -> μž‘μ—… μˆ˜ν–‰);
pool.shutdown();
λ©”μ„œλ“œμ„€λͺ…
availableProcessors()μ½”μ–΄ 수 확인
Executors.newFixedThreadPool()μŠ€λ ˆλ“œ ν’€ 생성
.submit()μž‘μ—… 등둝
.shutdown()μž‘μ—… μ™„λ£Œ ν›„ μ’…λ£Œ

βœ… 4. μŠ€λ ˆλ“œ μ•ˆμ „(Thread Safety)

μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μžμ›μ— μ ‘κ·Όν•  λ•Œ 였λ₯˜ 없이 μ•ˆμ „ν•˜κ²Œ λ™μž‘ν•˜λ„λ‘ 보μž₯ν•˜λŠ” 기법.

κΈ°λ²•μ—­ν• νŠΉμ§•
synchronizedν•œ λ²ˆμ— ν•œ μŠ€λ ˆλ“œλ§Œ μ ‘κ·Ό ν—ˆμš©λŠλ¦¬μ§€λ§Œ μ•ˆμ „
volatileλ³€μˆ˜ λ³€κ²½ μ¦‰μ‹œ λͺ¨λ“  μŠ€λ ˆλ“œμ— λ°˜μ˜κ°€μ‹œμ„± 보μž₯, μ›μžμ„±μ€ X
λ™μ‹œμ„± μ»¬λ ‰μ…˜λ³‘λ ¬ ν™˜κ²½μ—μ„œλ„ μ•ˆμ „ν•˜κ²Œ λ™μž‘ConcurrentHashMap λ“±

βœ… μš”μ•½

λ©€ν‹°μ½”μ–΄λŠ” 병렬성, λ©€ν‹°μŠ€λ ˆλ”©μ€ λ™μ‹œμ„±μ„ κ°€λŠ₯ν•˜κ²Œ ν•˜κ³ , Javaμ—μ„œλŠ” μŠ€λ ˆλ“œ ν’€κ³Ό 동기화 κΈ°λ²•μœΌλ‘œ 이λ₯Ό μ•ˆμ •μ μœΌλ‘œ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ“ Book Management

μ˜μ‘΄μ„±μ„ΈνŒ…

🧠 model.Author

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Author {
    private Integer id;
    private String name;
}

πŸ—„οΈ repository.AuthorRepository

@Repository
public class AuthorRepository {
    private final Map<Integer, Author> store = new LinkedHashMap<>();
    private final AtomicInteger seq = new AtomicInteger(0);

    public Author save(Author author) {
        if (author.getId() == null) {
            author.setId(seq.incrementAndGet());
        }
        store.put(author.getId(), author);

        return author;
    }
}

🧩 service.AuthorService

@Service
@RequiredArgsConstructor
public class AuthorService {
    private final AuthorRepository authorRepository;

    public Author create(Author author) {
        return authorRepository.save(author);
    }
}

🚚 dto.AuthorDto

@Getter
@Setter
public class AuthorDto {
    private Integer id;

    @NotBlank(message = "이름을 μž…λ ₯ν•˜μ„Έμš”")
    private String name;
}

πŸ“‘ controller.AuthorController

@RestController
@RequestMapping("/api/authors")
@RequiredArgsConstructor
public class AuthorController {
    private final AuthorService authorService;

    @PostMapping
    public Author create(
            @Valid @RequestBody AuthorDto authorDto
    ) {
        Author author = Author.builder()
                .name(authorDto.getName())
                .build();
        return authorService.create(author);
    }
}

πŸš€ POSTMAN

Postman은 API 개발 및 ν…ŒμŠ€νŠΈλ₯Ό μ‰½κ²Œ ν•΄μ£ΌλŠ” GUI 기반 도ꡬ닀.
ν”„λ‘ νŠΈμ—”λ“œ, λ°±μ—”λ“œ 개발자 λͺ¨λ‘ RESTful APIλ₯Ό μš”μ²­ν•˜κ³  응닡을 ν™•μΈν•˜κΈ° μœ„ν•΄ 많이 μ‚¬μš©ν•œλ‹€.

postman μ„€μΉ˜

postmanμ—μ„œ 확인


πŸš€ AWS μ„œλ²„ ν•˜λ‚˜μ— DB/Spring ν™˜κ²½ μ„€μ •ν•˜κΈ°

βœ… ec2 μΈμŠ€ν„΄μŠ€ μ„€μ •

  • OS : Amazon linux 2023 ami
  • key-pair : bes-seoul
  • inbound setting : port {5432 for postgresql, 8080 for spring}

βœ… μ„€μΉ˜λ“€ (db git jdk)

🐘 postgres

πŸš€ Amazon Linux 2023 AMI 버전

# 1. μ‹œμŠ€ν…œ νŒ¨ν‚€μ§€ μ΅œμ‹ ν™”
# 2. PostgreSQL 15 μ„€μΉ˜ (ν΄λΌμ΄μ–ΈνŠΈ + μ„œλ²„)
# 3. λ°μ΄ν„°λ² μ΄μŠ€ μ΄ˆκΈ°ν™”

sudo dnf update -y
sudo dnf install -y postgresql15 postgresql15-server
sudo postgresql-setup --initdb

# 4. μ„œλΉ„μŠ€ ν™œμ„±ν™” 및 μ‹œμž‘
# 5. μ„€μΉ˜ 확인

sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl status postgresql

🧬 git

sudo dnf install git -y

git --version

β˜• jdk

sudo dnf install java-17-amazon-corretto -y

java --version


βœ… ν™˜κ²½μ„€μ •

🐘 postgresql

sudo -u postgres psql

postgres에 password μ„€μ •

ALTER USER postgres WITH PASSWORD '<SUPERUSER_PASSWORD>';
\q

πŸ” λΉ„λ°€λ²ˆν˜Έ μž…λ ₯방식 = md5둜 λͺ¨λ‘ λ³€κ²½

sudo nano /var/lib/pgsql/data/pg_hba.conf
<# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             0.0.0.0/0               md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     md5
host    replication     all             0.0.0.0/0               md5
host    replication     all             ::1/128                 md5

(μ €μž₯ : ctrl x y enter)


πŸ” μ™ΈλΆ€ ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° ν—ˆμš© μ„€μ •

sudo -u postgres psql -c "SHOW config_file";
# 경둜 확인 ν›„ νŽΈμ§‘
sudo nano /var/lib/pgsql/data/postgresql.conf
# listen_addresses = 'localhost' β†’ listen_addresses = '*'

ctrl w 둜 localhostλ₯Ό 검색

Connection Settings 
- listen_addresses = '*'                  # what IP address(es) to listen on;

(μ €μž₯ : ctrl x y enter)


✏️ ν…Œμ΄λΈ” μž‘μ„±

# λ³€κ²½ 적용 μ‹œ μž¬μ‹œμž‘ 
sudo systemctl restart postgresql
# λ˜λŠ” μ„€μ •λ§Œ μž¬λ‘œλ“œ κ°€λŠ₯
sudo systemctl reload postgresql
psql -U postgres -W
Password:
psql (14.18)
Type "help" for help.
CREATE USER projectname WITH PASSWORD 'password';
CREATE DATABASE projectname OWNER projectname;
CREATE TABLE ...

🌱 Spring

intellijμ—μ„œ git push 전에 jdbcν™˜κ²½λ³€μˆ˜/toolchain/jdk버전 μ„€μ •

βš™οΈ resources.application.yml

spring:
  application:
    name: to_do_list_with_dto
  datasource:
    url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}

βš™οΈ rootfolder.settings.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

rootProject.name = 'to_do_list_with_dto'
cat settings.gradle

βš™οΈ rootfolder.system.properties

java.runtime.version=17

μ„€μ •ν•œ λ’€ git push

🧬 git

aws linux μ—μ„œ..

git clone your_github_repository_address

βœ… ν™˜κ²½λ³€μˆ˜ μ„€μ •

βš™οΈ aws amazon os environment variable

sudo nano ~/.bashrc

.bashrc 파일 맨 μ•„λž˜μ—

β˜‘οΈ JDK ν™˜κ²½λ³€μˆ˜ μ„€μ • (ν™˜κ²½λ³€μˆ˜ νŽΈμ§‘μ—μ„œ java_home, path μΆ”κ°€ 같은 κΈ°λŠ₯)

export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto
export PATH=$JAVA_HOME/bin:$PATH

β˜‘οΈ μ‚¬μš©μž ν™˜κ²½λ³€μˆ˜ μ„€μ • (μΈν…”λ¦¬μ œμ΄ edit configuration μ„€μ • μ—­ν• )

export APP_NAME=project_name
export DB_HOST=localhost 
export DB_PORT=5432
export DB_NAME=project_name
export DB_USERNAME=project_name
export DB_PASSWORD=password

localhost뢀뢄은 db μ„œλ²„κ°€ λ‹€λ₯΄λ©΄ κ·Έ μ„œλ²„λ‘œ λ‹€λ₯΄κ²Œ μ„€μ •ν•΄μ€˜μ•Όν•œλ‹€.

적용

source ~/.bashrc

βœ… λΉŒλ“œ 및 배포

chmod +x gradlew
rm -rf ~/.gradle
./gradlew clean build
./gradlew clean build -x test
ls build/libs/

dashboard-0.0.1-SNAPSHOT.jar dashboard-0.0.1-SNAPSHOT-plain.jar

nohup java -jar build/libs/filename-0.0.1-SNAPSHOT.jar > log.txt 2>&1 &
tail -f log.txt

끄렀면

kill pid

βœ… μ„œλ²„ μžλ™ μ’…λ£Œ μ„€μ •

sudo yum install cronie -y
crontab -e
-----crontab-----
i
* * * * * /sbin/shutdown -h now
:wq
-----------------
sudo systemctl start crond
sudo systemctl enable crond

⏱️ 크둠탭 ν˜•μ‹

λΆ„   μ‹œ   일   μ›”   μš”μΌ    <μ‹€ν–‰ν•  λͺ…λ Ή>
*    *    *    *    *      /sbin/shutdown -h now
ν•„λ“œ μœ„μΉ˜μ˜λ―Έμ˜ˆμ‹œ κ°’μ„€λͺ…
1λΆ„(minute)0–59λ§€ μ‹œκ°μ˜ λͺ‡ 뢄에 μ‹€ν–‰ν• μ§€
2μ‹œ(hour)0–23ν•˜λ£¨ 쀑 λͺ‡ μ‹œμ— μ‹€ν–‰ν• μ§€ (0 = μžμ •)
3일(day of month)1–31맀달 며칠에 μ‹€ν–‰ν• μ§€
4μ›”(month)1–12λͺ‡ 월에 μ‹€ν–‰ν• μ§€
5μš”μΌ(day of week)0–70 λ˜λŠ” 7 = μΌμš”μΌ, 1 = μ›”μš”μΌ ... 6 = ν† μš”μΌ
profile
πŸ—‚οΈ hamstern

0개의 λŒ“κΈ€