diff --git a/1.html b/1.html index 4507da405..f48e226b6 100644 --- a/1.html +++ b/1.html @@ -13,18 +13,18 @@ - - + +
-
본문으로 건너뛰기

[책] 글, 우리도 잘 쓸 수 있습니다.

· 약 5분

책 정보

글, 우리도 잘 쓸 수 있습니다.
+

[책] 글, 우리도 잘 쓸 수 있습니다.

· 약 5분

책 정보

글, 우리도 잘 쓸 수 있습니다.
박솔미

읽고 나서

저자의 경험과 함께 글쓰기에 대한 가벼운 조언이 담겨있어 가볍게 읽기 좋았다.
글을 잘 작성해 보고 싶을 때 적용해 볼 수 있는 정보가 많아서 도움이 되었다.

우아한 테크코스의 프리코스를 진행할 때 후기를 작성하고 나면 항상 글이 딱딱하다는 느낌을 받았다.
다른 지원자들의 읽기 편하고, 밝은 느낌을 주는 글을 보면 부러운 마음을 가지기도 했다.
이 책을 읽었으니 2023년에는 조금 더 글을 잘 적어보려고 한다.

밑줄 친 문장들

문장이 심심하고 지루하다면 내용을 일목요연하게 정리했고, 글의 의도도 삐뚤지 않고, 단어도 적절한 것으로 골랐는데… 그런데도 어딘가가 심심하고 지루하다면? 축축 처지고 따분하다면? 말꼬리를 모조리 ‘~다’로 통일한 건 아닌지 점검해 보세요.

말꼬리를 잘 갖고 놀아야 합니다. 문장의 마지막 글자를 매번 다르게 고쳐쓰는 것만으로도 글에 활기를 더할 수 있죠. 때론 문장을 다 마치지 않고, 단어로만 끝맺는 것도 방법. 문장과 문장 사이에 쉼표가 들어서며 글 전체에 활기가 돌게 돼요. 문장의 길이도 다채로워지는 덕분에 덤으로 얻게 되는 것도 있습니다. 바로, 글의 리듬.

이전 문장에서 끝난 글자로, 다음 문장을 끝맺지 않기. 한두 문단마다 단어 수준의 아주 짧은 문장 배치하기.

글의 진짜 이유, 글의 진짜 목적, 글의 진짜 대상을 찾으려고 애썼습니다. 지금처럼 틀을 떠올린다거나, 눈치를 본다거나, 정치적인 셈도 하지 않았어요.

제목은 짧게, 보기 쉽게, 읽기 쉽게, 발음이 비슷하게, 순서를 바꿔서

글을 마지막으로 다듬을 때, 노래에 가까워질 방법은 없을지 고민해봅니다. 감히 가 닿을 수 없는 목표이겠지만, 할 수 있는 최소한의 리듬이라도 붙여주고 싶어요.

여는 말과 마지막 말에 작정하고 마음을 담는 연습을 해봅시다. 글의 어느 구석이라도 뻔한 글자는 남기지 않겠노라 다짐하며 써보는 겁니다. 나만이 가진 유일한 메시지에 집중하면서요. 그럼 생각이 달라지고, 고르는 단어도 달라지고, 남긴 문장도 달라져요. 결국에는 글을 쓴 사람인 나 자신도 남달라질 겁니다.

맞춤법은 중요합니다. 하지만 맞춤법보다 더 중요한 건 거기에 담긴 마음입니다. 내 마음을 글에 담아 실어 보내기 전, 맞춤법을 점검하는 이유 역시 그겁니다. 오직 내 마음이 남에게 읽히는 동안 방해가 되지 않기를 바라기 때문이죠. 내가 쓴 글도, 남이 쓴 글도. 언제나 그 안에 담긴 마음이 먼저입니다.

글을 쓴다고 글이 완성되는 게 아니에요. 글과 닮은 모습으로 살 때, 글은 비로소 완성됩니다.

- - + + \ No newline at end of file diff --git a/10.html b/10.html index b5696d116..d38fd1036 100644 --- a/10.html +++ b/10.html @@ -13,12 +13,12 @@ - - + +
-

블랙잭 미션 회고

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
+

블랙잭 미션 회고

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
이번에는 실수하지 않고, 바로 미션을 진행하지 않고 친해지기 부터 시작했다.

블랙잭은 구현해야 될 내용이 많아 시간이 많이 부족할 것 같았지만
후추와 함께 전략적(삼일절에 미션 이야기 나누기)으로 미션을 진행해 시간 내에 제출할 수 있었다.

미션을 끝나고 회고를 했을 때 후추가 고민거리를 하나 내줬다.
"페어를 진행할 때 압박감을 느끼는 페어가 있다면 허브가 해줄 수 있는게 뭐가 있을까?"

곰곰히 생각해봤지만 쉽게 답을 내릴 수 없었다.
@@ -48,7 +48,7 @@ 회고때도 서로 솔직하게 의견을 주고 받아서 좋았다.

도메인 언어에 신경쓰는 부분
클래스명, 변수명과 같은 언어를 세심하게 신경쓴다.
요구사항 정리도 깔끔하게 잘하는 것 같다.

후추 최고 👍

- - + + \ No newline at end of file diff --git a/11.html b/11.html index 143d07206..8c7e66e12 100644 --- a/11.html +++ b/11.html @@ -13,15 +13,15 @@ - - + +
-

일반적인 책임 할당을 위한 패턴

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) +

일반적인 책임 할당을 위한 패턴

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) 객체 사이의 의존성이 과한 경우 결합도가 높다고 말한다.

  • 오브젝트 p.17

결합도를 낮춘다면 다음과 같은 이점이 있다.

  • 다른 구성 요소의 변화에 영향을 받지 않는다.
  • 재사용이 편리해진다.
  • 해당 클래스에 대한 이해가 쉬워진다. (의존하는 클래스가 적기 때문에)

높은 응집도 패턴(High Cohesion)

Q. 객체를 관리하기 쉽게 하려면 어떻게 해야 할까?

A. 높은 응집도를 유지할 수 있게 책임을 할당해야 한다.

응집도(Cohesion) 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도가 높다고 말한다.

  • 오브젝트 p.26

변경의 이유에 따라 클래스를 분리한다면 응집도를 높일 수 있고, 응집도가 높아진다면 다음과 같은 이점이 있다.

  • 해당 클래스에 대한 이해가 쉬워진다. (할당된 책임만을 수행하고 있기 때문에)
  • 유지보수가 쉬워진다.
  • 낮은 결합도 또한 지원한다.
  • 응집도가 높은 클래스는 특정한 목적에 사용할 수 있기 때문에 재사용하기 좋다.

컨트롤러 패턴(Controller)

Q. 사용자의 요청을 처리하는 것은 누가 담당해야 하는가?

A. 사용자의 요청을 처리하는 Controller 객체를 만들어서 사용해야 한다.

어떤 서브시스템이 존재한다고 가정할 때

  • 직접적으로 객체에 접근하여 프로그램을 사용한다면 결합도가 상승한다.
  • 서브 시스템에 들어오는 요청을 처리해주는 컨트롤러가 있다면 사용하는 입장에서는 해당 컨트롤러만 알면 된다.
  • 만약 서브 시스템의 변경이 생겼을 때 외부에 미치는 영향도 줄어든다.

다형성 패턴(Polymorphism)

Q. 객체의 타입에 따라 행동이 바뀐다면 책임을 어떻게 할당해야 할까?

A. OOP가 지원하는 다형성을 적극적으로 활용한다. (인터페이스를 두고 행동에 대한 부분을 구현)

객체의 종류에 따라 분기하는 조건문이 아닌 다형성을 사용하는 것이 좋은 방법이다.

새로운 타입이 추가되었을 때 조건문을 사용한다면 기존의 조건문을 수정해야 하지만 다형성을 활용하면 쉽게 확장할 수 있다.

변경 보호 패턴(Protected Variations)

Q. 어떻게 하면 변경이 다른 요소에 영향을 미치지 않도록 방지할 수 있을까?

A. 변화가 예상되는 지점을 식별하고, 주위에 안정된 인터페이스를 형성하도록 책임을 할당해야 한다.

간접 참조 패턴(Indirection)

Q. 두 객체 사이의 직접적인 연결을 피하고 싶다면 어떻게 해야 할까?

A. 두 객체 사이에 또 다른 객체를 두어 직접적인 연결을 피할 수 있다.

중재자 패턴을 사용하여 두 객체 사이에 또 하나의 객체를 추가하여 복잡한 관계를 단순화할 수 있다.

중간에 인터페이스를 둔다면 변경 보호 패턴(Protected Variations)에 해당된다.

순수한 가공물 패턴(Pure Fabrication)

Q. 책임을 할당한 도메인 객체가 Low Coupling, High Cohesion, 재사용성 등의 목적을 위반한다면 어떻게 해야 할까?

A. 도메인 개념을 포함하지 않는 클래스를 하나 만들고 매우 응집된 책임을 할당할 수 있다.

행동을 추가할 때, 해당 책임을 수행할 도메인 개념이 존재하지 않는다면 도메인과 무관한 인공적인 객체를 만든다음 해당 객체에게 책임을 할당한다.

객체가 데이터베이스에 저장해야 할 값을 가지고 있다고, 정보 전문가 패턴을 적용하여 데이터베이스에 저장하라는 책임을 가지라고 하지 않는다.

예) 상점과 고객 클래스가 있고 서로 다른 통화를 사용하고 있다고 가정

  • 서로 다른 통화를 사용하고 있기 때문에 거래를 하려면 환전을 해야한다.
  • 두 클래스 다 환전에 대한 책임을 부여하기 애매하다면 환전을 책임하는 클래스를 추가하고 사용할 수 있다.

참고 자료

오브젝트 5장. 책임 할당하기, 조영호

Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman

GRASP, 한빛 네트워크

- - + + \ No newline at end of file diff --git a/12.html b/12.html index 287f7b452..d76b8d472 100644 --- a/12.html +++ b/12.html @@ -13,12 +13,12 @@ - - + +
-

체스 미션 회고

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
+

체스 미션 회고

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
체스는 이전 미션들보다 훨씬 복잡한 도메인이었다.
하지만 가비와 나는 체스 도메인이 익숙해서 더 편한 마음으로 시작할 수 있었다.
미션을 진행하면서 어려웠던 부분은 기물의 이동, 이동시 경로에 기물이 존재하는지 확인하는 부분이었다.

가비가 집에가서도 기물의 이동 관련해 생각 정리한 글을 보내줘서 더욱 빨리 진행할 수 있었다.
@@ -53,7 +53,7 @@ 모르는게 있으면 솔직하게 말해주는 부분
나의 의견을 정리하지 못한 상태로 전달할 때 이해가 안되었다고 정확히 전달해주는 부분
솔직함은 페어할 때 중요한 부분인 것 같다.

마지막으로 찰리🍫 체스 미션때 꼼꼼하게 리뷰 남겨주셔서 감사합니다!

- - + + \ No newline at end of file diff --git a/13.html b/13.html index 742f5c3aa..9ae9795bc 100644 --- a/13.html +++ b/13.html @@ -13,12 +13,12 @@ - - + +
-

우아한테크코스 레벨 1 회고

· 약 8분

레벨 1이 끝났다.
+

우아한테크코스 레벨 1 회고

· 약 8분

레벨 1이 끝났다.
우테코를 시작하기 전 내가 정해두었던 목표 이상으로 달성했기 때문에 매우 만족스럽다.
혼자 독학을 할 땐 이 방향으로 공부하는 게 맞는지 계속 반추하다 결국 무기력함에 빠져들었다.
하지만 이제는 같이 공부할 사람도 있고, 이야기할 사람도 있기 때문에 즐기는 일만 남은 것 같다.

Keep

나만의 루틴 만들기

스스로가 외부의 영향을 많이 받는다고 생각한다.
@@ -50,7 +50,7 @@ 블로그에 기술적인 부분을 많이 정리하지 않았는데, 조금 더 깊게 공부하고 정리하는 시간도 가져야겠다.

레벨 1을 마무리하며

시간이 빠르게 흘러갔다.
타인에게 좋은 영향을 주기위해, 방학동안 나를 챙기는 시간을 가져야겠다.
또한 함께 일하고 싶은 사람을 목표로 앞으로도 꾸준히 의식적 노력을 해야겠다.

- - + + \ No newline at end of file diff --git a/14.html b/14.html index 818b61736..17c644f69 100644 --- a/14.html +++ b/14.html @@ -13,12 +13,12 @@ - - + +
-

커스텀 JdbcTemplate 만들기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
+

커스텀 JdbcTemplate 만들기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
이 때 JDBC를 사용할 때 데이터베이스의 커넥션을 얻고, try-with-resource를 사용하는 부분이 반복되었다.
템플릿 콜백 패턴을 이용하여 나만의 JdbcTemplate을 만들어보았다.

기존 코드

public class User {
private final int id;
private final String name;

public User(final int id, final String name) {
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

public String getName() {
return name;
}
}

SELECT, DELETE 중복 제거

변하지 않는 부분: try-with-resource, preparedStatement를 사용하는 부분, executeUpdate로 실행 등등
변하는 부분: SQL Query, 매개변수

다음과 같이 쿼리를 실행하는 부분을 분리하고 가변인수를 사용한다면 SELECT와 DELETE의 중복을 제거할 수 있다.

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
executeUpdate(query, userId);
}

private void executeUpdate(final String query, final Object... parameters) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
preparedStatement.executeUpdate();
} catch (final SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

조회 분리하기 - 1. 콜백을 위한 인터페이스 정의

조회는 INSERT, DELETE와 달리 값을 반환받아야 하기 때문에 다른 방법을 사용해야 한다.
@@ -30,7 +30,7 @@ 아래와 같이 제네릭을 적용하여 다른 Dao에서도 사용 가능하도록 변경할 수 있다.

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(final ResultSet resultSet) throws SQLException;
}

private <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}
private <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}

메서드 분리한 부분 클래스로 분리하기 + Optional 사용하기

메서드로 분리한 부분을 JdbcTemplate이라는 클래스를 만들어 옮긴다.
또한 null을 반환하기 보단 Optional로 감싸서 반환하도록 변경한다.
최종적으로 아래와 같은 코드가 완성된다.

public class UserDao {
private final RowMapper<User> rowMapper = resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
};
private final JdbcTemplate jdbcTemplate;

public UserDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
jdbcTemplate.executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
jdbcTemplate.executeUpdate(query, userId);
}

public Optional<User> findById(final int userId) {
final String query = "SELECT * FROM user WHERE id = ?";
return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);
}

public List<User> findAll() {
final String query = "SELECT * FROM user";
return jdbcTemplate.query(query, rowMapper);
}
}
- - + + \ No newline at end of file diff --git a/15.html b/15.html index 55df71b74..0e86530ce 100644 --- a/15.html +++ b/15.html @@ -13,12 +13,12 @@ - - + +
-

자바 클래스 파일 구조

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
+

자바 클래스 파일 구조

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
컴파일된 클래스파일은 어떤 구조로 되어있을까?

클래스 파일의 데이터 형식

8비트 바이트의 스트림으로 구성된다.
16비트 및 32비트의 데이터는 각각 2개, 4개의 연속된 8비트를 읽어서 구성된다.
멀티바이트의 경우 항상 big endian 순서로 저장된다.

u1 → unsigned 1byte
@@ -36,7 +36,7 @@ Class file in Java, File Format
java se11 Class 파일 형식, Oracle
java se17 Class 파일 형식, Oracle

- - + + \ No newline at end of file diff --git a/16.html b/16.html index 84797cacd..5621d7227 100644 --- a/16.html +++ b/16.html @@ -13,12 +13,12 @@ - - + +
-

테스트 대역

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
+

테스트 대역

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
Gerard Meszaros의 xUnit Test Patterns라는 책에서는 테스트 대역을 다섯 가지(더미, 스텁, 스파이, 목, 페이크)로 구분한다.

테스트 대역의 기본 메커니즘은 다형성을 이용하는 방법이다.
외부 서비스를 사용하는 코드를 테스트 하는 경우, 인터페이스를 정의하고 외부 서비스 대신 테스트 용도의 구현체를 생성하는 것이다.

테스트 대역의 타입 계층 구조

더미(Dummy)

가장 단순하고, 원시적인 유형의 테스트 대역이다.
기본적으로 아무 일도 하지 않는 구현체로 인스턴스화가 필요한 경우 사용한다.
@@ -36,7 +36,7 @@ 테스트 더블, Martin Fowler
테스트 관련 용어 정리, Johngrib
Test Double, Gerard Meszaros

- - + + \ No newline at end of file diff --git a/17.html b/17.html index 24f314c4c..d983ce5e0 100644 --- a/17.html +++ b/17.html @@ -13,12 +13,12 @@ - - + +
-

트랜잭션과 격리수준

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
+

트랜잭션과 격리수준

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
트랜잭션은 작업의 완전성과 데이터의 정합성을 보장해 준다.
논리적인 작업 셋을 완벽하게 처리하거나, 오류 시 작업의 일부만 적용되는 현상을 막아준다.

트랜잭션의 속성(ACID)

원자성(Atomicity): 트랜잭션 내에서 실행된 작업들은 모두 성공하거나, 실패해야 한다.
일관성(Consistency): 트랜잭션이 수행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
@@ -42,7 +42,7 @@ 예) A가 레코드를 여러 번 조회하던 중 B가 레코드를 변경하여 A가 조회한 값이 달라지는 경우

팬텀 리드(Phantom read, Phantom row)

한 트랜잭션 내에서 동일한 쿼리 수행시, 수행 결과가 다른 현상
예) A가 레코드를 조회하고 B가 레코드를 추가하여 A가 다시 조회할 때 존재하지 않은 레코드가 조회되는 경우

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
Isolation Level, MySQL

- - + + \ No newline at end of file diff --git a/18.html b/18.html index ba8702638..c8bafd982 100644 --- a/18.html +++ b/18.html @@ -13,12 +13,12 @@ - - + +
-

MySQL 엔진의 잠금

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
+

MySQL 엔진의 잠금

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다.

글로벌 락(Global lock)

MySQL에서 제공하는 잠금 중 가장 넓은 범위를 가지고 있는 잠금이다.

  • 영향을 미치는 범위는 해당 서버 전체이다.
  • 작업 대상 테이블, 데이터베이스 상관 없이 동일하게 영향을 받는다.

한 세션에서 글로벌 락을 획득하면 해제 될 때 까지 조회를 제외한 대부분의 명령이 대기 상태가 된다.
데이터베이스에 존재하는 MyISAM이나 MEMORY 테이블에 대해 일관된 백업을 받아야할 때 사용한다.
InnoDB 스토리지 엔진에서는 백업 시 조금 더 가벼운 백업 락을 사용할 수 있다.

-- GLOBAL LOCK
FLUSH TABLES WITH READ LOCK;
-- UNLOCK
UNLOCK TABLES;

-- BACKUP LOCK
LOCK INSTANCE FOR BACKUP;
-- UNLOCK
UNLOCK INSTANCE;
- - + + \ No newline at end of file diff --git a/19.html b/19.html index 5d8fca623..5bed01cc7 100644 --- a/19.html +++ b/19.html @@ -13,12 +13,12 @@ - - + +
-

InnoDB 스토리지 엔진의 잠금

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
+

InnoDB 스토리지 엔진의 잠금

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
보통 명시적으로 잠금을 사용하는 경우는 드물고, 격리 수준에 따라 묵시적으로 잠금이 사용된다.

동시성 제어 방식에는 낙관적인 방식과 비관적인 방식이 있다.
InnoDB는 기본적으로 MVCC(다중 버전 동시성 제어)를 통해 낙관적인 방식을 사용하고 락을 통해 특정 상황에서 비관적인 방식을 사용한다.

낙관적 동시성 제어(OCC, Optimistic concurrency control)

트랜잭션이 서로 충돌하지 않는다고 가정하는 방식

비관적 동시성 제어(PCC, Pessimistic Concurrency Control)

트랜잭션이 충돌하는 가정하에 잠금을 거는 방식
일반적으로 Shared Lock, Exclusive Lock을 통해 이를 구현한다.

Shared & Exclusive Locks

InnoDB는 로우 단위의 잠금을 수행할 때 공유 잠금과 배타적 잠금을 사용한다.

공유 잠금(S, shared lock)

데이터 조회를 위한 락, 읽기 잠금(read lock)으로도 불린다.
@@ -38,7 +38,7 @@ MySQL Innodb Locks, cecil1018
MySQL 8.0 InnoDB Locks, MySQL
Locks Set by Different SQL Statements in InnoDB, MySQL

- - + + \ No newline at end of file diff --git a/2.html b/2.html index 904e4b9ac..f43d0716b 100644 --- a/2.html +++ b/2.html @@ -13,12 +13,12 @@ - - + +
-

2022년 회고

· 약 4분

적당한 전환점, 2022년을 돌아보며

전역

약 1년 6개월간의 공군 정보보호병 생활을 마치고 전역을 했다.
+

2022년 회고

· 약 4분

적당한 전환점, 2022년을 돌아보며

전역

약 1년 6개월간의 공군 정보보호병 생활을 마치고 전역을 했다.
조기 전역 때문에 2021년 12월에 나왔지만, 실제 전역 날짜는 2022년이니 회고에 적어도 상관없겠지.

조금 더 미래에 대한 생각을 해볼걸 그랬다.
전역을 했지만 뭐 하나 제대로 할 줄 아는 것도 없으니 넓은 바닷속에 덩그러니 놓아진 기분이 괜히 들었었다.
일찍 생각을 정리하여 방향을 잡지 못했기에 아쉬움이 많이 남았다.

자바

전역을 하고 진로를 고민하다 향로님의 자바 공화국 포스팅을 읽고 나서 자바 공부를 시작했다.
@@ -33,7 +33,7 @@ 적지 않은 시간을 투자해 준비를 했고, 감사하게도 이번에는 최종 합격을 했다.

난 사람들과 소통하고, 협업하는 능력이 부족하다고 생각을 많이 했다.
우아한 테크코스를 통해 그 빈 부분을 채우도록 노력해야겠다.

2023년에는

마음의 여유가 없었던 2022년이었던 것 같다.
하고 싶은 건 많지만, 이번에는 여유를 가지고 할 수 있는 것에 최선을 다해야겠다.

- - + + \ No newline at end of file diff --git a/20.html b/20.html index 6bae5b04f..30f02e1e0 100644 --- a/20.html +++ b/20.html @@ -13,12 +13,12 @@ - - + +
-

[책] 상자 밖에 있는 사람

· 약 6분

책 정보

상자 밖에 있는 사람
+

[책] 상자 밖에 있는 사람

· 약 6분

책 정보

상자 밖에 있는 사람
아빈저연구소

자기기만과 자기배반

책에서는 자기기만과 자기배반에 대한 내용을 다룬다.

  • 자기기만: 자신의 문제를 인정하지 않는 것
  • 자기배반: 다른 사람을 위해 무언가 해야만 한다는 생각을 반하는 행위

자기배반을 한다면 자기기만 상태가 된다.
자기기만 상태에 빠지는 것을 책에서는 상자 안에 들어간다고 표현한다.

읽고 나서

최근에 읽은 책 중 가장 마음이 불편했다.
그렇기에 더더욱 나에게 필요한 내용이 담겨있었다.

살면서 많은 선택의 순간이 존재했고, 그 순간마다 자기배반을 택하는 경우가 많았다.
@@ -48,7 +48,7 @@ 우리가 그들과 진정으로 함께 소통하기 전까지는 우리는 그들의 가치를 잘 모릅니다.
우리의 위대함이란 다른 사람들의 위대한 점을 발견해 주는 것에 있습니다.
p.280

- - + + \ No newline at end of file diff --git a/21.html b/21.html index f13c760c0..cd024ca9c 100644 --- a/21.html +++ b/21.html @@ -13,12 +13,12 @@ - - + +
-

[테코챗] 1. 프로토타입 만들기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
+

[테코챗] 1. 프로토타입 만들기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
레벨 3, 4에서 나만의 강점을 가지고 싶어 고민을 많이 했다.
단순히 스프링을 깊게 공부하는 건 효율이 많이 떨어진다고 생각했다.
글쓰기 수상으로 받은 쿠폰을 사용해 브라운에게 커피챗을 신청했고, 사이드 프로젝트를 해보라는 답을 받았다.

나는 아이디어를 못내는 편인데 브라운이 아이디어까지 던져주셨다.
@@ -41,7 +41,7 @@ 추가로 띄어쓰기도 적용되지 않아서 \n<br>태그로 변환했다.
변환하는 로직은 GPT의 도움을 많이 받았다.

const replaceCodeFences = (input: String) => {
const codeFencesRegex = /```([\w-]*)\n([\s\S]*?)\n```/g;
return input
.replace(codeFencesRegex, (match, p1, p2) => {
const languageClass = p1 ? ` class="language-${p1}"` : "";
return `<pre><code${languageClass}>${p2}</code></pre>`;
})
.replace(/\n/g, "<br>");
};

Tiptap을 적용하니 다음과 같이 깔끔한 코드 블록을 볼 수 있었다.

tecochat

폰트 및 favicon 적용

타이틀은 배달의민족 도현체, 내용은 IBM Plex Sans를 사용했다.
추가로 favicon도 간단하게 적용해서 만족스러웠다.

- - + + \ No newline at end of file diff --git a/22.html b/22.html index 916c09b25..deb82cb83 100644 --- a/22.html +++ b/22.html @@ -13,12 +13,12 @@ - - + +
-

Jenkins로 CI/CD 설정

· 약 8분

설정 환경

소프트웨어 이미지: Amazon Linux 2023 AMI
+

- - + + \ No newline at end of file diff --git a/23.html b/23.html index 5bcce6df9..2d9aaaa17 100644 --- a/23.html +++ b/23.html @@ -13,12 +13,12 @@ - - + +
-

[테코챗] 2. 배포

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
+

[테코챗] 2. 배포

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
추가로 채팅을 이어나갈 수 있게 하는 기능도 추가했다.
자잘하게 신경 쓸 부분이 많아서, 프론트엔드 하는 사람들이 대단하다고 생각되었다.
여유가 된다면 자신의 채팅을 볼 수 있는 기능이나, 채팅을 이어서 할 수 있는 기능, 댓글 기능도 추가할 예정이다.

백엔드

최대한 빨리 서비스를 크루들에게 제공하기로 정해서, 백엔드는 말랑이 일단 다 만들고 있다.
@@ -37,7 +37,7 @@ 오늘 적용해 보니 램이 부족하여 중간에 잘 안되기도 하고 그래서 그냥 "Pipeline만 사용할 걸 그랬나?" 라는 생각이 든다.

참고 자료

Elastic Beanstalk, AWS
EC2 AWS Graviton, AWS
Default Memory Settings, AWS

- - + + \ No newline at end of file diff --git a/24.html b/24.html index eb3c464ed..279e619b6 100644 --- a/24.html +++ b/24.html @@ -13,12 +13,12 @@ - - + +
-

웹 자동차 미션 회고

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
+

웹 자동차 미션 회고

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
웹 자동차 미션에서는 비버와 페어가 매칭되었다.
레벨 2에서 진행하는 첫 미션이라 많이 긴장되었지만, 그래도 비버랑 초반에 맛있는 것도 많이 먹으면서 빨리 친해져서 재밌게 할 수 있었다.

스프링을 조금 사용할 줄 알아서, 비버랑 같이 학습하면서 미션을 진행했다.
첫 미션이라 그런지 특별한 부분은 없었고, 최대한 깔끔하게 작성하려고 노력했다.
@@ -37,7 +37,7 @@ 추가적으로 알고 싶은 부분을 따로 학습하는 열정이 좋다고 생각했다.
비버와 스프링에 대해 알아가는 시간을 많이 가진 부분이 매우 좋았다.
나도 5월부터 조금 더 화이팅 해야겠다.

- - + + \ No newline at end of file diff --git a/25.html b/25.html index 4a0794695..c092035ad 100644 --- a/25.html +++ b/25.html @@ -13,12 +13,12 @@ - - + +
-

웹 장바구니 미션 회고

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
+

웹 장바구니 미션 회고

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
요구사항이 엄청 복잡한 미션은 아니었고, 스프링을 사용하여 기본적인 CRUD를 구현하는 미션이었다.
2단계에서는 Basic 인증을 통해 자신의 장바구니에만 상품을 담고, 제거할 수 있도록 구현하는 요구사항이 추가되었다.
Interceptor나 Argument Resolver에 대한 이해도가 높지 않았는데, 이번 미션을 통해 조금 더 알아간 느낌이다.
@@ -32,7 +32,7 @@ 추가적으로 이모지를 적극적으로 사용하여 더욱 좋았다!

의견 일치시키기

페어 시간은 한정되어 있고, 기간 내 요구사항을 만족해야 한다.
따라서 적당히 타협을 봐서 의견을 빠르게 수용해 데드라인을 맞추는 것도 중요하다고 생각한다.
블랙캣은 내 의견을 잘 들어줬고, 덕분에 막히는 부분 없이 빠르게 미션을 진행할 수 있었다.

빨리 친해졌고, 의사소통이 잘 돼서 재밌게 코딩할 수 있었다!

- - + + \ No newline at end of file diff --git a/26.html b/26.html index bf9cf2aae..1b01219de 100644 --- a/26.html +++ b/26.html @@ -13,12 +13,12 @@ - - + +
-

중복과 우발적 중복

· 약 8분

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.
+

중복과 우발적 중복

· 약 8분

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.
요청에 담긴 Body를 통해 전달받은 값을 DTO로 매핑하여 추가와 수정을 했다.

장바구니 미션에서의 상품 추가 및 수정

중복1

클래스명을 제외하고 필드와 검증로직 그 외 모든게 같은 DTO를 보며 중복이라고 생각했다.
하지만 반대로 용도가 다르기 때문에 중복이 아니라고 생각하기도 했다.
위 경우는 중복일까? 중복이 아닐까?

이 부분에 대해서 다음과 같은 리뷰를 받았다.

ProductSaveRequestProductUpdateRequest가 완전히 동일한데, 재사용할 수 없을까? 라는 리뷰를 남겼었어요. 사실 생성과 수정은 서로 달라질 개연성이 높아서 미리 분리해놓는 게 더 좋은 방법이긴 한데, 그래도 중복은 싫어서 저도 요즘 이런저런 방법들을 시도해보는 중 입니다. 허브는 이 부분에 대해 어떤 생각을 가지고 있을지 궁금하네요 ㅎㅎ

질문에 대해 아래와 같이 답변을 했다.

저장과 수정할 때 필요한 필드값이 동일하여 현재 구조에서는 하나로 사용해도 된다고 생각을 하지만, 말씀해주신대로 요구사항이 변경된다면 달라질 가능성이 높다고 판단하였습니다!

중복과 우발적 중복

로버트 마틴님이 집필하신 클린 아키텍처는 아래와 같이 중복을 여러가지 종류로 나누어 설명하고 있다.

  • 진짜 중복: 한 인스턴스가 변경되면, 동일한 변경을 그 인스턴스의 모드 복사본에 반드시 적용해야 한다.
  • 거짓된 중복, 우발적 중복: 중복으로 보이는 두 코드 영역이 각자의 경로로 발전한다면, 즉 서로 다른 속도와 다른 이유로 변경된다면 이 두 코드는 진짜 중복이 아니다.

추가와 수정은 초기에는 중복으로 보이지만 초기 생성시에만 기입하는 데이터들이 추가되거나, 시간이 지나면서 서로 달라질 가능성이 높아진다. @@ -32,7 +32,7 @@ 상황에 맞춰 적재적소에 의존 역전을 이용해보는 것도 좋을 것 같다.

참고 자료

클린 아키텍처 16장 독립성, 로버트 C. 마틴
https://techblog.woowahan.com/2647/
https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/

- - + + \ No newline at end of file diff --git a/27.html b/27.html index c6d9814c7..c800dcf9a 100644 --- a/27.html +++ b/27.html @@ -13,12 +13,12 @@ - - + +
-

지하철 미션 회고

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
+

지하철 미션 회고

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
지하철 미션은 밀리랑 페어를 진행했다.
간단한 CRUD만 있던 이전 미션들과 달리, 조금 복잡한 도메인 요구사항이 있었다.
이때 API, 테이블, 도메인 설계를 해야 했는데 어떤 것부터 해야 할지 고민을 많이 했다.
@@ -39,7 +39,7 @@ 또한 코딩할 때 내가 평소에 사용하는 코딩 컨벤션에 맞춰주는 것 같아서 페어 할 때 편했다!

편한 분위기

전체적으로 페어 할 때 편하게 진행했던 것 같다.
일정도 그렇고, 페어 진행할 때도 그렇고 큰 문제가 없었던 것 같아서 좋았다.
나는 과연 다른 사람들에게 편한 사람일까?

- - + + \ No newline at end of file diff --git a/28.html b/28.html index 5f7e14f0a..da2727ce9 100644 --- a/28.html +++ b/28.html @@ -13,12 +13,12 @@ - - + +
-

컴포지트 패턴으로 요금 정책 추상화하기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
+

컴포지트 패턴으로 요금 정책 추상화하기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
요금을 계산하는 메서드는 최단 경로 계산의 결과, 사용자의 정보, 요금을 받아 요금을 계산한다.

public interface FarePolicy {
int calculate(Path path, Passenger passenger, int fare);
}

public class BaseFarePolicy implements FarePolicy { ... }
public class DistanceFarePolicy implements FarePolicy { ... }
public class AgeDiscountFarePolicy implements FarePolicy { ... }

composite1

모든 요금 정책을 포함하는 새로운 요금 정책 만들기

나머지 구현체를 모두 가지고 있는 하나의 구현체를 만들었다.
이 또한 FarePolicy를 구현한 형태가 되고, 필드로는 나머지 구현체들을 가지고 있다.

public class SubwayFarePolicy implements FarePolicy {

private final List<FarePolicy> farePolicies;

public SubwayFarePolicy(final List<FarePolicy> farePolicies) {
this.farePolicies = farePolicies;
}

@Override
public int calculate(final Path path, final Passenger passenger, final int fare) {
int calculatedFare = fare;
for (FarePolicy farePolicy : farePolicies) {
calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);
}
return calculatedFare;
}
}

따라서 그림으로 본다면 다음과 같은 구조가 된다.

composite2

정책의 순서

지하철 요구사항은 순서가 중요했다.
금액의 총합을 구하고, 그 후에 할인 정책이 들어가야했다.
@@ -31,7 +31,7 @@ 패턴을 맹목적으로 사용해서는 안되고, 현재의 요구사항에 따라 패턴을 유동적으로 수정해가면서 적용하는 것이 좋다.
항상 트레이드오프를 생각하자!

참고 자료

컴포지트 패턴, GoF의 디자인 패턴
디자인 패턴과 프레임워크, 오브젝트

- - + + \ No newline at end of file diff --git a/29.html b/29.html index 3e306383d..71f823ec1 100644 --- a/29.html +++ b/29.html @@ -13,12 +13,12 @@ - - + +
-

[테코챗] 3. 기능 구현

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
+

[테코챗] 3. 기능 구현

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
레벨 2가 거의 끝나가는 시점, 그동안 했던 것을 정리해 보려고 한다.

나의 채팅 확인하고 이어하는 기능

GPT에도 있는 기능인데, 내가 이전에 했던 채팅을 이어할 수 있는 기능을 추가했다.
예전에 어떤 질문을 남겼는지, 또한 해당 채팅을 이어서 할 수 있다.

chat1

좋아요와 댓글 기능

다른 사람들이 질문한 내용에 반응할 수 있는 무언가가 있었으면 좋겠다는 의견들이 많았다.
누가 좋아요를 눌렀는지, 어떤 채팅이 좋아요를 가장 많이 받았는지 확인할 수 있는 기능을 추가했다.
@@ -32,7 +32,7 @@ 제일 하고 싶은 것은 실제 GPT를 사용하는 것처럼 stream/text 값을 처리하고 싶은데 이 부분은 방학 때 기회가 되면 도전해 봐야겠다.

향후 계획

실제 크루들이 사용해 주는 서비스를 직접 만들어보면서 사용자의 입장에서 고민도 하게 되는 것 같다.
크루들이 직접 사용해 주니까 너무 고맙고, 한편으로는 신기하다.
일단 방학 때 stream/text 관련된 부분 동작되도록 구현해보려고 하고, 그 외의 부분은 조금 더 고민해야될 것 같다.

- - + + \ No newline at end of file diff --git a/3.html b/3.html index 20fb65e8c..52d3664a3 100644 --- a/3.html +++ b/3.html @@ -13,12 +13,12 @@ - - + +
-

[책] 객체지향의 사실과 오해

· 약 6분

책 정보

객체지향의 사실과 오해
+

[책] 객체지향의 사실과 오해

· 약 6분

책 정보

객체지향의 사실과 오해
조영호

읽고 나서

조영호님의 오브젝트를 읽고 나서 다시 한 번 읽어보았다.
아직 이해가 안되는 부분이 많지만, 그래도 항상 새로움을 느낀다.
더할 나위 없이 휼륭한 객체지향 책이고, 조금 더 공부하고 다시 읽어봐야될 것 같다.

커피 전문점, 지하철 노선도, 이상한 나라의 엘리스를 예시로 든 설명이 너무 좋았고
@@ -38,7 +38,7 @@ ’어떤 행위(What)’를 수행할 것인지 결정한 후 ‘누가(who)’ 그 행위를 수행할 것인지 결정해야 한다. 여기서 ‘어떤 행위’가 바로 메시지다. p.158

- - + + \ No newline at end of file diff --git a/30.html b/30.html index 8ff96bf02..fbdf63de4 100644 --- a/30.html +++ b/30.html @@ -13,12 +13,12 @@ - - + +
-

장바구니 주문 미션 회고

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
+

장바구니 주문 미션 회고

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
마코, 우가, 우코, 우스 그리고 나까지 합쳐서 5명이 한 팀이 되었다.

배포

이전 미션들과 달리 AWS를 이용해 배포를 해야 했다.
각자 하나의 EC2 인스턴스를 제공받을 수 있었고, 팀 별로 DB를 위한 추가 인스턴스를 제공받았다.
배포 스크립트를 작성하는 경험을 해볼 수 있었다.
@@ -35,7 +35,7 @@ 추가로 현업에서는 고가용성 내결함성 등을 위하여 클러스터를 구성하여 사용하는 경우가 많고, 이 경우 readOnly 설정이 되어있다면 읽기 전용 DB로 질의가 들어가서 부하 분산의 효과가 있다고 한다.

DAO에 @Transactional 적용

DAO에 트랜잭션을 보장해 보는 건 어떻겠냐고 리뷰가 달려서 고민을 많이 했다.
Service 계층에 이미 트랜잭션을 보장해 주고 있기에 필요 없지 않을까 생각했었다.
DAO를 다른 곳에서 사용하더라도 트랜잭션을 보장하기 위해(확장성 고려) @Transactional을 적용하는 것도 괜찮은 것 같다.

- - + + \ No newline at end of file diff --git a/31.html b/31.html index 3c558a309..4a79b63cf 100644 --- a/31.html +++ b/31.html @@ -13,12 +13,12 @@ - - + +
-

레벨 2 - 레벨 인터뷰 회고

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
+

레벨 2 - 레벨 인터뷰 회고

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
따라서 레벨 1 레벨 인터뷰 회고는 레벨 1 회고를 작성할 때 끼워넣었다.
이번에는 범위도 제한되어 있어 어떻게 준비해야 할지 당황했고, 답변에도 부족한 부분이 많았었다.
기억이 사라지기 전에 큰 문제 없이 답변한 내용을 제외하고, 기억 남는 것 위주로 작성해 보려고 한다.

API 문서 도구 선택

큰 문제 없이 답변을 했는데 앞으로도 팀 프로젝트를 하면서 도움 될 것 같은 내용이 있어서 남겨두려고 한다.
@@ -31,7 +31,7 @@ 생각할 시간을 가졌을 때 "다시 말씀드려도 될까요?"라고 말하고 답변을 이어나가기
기술적으로 깊이가 부족하다고 생각이 많이 들어서 조금 더 깊게 공부하고 정리하기
이전에 공부했던거 되돌아 보는 시간 가지기

- - + + \ No newline at end of file diff --git a/32.html b/32.html index a48ef1b44..d7ff18473 100644 --- a/32.html +++ b/32.html @@ -13,12 +13,12 @@ - - + +
-

우아한테크코스 레벨 2 회고

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
+

우아한테크코스 레벨 2 회고

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
빠르게 지나가서 조금 아쉽다.

학습

회고를 작성하기 전에 레벨 2 동안 보냈던 PR과 회고를 쭉 읽어봤다.
항상 아쉬운 곳은 있기 마련이지만, 잘 학습한 것 같다.
미션을 하면서 기술을 어떻게 선택하고, 적용할 것인지 고민하는 과정에서 꽤나 많은 성장을 한 것 같다.

고민은 깊었지만 이론적인 학습이 부족한 레벨 2였다.
@@ -29,7 +29,7 @@ 이번에는 프런트엔드 크루와 협업을 했다. 소통은 잘 된 것 같지만 API 명세를 정하는 부분이 아직 미숙한 것 같다.

레벨 3 때부터 본격적으로 프로젝트가 시작된다.
팀을 위해 어떤 것을 할 수 있을지 고민을 많이 해봐야겠다.

레벨 2를 마무리하며

회고 작성하면서 레벨 2에서 했던 것들을 반추해 봤는데 부족한 점은 많았어도 좋은 방향으로 가고 있는 것 같다. 읽고 싶은 책도 읽고, 부족한 부분 채우면서 쉬어야겠다.

- - + + \ No newline at end of file diff --git a/33.html b/33.html index ac6593553..dcc37bbb5 100644 --- a/33.html +++ b/33.html @@ -13,12 +13,12 @@ - - + +
-

Docusaurus

· 약 11분

팀 블로그 또는 문서화를 위해 Docusaurus를 사용하는 방법을 정리하려고 한다.

설치

공식 홈페이지에 들어가서 최신 버전을 설치한다.

yarn create docusaurus

배포

배포 안내 문서
+

Docusaurus

· 약 11분

팀 블로그 또는 문서화를 위해 Docusaurus를 사용하는 방법을 정리하려고 한다.

설치

공식 홈페이지에 들어가서 최신 버전을 설치한다.

yarn create docusaurus

배포

배포 안내 문서
netlify나 vercel 같은 서버리스 플랫폼을 추천하고 있고, 간단하고, 빠른 시간 안에 배포를 할 수 있다.
이 글에서는 github pages를 이용해서 배포하는 방법을 설명한다.

레포지토리 생성

github pages를 이용하려면 예시와 같이 username.github.io 형태의 레포지토리를 생성해야 한다.
이때 organization을 사용하는 경우 organization.github.io 형태의 레포지토리를 생성해서 사용한다.

설정 파일 수정

docusaurus.config
module.exports = {
// ...
url: 'https://greeng00se.github.io',
baseUrl: '/',
projectName: 'greeng00se.github.io',
organizationName: 'greeng00se',
trailingSlash: false,
// ...
};

토큰 설정

github action을 위해 배포용 토큰을 하나 생성하여 생성한 레포지토리에 Repository secrets으로 설정한다.
@@ -39,7 +39,7 @@ jq가 설치되어 있지 않으면 mac 기준 brew를 이용해서 설치할 수 있다.

brew install jq

다음 명령어를 이용하여 .env와 config.json을 이용하여 크롤링을 한다.

docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper

docusaurus 설정

전에 확인한 APP ID, Search-Only API KEY, IndexName을 이용하여 docusaurus.config 파일에 설정한다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
algolia: {
appId: 'MVIU5UEMOM', // Application ID
apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key
indexName: 'teco', // config.json에 설정한 인덱스명
contextualSearch: true,
},
})

부가 설정

화면 상단 Github Icon

파일 최하단에 아래 css 구문을 추가한다.

/src/css/custom.css
.header-github-link:hover {
opacity: 0.6;
}

.header-github-link:before {
content: '';
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

html[data-theme='dark'] .header-github-link:before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

themeconfig -> navbar에 github link를 설정한다.

docusaurus.config
navbar: {
title: 'HELLO',
items: [
{
href: 'https://github.com/greeng00se',
position: 'right',
className: 'header-github-link',
'aria-label': 'GitHub repository',
},
],
},

코드블럭

java나 kotlin의 경우 기본적으로 하이라이팅을 지원해 주지 않는다.
prism 설정을 아래와 같이 변경해 준다.

docusaurus.config
prism: {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
additionalLanguages: ['java', 'kotlin'],
}

mermaid

mermaid를 사용하려면 @docusaurus/theme-mermaid 를 설치해야 한다.

yarn add @docusaurus/theme-mermaid

설치 후 아래와 같이 설정을 추가한다.

docusaurus.config
const config = {
...
markdown: {
mermaid: true,
},
themes: [
'@docusaurus/theme-mermaid'
],
};

themeConfig에서 mermaid의 테마를 지정할 수 있다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
mermaid: {
theme: {
light: 'neutral',
dark: 'dark'
},
},
}),

국제화 설정

국제화 설정을 한다면 Older Entries 형태의 설명이 다음 페이지 로 변경된다.
설정파일에서 i18n에 있는 로케일 설정을 ko로 변경하면 된다.

docusaurus.config
i18n: {
defaultLocale: "ko",
locales: ["ko"],
},

블로그 글 author

팀원 별로 문서를 관리한다면 다음과 같이 어떤 팀원이 글을 작성했는지 설정해야 한다.

author

authors.yml 파일을 이용하여 사용자에 대한 기본 설정을 할 수 있다.

/blog/authors.yml
herb:
name: 허브
title: Backend
url: https://github.com/greeng00se
image_url: https://github.com/greeng00se.png

mallang:
name: 말랑
title: Backend
url: https://github.com/shin-mallang
image_url: https://github.com/shin-mallang.png

블로그 글을 작성할 때 다음과 같이 authors에 넣어주기만 하면 된다.

---
slug: 1
title: Hello World
authors: [herb, mallang]
tags: [hello, docusaurus]
---

첫 번째 문서 내용
- - + + \ No newline at end of file diff --git a/34.html b/34.html index c11de8a1d..490be0171 100644 --- a/34.html +++ b/34.html @@ -13,12 +13,12 @@ - - + +
-

웹소켓

· 약 3분

웹소켓

단일 TCP 연결을 통해 클라이언트와 서버 간 전이중 양방향 통신을 지원하는 프로토콜
+

웹소켓

· 약 3분

웹소켓

단일 TCP 연결을 통해 클라이언트와 서버 간 전이중 양방향 통신을 지원하는 프로토콜
웹 환경에서 연속된 데이터를 실시간으로 처리할 수 있다.

웹소켓은 HTTP의 포트를 그대로 사용하고 각각 포트 80과 포트 443을 사용하여 HTTP(ws://) 및 HTTPS(wss://)로 서버에 연결한다.

웹소켓 등장 배경

웹소켓이 등장하기 이전, 실시간성을 보장하기 위해 Polling, Streaming 같은 기술을 사용했어야 했다.
이는 실시간성이나 양방향성을 만족시키지 못했고, HTTP를 이용하기 때문에 과도한 오버헤드가 발생했다.

웹소켓의 동작

1. Upgrade 요청

WebSocket 프로토콜로 전환하는 HTTP 요청을 보낸다.
이는 HTTP와 같이 80, 443 포트를 사용한다.
@@ -32,7 +32,7 @@ https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications
https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
https://docs.spring.io/spring-framework/reference/web/websocket.html

- - + + \ No newline at end of file diff --git a/35.html b/35.html index 6eff860f8..ef3882348 100644 --- a/35.html +++ b/35.html @@ -13,12 +13,12 @@ - - + +
-

자바 17, 스프링 6.0, 스프링 부트 3.1

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
+

자바 17, 스프링 6.0, 스프링 부트 3.1

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
2.7 버전을 사용할 수도 있었지만 LTS 기간과 취약점 패치로 인한 버전업 등을 고려했을 때 3.1과 자바 17을 사용하는 것이 더 효율적이라고 판단했다.

자바 변경 사항

우아한테크코스 레벨 2까지는 자바 11을 사용했었다.
따라서 자바 11부터 자바 17까지의 변경사항을 정식 릴리즈 기준으로 정리해보려고 한다.

Switch Expressions(Java 14)

Java 14에서는 기존의 Switch 문을 간결하게 작성할 수 있는 Switch 식이 추가되었다.

enum RESULT {
WIN, LOSE, DRAW
}

RESULT result = RESULT.WIN;

int prize = switch (result) {
case WIN -> 10_000_000;
case LOSE, DRAW -> 5_000_000;
default -> 0;
};

주요 특징은 다음과 같다.

  • -> 연산자를 이용하여 각 case에 대한 결과를 바로 반환할 수 있다.
  • case를 콤마(,)로 연결하여 하나의 case에 여러 값을 지정할 수 있다.
  • break 문이 필요 없다.
  • default 블록을 통해 기본 값을 지정할 수 있다.

Text Block(Java 15)

Java 15에는 새로운 문자열 표현방식이 추가되었다.
긴 문자열을 + 연산자의 도움 없이 가독성있게 작성할 수 있다.

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("""
SELECT p FROM Post p
WHERE p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
""")
List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);
}

NPE 메시지(Java 15)

String name = null;
name.chars();

/**
# before
java.lang.NullPointerException
at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)

# after
Cannot invoke "String.chars()" because "name" is null
java.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null
*/

Record(Java 16)

Lombok의 @Data, kotlin의 data 클래스와 유사한 기능을 제공한다.
@@ -34,7 +34,7 @@ What's New in Spring Framework 6.x
Spring Boot 3.0 Release Notes
Spring Boot 3.1 Release Notes

- - + + \ No newline at end of file diff --git a/36.html b/36.html index cd8b42d2b..07b0cab1a 100644 --- a/36.html +++ b/36.html @@ -13,18 +13,18 @@ - - + +
-

경로 이미지 생성하기 - 기술 선택

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
+

경로 이미지 생성하기 - 기술 선택

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
따라서 이미지를 직접 생성하거나, 클라이언트에서 직접 위경도를 이용하여 그려야 한다.

해당 요구사항을 해결하기 위해서는 다음과 같은 기능을 가진 라이브러리가 필요하다.

  • 이미지 생성
  • 선과 점 표현
  • 투명한 배경색

현재 클라이언트의 바쁜 일정과 기능 구현에 있어 약간의 연산이 들어간다는 부분에서 백엔드에서 이미지를 생성하기로 결정을 내렸다.

고려한 기술

이미지 생성을 위해 다음과 같은 라이브러리 또는 기술들을 확인해 보았다.

  • Python의 Matplotlib
  • AWT(Abstract Window Toolkit) [최종 선택]
  • 이미지 처리 라이브러리 및 Java에서 내부적으로 Matplotlib 사용할 수 있는 라이브러리 (원하는 기능 없음)
  • Java Swing, Java FX (단순한 선 그리기 + 점 찍기라 불필요)

Python & Matplotlib

데이터 시각화 라이브러리
이미지 생성 및 로컬에 저장까지 걸리는 시간: 0.2초

  • 코드가 간단해서 유지 보수성이 좋다.
  • AWS Lambda 같은 서버리스 컴퓨팅 서비스나 FastAPI와 같은 웹 프레임워크로 추가적인 API를 구현해야 한다.
  • Spring Boot에서 추가적인 API 호출을 해야하고, 확장성과 비동기 처리 등 고려 해야 할 부분이 많다.

Java AWT 이외의 라이브러리

Python이 아닌 Java에서의 라이브러리도 고려를 해봤지만 요구사항에 적합하지 않거나, 적은 요구사항에 비해 무거운 라이브러리들이 많아서 제외했다.

라이브러리설명제외 이유
SwingAWT 이후에 나온 GUI 라이브러리, 네이티브 UI를 사용하지 않고 모든 운영체제 상에서 동일한 UI를 가지도록 함요구사항에 비해 무겁고 복잡도가 높음
JavaFXSwing 이후에 나온 GUI 라이브러리, 3차원 그래픽을 지원함요구사항에 비해 무겁고 복잡도가 높음
simple-java-plotAWT로 구현된 플로팅 라이브러리AWT 기반이긴 하지만 직접 AWT를 사용하는 것에 비해 메리트가 없음, 커스텀 설정 기능이 없음
matplotlib4jMatplotlib를 Java에서 사용할 수 있게 하는 라이브러리내부적으로 파이썬 사용하기에 무거움, 배경 투명화 기능 없음

Java & AWT(Abstract Window Toolkit)

그래픽과 이미지를 그리기 위한 도구
이미지 생성 및 로컬에 저장까지 걸리는 시간: 1.75초

  • 플로팅 라이브러리를 사용하는 것보다 구현의 난이도가 다소 존재한다.
  • 이미지 생성 시간이 다소 소요되기 때문에 빠른 응답 반환을 위해 비동기 처리를 고려할 수 있을 것 같다.
  • 추가적인 api 호출을 하지 않아도 된다.

기술 선택

AWT의 경우 Matplotlib에 비해 구현의 난이도가 다소 있고, 이미지 생성 시간이 더 많이 걸리는 단점이 있다.
하지만 추가적인 api 호출을 하지 않아도 되는 부분, Python을 사용하는 경우 추가적인 웹 프레임워크의 학습 비용을 고려하여 AWT를 사용하기로 결정했다.

유지 보수

AWT라는 생소한 기술을 사용하기 때문에 유지 보수성을 위해 팀원들과 공유하는 것이 중요하다고 생각했다.
따라서 다음과 같은 방법으로 공유하기로 했다.

  1. 코드 리뷰와 PR을 통해 작성한 AWT 코드에 대한 설명 및 리뷰 받는다.
  2. AWT를 사용한 부분을 문서화하여 공유한다.
- - + + \ No newline at end of file diff --git a/37.html b/37.html index 30cf122d7..1a27a1df1 100644 --- a/37.html +++ b/37.html @@ -13,12 +13,12 @@ - - + +
-

Mockito 이용해서 static 메서드 모킹하기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
+

Mockito 이용해서 static 메서드 모킹하기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
하지만 특수한 경우에는 정적 메서드를 모킹하는 것이 필요할 수 있다고 생각한다.

예를 들어 레거시 코드를 테스트 한다던지, IO 관련한 부분을 테스트 할 때 정말 필요한 부분에만 적용할 수 있을 것이다.

프로젝트를 진행하며 ImageIo.write 메서드가 호출되는 지 검증이 필요했다.
해당 static 메서드를 호출하는 부분을 따로 RouteImageUploader 클래스로 최대한 분리했다.
이미지 저장 기능 자체가 외부로 나가는 상호작용이고, 호출 횟수를 검사하는데는 mock을 사용하는게 적절하다고 판단했다.

public void upload(BufferedImage bufferedImage) {
File file = new File(파일경로);
try {
ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);
} catch (IOException e) {
throw new DrawException(IMAGE_SAVE_FAIL);
}
}

Mocking static methods

Mockito 3.4.0 이후에는 static method를 모킹할 수 있는 Mockito.mockStatic 메서드를 지원한다.
@@ -27,7 +27,7 @@ 항상 상황을 고려하고 간결함을 포기할 만큼 중요한 부분인지 적절한 트레이드오프를 고려하자.

참고 자료

Mocking static methods
Mockito mock static methods
Enable mocking static methods in Mockito

- - + + \ No newline at end of file diff --git a/38.html b/38.html index 1fd07b4d5..ce18f1035 100644 --- a/38.html +++ b/38.html @@ -13,12 +13,12 @@ - - + +
-

경로 이미지 생성하기 - 파이썬

· 약 7분

개요

이전에 기술 구현 가능 여부를 조사하면서 파이썬을 사용한 내용을 정리한 내용이다.

사용 기술

언어: Python 3.10
+

- - + + \ No newline at end of file diff --git a/39.html b/39.html index 74cdcd859..3b8197182 100644 --- a/39.html +++ b/39.html @@ -13,12 +13,12 @@ - - + +
-

경로 이미지 생성하기 - 구현

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
+

경로 이미지 생성하기 - 구현

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
경로 이미지에 대한 요구사항 및 기술 선택에 대한 내용은 링크에 있다.

구현 결과

./result.png

예시 데이터는 다음과 같다.
서울역(점) → 신사역 → 노량진역 → 홍대입구역 → 종로3가역 → 옥수역 → 구로역(점) → 신림역 → 발산역

예시 데이터
List<Double> x = List.of(
126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,
126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639
);
List<Double> y = List.of(
37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,
37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184
);
List<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);
List<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);

IMAGE_SIZE & ROUTE_SIZE

RouteImageGenerator.java
private static final int IMAGE_SIZE = 800;
private static final int ROUTE_SIZE = 600;

코드를 보면 이미지 크기와 경로 크기가 있습니다.
이미지 크기는 말 그대로 이미지의 width와 height를 의미한다.
@@ -29,7 +29,7 @@ BufferedImage를 사용할 때 왼쪽 상단의 좌표 (0, 0) 기준으로 아래로 내려갈수록 y 값이 커지고, 오른쪽으로 갈 수록 x 값이 커진다.

./800.png

따라서 최종적으로 이미지를 생성하기 위한 값을 다음과 같이 구했다.

x 값 → 계산한 offset 그대로 더한다.
y 값 → imageSize(800)에서 y + offset 값을 뺀다.

RouteImageDrawer(실제 이미지에 경로를 그려주는 클래스)

BufferedImage, Graphics2D를 필드로 가지고 있는 클래스다.
그림을 그리기 위해 설정한 상수들이 존재한다.

RouteImageDrawer.java
// RGB에 각각 8비트씩 할당한 값을 24비트 트루컬러라 부른다.
// 해당 설정은 24비트 + 8비트(alpha, 투명도)를 추가한 32비트 이미지 타입이다.
// 이를 RGBA라고 부른다.
private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;
// 배경 투명색
private static final Color TRANSPARENT = new Color(0, 0, 0, 0);
// 경로를 위한 STROKE
private static final int LINE_STROKE_WIDTH = 7;
private static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 위치 점을 위한 STROKE
private static final int POINT_STROKE_WIDTH = 20;
private static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 안티앨리어싱 등 화질이 안좋은 이미지를 개선하기 위한 설정
private static final Map<Object, Object> renderingHints = Map.of(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,
RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,
RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

RouteImageDrawer 클래스에는 다음 세 개의 인터페이스가 존재한다.

  • drawLine: 선을 그린다.
  • drawPoint: 점을 찍는다.
  • dispose: 자원 할당을 해제한다.

dispose의 경우 내부에서 생성된 graphics2D에 대한 자원 할당을 해제하는 메서드인 graphics2D.dispose를 호출한다.

이미지 생성 Flow

1. 이미지 생성 준비

2. 선 그리기 요청

3. 위치 점 그리기 요청

4. 업로드 요청

전체 Flow

- - + + \ No newline at end of file diff --git a/4.html b/4.html index 666d82292..c155c30f8 100644 --- a/4.html +++ b/4.html @@ -13,19 +13,19 @@ - - + +
-

JSR-310

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
+

JSR-310

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
ISO-8601을 기반으로 작성
설계 목표 → 불변, Fluent API, 명확하고 명시적, 확장 가능성

ISO-8601

날짜와 시간에 관련된 데이터를 다루는 국제 표준

LocalDate, LocalTime, LocalDateTime

날짜와 시간을 표현하는 클래스

Instant

유닉스 시간(1970-01-01, 00:00:00 UTC) 기준으로 특정 지점까지의 시간을 초로 표현하는 클래스
기계의 관점에서 시간 표현

Duration, Period

간격을 표현하는 클래스

TemporalAdjusters

복잡한 날짜 조정이 필요할 때 사용
필요한 경우 다음 인터페이스를 구현하여 커스텀 TemporalAdjuster를 구현 가능

@FunctionalInterface
public interface TemporalAdjuster {
Temporal adjustInto(Temporal temporal);
}

DateTimeFormatter

날짜와 시간 포맷 클래스
특정 날짜 패턴이나, DateTimeFormatterBuilder를 이용해서 커스텀한 포맷을 생성 가능

ZoneId, ZoneOffset

ZoneId는 지역 ID는 ‘지역/도시’ 형식, ZoneOffset은 시차 UTC 기준 고정된 시간 차이 이용
ZoneId의 경우 IANA Time Zone Database에서 제공하는 지역 집합 정보 사용

Instant instant = Instant.now();
LocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

참고 자료

- - + + \ No newline at end of file diff --git a/40.html b/40.html index 6fa2e305a..93317c82c 100644 --- a/40.html +++ b/40.html @@ -13,12 +13,12 @@ - - + +
-

경로 이미지 생성하기 - 비동기 처리

· 약 12분

이전 글

경로 이미지 생성하기 - 기술 선택
+

경로 이미지 생성하기 - 비동기 처리

· 약 12분

이전 글

경로 이미지 생성하기 - 기술 선택
경로 이미지 생성하기 - 구현

개요

현재 여행을 마치는 경우, 감상을 생성하는 경우 이미지 생성 요청이 이루어진다.
경로 이미지 생성의 경우 위치 정보의 개수에 정비례하여 생성 시간이 증가한다.
따라서 비동기로 이미지 생성 요청을 처리하여 사용자의 경험을 개선시킬 수 있다고 생각했다.

주기능의 응답속도 개선

여행 종료와 감상 생성이 주기능이고, 이미지 생성 기능은 부기능이다.
@@ -44,8 +44,8 @@ 통합 테스트에선 트랜잭션이 정상 종료되었을 때 비동기로 이벤트를 구독하여 이미지 생성 메서드를 호출하는지 검증이 필요했기 때문에 최종적으로 Mockito.timeout 메서드를 사용하여 비동기 메서드가 통과될 때까지 대기하는 방향으로 변경했다.

결과

./time.png

위 응답 시간은 위치 정보 1000개를 기준으로 테스트한 값이다.
응답 시간에 이미지 생성 시간이 포함되지 않아서 성능이 개선된 것을 볼 수 있다.

참고 자료

7.7. Task Execution and Scheduling, Spring Boot Docs
Spring Events, Baeldung
-회원시스템 이벤트기반 아키텍처 구축하기

- - +회원시스템 이벤트기반 아키텍처 구축하기

+ + \ No newline at end of file diff --git a/404.html b/404.html index 27d3e7738..bddcb6f9d 100644 --- a/404.html +++ b/404.html @@ -13,13 +13,13 @@ - - + +

페이지를 찾을 수 없습니다.

원하는 페이지를 찾을 수 없습니다.

사이트 관리자에게 링크가 깨진 것을 알려주세요.

- - + + \ No newline at end of file diff --git a/41.html b/41.html new file mode 100644 index 000000000..f6685337d --- /dev/null +++ b/41.html @@ -0,0 +1,44 @@ + + + + + +CloudWatch를 이용한 로깅, 메트릭 모니터링 환경 구성 | GG + + + + + + + + + + + + + +
+

CloudWatch를 이용한 로깅, 메트릭 모니터링 환경 구성

· 약 6분

CloudWatch

AWS 리소스와 애플리케이션의 지표와 로그에 대한 모니터링을 제공하는 서비스다.
+지표를 감시하여 알림을 보내는 기능도 제공한다.
+프리티어를 사용하지 않는 경우 대시보드당 3$/M 의 비용이 청구되고, 지표나 로그의 양에 따라 비용이 추가적으로 청구된다.
+요금 정보에 대한 자세한 정보는 다음 링크에서 확인할 수 있다.

CloudWatch Metrics

기본적으로 5분마다 지표에 대한 정보가 수집된다.
+세부 모니터링(Detailed Monitoring)을 활성화하면 1분마다 지표를 수집한다.
+대시보드에서 InstanceId로 검색하여 수집된 지표를 확인할 수 있다.

./cloudwatch1.png

CPUUtilization, NetworkIn, NetworkOut과 같은 기본적인 지표를 제공하고, 메모리, 디스크 공간과 같은 지표를 확인하려면 사용자 지정 지표를 설정해야 한다.

CloudWatch Agent 설치

CloudWatch Agent 사용자 지정 지표와 로그를 수집할 수 있다.

IAM 역할 설정

기본적으로 EC2 인스턴스가 CloudWatchAgentServerPolicy에 대한 권한이 있어야 한다.
+IAM → 역할에서 역할 생성을 클릭한다.

./cloudwatch2.png

CloudWatchAgentServerPolicy 권한 정책을 선택하고, 적당한 역할 이름을 입력해서 역할을 생성한다.

./cloudwatch3.png

EC2 인스턴스 목록으로 들어가서, CloudWatch Agent를 설치할 EC2 인스턴스를 클릭한다.
+작업 → 보안 → IAM 역할 수정에서 이전에 생성한 역할을 지정한다.

./cloudwatch4.png

설치

환경은 다음과 같다.

OS: ubuntu 22.04
+인스턴스 유형: t4g.small (ARM64)

아래 명령어를 입력하여 설치한다.

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

사용 설명서에 각 인스턴스 유형마다 다운로드 링크가 자세하게 안내되어 있다.

Wizard

CloudWatch Wizard를 사용하면 간단하게 설정 파일 생성할 수 있다.
+로그를 수집하도록 설정하는 경우 Wizard 실행 명령어 입력 전 log 파일의 절대 경로를 복사해두는 것이 좋다.
+아래의 명령어를 입력하여 Wizard를 실행할 수 있다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

설정을 진행하다 보면 설정 파일이 어떻게 구성될지 확인할 수 있다.
+로그를 추가할 것이냐고 물어보는 입력창이 나오면 준비해뒀던 로그 파일의 절대 경로를 입력한다.

./cloudwatch5.png

중간에 SSM parameter store에 설정 파일을 저장할 것이냐고 물어보는 창이 나온다.

Do you want to store the config in the SSM parameter store?
1. yes
2. no

추가적으로 설정하지 않는 경우 2번을 선택한다.
+Parameter Store 관리에 대한 내용은 다음의 문서를 참고하면 좋을 거 같다.
+설정이 완료되면 /opt/aws/amazon-cloudwatch-agent/bin/config.json 에 설정에 대한 내용이 저장된다.

설정 파일 적용

아래의 명령어를 입력하여 설정파일을 적용할 수 있다.
+file 뒤에는 설정 파일에 대한 절대경로(아래 명령어 기준 기본 생성 위치)를 입력하면 된다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

types.db: no such file or directory 에러

다음과 같은 에러가 발생한다면 types.db 파일을 생성해서 문제를 해결할 수 있다.

Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory

types.db 파일 생성

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

지표 확인

CloudWatch Metrics에 가보면 CWAgent라는 사용자 지정 네임스페이스가 추가된 것을 볼 수 있다.
+설정 파일에 네임스페이스를 추가하는 방법도 있다.

./cloudwatch6.png

로그

CloudWatch → 로그 그룹으로 가면 Wizard로 추가한 로그를 확인할 수 있다.

./cloudwatch7.png

참고 자료

CloudWatch란 무엇입니까?
+Amazon CloudWatch 요금
+Linux 인스턴스 지표
+서버에 CloudWatch 에이전트 설치 및 실행
+CloudWatch Agent를 Parameter Store에서 관리해 보기

+ + + + \ No newline at end of file diff --git a/5.html b/5.html index 31db8a86b..fc9497e02 100644 --- a/5.html +++ b/5.html @@ -13,12 +13,12 @@ - - + +
-

Kotlin에서 null을 다루는 방법

· 약 5분

nullable 타입

코틀린은 NullPointerException 예외를 최대한 발생시키지 않기 위해 타입 시스템이 설계되어 있다.
+

Kotlin에서 null을 다루는 방법

· 약 5분

nullable 타입

코틀린은 NullPointerException 예외를 최대한 발생시키지 않기 위해 타입 시스템이 설계되어 있다.
이는 실행 시점이 아닌 컴파일 시 미리 오류가 발생할 가능성이 있는 부분을 미리 감지하여 NPE 발생의 가능성을 줄여준다.

코틀린의 경우 nullable 타입을 다음과 같이 표현한다.

val number: Int?

타입 뒤에 ?를 붙여 해당 값이 null이 될 수 있다는 것을 의미한다.
만약 ?를 붙이지 않을 때 null을 받는 경우 컴파일 시 오류가 발생한다.

?. Safe Calls 연산자

자바에서 NPE를 발생시키지 않기 위해 null을 처리하는 가장 간단한 방법으로는 분기를 사용하는 방법이 있다.

코틀린은 안전한 호출 연산자인 ?. 연산자를 지원한다.
따라서 참조 값이 null이 아닐 경우에만 메서드 호출을 할 수 있다.
@@ -30,7 +30,7 @@ 사용하기 쉽지만, 리스크가 크고 혹시나 해당 값이 추후에는 null이 될 수 있기 때문에 지양해야 된다고 생각한다.

val length: Int = word!!.length

as? 안전한 캐스팅

타입 변환을 할 때 지정한 타입으로 변경할 수 없다면 ClassCastException이 발생한다.
코틀린에서는 as 뒤에 ?를 붙여 안전하게 타입 변환을 할 수 있다.
따라서 미리 변환 가능한 타입인지 확인하지 않고, 안전하게 타입을 변환 할 수 있다.

타입 변환이 불가능 할 경우 예외를 발생시키지 않고 null을 반환한다.

val value: Int? = something as? Int

List에서의 null 처리

List에는 null이 아닌 값만 반환하는 filterNotNull 유틸리티 메서드를 제공한다.

val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")
val foods = foodsWithNull.filterNotNull()

참고 자료

- - + + \ No newline at end of file diff --git a/6.html b/6.html index 1793ee5cc..08bd61399 100644 --- a/6.html +++ b/6.html @@ -13,13 +13,13 @@ - - + +
-

IntelliJ 설정

· 약 1분

Import 자동 적용

Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly

auto-import

저장시 동작

Prefrences > Tools > Actions on Save

actions-on-save

Reformat Code: Code Reformmating

Optimize imports: 사용하지 않는 Import 제거

Rearrange: Code Style > Arrangement 설정 기반 코드 재정렬

메소드 추출, 변수 추출시 final 적용

Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier

final-modifier

- - +

IntelliJ 설정

· 약 1분

Import 자동 적용

Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly

auto-import

저장시 동작

Prefrences > Tools > Actions on Save

actions-on-save

Reformat Code: Code Reformmating

Optimize imports: 사용하지 않는 Import 제거

Rearrange: Code Style > Arrangement 설정 기반 코드 재정렬

메소드 추출, 변수 추출시 final 적용

Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier

final-modifier

+ + \ No newline at end of file diff --git a/7.html b/7.html index a4afa42f0..e9c1cc924 100644 --- a/7.html +++ b/7.html @@ -13,12 +13,12 @@ - - + +
-

Parameterized Tests

· 약 4분

테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
+

Parameterized Tests

· 약 4분

테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
이 때 @ParameterizedTest를 사용하면 단일 테스트를 매개변수를 사용하여 여러 번 반복할 수 있다.

Argument Sources

@ParameterizedTest를 사용하려면 최소 하나 이상의 Source 애노테이션이 필요하다.
JUnit이 제공하는 다양한 Source가 있기 때문에, 테스트에 맞춰 다양하게 사용할 수 있다.

Value Source

값을 이용하여 제공하는 형태로, 다음과 같은 타입의 값을 매개변수로 제공할 수 있다.

  • short, int, long, float, double
  • byte, char, boolean, String, Class
@ParameterizedTest
@ValueSource(ints = {1, 100, Integer.MAX_VALUE})
void valueTest(final int value) {
Assertions.assertThat(value).isPositive();
}

Null & Empty Source

null 값, 빈 값을 제공한다.
Empty Source의 경우 다음과 같은 타입에 한해 매개변수로 제공할 수 있다.

  • String
  • java.util.List, java.util.Set, java.util.Map
  • primitive arrays — ex) int[]
  • object arrays — ex) String[]
@ParameterizedTest
@NullAndEmptySource
void nullAndEmptyTest(final String value) {
Assertions.assertThat(value).isNullOrEmpty();
}

Enum Source

EnumSource를 이용하여 Enum 또한 매개변수로 제공할 수 있다.

enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

@ParameterizedTest
@EnumSource(Day.class)
void enumTest(final Day day) {
assertThat(day).isInstanceOf(Day.class);
}

다음과 같이 mode 값을 이용하여 특징 Enum을 제외하거나, 포함시킬 수 있다. (default: Mode.Include)

@ParameterizedTest
@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)
void enumTest(final Day day) {
// MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
assertThat(day).isInstanceOf(Day.class);
}

CSV Source

csv 형식의 값을 이용하여 매개변수를 제공한다.
@@ -26,7 +26,7 @@ 개인적으로 2개 정도의 값을 매개변수로 전달하는 경우 CsvSource를 사용한다.

@ParameterizedTest
@CsvSource({"1,1", "2,4", "3,9", "4,16"})
void csvTest(final int number, final int result) {
assertThat(number * number).isEqualTo(result);
}

Method Source

복잡한 타입의 값을 전달할 때 사용한다.
메서드명을 입력하여 매개변수를 제공하는 메서드를 지정할 수 있다.
메서드명을 따로 입력하지 않으면 테스트명과 동일한 static 메서드가 지정된다.

@ParameterizedTest
@MethodSource
void methodTest(final List<Integer> numbers, final int count) {
assertThat(numbers).hasSize(count);
}

private static Stream<Arguments> methodTest() {
return Stream.of(
Arguments.of(List.of(1), 1),
Arguments.of(List.of(1, 2), 2),
Arguments.of(List.of(1, 2, 3), 3)
);
}

ETC.

위에서 언급한 방법 이외에도 다양한 방법으로 매개변수를 제공할 수 있다.

  • CSV 파일을 이용한 CsvFileSource
  • ArgumentsProvider 구현한 클래스를 이용하는 ArgumentsSource

참고 자료

- - + + \ No newline at end of file diff --git a/8.html b/8.html index dc6f0ccd5..54cbae944 100644 --- a/8.html +++ b/8.html @@ -13,12 +13,12 @@ - - + +
-

자동차 경주 미션 회고

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
+

자동차 경주 미션 회고

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
우테코 들어와서 첫 페어프로그래밍이라 많이 떨렸지만, 다즐이 대화를 잘 이끌어줘 너무 즐거웠다.

첫날은 간단히 컨벤션과 환경을 설정하는 시간을 가졌고 다음 날부터 자동차 경주를 시작했다.
시작은 간단하게 요구사항을 정리하고, 어떻게 코드를 작성할지 같이 고민했다.

시작하기 전 아래와 같이 mermaid를 이용하여 의존성 방향에 대해서 간단한 다이어그램을 만들고 시작했다.
mermaid는 코드로 다이어그램을 생성 해주는 도구로 다음과 같은 장점이 있다고 생각한다.

  • 코드 기반이라 빠른 시간 안에 생각한 것을 시각화할 수 있다.
  • github에서 mermaid를 지원하기 때문에 리뷰어에게 코드를 이해할 수 있는 부가적인 정보를 제공할 수 있다.

미션을 진행하는 데 큰 어려움이 있지는 않았고, 페어를 마치기 전 서로 고민되는 부분을 정리했을 때 좋았다.

페어하면서 잘했다고 생각했던 점은 서로의 생각과 리뷰 받은 것을 공유한 것이다.
@@ -44,7 +44,7 @@ 그래서 즐거운 마음으로 페어 프로그래밍을 했었던 것 같다.

어떤 이유 때문인지 모르겠지만 같이 페어하는데 편한 마음이 들었다.
이건 바로 배울 수 없지만.
나도 같이 일할 때 편한 사람, 같이 일하고 싶은 사람이 되기 위해 깊이 고민해봐야겠다.

- - + + \ No newline at end of file diff --git a/9.html b/9.html index eb3b5cdde..7fd93f135 100644 --- a/9.html +++ b/9.html @@ -13,12 +13,12 @@ - - + +
-

사다리 타기 미션 회고

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
+

사다리 타기 미션 회고

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
이전 미션과 달리 TDD로 진행하는 것이 필수였기 때문에 익숙하지 않았지만, 우가와 미션에 관한 소통이 잘 되어서 큰 문제 없이 미션을 마무리할 수 있었다.

우가와 이야기가 잘 통해서 그런지 1단계는 크게 어렵지 않게 진행할 수 있었는데, 2단계에서 많이 고전한 것 같다.

2단계에서는 2가지 방법으로 구현해봤다.

  1. LadderGame에서 Position 기준으로 사다리 게임을 진행하는 방법
  2. Player에게 Ladder를 넘겨서 Ladder에게 Position을 넘겨주며 메시지를 보내는 방법

Position 기준으로 사다리 게임을 진행하는 방법

사실상 index를 Ladder에게 넘겨주고, 해당 index에 대한 결과를 받는 방법과 유사했다.
구현하고 나니 다른 클래스들이 Position에 대한 의존도가 너무 높은 것 같았다.
또한 Players가 별다른 책임을 가지고 있지 않다고 느꼈다.

public LadderGameResult play() {
final Map<Player, Item> result = new LinkedHashMap<>();
// 사용자 수만큼 Position을 가져와서 사다리 게임을 진행한다.
for (Position position : Position.range(players.count())) {
final Position resultPosition = ladder.play(position);
result.put(players.get(position), items.get(resultPosition));
}
return new LadderGameResult(result);
}

Player에게 Ladder를 전달하여 게임을 진행하는 방법

Position에 대한 값을 가지고 있는 Player에게 Ladder를 넘겨서, Player가 Ladder에게 메시지를 보내도록 구현하였다.
@@ -50,7 +50,7 @@ 또한 페어 진행이 느린 것 같다고 말해줘서 안정적으로 시간 안에 미션을 완료할 수 있었다.
페어프로그래밍 진행 속도에 대해 조금 더 생각을 해봐야겠다!

항상 지나갈 때마다 웃어주는데, 나도 자주 웃어야겠다고 생각했다.
웃는 것만으로도 사람이 밝아 보여서 너무 좋은 것 같다!

- - + + \ No newline at end of file diff --git a/assets/images/cloudwatch1-859296155df6c20d0846f1388022a86c.png b/assets/images/cloudwatch1-859296155df6c20d0846f1388022a86c.png new file mode 100644 index 000000000..137426643 Binary files /dev/null and b/assets/images/cloudwatch1-859296155df6c20d0846f1388022a86c.png differ diff --git a/assets/images/cloudwatch2-ca9c26868dec08ea7133e2774f49798a.png b/assets/images/cloudwatch2-ca9c26868dec08ea7133e2774f49798a.png new file mode 100644 index 000000000..9ed01306c Binary files /dev/null and b/assets/images/cloudwatch2-ca9c26868dec08ea7133e2774f49798a.png differ diff --git a/assets/images/cloudwatch3-da10422b87e1901286b6d3e85e2c01cc.png b/assets/images/cloudwatch3-da10422b87e1901286b6d3e85e2c01cc.png new file mode 100644 index 000000000..f92a384a5 Binary files /dev/null and b/assets/images/cloudwatch3-da10422b87e1901286b6d3e85e2c01cc.png differ diff --git a/assets/images/cloudwatch4-1e7eddc7e8dd890ac18352e900df8e07.png b/assets/images/cloudwatch4-1e7eddc7e8dd890ac18352e900df8e07.png new file mode 100644 index 000000000..0eb037d66 Binary files /dev/null and b/assets/images/cloudwatch4-1e7eddc7e8dd890ac18352e900df8e07.png differ diff --git a/assets/images/cloudwatch5-67d1bd59d4552f4fe481452eddc78a5e.png b/assets/images/cloudwatch5-67d1bd59d4552f4fe481452eddc78a5e.png new file mode 100644 index 000000000..4c5ef0d19 Binary files /dev/null and b/assets/images/cloudwatch5-67d1bd59d4552f4fe481452eddc78a5e.png differ diff --git a/assets/images/cloudwatch6-06ead809f7510938baee41505bc72b97.png b/assets/images/cloudwatch6-06ead809f7510938baee41505bc72b97.png new file mode 100644 index 000000000..bdec3c869 Binary files /dev/null and b/assets/images/cloudwatch6-06ead809f7510938baee41505bc72b97.png differ diff --git a/assets/images/cloudwatch7-a86dfc0db307ddf7d1660d2b9e419c96.png b/assets/images/cloudwatch7-a86dfc0db307ddf7d1660d2b9e419c96.png new file mode 100644 index 000000000..d18b25ee9 Binary files /dev/null and b/assets/images/cloudwatch7-a86dfc0db307ddf7d1660d2b9e419c96.png differ diff --git a/assets/js/0050401e.14bb3b4a.js b/assets/js/0050401e.14bb3b4a.js deleted file mode 100644 index 3173d0fe1..000000000 --- a/assets/js/0050401e.14bb3b4a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9735],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(k,p(p({ref:t},s),{},{components:n})):r.createElement(k,p({ref:t},s))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:30,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/30",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",description:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",date:"2023-06-04T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 4\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.595,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:"30",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"},nextItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"}},i={authorsImageUrls:[]},c=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158",level:3},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84",id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158"},"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158"),(0,a.kt)("p",null,"\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,a.kt)("p",null,"\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'echo "Start Deploy Script"\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\nPROJECT_NAME=jwp-shopping-order\n\necho "Change Directory"\ncd $REPOSITORY_NAME\n\necho "Git Pull"\ngit pull origin step2\n\necho "Build"\n./gradlew bootJar\n\necho "Copy, Start Server"\nmv ./build/libs/$PROJECT_NAME.jar .\n\nPID=$(pgrep -f $PROJECT_NAME)\n\nif [ -n $PID ]; then\n kill -9 $PID\n sleep 5\nfi\n\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\n')),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30")),(0,a.kt)("p",null,"\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84"},"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"expose headers")),(0,a.kt)("p",null,"\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c ",(0,a.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header"},"\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354"),"\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","nginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"add_header 'Access-Control-Expose-Headers' 'Location'\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158")," "),(0,a.kt)("p",null,"\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Transactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("p",null,"setReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.")),(0,a.kt)("p",null,"ORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"strong"},"@Transactional")," \uc801\uc6a9")," "),(0,a.kt)("p",null,"DAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Service \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) ",(0,a.kt)("inlineCode",{parentName:"p"},"@Transactional"),"\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0050401e.6d327cbb.js b/assets/js/0050401e.6d327cbb.js new file mode 100644 index 000000000..97a327e42 --- /dev/null +++ b/assets/js/0050401e.6d327cbb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9735],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(k,p(p({ref:t},s),{},{components:n})):r.createElement(k,p({ref:t},s))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:30,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/30",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",description:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",date:"2023-06-04T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 4\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.595,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:"30",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"},nextItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"}},i={authorsImageUrls:[]},c=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158",level:3},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84",id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158"},"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158"),(0,a.kt)("p",null,"\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,a.kt)("p",null,"\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'echo "Start Deploy Script"\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\nPROJECT_NAME=jwp-shopping-order\n\necho "Change Directory"\ncd $REPOSITORY_NAME\n\necho "Git Pull"\ngit pull origin step2\n\necho "Build"\n./gradlew bootJar\n\necho "Copy, Start Server"\nmv ./build/libs/$PROJECT_NAME.jar .\n\nPID=$(pgrep -f $PROJECT_NAME)\n\nif [ -n $PID ]; then\n kill -9 $PID\n sleep 5\nfi\n\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\n')),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30")),(0,a.kt)("p",null,"\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84"},"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"expose headers")),(0,a.kt)("p",null,"\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c ",(0,a.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header"},"\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354"),"\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","nginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"add_header 'Access-Control-Expose-Headers' 'Location'\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158")," "),(0,a.kt)("p",null,"\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Transactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("p",null,"setReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.")),(0,a.kt)("p",null,"ORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"strong"},"@Transactional")," \uc801\uc6a9")," "),(0,a.kt)("p",null,"DAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Service \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) ",(0,a.kt)("inlineCode",{parentName:"p"},"@Transactional"),"\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/00931cc3.6ebd0500.js b/assets/js/00931cc3.6ebd0500.js new file mode 100644 index 000000000..f27cc592e --- /dev/null +++ b/assets/js/00931cc3.6ebd0500.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5669],{92291:e=>{e.exports=JSON.parse('{"permalink":"/page/30","page":30,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/29","nextPage":"/page/31","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/00931cc3.8dc43f44.js b/assets/js/00931cc3.8dc43f44.js deleted file mode 100644 index dfba19947..000000000 --- a/assets/js/00931cc3.8dc43f44.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5669],{2291:e=>{e.exports=JSON.parse('{"permalink":"/page/30","page":30,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/29","nextPage":"/page/31","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.76b4ff2a.js b/assets/js/01a85c17.76b4ff2a.js new file mode 100644 index 000000000..200defd65 --- /dev/null +++ b/assets/js/01a85c17.76b4ff2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4013],{39058:(e,t,a)=>{a.d(t,{Z:()=>_});var l=a(67294),n=a(86010),r=a(54774),s=a(87524),c=a(39960),i=a(95999);const m="sidebar_re4s",o="sidebarItemTitle_pO2u",u="sidebarItemList_Yudw",g="sidebarItem__DBe",b="sidebarItemLink_mo7H",d="sidebarItemLinkActive_I1ZP";function E(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(m,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(o,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(u,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:g},l.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:b,activeClassName:d},e.title)))))))}var p=a(13102);function h(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function k(e){return l.createElement(p.Zo,{component:h,props:e})}function N(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(k,{sidebar:t}):l.createElement(E,{sidebar:t}):null}function _(e){const{sidebar:t,toc:a,children:s,...c}=e,i=t&&t.items.length>0;return l.createElement(r.Z,c,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(N,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},24524:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(67294),n=a(86010),r=a(35155),s=a(10833),c=a(35281),i=a(39058),m=a(26090),o=a(90197);function u(e){let{tags:t,sidebar:a}=e;const u=(0,r.M)();return l.createElement(s.FG,{className:(0,n.Z)(c.k.wrapper.blogPages,c.k.page.blogTagsListPage)},l.createElement(s.d,{title:u}),l.createElement(o.Z,{tag:"blog_tags_list"}),l.createElement(i.Z,{sidebar:a},l.createElement("h1",null,u),l.createElement(m.Z,{tags:t})))}},13008:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(67294),n=a(86010),r=a(39960);const s="tag_zVej",c="tagRegular_sFm0",i="tagWithCount_h2kH";function m(e){let{permalink:t,label:a,count:m}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(s,m?i:c)},a,m&&l.createElement("span",null,m))}},26090:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(67294),n=a(35155),r=a(13008);const s="tag_Nnez";function c(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:s},l.createElement(r.Z,e))))),l.createElement("hr",null))}function i(e){let{tags:t}=e;const a=(0,n.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(c,{key:e.letter,letterEntry:e}))))}},35155:(e,t,a)=>{a.d(t,{M:()=>n,P:()=>r});var l=a(95999);const n=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.97ec86b3.js b/assets/js/01a85c17.97ec86b3.js deleted file mode 100644 index 8709e0563..000000000 --- a/assets/js/01a85c17.97ec86b3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4013],{9058:(e,t,a)=>{a.d(t,{Z:()=>_});var l=a(7294),n=a(6010),r=a(4774),s=a(7524),c=a(9960),i=a(5999);const m="sidebar_re4s",o="sidebarItemTitle_pO2u",u="sidebarItemList_Yudw",g="sidebarItem__DBe",b="sidebarItemLink_mo7H",d="sidebarItemLinkActive_I1ZP";function E(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(m,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(o,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(u,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:g},l.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:b,activeClassName:d},e.title)))))))}var p=a(3102);function h(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function k(e){return l.createElement(p.Zo,{component:h,props:e})}function N(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(k,{sidebar:t}):l.createElement(E,{sidebar:t}):null}function _(e){const{sidebar:t,toc:a,children:s,...c}=e,i=t&&t.items.length>0;return l.createElement(r.Z,c,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(N,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},4524:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294),n=a(6010),r=a(5155),s=a(833),c=a(5281),i=a(9058),m=a(6090),o=a(197);function u(e){let{tags:t,sidebar:a}=e;const u=(0,r.M)();return l.createElement(s.FG,{className:(0,n.Z)(c.k.wrapper.blogPages,c.k.page.blogTagsListPage)},l.createElement(s.d,{title:u}),l.createElement(o.Z,{tag:"blog_tags_list"}),l.createElement(i.Z,{sidebar:a},l.createElement("h1",null,u),l.createElement(m.Z,{tags:t})))}},3008:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(7294),n=a(6010),r=a(9960);const s="tag_zVej",c="tagRegular_sFm0",i="tagWithCount_h2kH";function m(e){let{permalink:t,label:a,count:m}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(s,m?i:c)},a,m&&l.createElement("span",null,m))}},6090:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(7294),n=a(5155),r=a(3008);const s="tag_Nnez";function c(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:s},l.createElement(r.Z,e))))),l.createElement("hr",null))}function i(e){let{tags:t}=e;const a=(0,n.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(c,{key:e.letter,letterEntry:e}))))}},5155:(e,t,a)=>{a.d(t,{M:()=>n,P:()=>r});var l=a(5999);const n=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/2b479afe.08c2d69e.js b/assets/js/0281109c.094422e8.js similarity index 50% rename from assets/js/2b479afe.08c2d69e.js rename to assets/js/0281109c.094422e8.js index 69fb6d7e6..c0d9e04dc 100644 --- a/assets/js/2b479afe.08c2d69e.js +++ b/assets/js/0281109c.094422e8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9591],{6973:e=>{e.exports=JSON.parse('{"permalink":"/tags/mockito","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[422],{25266:e=>{e.exports=JSON.parse('{"permalink":"/tags/jenkins","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0281109c.3e72a180.js b/assets/js/0281109c.3e72a180.js deleted file mode 100644 index 7d9047fa2..000000000 --- a/assets/js/0281109c.3e72a180.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[422],{5266:e=>{e.exports=JSON.parse('{"permalink":"/tags/jenkins","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/03e71e14.07b9fcbf.js b/assets/js/03e71e14.07b9fcbf.js new file mode 100644 index 000000000..e1ab151ed --- /dev/null +++ b/assets/js/03e71e14.07b9fcbf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4371],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,g=d["".concat(p,".").concat(m)]||d[m]||c[m]||i;return n?r.createElement(g,l(l({ref:t},s),{},{components:n})):r.createElement(g,l({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(67294),a=n(86010);const i="tabItem_Ymn6";function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(i,l),hidden:n},t)}},74866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(87462),a=n(67294),i=n(86010),l=n(12466),o=n(16550),p=n(91980),u=n(67392),s=n(50012);function c(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??c(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:n}=e;const r=(0,o.k6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,p._X)(i),(0,a.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=d(e),[l,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:i}))),[p,u]=g({queryString:n,groupId:r}),[c,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,s.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),b=(()=>{const e=p??c;return m({value:e,tabValues:i})?e:null})();(0,a.useEffect)((()=>{b&&o(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),v(e)}),[u,v,i]),tabValues:i}}var b=n(72389);const h="tabList__CuJ",k="tabItem_LNqP";function f(e){let{className:t,block:n,selectedValue:o,selectValue:p,tabValues:u}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),d=e=>{const t=e.currentTarget,n=s.indexOf(t),r=u[n].value;r!==o&&(c(t),p(r))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>s.push(e),onKeyDown:m,onClick:d},l,{className:(0,i.Z)("tabs__item",k,l?.className,{"tabs__item--active":o===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:r}=e;if(t){const e=n.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function T(e){const t=v(e);return a.createElement("div",{className:(0,i.Z)("tabs-container",h)},a.createElement(f,(0,r.Z)({},e,t)),a.createElement(y,(0,r.Z)({},e,t)))}function E(e){const t=(0,b.Z)();return a.createElement(T,(0,r.Z)({key:String(t)},e))}},69056:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>c});var r=n(87462),a=(n(67294),n(3905)),i=n(74866),l=n(85162);const o={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:40,tags:["async","event"]},p=void 0,u={permalink:"/40",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",source:"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",description:"\uc774\uc804 \uae00",date:"2023-08-13T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 13\uc77c",tags:[{label:"async",permalink:"/tags/async"},{label:"event",permalink:"/tags/event"}],readingTime:11.2,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:"40",tags:["async","event"]},prevItem:{title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",permalink:"/41"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"}},s={authorsImageUrls:[]},c=[{value:"\uc774\uc804 \uae00",id:"\uc774\uc804-\uae00",level:2},{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120",id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120",level:3},{value:"\ud655\uc7a5\uc131 \ub300\ube44",id:"\ud655\uc7a5\uc131-\ub300\ube44",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac",level:2},{value:"\ube44\ub3d9\uae30 \uc124\uc815",id:"\ube44\ub3d9\uae30-\uc124\uc815",level:3},{value:"@Async \uc801\uc6a9",id:"async-\uc801\uc6a9",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810",level:3},{value:"\uc774\ubca4\ud2b8 \uc0ac\uc6a9",id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9",level:2},{value:"\uc774\ubca4\ud2b8 \ubc1c\ud589",id:"\uc774\ubca4\ud2b8-\ubc1c\ud589",level:3},{value:"\uc774\ubca4\ud2b8 \uad6c\ub3c5",id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5",level:3},{value:"\ud14c\uc2a4\ud2b8",id:"\ud14c\uc2a4\ud2b8",level:3},{value:"\uacb0\uacfc",id:"\uacb0\uacfc",level:2},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],d={toc:c};function m(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"\uc774\uc804-\uae00"},"\uc774\uc804 \uae00"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"./36"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"./39"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604")),(0,a.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120"},"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120"),(0,a.kt)("p",null,"\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\ud655\uc7a5\uc131-\ub300\ube44"},"\ud655\uc7a5\uc131 \ub300\ube44"),(0,a.kt)("p",null,"\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. "),(0,a.kt)("h2",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac"},"\ube44\ub3d9\uae30 \ucc98\ub9ac"),(0,a.kt)("p",null,"@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\uc124\uc815"},"\ube44\ub3d9\uae30 \uc124\uc815"),(0,a.kt)("p",null,"\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="AsyncConfig"',title:'"AsyncConfig"'},"@EnableAsync\n@Configuration\npublic class AsyncConfig {\n}\n")),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. "),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\n7.7. Task Execution and Scheduling, Spring Boot Docs")),(0,a.kt)("h3",{id:"async-\uc801\uc6a9"},"@Async \uc801\uc6a9"),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator"',title:'"RouteImageGenerator"'},"@Async\npublic void generate(\n List latitudes,\n List longitudes,\n List pointedLatitudes,\n List pointedLongitudes,\n Long tripId\n) {\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\n\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\n\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\n routeImageDrawer.dispose();\n\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\n Trip trip = tripRepository.findById(tripId)\n .orElseThrow();\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n}\n")),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810"},"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810"),(0,a.kt)("p",null,"\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\n draw --\x3e trip"}),(0,a.kt)("p",null,"\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n\tsubgraph draw\n\t\tdirection LR\n\t\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\n\tend\n subgraph trip\n\t\tdirection LR\n\t\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\n\t\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\n\tend\n\n\ttrip --\x3e draw"}),(0,a.kt)("p",null,"\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9"},"\uc774\ubca4\ud2b8 \uc0ac\uc6a9"),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\ubc1c\ud589"},"\uc774\ubca4\ud2b8 \ubc1c\ud589"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripService & TripUpdateEvent"',title:'"TripService',"&":!0,'TripUpdateEvent"':!0},"public void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\n ...\n\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\n}\n\npublic record TripUpdateEvent(Long tripId) {\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5"},"\uc774\ubca4\ud2b8 \uad6c\ub3c5"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec ",(0,a.kt)("inlineCode",{parentName:"p"},"@Async")," \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 ",(0,a.kt)("inlineCode",{parentName:"p"},"@TransactionalEventListener"),"\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,a.kt)("admonition",{title:"TransactionPhase \uc124\uc815",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"TransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("p",{parentName:"admonition"},"AFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","BEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 ")),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripUpdateEventHandler"',title:'"TripUpdateEventHandler"'},"@Component\npublic class TripUpdateEventHandler {\n\n private final RouteImageGenerator routeImageGenerator;\n private final TripRepository tripRepository;\n\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\n this.routeImageGenerator = routeImageGenerator;\n this.tripRepository = tripRepository;\n }\n\n @Async\n @TransactionalEventListener(phase = AFTER_COMMIT)\n public void handle(TripUpdateEvent tripUpdateEvent) {\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\n\n String imageUrl = routeImageGenerator.generate(\n trip.getLatitudes(),\n trip.getLongitudes(),\n trip.getPointedLatitudes(),\n trip.getPointedLongitudes()\n );\n\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n }\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4."),(0,a.kt)("mermaid",{value:"graph LR\n subgraph trip\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\n TripRepository\n end\n\n subgraph draw\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\n end"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8"},"\ud14c\uc2a4\ud2b8"),(0,a.kt)("p",null,"\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. "),(0,a.kt)(i.Z,{mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",label:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(Mockito.timeout(5000).times(1))\n .generate(any(), any(), any(), any());\n }\n}\n"))),(0,a.kt)(l.Z,{value:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",label:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ContextConfiguration(classes = TestSyncConfig.class)\n@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(times(1))\n .generate(any(), any(), any(), any());\n }\n}\n")))),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0")," \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c ",(0,a.kt)("inlineCode",{parentName:"p"},"Mockito.timeout")," \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uacb0\uacfc"},"\uacb0\uacfc"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"./time.png",src:n(39711).Z,width:"1682",height:"678"})),(0,a.kt)("p",null,"\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. "),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling"},"7.7. Task Execution and Scheduling, Spring Boot Docs"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/spring-events"},"Spring Events, Baeldung"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/7835/"},"\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30")))}m.isMDXComponent=!0},39711:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/time-8bef9a6cf2dcace85f12ae5624da94f5.png"}}]); \ No newline at end of file diff --git a/assets/js/03e71e14.492c1594.js b/assets/js/03e71e14.492c1594.js deleted file mode 100644 index ecd67b08e..000000000 --- a/assets/js/03e71e14.492c1594.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4371],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,g=d["".concat(p,".").concat(m)]||d[m]||c[m]||i;return n?r.createElement(g,l(l({ref:t},s),{},{components:n})):r.createElement(g,l({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(7294),a=n(6010);const i="tabItem_Ymn6";function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(i,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),i=n(6010),l=n(2466),o=n(6550),p=n(1980),u=n(7392),s=n(12);function c(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??c(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:n}=e;const r=(0,o.k6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,p._X)(i),(0,a.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=d(e),[l,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:i}))),[p,u]=g({queryString:n,groupId:r}),[c,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,s.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),b=(()=>{const e=p??c;return m({value:e,tabValues:i})?e:null})();(0,a.useEffect)((()=>{b&&o(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),v(e)}),[u,v,i]),tabValues:i}}var b=n(2389);const h="tabList__CuJ",k="tabItem_LNqP";function f(e){let{className:t,block:n,selectedValue:o,selectValue:p,tabValues:u}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),d=e=>{const t=e.currentTarget,n=s.indexOf(t),r=u[n].value;r!==o&&(c(t),p(r))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>s.push(e),onKeyDown:m,onClick:d},l,{className:(0,i.Z)("tabs__item",k,l?.className,{"tabs__item--active":o===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:r}=e;if(t){const e=n.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function T(e){const t=v(e);return a.createElement("div",{className:(0,i.Z)("tabs-container",h)},a.createElement(f,(0,r.Z)({},e,t)),a.createElement(y,(0,r.Z)({},e,t)))}function E(e){const t=(0,b.Z)();return a.createElement(T,(0,r.Z)({key:String(t)},e))}},9056:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>c});var r=n(7462),a=(n(7294),n(3905)),i=n(4866),l=n(5162);const o={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:40,tags:["async","event"]},p=void 0,u={permalink:"/40",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",source:"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",description:"\uc774\uc804 \uae00",date:"2023-08-13T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 13\uc77c",tags:[{label:"async",permalink:"/tags/async"},{label:"event",permalink:"/tags/event"}],readingTime:11.2,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:"40",tags:["async","event"]},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"}},s={authorsImageUrls:[]},c=[{value:"\uc774\uc804 \uae00",id:"\uc774\uc804-\uae00",level:2},{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120",id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120",level:3},{value:"\ud655\uc7a5\uc131 \ub300\ube44",id:"\ud655\uc7a5\uc131-\ub300\ube44",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac",level:2},{value:"\ube44\ub3d9\uae30 \uc124\uc815",id:"\ube44\ub3d9\uae30-\uc124\uc815",level:3},{value:"@Async \uc801\uc6a9",id:"async-\uc801\uc6a9",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810",level:3},{value:"\uc774\ubca4\ud2b8 \uc0ac\uc6a9",id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9",level:2},{value:"\uc774\ubca4\ud2b8 \ubc1c\ud589",id:"\uc774\ubca4\ud2b8-\ubc1c\ud589",level:3},{value:"\uc774\ubca4\ud2b8 \uad6c\ub3c5",id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5",level:3},{value:"\ud14c\uc2a4\ud2b8",id:"\ud14c\uc2a4\ud2b8",level:3},{value:"\uacb0\uacfc",id:"\uacb0\uacfc",level:2},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],d={toc:c};function m(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"\uc774\uc804-\uae00"},"\uc774\uc804 \uae00"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"./36"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"./39"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604")),(0,a.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120"},"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120"),(0,a.kt)("p",null,"\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\ud655\uc7a5\uc131-\ub300\ube44"},"\ud655\uc7a5\uc131 \ub300\ube44"),(0,a.kt)("p",null,"\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. "),(0,a.kt)("h2",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac"},"\ube44\ub3d9\uae30 \ucc98\ub9ac"),(0,a.kt)("p",null,"@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\uc124\uc815"},"\ube44\ub3d9\uae30 \uc124\uc815"),(0,a.kt)("p",null,"\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="AsyncConfig"',title:'"AsyncConfig"'},"@EnableAsync\n@Configuration\npublic class AsyncConfig {\n}\n")),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. "),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\n7.7. Task Execution and Scheduling, Spring Boot Docs")),(0,a.kt)("h3",{id:"async-\uc801\uc6a9"},"@Async \uc801\uc6a9"),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator"',title:'"RouteImageGenerator"'},"@Async\npublic void generate(\n List latitudes,\n List longitudes,\n List pointedLatitudes,\n List pointedLongitudes,\n Long tripId\n) {\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\n\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\n\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\n routeImageDrawer.dispose();\n\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\n Trip trip = tripRepository.findById(tripId)\n .orElseThrow();\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n}\n")),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810"},"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810"),(0,a.kt)("p",null,"\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\n draw --\x3e trip"}),(0,a.kt)("p",null,"\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n\tsubgraph draw\n\t\tdirection LR\n\t\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\n\tend\n subgraph trip\n\t\tdirection LR\n\t\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\n\t\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\n\tend\n\n\ttrip --\x3e draw"}),(0,a.kt)("p",null,"\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9"},"\uc774\ubca4\ud2b8 \uc0ac\uc6a9"),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\ubc1c\ud589"},"\uc774\ubca4\ud2b8 \ubc1c\ud589"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripService & TripUpdateEvent"',title:'"TripService',"&":!0,'TripUpdateEvent"':!0},"public void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\n ...\n\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\n}\n\npublic record TripUpdateEvent(Long tripId) {\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5"},"\uc774\ubca4\ud2b8 \uad6c\ub3c5"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec ",(0,a.kt)("inlineCode",{parentName:"p"},"@Async")," \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 ",(0,a.kt)("inlineCode",{parentName:"p"},"@TransactionalEventListener"),"\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,a.kt)("admonition",{title:"TransactionPhase \uc124\uc815",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"TransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("p",{parentName:"admonition"},"AFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","BEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 ")),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripUpdateEventHandler"',title:'"TripUpdateEventHandler"'},"@Component\npublic class TripUpdateEventHandler {\n\n private final RouteImageGenerator routeImageGenerator;\n private final TripRepository tripRepository;\n\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\n this.routeImageGenerator = routeImageGenerator;\n this.tripRepository = tripRepository;\n }\n\n @Async\n @TransactionalEventListener(phase = AFTER_COMMIT)\n public void handle(TripUpdateEvent tripUpdateEvent) {\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\n\n String imageUrl = routeImageGenerator.generate(\n trip.getLatitudes(),\n trip.getLongitudes(),\n trip.getPointedLatitudes(),\n trip.getPointedLongitudes()\n );\n\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n }\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4."),(0,a.kt)("mermaid",{value:"graph LR\n subgraph trip\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\n TripRepository\n end\n\n subgraph draw\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\n end"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8"},"\ud14c\uc2a4\ud2b8"),(0,a.kt)("p",null,"\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. "),(0,a.kt)(i.Z,{mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",label:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(Mockito.timeout(5000).times(1))\n .generate(any(), any(), any(), any());\n }\n}\n"))),(0,a.kt)(l.Z,{value:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",label:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ContextConfiguration(classes = TestSyncConfig.class)\n@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(times(1))\n .generate(any(), any(), any(), any());\n }\n}\n")))),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0")," \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c ",(0,a.kt)("inlineCode",{parentName:"p"},"Mockito.timeout")," \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uacb0\uacfc"},"\uacb0\uacfc"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"./time.png",src:n(9711).Z,width:"1682",height:"678"})),(0,a.kt)("p",null,"\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. "),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling"},"7.7. Task Execution and Scheduling, Spring Boot Docs"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/spring-events"},"Spring Events, Baeldung"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/7835/"},"\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30")))}m.isMDXComponent=!0},9711:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/time-8bef9a6cf2dcace85f12ae5624da94f5.png"}}]); \ No newline at end of file diff --git a/assets/js/041ed4b0.0fdc0f2b.js b/assets/js/041ed4b0.0fdc0f2b.js new file mode 100644 index 000000000..70fc1f3ef --- /dev/null +++ b/assets/js/041ed4b0.0fdc0f2b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6847],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),b=a,f=s["".concat(i,".").concat(b)]||s[b]||m[b]||p;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"2022\ub144 \ud68c\uace0",slug:2,tags:["Retrospective"]},l=void 0,o={permalink:"/2",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",title:"2022\ub144 \ud68c\uace0",description:"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70",date:"2023-01-02T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 2\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.705,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2022\ub144 \ud68c\uace0",slug:"2",tags:["Retrospective"]},prevItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"},nextItem:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",permalink:"/1"}},i={authorsImageUrls:[]},c=[{value:"\uc804\uc5ed",id:"\uc804\uc5ed",level:3},{value:"\uc790\ubc14",id:"\uc790\ubc14",level:3},{value:"\uc2a4\ud130\ub514",id:"\uc2a4\ud130\ub514",level:3},{value:"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4",id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4",level:3},{value:"2023\ub144\uc5d0\ub294",id:"2023\ub144\uc5d0\ub294",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 "),(0,a.kt)("h3",{id:"\uc804\uc5ed"},"\uc804\uc5ed"),(0,a.kt)("p",null,"\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. "),(0,a.kt)("p",null,"\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uc790\ubc14"},"\uc790\ubc14"),(0,a.kt)("p",null,"\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 ",(0,a.kt)("a",{parentName:"p",href:"https://jojoldu.tistory.com/609"},"\uc790\ubc14 \uacf5\ud654\uad6d")," \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\uc2a4\ud130\ub514"},"\uc2a4\ud130\ub514"),(0,a.kt)("p",null,"\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4"},"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4"),(0,a.kt)("p",null,"\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. "),(0,a.kt)("p",null,"\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"2023\ub144\uc5d0\ub294"},"2023\ub144\uc5d0\ub294"),(0,a.kt)("p",null,"\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/041ed4b0.2cd713e4.js b/assets/js/041ed4b0.2cd713e4.js deleted file mode 100644 index a95d30c8b..000000000 --- a/assets/js/041ed4b0.2cd713e4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6847],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),b=a,f=s["".concat(i,".").concat(b)]||s[b]||m[b]||p;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"2022\ub144 \ud68c\uace0",slug:2,tags:["Retrospective"]},l=void 0,o={permalink:"/2",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",title:"2022\ub144 \ud68c\uace0",description:"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70",date:"2023-01-02T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 2\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.705,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2022\ub144 \ud68c\uace0",slug:"2",tags:["Retrospective"]},prevItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"},nextItem:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",permalink:"/1"}},i={authorsImageUrls:[]},c=[{value:"\uc804\uc5ed",id:"\uc804\uc5ed",level:3},{value:"\uc790\ubc14",id:"\uc790\ubc14",level:3},{value:"\uc2a4\ud130\ub514",id:"\uc2a4\ud130\ub514",level:3},{value:"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4",id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4",level:3},{value:"2023\ub144\uc5d0\ub294",id:"2023\ub144\uc5d0\ub294",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 "),(0,a.kt)("h3",{id:"\uc804\uc5ed"},"\uc804\uc5ed"),(0,a.kt)("p",null,"\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. "),(0,a.kt)("p",null,"\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uc790\ubc14"},"\uc790\ubc14"),(0,a.kt)("p",null,"\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 ",(0,a.kt)("a",{parentName:"p",href:"https://jojoldu.tistory.com/609"},"\uc790\ubc14 \uacf5\ud654\uad6d")," \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\uc2a4\ud130\ub514"},"\uc2a4\ud130\ub514"),(0,a.kt)("p",null,"\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4"},"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4"),(0,a.kt)("p",null,"\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. "),(0,a.kt)("p",null,"\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"2023\ub144\uc5d0\ub294"},"2023\ub144\uc5d0\ub294"),(0,a.kt)("p",null,"\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0462f8fc.d30e14d1.js b/assets/js/0462f8fc.d30e14d1.js deleted file mode 100644 index 9fa62bf9f..000000000 --- a/assets/js/0462f8fc.d30e14d1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4481],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,f=d["".concat(p,".").concat(m)]||d[m]||s[m]||l;return r?n.createElement(f,o(o({ref:t},u),{},{components:r})):n.createElement(f,o({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const l={title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",tags:["test"]},o=void 0,i={unversionedId:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",id:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",description:"\ub514\ubc84\uae45 \uac10\uc18c",source:"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd.mdx",sourceDirName:"\ud14c\uc2a4\ud2b8",slug:"/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd.mdx",tags:[{label:"test",permalink:"/docs/tags/test"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",tags:["test"]},sidebar:"tutorialSidebar",previous:{title:"TDD heuristics",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59"}},p={},c=[{value:"\ub514\ubc84\uae45 \uac10\uc18c",id:"\ub514\ubc84\uae45-\uac10\uc18c",level:3},{value:"\uc790\uc2e0 \uc788\uac8c \ubcc0\uacbd",id:"\uc790\uc2e0-\uc788\uac8c-\ubcc0\uacbd",level:3},{value:"\ub354 \ub098\uc740 \ubb38\uc11c \uc790\ub8cc",id:"\ub354-\ub098\uc740-\ubb38\uc11c-\uc790\ub8cc",level:3},{value:"\ub354 \ub2e8\uc21c\ud55c \ub9ac\ubdf0",id:"\ub354-\ub2e8\uc21c\ud55c-\ub9ac\ubdf0",level:3},{value:"\uc0ac\ub824 \uae4a\uc740 \uc124\uacc4",id:"\uc0ac\ub824-\uae4a\uc740-\uc124\uacc4",level:3},{value:"\uace0\ud488\uc9c8\uc758 \ub9b4\ub9ac\uc2a4\ub97c \ube60\ub974\uac8c",id:"\uace0\ud488\uc9c8\uc758-\ub9b4\ub9ac\uc2a4\ub97c-\ube60\ub974\uac8c",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ub514\ubc84\uae45-\uac10\uc18c"},"\ub514\ubc84\uae45 \uac10\uc18c"),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8\ub97c \ud55c \ubc88 \uc791\uc131\ud574\ub450\uba74 \ud504\ub85c\uc81d\ud2b8\uc758 \uc0dd\uc874 \uc8fc\uae30\ub3d9\uc548 \uac12\ube44\uc2fc \uacb0\ud568\uc744 \uc608\ubc29\ud574 \uc900\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud568\uc774 \ud574\uacb0\ub418\uc5b4 \ub514\ubc84\uae45\uc5d0\uc11c \ud574\ubc29\uc2dc\ucf1c\uc900\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30\uc5d0\uc11c \uc5b8\uae09\ub41c ",(0,a.kt)("inlineCode",{parentName:"p"},"TDD heuristics 15. \ub514\ubc84\uac70 \uc0ac\uc6a9\uc744 \ud53c\ud558\ub77c")," \uc640 \uc5f0\uacb0\ub418\ub294 \ub0b4\uc6a9\uc774\ub2e4."),(0,a.kt)("h3",{id:"\uc790\uc2e0-\uc788\uac8c-\ubcc0\uacbd"},"\uc790\uc2e0 \uc788\uac8c \ubcc0\uacbd"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4\ub294 \ud56d\uc0c1 \ubcc0\uacbd\ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ud329\ud130\ub9c1\ud560 \ub54c \uc790\uc2e0\uac10\uc744 \uac00\uc9c0\uace0 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ub354-\ub098\uc740-\ubb38\uc11c-\uc790\ub8cc"},"\ub354 \ub098\uc740 \ubb38\uc11c \uc790\ub8cc"),(0,a.kt)("p",null,"\ud558\ub098\uc758 \ud589\uc704\ub9cc \uc9d1\uc911\ud574 \uac80\uc99d\ud558\ub294 \ud14c\uc2a4\ud2b8\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ubb38\uc11c\uc640 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \ud14c\uc2a4\ud2b8\ub294 \uba85\ud655\ud558\uace0 \uac04\uacb0\ud574\uc57c\uc9c0\ub9cc \ubb38\uc11c \uc790\ub8cc\ub85c\uc11c\uc758 \uc5ed\ud560\uc744 \ud6cc\ub96d\ud788 \uc218\ud589\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ub354-\ub2e8\uc21c\ud55c-\ub9ac\ubdf0"},"\ub354 \ub2e8\uc21c\ud55c \ub9ac\ubdf0"),(0,a.kt)("p",null,"\uc815\ud655\uc131, \uadf9\ub2e8 \uc0c1\ud669, \uc624\ub958 \uc0c1\ud669 \ub4f1\uc758 \ub2e4\uc591\ud55c \uce21\uba74\uc5d0\uc11c \ucf54\ub4dc\ub97c \uac80\uc0ac\ud574\uc8fc\ub294 \ud14c\uc2a4\ud2b8\uac00 \uc900\ube44\ub418\uc5b4 \uc788\ub2e4\uba74 \ub9ac\ubdf0\uc5b4\uac00 \uac80\uc99d\ud558\ub294 \uc2dc\uac04\uc744 \ud06c\uac8c \uc904\uc5ec\uc900\ub2e4. "),(0,a.kt)("h3",{id:"\uc0ac\ub824-\uae4a\uc740-\uc124\uacc4"},"\uc0ac\ub824 \uae4a\uc740 \uc124\uacc4"),(0,a.kt)("p",null,"\uc0c8\ub85c \uc791\uc131\ud55c \ucf54\ub4dc\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uc77c\uc740 \uc2e4\uc9c8\uc801\uc73c\ub85c \ud574\ub2f9 \ucf54\ub4dc\uc758 API\uac00 \uc798 \uc124\uacc4\ub418\uc5b4 \uc788\ub294\uc9c0\ub97c \uc2dc\ud5d8\ud558\ub294 \ud589\uc704\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8\ud558\uae30 \uc5b4\ub824\uc6b4 \ucf54\ub4dc\ub294 \ub108\ubb34 \ub9ce\uc740 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac70\ub098, \uc758\uc874\uc131\uc774 \ubcf5\uc7a1\ud55c \uacbd\uc6b0\uac00 \ub9ce\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc798 \uc124\uacc4\ub41c \ucf54\ub4dc\ub77c\uba74 \ubaa8\ub4c8\ud654\uac00 \uc798 \ub418\uc5b4\uc788\uc5b4\uc57c \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uace0\ud488\uc9c8\uc758-\ub9b4\ub9ac\uc2a4\ub97c-\ube60\ub974\uac8c"},"\uace0\ud488\uc9c8\uc758 \ub9b4\ub9ac\uc2a4\ub97c \ube60\ub974\uac8c"),(0,a.kt)("p",null,"\uc790\ub3d9\ud654\ub41c \ud14c\uc2a4\ud2b8\ub97c \uac16\ucd98\ub2e4\uba74 \uc0c8\ub85c\uc6b4 \ubc84\uc804\uc744 \ub9b4\ub9ac\uc2a4\ud560 \ub54c \ubd88\uc548\uc5d0 \ub5a8\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uad6c\uae00 \uc5d4\uc9c0\ub2c8\uc5b4\ub294 \uc774\ub807\uac8c \uc77c\ud55c\ub2e4, \ud0c0\uc774\ud130\uc2a4 \uc708\ud130\uc2a4, \ud1b0 \ub9e8\uc26c\ub809, \ud558\uc774\ub7fc \ub77c\uc774\ud2b8 p.288"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0462f8fc.f94ff9b8.js b/assets/js/0462f8fc.f94ff9b8.js new file mode 100644 index 000000000..dd4085227 --- /dev/null +++ b/assets/js/0462f8fc.f94ff9b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4481],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,f=d["".concat(p,".").concat(m)]||d[m]||s[m]||l;return r?n.createElement(f,o(o({ref:t},u),{},{components:r})):n.createElement(f,o({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const l={title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",tags:["test"]},o=void 0,i={unversionedId:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",id:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",description:"\ub514\ubc84\uae45 \uac10\uc18c",source:"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd.mdx",sourceDirName:"\ud14c\uc2a4\ud2b8",slug:"/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd.mdx",tags:[{label:"test",permalink:"/docs/tags/test"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",tags:["test"]},sidebar:"tutorialSidebar",previous:{title:"TDD heuristics",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59"}},p={},c=[{value:"\ub514\ubc84\uae45 \uac10\uc18c",id:"\ub514\ubc84\uae45-\uac10\uc18c",level:3},{value:"\uc790\uc2e0 \uc788\uac8c \ubcc0\uacbd",id:"\uc790\uc2e0-\uc788\uac8c-\ubcc0\uacbd",level:3},{value:"\ub354 \ub098\uc740 \ubb38\uc11c \uc790\ub8cc",id:"\ub354-\ub098\uc740-\ubb38\uc11c-\uc790\ub8cc",level:3},{value:"\ub354 \ub2e8\uc21c\ud55c \ub9ac\ubdf0",id:"\ub354-\ub2e8\uc21c\ud55c-\ub9ac\ubdf0",level:3},{value:"\uc0ac\ub824 \uae4a\uc740 \uc124\uacc4",id:"\uc0ac\ub824-\uae4a\uc740-\uc124\uacc4",level:3},{value:"\uace0\ud488\uc9c8\uc758 \ub9b4\ub9ac\uc2a4\ub97c \ube60\ub974\uac8c",id:"\uace0\ud488\uc9c8\uc758-\ub9b4\ub9ac\uc2a4\ub97c-\ube60\ub974\uac8c",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ub514\ubc84\uae45-\uac10\uc18c"},"\ub514\ubc84\uae45 \uac10\uc18c"),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8\ub97c \ud55c \ubc88 \uc791\uc131\ud574\ub450\uba74 \ud504\ub85c\uc81d\ud2b8\uc758 \uc0dd\uc874 \uc8fc\uae30\ub3d9\uc548 \uac12\ube44\uc2fc \uacb0\ud568\uc744 \uc608\ubc29\ud574 \uc900\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud568\uc774 \ud574\uacb0\ub418\uc5b4 \ub514\ubc84\uae45\uc5d0\uc11c \ud574\ubc29\uc2dc\ucf1c\uc900\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30\uc5d0\uc11c \uc5b8\uae09\ub41c ",(0,a.kt)("inlineCode",{parentName:"p"},"TDD heuristics 15. \ub514\ubc84\uac70 \uc0ac\uc6a9\uc744 \ud53c\ud558\ub77c")," \uc640 \uc5f0\uacb0\ub418\ub294 \ub0b4\uc6a9\uc774\ub2e4."),(0,a.kt)("h3",{id:"\uc790\uc2e0-\uc788\uac8c-\ubcc0\uacbd"},"\uc790\uc2e0 \uc788\uac8c \ubcc0\uacbd"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4\ub294 \ud56d\uc0c1 \ubcc0\uacbd\ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ud329\ud130\ub9c1\ud560 \ub54c \uc790\uc2e0\uac10\uc744 \uac00\uc9c0\uace0 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ub354-\ub098\uc740-\ubb38\uc11c-\uc790\ub8cc"},"\ub354 \ub098\uc740 \ubb38\uc11c \uc790\ub8cc"),(0,a.kt)("p",null,"\ud558\ub098\uc758 \ud589\uc704\ub9cc \uc9d1\uc911\ud574 \uac80\uc99d\ud558\ub294 \ud14c\uc2a4\ud2b8\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ubb38\uc11c\uc640 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \ud14c\uc2a4\ud2b8\ub294 \uba85\ud655\ud558\uace0 \uac04\uacb0\ud574\uc57c\uc9c0\ub9cc \ubb38\uc11c \uc790\ub8cc\ub85c\uc11c\uc758 \uc5ed\ud560\uc744 \ud6cc\ub96d\ud788 \uc218\ud589\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ub354-\ub2e8\uc21c\ud55c-\ub9ac\ubdf0"},"\ub354 \ub2e8\uc21c\ud55c \ub9ac\ubdf0"),(0,a.kt)("p",null,"\uc815\ud655\uc131, \uadf9\ub2e8 \uc0c1\ud669, \uc624\ub958 \uc0c1\ud669 \ub4f1\uc758 \ub2e4\uc591\ud55c \uce21\uba74\uc5d0\uc11c \ucf54\ub4dc\ub97c \uac80\uc0ac\ud574\uc8fc\ub294 \ud14c\uc2a4\ud2b8\uac00 \uc900\ube44\ub418\uc5b4 \uc788\ub2e4\uba74 \ub9ac\ubdf0\uc5b4\uac00 \uac80\uc99d\ud558\ub294 \uc2dc\uac04\uc744 \ud06c\uac8c \uc904\uc5ec\uc900\ub2e4. "),(0,a.kt)("h3",{id:"\uc0ac\ub824-\uae4a\uc740-\uc124\uacc4"},"\uc0ac\ub824 \uae4a\uc740 \uc124\uacc4"),(0,a.kt)("p",null,"\uc0c8\ub85c \uc791\uc131\ud55c \ucf54\ub4dc\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uc77c\uc740 \uc2e4\uc9c8\uc801\uc73c\ub85c \ud574\ub2f9 \ucf54\ub4dc\uc758 API\uac00 \uc798 \uc124\uacc4\ub418\uc5b4 \uc788\ub294\uc9c0\ub97c \uc2dc\ud5d8\ud558\ub294 \ud589\uc704\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8\ud558\uae30 \uc5b4\ub824\uc6b4 \ucf54\ub4dc\ub294 \ub108\ubb34 \ub9ce\uc740 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac70\ub098, \uc758\uc874\uc131\uc774 \ubcf5\uc7a1\ud55c \uacbd\uc6b0\uac00 \ub9ce\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc798 \uc124\uacc4\ub41c \ucf54\ub4dc\ub77c\uba74 \ubaa8\ub4c8\ud654\uac00 \uc798 \ub418\uc5b4\uc788\uc5b4\uc57c \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uace0\ud488\uc9c8\uc758-\ub9b4\ub9ac\uc2a4\ub97c-\ube60\ub974\uac8c"},"\uace0\ud488\uc9c8\uc758 \ub9b4\ub9ac\uc2a4\ub97c \ube60\ub974\uac8c"),(0,a.kt)("p",null,"\uc790\ub3d9\ud654\ub41c \ud14c\uc2a4\ud2b8\ub97c \uac16\ucd98\ub2e4\uba74 \uc0c8\ub85c\uc6b4 \ubc84\uc804\uc744 \ub9b4\ub9ac\uc2a4\ud560 \ub54c \ubd88\uc548\uc5d0 \ub5a8\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uad6c\uae00 \uc5d4\uc9c0\ub2c8\uc5b4\ub294 \uc774\ub807\uac8c \uc77c\ud55c\ub2e4, \ud0c0\uc774\ud130\uc2a4 \uc708\ud130\uc2a4, \ud1b0 \ub9e8\uc26c\ub809, \ud558\uc774\ub7fc \ub77c\uc774\ud2b8 p.288"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/05b907fc.1adac84e.js b/assets/js/05b907fc.1adac84e.js deleted file mode 100644 index bf9dc1dcf..000000000 --- a/assets/js/05b907fc.1adac84e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[734],{2943:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/8","page":8,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/7","nextPage":"/tags/retrospective/page/9","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/05b907fc.81878d39.js b/assets/js/05b907fc.81878d39.js new file mode 100644 index 000000000..d67cc00b5 --- /dev/null +++ b/assets/js/05b907fc.81878d39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[734],{92943:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/8","page":8,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/7","nextPage":"/tags/retrospective/page/9","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/06ea9cd1.0417406e.js b/assets/js/06ea9cd1.0417406e.js deleted file mode 100644 index bffbba0bd..000000000 --- a/assets/js/06ea9cd1.0417406e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8296],{3905:(t,e,a)=>{a.d(e,{Zo:()=>o,kt:()=>k});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var u=n.createContext({}),m=function(t){var e=n.useContext(u),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},o=function(t){var e=m(t.components);return n.createElement(u.Provider,{value:e},t.children)},s={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},d=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,u=t.parentName,o=i(t,["components","mdxType","originalType","parentName"]),d=m(a),k=r,c=d["".concat(u,".").concat(k)]||d[k]||s[k]||l;return a?n.createElement(c,p(p({ref:e},o),{},{components:a})):n.createElement(c,p({ref:e},o))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,p=new Array(l);p[0]=d;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i.mdxType="string"==typeof t?t:r,p[1]=i;for(var m=2;m{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var n=a(7462),r=(a(7294),a(3905));const l={title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:15,tags:["Java","Class"]},p=void 0,i={permalink:"/15",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",source:"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",description:"\ud074\ub798\uc2a4 \ud30c\uc77c",date:"2023-04-03T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 3\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Class",permalink:"/tags/class"}],readingTime:5.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:"15",tags:["Java","Class"]},prevItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"},nextItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"}},u={authorsImageUrls:[]},m=[{value:"\ud074\ub798\uc2a4 \ud30c\uc77c",id:"\ud074\ub798\uc2a4-\ud30c\uc77c",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd",id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870",level:3},{value:"\ub9e4\uc9c1\ub118\ubc84",id:"\ub9e4\uc9c1\ub118\ubc84",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804",level:3},{value:"\uc0c1\uc218 \ud480",id:"\uc0c1\uc218-\ud480",level:3},{value:"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8",id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8",level:3},{value:"this_class",id:"this_class",level:3},{value:"super_class",id:"super_class",level:3},{value:"interface, field, method",id:"interface-field-method",level:3},{value:"attributes",id:"attributes",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],o={toc:m};function s(t){let{components:e,...a}=t;return(0,r.kt)("wrapper",(0,n.Z)({},o,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c"},"\ud074\ub798\uc2a4 \ud30c\uc77c"),(0,r.kt)("p",null,"\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?"),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd"},"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd"),(0,r.kt)("p",null,"8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. "),(0,r.kt)("p",null,"u1 \u2192 unsigned 1byte",(0,r.kt)("br",{parentName:"p"}),"\n","u2 \u2192 unsigned 2byte",(0,r.kt)("br",{parentName:"p"}),"\n","u4 \u2192 unsigned 4byte "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870"},"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"ClassFile {\n u4 magic;\n u2 minor_version;\n u2 major_version;\n u2 constant_pool_count;\n cp_info constant_pool[constant_pool_count-1];\n u2 access_flags;\n u2 this_class;\n u2 super_class;\n u2 interfaces_count;\n u2 interfaces[interfaces_count];\n u2 fields_count;\n field_info fields[fields_count];\n u2 methods_count;\n method_info methods[methods_count];\n u2 attributes_count;\n attribute_info attributes[attributes_count];\n}\n")),(0,r.kt)("h3",{id:"\ub9e4\uc9c1\ub118\ubc84"},"\ub9e4\uc9c1\ub118\ubc84"),(0,r.kt)("p",null,"\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D")),(0,r.kt)("p",null,"\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"UnsupportedClassVersionError")," \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"class\xa0file format major versions")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Java SE"),(0,r.kt)("th",{parentName:"tr",align:null},"Released"),(0,r.kt)("th",{parentName:"tr",align:null},"Major"),(0,r.kt)("th",{parentName:"tr",align:null},"Supported majors"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2014"),(0,r.kt)("td",{parentName:"tr",align:null},"52"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 52")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"9"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2017"),(0,r.kt)("td",{parentName:"tr",align:null},"53"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 53")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"54"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 54")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"11"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"55"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 55")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"12"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"56"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"13"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"57"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 57")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"14"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"58"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 58")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"15"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"59"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 59")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"60"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 60")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"17"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"61"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 61")))),(0,r.kt)("h3",{id:"\uc0c1\uc218-\ud480"},"\uc0c1\uc218 \ud480"),(0,r.kt)("p",null,"2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","JVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8"},"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_PUBLIC")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_INTERFACE")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_ABSTRACT"))),(0,r.kt)("p",null,"\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Class access and property modifiers")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Flag Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"),(0,r.kt)("th",{parentName:"tr",align:null},"Interpretation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_PUBLIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0001"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0public; may be accessed from outside its package.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_FINAL"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0010"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0final; no subclasses allowed.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SUPER"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0020"),(0,r.kt)("td",{parentName:"tr",align:null},"Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_INTERFACE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0200"),(0,r.kt)("td",{parentName:"tr",align:null},"Is an interface, not a class.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ABSTRACT"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0400"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0abstract; must not be instantiated.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SYNTHETIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x1000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared synthetic; not present in the source code.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ANNOTATION"),(0,r.kt)("td",{parentName:"tr",align:null},"0x2000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an annotation type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ENUM"),(0,r.kt)("td",{parentName:"tr",align:null},"0x4000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an\xa0enum\xa0type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_MODULE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x8000"),(0,r.kt)("td",{parentName:"tr",align:null},"Is a module, not a class or interface.")))),(0,r.kt)("h3",{id:"this_class"},"this_class"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 ",(0,r.kt)("inlineCode",{parentName:"p"},"CONSTANT_Class_infoclass")," \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"super_class"},"super_class"),(0,r.kt)("p",null,"\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"java.lang.Object"),"\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4."),(0,r.kt)("h3",{id:"interface-field-method"},"interface, field, method"),(0,r.kt)("p",null,"\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","interface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4."),(0,r.kt)("h3",{id:"attributes"},"attributes"),(0,r.kt)("p",null,"\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85",(0,r.kt)("br",{parentName:"p"}),"\n","\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234"),(0,r.kt)("p",null,"IntelliJ plugin - BinEd",(0,r.kt)("br",{parentName:"p"}),"\n","IntelliJ plugin - jclasslib Bytecode Viewer"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.fileformat.com/ko/programming/class/"},"Class file in Java, File Format"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html"},"java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html"},"java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/06ea9cd1.97756b06.js b/assets/js/06ea9cd1.97756b06.js new file mode 100644 index 000000000..2419dbe57 --- /dev/null +++ b/assets/js/06ea9cd1.97756b06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8296],{3905:(t,e,a)=>{a.d(e,{Zo:()=>o,kt:()=>k});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var u=n.createContext({}),m=function(t){var e=n.useContext(u),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},o=function(t){var e=m(t.components);return n.createElement(u.Provider,{value:e},t.children)},s={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},d=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,u=t.parentName,o=i(t,["components","mdxType","originalType","parentName"]),d=m(a),k=r,c=d["".concat(u,".").concat(k)]||d[k]||s[k]||l;return a?n.createElement(c,p(p({ref:e},o),{},{components:a})):n.createElement(c,p({ref:e},o))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,p=new Array(l);p[0]=d;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i.mdxType="string"==typeof t?t:r,p[1]=i;for(var m=2;m{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var n=a(87462),r=(a(67294),a(3905));const l={title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:15,tags:["Java","Class"]},p=void 0,i={permalink:"/15",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",source:"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",description:"\ud074\ub798\uc2a4 \ud30c\uc77c",date:"2023-04-03T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 3\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Class",permalink:"/tags/class"}],readingTime:5.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:"15",tags:["Java","Class"]},prevItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"},nextItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"}},u={authorsImageUrls:[]},m=[{value:"\ud074\ub798\uc2a4 \ud30c\uc77c",id:"\ud074\ub798\uc2a4-\ud30c\uc77c",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd",id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870",level:3},{value:"\ub9e4\uc9c1\ub118\ubc84",id:"\ub9e4\uc9c1\ub118\ubc84",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804",level:3},{value:"\uc0c1\uc218 \ud480",id:"\uc0c1\uc218-\ud480",level:3},{value:"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8",id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8",level:3},{value:"this_class",id:"this_class",level:3},{value:"super_class",id:"super_class",level:3},{value:"interface, field, method",id:"interface-field-method",level:3},{value:"attributes",id:"attributes",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],o={toc:m};function s(t){let{components:e,...a}=t;return(0,r.kt)("wrapper",(0,n.Z)({},o,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c"},"\ud074\ub798\uc2a4 \ud30c\uc77c"),(0,r.kt)("p",null,"\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?"),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd"},"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd"),(0,r.kt)("p",null,"8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. "),(0,r.kt)("p",null,"u1 \u2192 unsigned 1byte",(0,r.kt)("br",{parentName:"p"}),"\n","u2 \u2192 unsigned 2byte",(0,r.kt)("br",{parentName:"p"}),"\n","u4 \u2192 unsigned 4byte "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870"},"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"ClassFile {\n u4 magic;\n u2 minor_version;\n u2 major_version;\n u2 constant_pool_count;\n cp_info constant_pool[constant_pool_count-1];\n u2 access_flags;\n u2 this_class;\n u2 super_class;\n u2 interfaces_count;\n u2 interfaces[interfaces_count];\n u2 fields_count;\n field_info fields[fields_count];\n u2 methods_count;\n method_info methods[methods_count];\n u2 attributes_count;\n attribute_info attributes[attributes_count];\n}\n")),(0,r.kt)("h3",{id:"\ub9e4\uc9c1\ub118\ubc84"},"\ub9e4\uc9c1\ub118\ubc84"),(0,r.kt)("p",null,"\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D")),(0,r.kt)("p",null,"\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"UnsupportedClassVersionError")," \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"class\xa0file format major versions")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Java SE"),(0,r.kt)("th",{parentName:"tr",align:null},"Released"),(0,r.kt)("th",{parentName:"tr",align:null},"Major"),(0,r.kt)("th",{parentName:"tr",align:null},"Supported majors"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2014"),(0,r.kt)("td",{parentName:"tr",align:null},"52"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 52")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"9"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2017"),(0,r.kt)("td",{parentName:"tr",align:null},"53"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 53")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"54"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 54")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"11"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"55"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 55")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"12"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"56"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"13"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"57"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 57")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"14"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"58"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 58")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"15"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"59"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 59")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"60"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 60")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"17"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"61"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 61")))),(0,r.kt)("h3",{id:"\uc0c1\uc218-\ud480"},"\uc0c1\uc218 \ud480"),(0,r.kt)("p",null,"2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","JVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8"},"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_PUBLIC")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_INTERFACE")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_ABSTRACT"))),(0,r.kt)("p",null,"\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Class access and property modifiers")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Flag Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"),(0,r.kt)("th",{parentName:"tr",align:null},"Interpretation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_PUBLIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0001"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0public; may be accessed from outside its package.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_FINAL"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0010"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0final; no subclasses allowed.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SUPER"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0020"),(0,r.kt)("td",{parentName:"tr",align:null},"Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_INTERFACE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0200"),(0,r.kt)("td",{parentName:"tr",align:null},"Is an interface, not a class.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ABSTRACT"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0400"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0abstract; must not be instantiated.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SYNTHETIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x1000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared synthetic; not present in the source code.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ANNOTATION"),(0,r.kt)("td",{parentName:"tr",align:null},"0x2000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an annotation type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ENUM"),(0,r.kt)("td",{parentName:"tr",align:null},"0x4000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an\xa0enum\xa0type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_MODULE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x8000"),(0,r.kt)("td",{parentName:"tr",align:null},"Is a module, not a class or interface.")))),(0,r.kt)("h3",{id:"this_class"},"this_class"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 ",(0,r.kt)("inlineCode",{parentName:"p"},"CONSTANT_Class_infoclass")," \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"super_class"},"super_class"),(0,r.kt)("p",null,"\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"java.lang.Object"),"\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4."),(0,r.kt)("h3",{id:"interface-field-method"},"interface, field, method"),(0,r.kt)("p",null,"\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","interface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4."),(0,r.kt)("h3",{id:"attributes"},"attributes"),(0,r.kt)("p",null,"\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85",(0,r.kt)("br",{parentName:"p"}),"\n","\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234"),(0,r.kt)("p",null,"IntelliJ plugin - BinEd",(0,r.kt)("br",{parentName:"p"}),"\n","IntelliJ plugin - jclasslib Bytecode Viewer"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.fileformat.com/ko/programming/class/"},"Class file in Java, File Format"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html"},"java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html"},"java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0746167d.63ebf32c.js b/assets/js/0746167d.63ebf32c.js deleted file mode 100644 index 75e0ee682..000000000 --- a/assets/js/0746167d.63ebf32c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1113],{9758:e=>{e.exports=JSON.parse('{"permalink":"/tags/elastic-beanstalk","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0746167d.afac0769.js b/assets/js/0746167d.afac0769.js new file mode 100644 index 000000000..612693635 --- /dev/null +++ b/assets/js/0746167d.afac0769.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1113],{19758:e=>{e.exports=JSON.parse('{"permalink":"/tags/elastic-beanstalk","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/08726fcf.b0eaf3bf.js b/assets/js/08726fcf.b0eaf3bf.js new file mode 100644 index 000000000..0c4fe5d08 --- /dev/null +++ b/assets/js/08726fcf.b0eaf3bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5487],{38441:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/4","page":4,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java/page/3","nextPage":"/tags/java/page/5","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/08726fcf.bf8438e4.js b/assets/js/08726fcf.bf8438e4.js deleted file mode 100644 index 2b3eda386..000000000 --- a/assets/js/08726fcf.bf8438e4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5487],{8441:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/4","page":4,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java/page/3","nextPage":"/tags/java/page/5","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/087c46fa.7825b8cb.js b/assets/js/087c46fa.7825b8cb.js deleted file mode 100644 index 27be481e9..000000000 --- a/assets/js/087c46fa.7825b8cb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[96],{5774:e=>{e.exports=JSON.parse('{"label":"Spring Boot","permalink":"/tags/spring-boot","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/087c46fa.efcd5e69.js b/assets/js/087c46fa.efcd5e69.js new file mode 100644 index 000000000..a2b6d5a48 --- /dev/null +++ b/assets/js/087c46fa.efcd5e69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[96],{25774:e=>{e.exports=JSON.parse('{"label":"Spring Boot","permalink":"/tags/spring-boot","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/09fbb6bd.18013175.js b/assets/js/09fbb6bd.18013175.js deleted file mode 100644 index 974391a22..000000000 --- a/assets/js/09fbb6bd.18013175.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5964],{1679:e=>{e.exports=JSON.parse('{"permalink":"/page/16","page":16,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/15","nextPage":"/page/17","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/09fbb6bd.44263ee4.js b/assets/js/09fbb6bd.44263ee4.js new file mode 100644 index 000000000..3054576a7 --- /dev/null +++ b/assets/js/09fbb6bd.44263ee4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5964],{41679:e=>{e.exports=JSON.parse('{"permalink":"/page/16","page":16,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/15","nextPage":"/page/17","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0a2eaa84.338d4c36.js b/assets/js/0a2eaa84.338d4c36.js new file mode 100644 index 000000000..abfd1f6c2 --- /dev/null +++ b/assets/js/0a2eaa84.338d4c36.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8942],{52930:a=>{a.exports=JSON.parse('{"label":"DataBase","permalink":"/tags/data-base","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/0a2eaa84.799729e8.js b/assets/js/0a2eaa84.799729e8.js deleted file mode 100644 index 29977842d..000000000 --- a/assets/js/0a2eaa84.799729e8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8942],{2930:a=>{a.exports=JSON.parse('{"label":"DataBase","permalink":"/tags/data-base","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/0a7a6076.2d512b65.js b/assets/js/0a7a6076.2d512b65.js new file mode 100644 index 000000000..183271e8d --- /dev/null +++ b/assets/js/0a7a6076.2d512b65.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5212],{3905:(t,e,a)=>{a.d(e,{Zo:()=>m,kt:()=>d});var n=a(67294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},m=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},c=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,r=t.originalType,o=t.parentName,m=p(t,["components","mdxType","originalType","parentName"]),c=u(a),d=l,s=c["".concat(o,".").concat(d)]||c[d]||k[d]||r;return a?n.createElement(s,i(i({ref:e},m),{},{components:a})):n.createElement(s,i({ref:e},m))}));function d(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var r=a.length,i=new Array(r);i[0]=c;var p={};for(var o in e)hasOwnProperty.call(e,o)&&(p[o]=e[o]);p.originalType=t,p.mdxType="string"==typeof t?t:l,i[1]=p;for(var u=2;u{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>i,default:()=>k,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=a(87462),l=(a(67294),a(3905));const r={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:36,tags:["image","awt"]},i=void 0,p={permalink:"/36",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",source:"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",description:"./route.png",date:"2023-07-27T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 27\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:5.28,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:"36",tags:["image","awt"]},prevItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"},nextItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"}},o={authorsImageUrls:[]},u=[{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784",level:2},{value:"\uace0\ub824\ud55c \uae30\uc220",id:"\uace0\ub824\ud55c-\uae30\uc220",level:2},{value:"Python & Matplotlib",id:"python--matplotlib",level:2},{value:"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac",id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac",level:2},{value:"Java & AWT(Abstract Window Toolkit)",id:"java--awtabstract-window-toolkit",level:2},{value:"\uae30\uc220 \uc120\ud0dd",id:"\uae30\uc220-\uc120\ud0dd",level:2},{value:"\uc720\uc9c0 \ubcf4\uc218",id:"\uc720\uc9c0-\ubcf4\uc218",level:2}],m={toc:u};function k(t){let{components:e,...r}=t;return(0,l.kt)("wrapper",(0,n.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"./route.png",src:a(31887).Z,width:"1014",height:"902"})),(0,l.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784"),(0,l.kt)("p",null,"\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac"),"\uc640 ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0"),"\uc758 \uacbd\uc6b0, \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4."),(0,l.kt)("p",null,"\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,l.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,l.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9")),(0,l.kt)("p",null,"\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4."),(0,l.kt)("h2",{id:"\uace0\ub824\ud55c-\uae30\uc220"},"\uace0\ub824\ud55c \uae30\uc220"),(0,l.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Python\uc758 Matplotlib"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"AWT(Abstract Window Toolkit) ","[\ucd5c\uc885 \uc120\ud0dd]")),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)"),(0,l.kt)("li",{parentName:"ul"},"Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)")),(0,l.kt)("h2",{id:"python--matplotlib"},"Python & Matplotlib"),(0,l.kt)("p",null,"\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. "),(0,l.kt)("li",{parentName:"ul"},"AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.")),(0,l.kt)("h2",{id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac"},"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("p",null,"Python\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"\ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc81c\uc678 \uc774\uc720"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Swing"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"JavaFX"),(0,l.kt)("td",{parentName:"tr",align:null},"Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/yuriy-g/simple-java-plot"},"simple-java-plot")),(0,l.kt)("td",{parentName:"tr",align:null},"AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/sh0nk/matplotlib4j"},"matplotlib4j")),(0,l.kt)("td",{parentName:"tr",align:null},"Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c")))),(0,l.kt)("h2",{id:"java--awtabstract-window-toolkit"},"Java & AWT(Abstract Window Toolkit)"),(0,l.kt)("p",null,"\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.")),(0,l.kt)("h2",{id:"\uae30\uc220-\uc120\ud0dd"},"\uae30\uc220 \uc120\ud0dd"),(0,l.kt)("p",null,"AWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4."),(0,l.kt)("h2",{id:"\uc720\uc9c0-\ubcf4\uc218"},"\uc720\uc9c0 \ubcf4\uc218"),(0,l.kt)("p",null,"AWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. "),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4.")))}k.isMDXComponent=!0},31887:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"}}]); \ No newline at end of file diff --git a/assets/js/0a7a6076.c55b1324.js b/assets/js/0a7a6076.c55b1324.js deleted file mode 100644 index f295794d9..000000000 --- a/assets/js/0a7a6076.c55b1324.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5212],{3905:(t,e,a)=>{a.d(e,{Zo:()=>m,kt:()=>d});var n=a(7294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},m=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},c=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,r=t.originalType,o=t.parentName,m=p(t,["components","mdxType","originalType","parentName"]),c=u(a),d=l,s=c["".concat(o,".").concat(d)]||c[d]||k[d]||r;return a?n.createElement(s,i(i({ref:e},m),{},{components:a})):n.createElement(s,i({ref:e},m))}));function d(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var r=a.length,i=new Array(r);i[0]=c;var p={};for(var o in e)hasOwnProperty.call(e,o)&&(p[o]=e[o]);p.originalType=t,p.mdxType="string"==typeof t?t:l,i[1]=p;for(var u=2;u{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>i,default:()=>k,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=a(7462),l=(a(7294),a(3905));const r={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:36,tags:["image","awt"]},i=void 0,p={permalink:"/36",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",source:"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",description:"./route.png",date:"2023-07-27T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 27\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:5.28,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:"36",tags:["image","awt"]},prevItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"},nextItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"}},o={authorsImageUrls:[]},u=[{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784",level:2},{value:"\uace0\ub824\ud55c \uae30\uc220",id:"\uace0\ub824\ud55c-\uae30\uc220",level:2},{value:"Python & Matplotlib",id:"python--matplotlib",level:2},{value:"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac",id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac",level:2},{value:"Java & AWT(Abstract Window Toolkit)",id:"java--awtabstract-window-toolkit",level:2},{value:"\uae30\uc220 \uc120\ud0dd",id:"\uae30\uc220-\uc120\ud0dd",level:2},{value:"\uc720\uc9c0 \ubcf4\uc218",id:"\uc720\uc9c0-\ubcf4\uc218",level:2}],m={toc:u};function k(t){let{components:e,...r}=t;return(0,l.kt)("wrapper",(0,n.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"./route.png",src:a(1887).Z,width:"1014",height:"902"})),(0,l.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784"),(0,l.kt)("p",null,"\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac"),"\uc640 ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0"),"\uc758 \uacbd\uc6b0, \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4."),(0,l.kt)("p",null,"\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,l.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,l.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9")),(0,l.kt)("p",null,"\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4."),(0,l.kt)("h2",{id:"\uace0\ub824\ud55c-\uae30\uc220"},"\uace0\ub824\ud55c \uae30\uc220"),(0,l.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Python\uc758 Matplotlib"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"AWT(Abstract Window Toolkit) ","[\ucd5c\uc885 \uc120\ud0dd]")),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)"),(0,l.kt)("li",{parentName:"ul"},"Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)")),(0,l.kt)("h2",{id:"python--matplotlib"},"Python & Matplotlib"),(0,l.kt)("p",null,"\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. "),(0,l.kt)("li",{parentName:"ul"},"AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.")),(0,l.kt)("h2",{id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac"},"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("p",null,"Python\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"\ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc81c\uc678 \uc774\uc720"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Swing"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"JavaFX"),(0,l.kt)("td",{parentName:"tr",align:null},"Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/yuriy-g/simple-java-plot"},"simple-java-plot")),(0,l.kt)("td",{parentName:"tr",align:null},"AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/sh0nk/matplotlib4j"},"matplotlib4j")),(0,l.kt)("td",{parentName:"tr",align:null},"Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c")))),(0,l.kt)("h2",{id:"java--awtabstract-window-toolkit"},"Java & AWT(Abstract Window Toolkit)"),(0,l.kt)("p",null,"\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.")),(0,l.kt)("h2",{id:"\uae30\uc220-\uc120\ud0dd"},"\uae30\uc220 \uc120\ud0dd"),(0,l.kt)("p",null,"AWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4."),(0,l.kt)("h2",{id:"\uc720\uc9c0-\ubcf4\uc218"},"\uc720\uc9c0 \ubcf4\uc218"),(0,l.kt)("p",null,"AWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. "),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4.")))}k.isMDXComponent=!0},1887:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"}}]); \ No newline at end of file diff --git a/assets/js/0b2567db.5ea6f952.js b/assets/js/0b2567db.5ea6f952.js deleted file mode 100644 index deceef53d..000000000 --- a/assets/js/0b2567db.5ea6f952.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3578],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var m=n.createContext({}),u=function(e){var t=n.useContext(m),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(m.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,m=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=u(r),s=a,b=c["".concat(m,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var m in t)hasOwnProperty.call(t,m)&&(o[m]=t[m]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{r.r(t),r.d(t,{assets:()=>m,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:13,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/13",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",description:"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",date:"2023-04-01T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 1\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.48,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:"13",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"},nextItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"}},m={authorsImageUrls:[]},u=[{value:"Keep",id:"keep",level:3},{value:"Problem",id:"problem",level:3},{value:"Try",id:"try",level:3},{value:"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],i={toc:u};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"keep"},"Keep"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30")," "),(0,a.kt)("p",null,"\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 "),(0,a.kt)("p",null,"\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30")," "),(0,a.kt)("p",null,"10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae00\uc4f0\uae30")," "),(0,a.kt)("p",null,"\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514")," "),(0,a.kt)("p",null,"\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub808\ubca8 \uc778\ud130\ubdf0")),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\ub450\uad04\uc2dd \ud45c\ud604"),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30"),(0,a.kt)("li",{parentName:"ul"},"\ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30")),(0,a.kt)("h3",{id:"problem"},"Problem"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871")," "),(0,a.kt)("p",null,"\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"try"},"Try"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?")," "),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)")," \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0b2567db.68923e22.js b/assets/js/0b2567db.68923e22.js new file mode 100644 index 000000000..c3ee1d685 --- /dev/null +++ b/assets/js/0b2567db.68923e22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3578],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var m=n.createContext({}),u=function(e){var t=n.useContext(m),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(m.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,m=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=u(r),s=a,b=c["".concat(m,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var m in t)hasOwnProperty.call(t,m)&&(o[m]=t[m]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{r.r(t),r.d(t,{assets:()=>m,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:13,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/13",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",description:"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",date:"2023-04-01T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 1\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.48,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:"13",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"},nextItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"}},m={authorsImageUrls:[]},u=[{value:"Keep",id:"keep",level:3},{value:"Problem",id:"problem",level:3},{value:"Try",id:"try",level:3},{value:"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],i={toc:u};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"keep"},"Keep"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30")," "),(0,a.kt)("p",null,"\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 "),(0,a.kt)("p",null,"\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30")," "),(0,a.kt)("p",null,"10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae00\uc4f0\uae30")," "),(0,a.kt)("p",null,"\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514")," "),(0,a.kt)("p",null,"\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub808\ubca8 \uc778\ud130\ubdf0")),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\ub450\uad04\uc2dd \ud45c\ud604"),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30"),(0,a.kt)("li",{parentName:"ul"},"\ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30")),(0,a.kt)("h3",{id:"problem"},"Problem"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871")," "),(0,a.kt)("p",null,"\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"try"},"Try"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?")," "),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)")," \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0c071de2.b57ad227.js b/assets/js/0c071de2.b57ad227.js new file mode 100644 index 000000000..ef7b4fd4b --- /dev/null +++ b/assets/js/0c071de2.b57ad227.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[321],{23125:e=>{e.exports=JSON.parse('{"permalink":"/page/2","page":2,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/","nextPage":"/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0c071de2.e695d97e.js b/assets/js/0c071de2.e695d97e.js deleted file mode 100644 index edfa39eeb..000000000 --- a/assets/js/0c071de2.e695d97e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[321],{3125:e=>{e.exports=JSON.parse('{"permalink":"/page/2","page":2,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/","nextPage":"/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0cb009d1.3f4526e3.js b/assets/js/0cb009d1.3f4526e3.js deleted file mode 100644 index 06bf3c7c2..000000000 --- a/assets/js/0cb009d1.3f4526e3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[116],{6643:e=>{e.exports=JSON.parse('{"label":"event","permalink":"/tags/event","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/0cb009d1.ddadf169.js b/assets/js/0cb009d1.ddadf169.js new file mode 100644 index 000000000..683b11c36 --- /dev/null +++ b/assets/js/0cb009d1.ddadf169.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[116],{66643:e=>{e.exports=JSON.parse('{"label":"event","permalink":"/tags/event","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/0cb2f220.02c96c56.js b/assets/js/0cb2f220.02c96c56.js new file mode 100644 index 000000000..15c5cc440 --- /dev/null +++ b/assets/js/0cb2f220.02c96c56.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8188],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),c=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,d=m["".concat(o,".").concat(b)]||m[b]||u[b]||l;return r?n.createElement(d,p(p({ref:t},s),{},{components:r})):n.createElement(d,p({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,p=new Array(l);p[0]=m;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:a,p[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const l={title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:29,tags:["TecoChat","Retrospective"]},p=void 0,i={permalink:"/29",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",source:"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",description:"\uac1c\uc694",date:"2023-06-01T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.005,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:"29",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"},nextItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"}},o={authorsImageUrls:[]},c=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5",id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5",level:3},{value:"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c",id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c",level:3},{value:"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30",id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30",level:3},{value:"\ud5a5\ud6c4 \uacc4\ud68d",id:"\ud5a5\ud6c4-\uacc4\ud68d",level:3}],s={toc:c};function u(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc6d0\ub798 \ubaa9\uc801\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0"),"\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"GPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat1",src:r(90663).Z,width:"2878",height:"1316"})),(0,a.kt)("h3",{id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5"},"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c"},"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c"),(0,a.kt)("p",null,"\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","CSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat2",src:r(25276).Z,width:"2394",height:"1048"})),(0,a.kt)("h3",{id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30"},"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat3",src:r(14143).Z,width:"1668",height:"718"})),(0,a.kt)("p",null,"\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud5a5\ud6c4-\uacc4\ud68d"},"\ud5a5\ud6c4 \uacc4\ud68d"),(0,a.kt)("p",null,"\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0},90663:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat1-e9408e2e2f13bb192541de194ffccc6a.png"},25276:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat2-4b3b653eb2b23b88f19e8cb4177a786c.png"},14143:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat3-12a510067e4d210c13e46b7b99313307.png"}}]); \ No newline at end of file diff --git a/assets/js/0cb2f220.b257b827.js b/assets/js/0cb2f220.b257b827.js deleted file mode 100644 index 12997750c..000000000 --- a/assets/js/0cb2f220.b257b827.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8188],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),c=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,d=m["".concat(o,".").concat(b)]||m[b]||u[b]||l;return r?n.createElement(d,p(p({ref:t},s),{},{components:r})):n.createElement(d,p({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,p=new Array(l);p[0]=m;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:a,p[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const l={title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:29,tags:["TecoChat","Retrospective"]},p=void 0,i={permalink:"/29",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",source:"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",description:"\uac1c\uc694",date:"2023-06-01T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.005,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:"29",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"},nextItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"}},o={authorsImageUrls:[]},c=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5",id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5",level:3},{value:"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c",id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c",level:3},{value:"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30",id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30",level:3},{value:"\ud5a5\ud6c4 \uacc4\ud68d",id:"\ud5a5\ud6c4-\uacc4\ud68d",level:3}],s={toc:c};function u(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc6d0\ub798 \ubaa9\uc801\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0"),"\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"GPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat1",src:r(663).Z,width:"2878",height:"1316"})),(0,a.kt)("h3",{id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5"},"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c"},"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c"),(0,a.kt)("p",null,"\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","CSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat2",src:r(5276).Z,width:"2394",height:"1048"})),(0,a.kt)("h3",{id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30"},"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat3",src:r(4143).Z,width:"1668",height:"718"})),(0,a.kt)("p",null,"\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud5a5\ud6c4-\uacc4\ud68d"},"\ud5a5\ud6c4 \uacc4\ud68d"),(0,a.kt)("p",null,"\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0},663:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat1-e9408e2e2f13bb192541de194ffccc6a.png"},5276:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat2-4b3b653eb2b23b88f19e8cb4177a786c.png"},4143:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat3-12a510067e4d210c13e46b7b99313307.png"}}]); \ No newline at end of file diff --git a/assets/js/0d47646f.f3a0b915.js b/assets/js/0d47646f.f3a0b915.js new file mode 100644 index 000000000..8660a83f0 --- /dev/null +++ b/assets/js/0d47646f.f3a0b915.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2342],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,f=d["".concat(p,".").concat(m)]||d[m]||s[m]||a;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:o,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(87462),o=(r(67294),r(3905));const a={title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",tags:["monitoring"]},l=void 0,i={unversionedId:"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",id:"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",description:"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4",source:"@site/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131.mdx",sourceDirName:"\ubaa8\ub2c8\ud130\ub9c1",slug:"/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",permalink:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131.mdx",tags:[{label:"monitoring",permalink:"/docs/tags/monitoring"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",tags:["monitoring"]},sidebar:"tutorialSidebar",previous:{title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815"},next:{title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",permalink:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c"}},p={},c=[{value:"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4",id:"\ubaa8\ub2c8\ud130\ub9c1-3\ub2e8\uacc4",level:3},{value:"\ubaa8\ub2c8\ud130\ub9c1 \ub300\uc0c1",id:"\ubaa8\ub2c8\ud130\ub9c1-\ub300\uc0c1",level:3},{value:"\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucd94\uc801",id:"\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\ucd94\uc801",level:3},{value:"\ub85c\uadf8",id:"\ub85c\uadf8",level:3},{value:"\ubaa8\ub2c8\ud130\ub9c1",id:"\ubaa8\ub2c8\ud130\ub9c1",level:3},{value:"\uc54c\ub78c",id:"\uc54c\ub78c",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ubaa8\ub2c8\ud130\ub9c1-3\ub2e8\uacc4"},"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4"),(0,o.kt)("p",null,"\ub300\uc2dc\ubcf4\ub4dc",(0,o.kt)("br",{parentName:"p"}),"\n","\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucd94\uc801 - \ud540\ud3ec\uc778\ud2b8",(0,o.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8 "),(0,o.kt)("h3",{id:"\ubaa8\ub2c8\ud130\ub9c1-\ub300\uc0c1"},"\ubaa8\ub2c8\ud130\ub9c1 \ub300\uc0c1"),(0,o.kt)("p",null,"\uc2dc\uc2a4\ud15c \uba54\ud2b8\ub9ad(CPU, \uba54\ubaa8\ub9ac)",(0,o.kt)("br",{parentName:"p"}),"\n","\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uba54\ud2b8\ub9ad(Thread Pool, Connection Pool, \ud638\ucd9c \uc218)",(0,o.kt)("br",{parentName:"p"}),"\n","\ube44\uc988\ub2c8\uc2a4 \uba54\ud2b8\ub9ad"),(0,o.kt)("h3",{id:"\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\ucd94\uc801"},"\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucd94\uc801"),(0,o.kt)("p",null,"\uac01\uac01\uc758 HTTP \uc694\uccad \ucd94\uc801",(0,o.kt)("br",{parentName:"p"}),"\n","\ud540\ud3ec\uc778\ud2b8, \uc2a4\uce74\uc6b0\ud2b8, \uc640\ud0ed, \uc81c\ub2c8\ud37c "),(0,o.kt)("h3",{id:"\ub85c\uadf8"},"\ub85c\uadf8"),(0,o.kt)("p",null,"\uac00\uc7a5 \uc138\uc138\ud55c \ucd94\uc801",(0,o.kt)("br",{parentName:"p"}),"\n","\uac19\uc740 HTTP \uc694\uccad\uc744 \ubb36\uc5b4\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \uc911\uc694\ud558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","MDC(Mapped Diagnostic Context) \uc801\uc6a9"),(0,o.kt)("p",null,"\ud30c\uc77c\ub85c \uc9c1\uc811 \ub85c\uadf8\ub97c \ub0a8\uae30\ub294 \uacbd\uc6b0 \u2192 \uc77c\ubc18 \ub85c\uadf8\uc640 \uc5d0\ub7ec \ub85c\uadf8 \ud30c\uc77c\uc744 \uad6c\ubd84\ud574\uc11c \ub0a8\uaca8\uc57c \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ud074\ub77c\uc6b0\ub4dc\uc5d0 \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0 \u2192 \uac80\uc0c9\uc774 \uc798 \ub418\ub3c4\ub85d \uad6c\ubd84\ud55c\ub2e4. "),(0,o.kt)("h3",{id:"\ubaa8\ub2c8\ud130\ub9c1"},"\ubaa8\ub2c8\ud130\ub9c1"),(0,o.kt)("p",null,"\uad00\ucc30\uc758 \uacbd\uc6b0 \uc804\uccb4 \u2192 \uc881\uac8c"),(0,o.kt)("h3",{id:"\uc54c\ub78c"},"\uc54c\ub78c"),(0,o.kt)("p",null,"\uc54c\ub78c\uc758 \uacbd\uc6b0 2\uac00\uc9c0 \uc885\ub958(\uacbd\uace0, \uc2ec\uac01)\ub85c \uad6c\ubd84\ud574\uc11c \uad00\ub9ac\ud55c\ub2e4."),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ud575\uc2ec \uc6d0\ub9ac\uc640 \ud65c\uc6a9, \uae40\uc601\ud55c"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0d47646f.f43e043a.js b/assets/js/0d47646f.f43e043a.js deleted file mode 100644 index 38dd972cc..000000000 --- a/assets/js/0d47646f.f43e043a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2342],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,f=d["".concat(p,".").concat(m)]||d[m]||s[m]||a;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:o,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const a={title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",tags:["monitoring"]},l=void 0,i={unversionedId:"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",id:"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",description:"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4",source:"@site/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131.mdx",sourceDirName:"\ubaa8\ub2c8\ud130\ub9c1",slug:"/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",permalink:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131.mdx",tags:[{label:"monitoring",permalink:"/docs/tags/monitoring"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",tags:["monitoring"]},sidebar:"tutorialSidebar",previous:{title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815"},next:{title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",permalink:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c"}},p={},c=[{value:"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4",id:"\ubaa8\ub2c8\ud130\ub9c1-3\ub2e8\uacc4",level:3},{value:"\ubaa8\ub2c8\ud130\ub9c1 \ub300\uc0c1",id:"\ubaa8\ub2c8\ud130\ub9c1-\ub300\uc0c1",level:3},{value:"\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucd94\uc801",id:"\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\ucd94\uc801",level:3},{value:"\ub85c\uadf8",id:"\ub85c\uadf8",level:3},{value:"\ubaa8\ub2c8\ud130\ub9c1",id:"\ubaa8\ub2c8\ud130\ub9c1",level:3},{value:"\uc54c\ub78c",id:"\uc54c\ub78c",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ubaa8\ub2c8\ud130\ub9c1-3\ub2e8\uacc4"},"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4"),(0,o.kt)("p",null,"\ub300\uc2dc\ubcf4\ub4dc",(0,o.kt)("br",{parentName:"p"}),"\n","\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucd94\uc801 - \ud540\ud3ec\uc778\ud2b8",(0,o.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8 "),(0,o.kt)("h3",{id:"\ubaa8\ub2c8\ud130\ub9c1-\ub300\uc0c1"},"\ubaa8\ub2c8\ud130\ub9c1 \ub300\uc0c1"),(0,o.kt)("p",null,"\uc2dc\uc2a4\ud15c \uba54\ud2b8\ub9ad(CPU, \uba54\ubaa8\ub9ac)",(0,o.kt)("br",{parentName:"p"}),"\n","\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uba54\ud2b8\ub9ad(Thread Pool, Connection Pool, \ud638\ucd9c \uc218)",(0,o.kt)("br",{parentName:"p"}),"\n","\ube44\uc988\ub2c8\uc2a4 \uba54\ud2b8\ub9ad"),(0,o.kt)("h3",{id:"\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\ucd94\uc801"},"\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucd94\uc801"),(0,o.kt)("p",null,"\uac01\uac01\uc758 HTTP \uc694\uccad \ucd94\uc801",(0,o.kt)("br",{parentName:"p"}),"\n","\ud540\ud3ec\uc778\ud2b8, \uc2a4\uce74\uc6b0\ud2b8, \uc640\ud0ed, \uc81c\ub2c8\ud37c "),(0,o.kt)("h3",{id:"\ub85c\uadf8"},"\ub85c\uadf8"),(0,o.kt)("p",null,"\uac00\uc7a5 \uc138\uc138\ud55c \ucd94\uc801",(0,o.kt)("br",{parentName:"p"}),"\n","\uac19\uc740 HTTP \uc694\uccad\uc744 \ubb36\uc5b4\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \uc911\uc694\ud558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","MDC(Mapped Diagnostic Context) \uc801\uc6a9"),(0,o.kt)("p",null,"\ud30c\uc77c\ub85c \uc9c1\uc811 \ub85c\uadf8\ub97c \ub0a8\uae30\ub294 \uacbd\uc6b0 \u2192 \uc77c\ubc18 \ub85c\uadf8\uc640 \uc5d0\ub7ec \ub85c\uadf8 \ud30c\uc77c\uc744 \uad6c\ubd84\ud574\uc11c \ub0a8\uaca8\uc57c \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ud074\ub77c\uc6b0\ub4dc\uc5d0 \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0 \u2192 \uac80\uc0c9\uc774 \uc798 \ub418\ub3c4\ub85d \uad6c\ubd84\ud55c\ub2e4. "),(0,o.kt)("h3",{id:"\ubaa8\ub2c8\ud130\ub9c1"},"\ubaa8\ub2c8\ud130\ub9c1"),(0,o.kt)("p",null,"\uad00\ucc30\uc758 \uacbd\uc6b0 \uc804\uccb4 \u2192 \uc881\uac8c"),(0,o.kt)("h3",{id:"\uc54c\ub78c"},"\uc54c\ub78c"),(0,o.kt)("p",null,"\uc54c\ub78c\uc758 \uacbd\uc6b0 2\uac00\uc9c0 \uc885\ub958(\uacbd\uace0, \uc2ec\uac01)\ub85c \uad6c\ubd84\ud574\uc11c \uad00\ub9ac\ud55c\ub2e4."),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ud575\uc2ec \uc6d0\ub9ac\uc640 \ud65c\uc6a9, \uae40\uc601\ud55c"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e9b73e4.b903d938.js b/assets/js/0e9b73e4.b903d938.js deleted file mode 100644 index 28b1cf721..000000000 --- a/assets/js/0e9b73e4.b903d938.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9823],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,f=m["".concat(i,".").concat(b)]||m[b]||s[b]||o;return r?n.createElement(f,p(p({ref:t},u),{},{components:r})):n.createElement(f,p({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:31,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/31",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",description:"\ub808\ubca8 \uc778\ud130\ubdf0",date:"2023-06-08T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 8\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.435,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:"31",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"},nextItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"}},i={authorsImageUrls:[]},c=[{value:"\ub808\ubca8 \uc778\ud130\ubdf0",id:"\ub808\ubca8-\uc778\ud130\ubdf0",level:3},{value:"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd",id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd",level:3},{value:"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158",id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158",level:3},{value:"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810",id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ub808\ubca8-\uc778\ud130\ubdf0"},"\ub808\ubca8 \uc778\ud130\ubdf0"),(0,a.kt)("p",null,"\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd"},"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd"),(0,a.kt)("p",null,"\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4."),(0,a.kt)("p",null,"\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d")),(0,a.kt)("h3",{id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158"},"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158"),(0,a.kt)("p",null,"PUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810"},"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810"),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n",'\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c "\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30',(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e9b73e4.cc55e086.js b/assets/js/0e9b73e4.cc55e086.js new file mode 100644 index 000000000..3bf616e12 --- /dev/null +++ b/assets/js/0e9b73e4.cc55e086.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9823],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,f=m["".concat(i,".").concat(b)]||m[b]||s[b]||o;return r?n.createElement(f,p(p({ref:t},u),{},{components:r})):n.createElement(f,p({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:31,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/31",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",description:"\ub808\ubca8 \uc778\ud130\ubdf0",date:"2023-06-08T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 8\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.435,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:"31",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"},nextItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"}},i={authorsImageUrls:[]},c=[{value:"\ub808\ubca8 \uc778\ud130\ubdf0",id:"\ub808\ubca8-\uc778\ud130\ubdf0",level:3},{value:"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd",id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd",level:3},{value:"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158",id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158",level:3},{value:"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810",id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ub808\ubca8-\uc778\ud130\ubdf0"},"\ub808\ubca8 \uc778\ud130\ubdf0"),(0,a.kt)("p",null,"\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd"},"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd"),(0,a.kt)("p",null,"\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4."),(0,a.kt)("p",null,"\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d")),(0,a.kt)("h3",{id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158"},"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158"),(0,a.kt)("p",null,"PUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810"},"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810"),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n",'\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c "\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30',(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ecaa6ec.1c7c46fb.js b/assets/js/0ecaa6ec.1c7c46fb.js new file mode 100644 index 000000000..2d42b5a3c --- /dev/null +++ b/assets/js/0ecaa6ec.1c7c46fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6304],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=c(r),f=a,b=m["".concat(i,".").concat(f)]||m[f]||s[f]||o;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p.mdxType="string"==typeof e?e:a,l[1]=p;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:32,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,p={permalink:"/32",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",description:"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",date:"2023-06-11T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 11\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:2.545,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:"32",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"Docusaurus",permalink:"/33"},nextItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"}},i={authorsImageUrls:[]},c=[{value:"\ud559\uc2b5",id:"\ud559\uc2b5",level:3},{value:"\uc218\uba74",id:"\uc218\uba74",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. "),(0,a.kt)("h3",{id:"\ud559\uc2b5"},"\ud559\uc2b5"),(0,a.kt)("p",null,"\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc218\uba74"},"\uc218\uba74"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ecaa6ec.c709cdd9.js b/assets/js/0ecaa6ec.c709cdd9.js deleted file mode 100644 index 2d692dda1..000000000 --- a/assets/js/0ecaa6ec.c709cdd9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6304],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=c(r),f=a,b=m["".concat(i,".").concat(f)]||m[f]||s[f]||o;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p.mdxType="string"==typeof e?e:a,l[1]=p;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:32,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,p={permalink:"/32",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",description:"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",date:"2023-06-11T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 11\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:2.545,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:"32",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"Docusaurus",permalink:"/33"},nextItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"}},i={authorsImageUrls:[]},c=[{value:"\ud559\uc2b5",id:"\ud559\uc2b5",level:3},{value:"\uc218\uba74",id:"\uc218\uba74",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. "),(0,a.kt)("h3",{id:"\ud559\uc2b5"},"\ud559\uc2b5"),(0,a.kt)("p",null,"\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc218\uba74"},"\uc218\uba74"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0f9a8782.2f044698.js b/assets/js/0f9a8782.2f044698.js deleted file mode 100644 index 2fa0f7cc3..000000000 --- a/assets/js/0f9a8782.2f044698.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[782],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),o=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=o(e.components);return a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),m=o(n),k=r,d=m["".concat(s,".").concat(k)]||m[k]||u[k]||l;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var o=2;o{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var a=n(7462),r=(n(7294),n(3905));const l={title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:23,tags:["TecoChat","Retrospective"]},i=void 0,p={permalink:"/23",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",source:"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",description:"\ud504\ub860\ud2b8\uc5d4\ud2b8",date:"2023-05-01T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.67,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:"23",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"},nextItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"}},s={authorsImageUrls:[]},o=[{value:"\ud504\ub860\ud2b8\uc5d4\ud2b8",id:"\ud504\ub860\ud2b8\uc5d4\ud2b8",level:3},{value:"\ubc31\uc5d4\ub4dc",id:"\ubc31\uc5d4\ub4dc",level:3},{value:"Http Request Header",id:"http-request-header",level:3},{value:"Elastic Beanstalk",id:"elastic-beanstalk",level:3},{value:"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac",id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac",level:3},{value:"Elastic Beanstalk nginx \uc124\uc815",id:"elastic-beanstalk-nginx-\uc124\uc815",level:3},{value:"Jenkins",id:"jenkins",level:3},{value:"Jenkins Blue Ocean",id:"jenkins-blue-ocean",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:o};function u(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud504\ub860\ud2b8\uc5d4\ud2b8"},"\ud504\ub860\ud2b8\uc5d4\ud2b8"),(0,r.kt)("p",null,"\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\ubc31\uc5d4\ub4dc"},"\ubc31\uc5d4\ub4dc"),(0,r.kt)("p",null,"\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,r.kt)("h3",{id:"http-request-header"},"Http Request Header"),(0,r.kt)("p",null,"\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const encodedName = () => {\n const uriComponent = unescape(encodeURIComponent(name.value));\n return btoa(uriComponent);\n};\n")),(0,r.kt)("h3",{id:"elastic-beanstalk"},"Elastic Beanstalk"),(0,r.kt)("p",null,"\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac"},"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac"),(0,r.kt)("p",null,"\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","RDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-nginx-\uc124\uc815"},"Elastic Beanstalk nginx \uc124\uc815"),(0,r.kt)("p",null,"\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},".platform/nginx/conf.d/")," \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"jenkins"},"Jenkins"),(0,r.kt)("p",null,"\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","t4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},'test {\n maxHeapSize = "1024m"\n}\n')),(0,r.kt)("h3",{id:"jenkins-blue-ocean"},"Jenkins Blue Ocean"),(0,r.kt)("p",null,"Blue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",'\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 "Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. '),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html"},"Elastic Beanstalk, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/ec2/graviton/"},"EC2 AWS Graviton, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings"},"Default Memory Settings, AWS")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0f9a8782.91c52f55.js b/assets/js/0f9a8782.91c52f55.js new file mode 100644 index 000000000..eeee09ab0 --- /dev/null +++ b/assets/js/0f9a8782.91c52f55.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[782],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>k});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),o=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=o(e.components);return a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),m=o(n),k=r,d=m["".concat(s,".").concat(k)]||m[k]||u[k]||l;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var o=2;o{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var a=n(87462),r=(n(67294),n(3905));const l={title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:23,tags:["TecoChat","Retrospective"]},i=void 0,p={permalink:"/23",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",source:"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",description:"\ud504\ub860\ud2b8\uc5d4\ud2b8",date:"2023-05-01T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.67,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:"23",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"},nextItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"}},s={authorsImageUrls:[]},o=[{value:"\ud504\ub860\ud2b8\uc5d4\ud2b8",id:"\ud504\ub860\ud2b8\uc5d4\ud2b8",level:3},{value:"\ubc31\uc5d4\ub4dc",id:"\ubc31\uc5d4\ub4dc",level:3},{value:"Http Request Header",id:"http-request-header",level:3},{value:"Elastic Beanstalk",id:"elastic-beanstalk",level:3},{value:"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac",id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac",level:3},{value:"Elastic Beanstalk nginx \uc124\uc815",id:"elastic-beanstalk-nginx-\uc124\uc815",level:3},{value:"Jenkins",id:"jenkins",level:3},{value:"Jenkins Blue Ocean",id:"jenkins-blue-ocean",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:o};function u(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud504\ub860\ud2b8\uc5d4\ud2b8"},"\ud504\ub860\ud2b8\uc5d4\ud2b8"),(0,r.kt)("p",null,"\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\ubc31\uc5d4\ub4dc"},"\ubc31\uc5d4\ub4dc"),(0,r.kt)("p",null,"\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,r.kt)("h3",{id:"http-request-header"},"Http Request Header"),(0,r.kt)("p",null,"\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const encodedName = () => {\n const uriComponent = unescape(encodeURIComponent(name.value));\n return btoa(uriComponent);\n};\n")),(0,r.kt)("h3",{id:"elastic-beanstalk"},"Elastic Beanstalk"),(0,r.kt)("p",null,"\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac"},"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac"),(0,r.kt)("p",null,"\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","RDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-nginx-\uc124\uc815"},"Elastic Beanstalk nginx \uc124\uc815"),(0,r.kt)("p",null,"\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},".platform/nginx/conf.d/")," \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"jenkins"},"Jenkins"),(0,r.kt)("p",null,"\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","t4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},'test {\n maxHeapSize = "1024m"\n}\n')),(0,r.kt)("h3",{id:"jenkins-blue-ocean"},"Jenkins Blue Ocean"),(0,r.kt)("p",null,"Blue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",'\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 "Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. '),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html"},"Elastic Beanstalk, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/ec2/graviton/"},"EC2 AWS Graviton, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings"},"Default Memory Settings, AWS")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12cbeba7.3e9be6a2.js b/assets/js/12cbeba7.3e9be6a2.js deleted file mode 100644 index 9754d1357..000000000 --- a/assets/js/12cbeba7.3e9be6a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6508],{6134:e=>{e.exports=JSON.parse('{"permalink":"/page/29","page":29,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/28","nextPage":"/page/30","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/12cbeba7.dd36b7ee.js b/assets/js/12cbeba7.dd36b7ee.js new file mode 100644 index 000000000..b232e94b9 --- /dev/null +++ b/assets/js/12cbeba7.dd36b7ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6508],{16134:e=>{e.exports=JSON.parse('{"permalink":"/page/29","page":29,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/28","nextPage":"/page/30","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/14164549.19fdb006.js b/assets/js/14164549.19fdb006.js deleted file mode 100644 index a8460b620..000000000 --- a/assets/js/14164549.19fdb006.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7268],{1279:e=>{e.exports=JSON.parse('{"permalink":"/tags/book","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/book/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/14164549.7a0bdef8.js b/assets/js/14164549.7a0bdef8.js new file mode 100644 index 000000000..bd15972a2 --- /dev/null +++ b/assets/js/14164549.7a0bdef8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7268],{11279:e=>{e.exports=JSON.parse('{"permalink":"/tags/book","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/book/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/1563fc8b.e1b4fa1d.js b/assets/js/1563fc8b.e1b4fa1d.js deleted file mode 100644 index c459e8814..000000000 --- a/assets/js/1563fc8b.e1b4fa1d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9690],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},i=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,c=e.parentName,i=u(e,["components","mdxType","originalType","parentName"]),b=p(r),m=o,s=b["".concat(c,".").concat(m)]||b[m]||k[m]||l;return r?n.createElement(s,a(a({ref:t},i),{},{components:r})):n.createElement(s,a({ref:t},i))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,a=new Array(l);a[0]=b;var u={};for(var c in t)hasOwnProperty.call(t,c)&&(u[c]=t[c]);u.originalType=e,u.mdxType="string"==typeof e?e:o,a[1]=u;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const l={title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:1,tags:["Book"]},a=void 0,u={permalink:"/1",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",source:"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",description:"\ucc45 \uc815\ubcf4",date:"2023-01-01T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 1\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:4.425,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:"1",tags:["Book"]},prevItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},c={authorsImageUrls:[]},p=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:p};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ubc15\uc194\ubbf8 ")),(0,o.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,o.kt)("p",null,"\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. "),(0,o.kt)("p",null,"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,o.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1563fc8b.e56f65f4.js b/assets/js/1563fc8b.e56f65f4.js new file mode 100644 index 000000000..f30878fee --- /dev/null +++ b/assets/js/1563fc8b.e56f65f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9690],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},i=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,c=e.parentName,i=u(e,["components","mdxType","originalType","parentName"]),b=p(r),m=o,s=b["".concat(c,".").concat(m)]||b[m]||k[m]||l;return r?n.createElement(s,a(a({ref:t},i),{},{components:r})):n.createElement(s,a({ref:t},i))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,a=new Array(l);a[0]=b;var u={};for(var c in t)hasOwnProperty.call(t,c)&&(u[c]=t[c]);u.originalType=e,u.mdxType="string"==typeof e?e:o,a[1]=u;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const l={title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:1,tags:["Book"]},a=void 0,u={permalink:"/1",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",source:"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",description:"\ucc45 \uc815\ubcf4",date:"2023-01-01T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 1\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:4.425,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:"1",tags:["Book"]},prevItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},c={authorsImageUrls:[]},p=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:p};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ubc15\uc194\ubbf8 ")),(0,o.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,o.kt)("p",null,"\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. "),(0,o.kt)("p",null,"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,o.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/303c1e60.a06a11f0.js b/assets/js/16cc6f3a.1d0d6548.js similarity index 70% rename from assets/js/303c1e60.a06a11f0.js rename to assets/js/16cc6f3a.1d0d6548.js index b53d7cc58..e030a898e 100644 --- a/assets/js/303c1e60.a06a11f0.js +++ b/assets/js/16cc6f3a.1d0d6548.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2656],{9529:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[425],{12946:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/16cc6f3a.9aaf08be.js b/assets/js/16cc6f3a.9aaf08be.js deleted file mode 100644 index 7de069a42..000000000 --- a/assets/js/16cc6f3a.9aaf08be.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[425],{2946:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/17896441.9546f07c.js b/assets/js/17896441.9546f07c.js deleted file mode 100644 index 0b6898cd2..000000000 --- a/assets/js/17896441.9546f07c.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7918],{8945:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>ve});var a=n(7294),l=n(833),r=n(902);const s=a.createContext(null);function o(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(s.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(s);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(6010),m=n(7524),u=n(7462),v=n(5999),h=n(2244);function b(e){const{previous:t,next:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,v.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&a.createElement(h.Z,(0,u.Z)({},t,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&a.createElement(h.Z,(0,u.Z)({},n,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}function f(){const{metadata:e}=c();return a.createElement(b,{previous:e.previous,next:e.next})}var p=n(2263),E=n(9960),g=n(143),L=n(5281),N=n(373),k=n(4477);const _={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function Z(e){const t=_[e.versionMetadata.banner];return a.createElement(t,e)}function C(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(v.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(E.Z,{to:n,onClick:l},a.createElement(v.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:l}}=(0,p.Z)(),{pluginId:r}=(0,g.gA)({failfast:!0}),{savePreferredVersionName:s}=(0,N.J)(r),{latestDocSuggestion:o,latestVersionSuggestion:c}=(0,g.Jo)(r),i=o??(m=c).docs.find((e=>e.id===m.mainDocId));var m;return a.createElement("div",{className:(0,d.Z)(t,L.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(Z,{siteTitle:l,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(C,{versionLabel:c.label,to:i.path,onClick:()=>s(c.name)})))}function T(e){let{className:t}=e;const n=(0,k.E)();return n.banner?a.createElement(x,{className:t,versionMetadata:n}):null}function y(e){let{className:t}=e;const n=(0,k.E)();return n.badge?a.createElement("span",{className:(0,d.Z)(t,L.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(v.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}function U(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function H(e){let{lastUpdatedBy:t}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function w(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:L.k.common.lastUpdated},a.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(U,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(H,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var A=n(4881),M=n(1526);const B="lastUpdated_vwxv";function I(e){return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(M.Z,e)))}function O(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(A.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",B)},(n||l)&&a.createElement(w,{lastUpdatedAt:n,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function V(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:s}=e,o=s.length>0,i=!!(t||n||r);return o||i?a.createElement("footer",{className:(0,d.Z)(L.k.docs.docFooter,"docusaurus-mt-lg")},o&&a.createElement(I,{tags:s}),i&&a.createElement(O,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var D=n(6043),S=n(3743);const P="tocCollapsibleButton_TO0P",R="tocCollapsibleButtonExpanded_MG3E";function F(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,u.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",P,!t&&R,n.className)}),a.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const j="tocCollapsible_ETCw",z="tocCollapsibleContent_vkbj",q="tocCollapsibleExpanded_sAul";function $(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:s,toggleCollapsed:o}=(0,D.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(j,!s&&q,n)},a.createElement(F,{collapsed:s,onClick:o}),a.createElement(D.z,{lazy:!0,className:z,collapsed:s},a.createElement(S.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const G="tocMobile_ITEo";function J(){const{toc:e,frontMatter:t}=c();return a.createElement($,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(L.k.docs.docTocMobile,G)})}var Y=n(9407);function K(){const{toc:e,frontMatter:t}=c();return a.createElement(Y.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:L.k.docs.docTocDesktop})}var Q=n(7955),W=n(4155);function X(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(L.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(Q.Z,{as:"h1"},n)),a.createElement(W.Z,null,t))}var ee=n(3438),te=n(8596),ne=n(4996);function ae(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const le="breadcrumbHomeIcon_YNFT";function re(){const e=(0,ne.Z)("/");return a.createElement("li",{className:"breadcrumbs__item"},a.createElement(E.Z,{"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},a.createElement(ae,{className:le})))}const se="breadcrumbsContainer_Z_bl";function oe(e){let{children:t,href:n,isLast:l}=e;const r="breadcrumbs__link";return l?a.createElement("span",{className:r,itemProp:"name"},t):n?a.createElement(E.Z,{className:r,href:n,itemProp:"item"},a.createElement("span",{itemProp:"name"},t)):a.createElement("span",{className:r},t)}function ce(e){let{children:t,active:n,index:l,addMicrodata:r}=e;return a.createElement("li",(0,u.Z)({},r&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,d.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,a.createElement("meta",{itemProp:"position",content:String(l+1)}))}function ie(){const e=(0,ee.s1)(),t=(0,te.Ns)();return e?a.createElement("nav",{className:(0,d.Z)(L.k.docs.docBreadcrumbs,se),"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},a.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&a.createElement(re,null),e.map(((t,n)=>{const l=n===e.length-1;return a.createElement(ce,{key:n,active:l,index:n,addMicrodata:!!t.href},a.createElement(oe,{href:t.href,isLast:l},t.label))})))):null}const de="docItemContainer_Djhp",me="docItemCol_VOVn";function ue(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?a.createElement(J,null):void 0,desktop:!r||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(K,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&me)},a.createElement(T,null),a.createElement("div",{className:de},a.createElement("article",null,a.createElement(ie,null),a.createElement(y,null),n.mobile,a.createElement(X,null,t),a.createElement(V,null)),a.createElement(f,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function ve(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(o,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement(ue,null,a.createElement(n,null))))}},9407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(7462),l=n(7294),r=n(6010),s=n(3743);const o="tableOfContents_bqdL";function c(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(o,"thin-scrollbar",t)},l.createElement(s.Z,(0,a.Z)({},n,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}},3743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var a=n(7462),l=n(7294),r=n(6668);function s(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function o(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=o({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:s}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:s}),c=i(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function h(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...h}=e;const b=(0,r.L)(),f=d??b.tableOfContents.minHeadingLevel,p=u??b.tableOfContents.maxHeadingLevel,E=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>o({toc:s(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:f,maxHeadingLevel:p});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:f,maxHeadingLevel:p}}),[c,i,f,p])),l.createElement(v,(0,a.Z)({toc:E,className:n,linkClassName:c},h))}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>o,q:()=>s});var a=n(7294),l=n(902);const r=a.createContext(null);function s(e){let{children:t,version:n}=e;return a.createElement(r.Provider,{value:n},t)}function o(){const e=(0,a.useContext)(r);if(null===e)throw new l.i6("DocsVersionProvider");return e}},1748:(e,t,n)=>{var a={"./locale":9234,"./locale.js":9234};function l(e){var t=r(e);return n(t)}function r(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}l.keys=function(){return Object.keys(a)},l.resolve=r,e.exports=l,l.id=1748}}]); \ No newline at end of file diff --git a/assets/js/17896441.d467f5c1.js b/assets/js/17896441.d467f5c1.js new file mode 100644 index 000000000..65e447967 --- /dev/null +++ b/assets/js/17896441.d467f5c1.js @@ -0,0 +1 @@ +(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7918],{78945:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>ve});var a=n(67294),l=n(10833),r=n(902);const s=a.createContext(null);function o(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(s.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(s);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(86010),m=n(87524),u=n(87462),v=n(95999),h=n(32244);function b(e){const{previous:t,next:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,v.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&a.createElement(h.Z,(0,u.Z)({},t,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&a.createElement(h.Z,(0,u.Z)({},n,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}function f(){const{metadata:e}=c();return a.createElement(b,{previous:e.previous,next:e.next})}var p=n(52263),E=n(39960),g=n(80143),L=n(35281),N=n(60373),k=n(74477);const _={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function Z(e){const t=_[e.versionMetadata.banner];return a.createElement(t,e)}function C(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(v.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(E.Z,{to:n,onClick:l},a.createElement(v.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:l}}=(0,p.Z)(),{pluginId:r}=(0,g.gA)({failfast:!0}),{savePreferredVersionName:s}=(0,N.J)(r),{latestDocSuggestion:o,latestVersionSuggestion:c}=(0,g.Jo)(r),i=o??(m=c).docs.find((e=>e.id===m.mainDocId));var m;return a.createElement("div",{className:(0,d.Z)(t,L.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(Z,{siteTitle:l,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(C,{versionLabel:c.label,to:i.path,onClick:()=>s(c.name)})))}function T(e){let{className:t}=e;const n=(0,k.E)();return n.banner?a.createElement(x,{className:t,versionMetadata:n}):null}function y(e){let{className:t}=e;const n=(0,k.E)();return n.badge?a.createElement("span",{className:(0,d.Z)(t,L.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(v.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}function U(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function H(e){let{lastUpdatedBy:t}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function w(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:L.k.common.lastUpdated},a.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(U,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(H,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var A=n(84881),M=n(71526);const B="lastUpdated_vwxv";function I(e){return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(M.Z,e)))}function O(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(A.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",B)},(n||l)&&a.createElement(w,{lastUpdatedAt:n,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function V(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:s}=e,o=s.length>0,i=!!(t||n||r);return o||i?a.createElement("footer",{className:(0,d.Z)(L.k.docs.docFooter,"docusaurus-mt-lg")},o&&a.createElement(I,{tags:s}),i&&a.createElement(O,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var D=n(86043),S=n(93743);const P="tocCollapsibleButton_TO0P",R="tocCollapsibleButtonExpanded_MG3E";function F(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,u.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",P,!t&&R,n.className)}),a.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const j="tocCollapsible_ETCw",z="tocCollapsibleContent_vkbj",q="tocCollapsibleExpanded_sAul";function $(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:s,toggleCollapsed:o}=(0,D.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(j,!s&&q,n)},a.createElement(F,{collapsed:s,onClick:o}),a.createElement(D.z,{lazy:!0,className:z,collapsed:s},a.createElement(S.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const G="tocMobile_ITEo";function J(){const{toc:e,frontMatter:t}=c();return a.createElement($,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(L.k.docs.docTocMobile,G)})}var Y=n(39407);function K(){const{toc:e,frontMatter:t}=c();return a.createElement(Y.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:L.k.docs.docTocDesktop})}var Q=n(92503),W=n(4155);function X(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(L.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(Q.Z,{as:"h1"},n)),a.createElement(W.Z,null,t))}var ee=n(53438),te=n(48596),ne=n(44996);function ae(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const le="breadcrumbHomeIcon_YNFT";function re(){const e=(0,ne.Z)("/");return a.createElement("li",{className:"breadcrumbs__item"},a.createElement(E.Z,{"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},a.createElement(ae,{className:le})))}const se="breadcrumbsContainer_Z_bl";function oe(e){let{children:t,href:n,isLast:l}=e;const r="breadcrumbs__link";return l?a.createElement("span",{className:r,itemProp:"name"},t):n?a.createElement(E.Z,{className:r,href:n,itemProp:"item"},a.createElement("span",{itemProp:"name"},t)):a.createElement("span",{className:r},t)}function ce(e){let{children:t,active:n,index:l,addMicrodata:r}=e;return a.createElement("li",(0,u.Z)({},r&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,d.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,a.createElement("meta",{itemProp:"position",content:String(l+1)}))}function ie(){const e=(0,ee.s1)(),t=(0,te.Ns)();return e?a.createElement("nav",{className:(0,d.Z)(L.k.docs.docBreadcrumbs,se),"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},a.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&a.createElement(re,null),e.map(((t,n)=>{const l=n===e.length-1;return a.createElement(ce,{key:n,active:l,index:n,addMicrodata:!!t.href},a.createElement(oe,{href:t.href,isLast:l},t.label))})))):null}const de="docItemContainer_Djhp",me="docItemCol_VOVn";function ue(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?a.createElement(J,null):void 0,desktop:!r||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(K,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&me)},a.createElement(T,null),a.createElement("div",{className:de},a.createElement("article",null,a.createElement(ie,null),a.createElement(y,null),n.mobile,a.createElement(X,null,t),a.createElement(V,null)),a.createElement(f,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function ve(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(o,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement(ue,null,a.createElement(n,null))))}},39407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(87462),l=n(67294),r=n(86010),s=n(93743);const o="tableOfContents_bqdL";function c(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(o,"thin-scrollbar",t)},l.createElement(s.Z,(0,a.Z)({},n,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}},93743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var a=n(87462),l=n(67294),r=n(86668);function s(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function o(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=o({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:s}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:s}),c=i(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function h(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...h}=e;const b=(0,r.L)(),f=d??b.tableOfContents.minHeadingLevel,p=u??b.tableOfContents.maxHeadingLevel,E=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>o({toc:s(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:f,maxHeadingLevel:p});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:f,maxHeadingLevel:p}}),[c,i,f,p])),l.createElement(v,(0,a.Z)({toc:E,className:n,linkClassName:c},h))}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>o,q:()=>s});var a=n(67294),l=n(902);const r=a.createContext(null);function s(e){let{children:t,version:n}=e;return a.createElement(r.Provider,{value:n},t)}function o(){const e=(0,a.useContext)(r);if(null===e)throw new l.i6("DocsVersionProvider");return e}},11748:(e,t,n)=>{var a={"./locale":89234,"./locale.js":89234};function l(e){var t=r(e);return n(t)}function r(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}l.keys=function(){return Object.keys(a)},l.resolve=r,e.exports=l,l.id=11748}}]); \ No newline at end of file diff --git a/assets/js/e2de2dbb.b339d4ea.js b/assets/js/1893cb59.8a4bc4b2.js similarity index 68% rename from assets/js/e2de2dbb.b339d4ea.js rename to assets/js/1893cb59.8a4bc4b2.js index b72957de8..45c01b8ac 100644 --- a/assets/js/e2de2dbb.b339d4ea.js +++ b/assets/js/1893cb59.8a4bc4b2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6710],{7023:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[286],{16269:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/1893cb59.eba2db5b.js b/assets/js/1893cb59.eba2db5b.js deleted file mode 100644 index a66ab903e..000000000 --- a/assets/js/1893cb59.eba2db5b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[286],{6269:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/198f8d8a.14616afb.js b/assets/js/198f8d8a.14616afb.js deleted file mode 100644 index 441d987d9..000000000 --- a/assets/js/198f8d8a.14616afb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9059],{7238:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/3","page":3,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java/page/2","nextPage":"/tags/java/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/198f8d8a.246f1a7e.js b/assets/js/198f8d8a.246f1a7e.js new file mode 100644 index 000000000..4b3ab7e9e --- /dev/null +++ b/assets/js/198f8d8a.246f1a7e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9059],{17238:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/3","page":3,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java/page/2","nextPage":"/tags/java/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/19f4ae8e.f32f8930.js b/assets/js/19f4ae8e.f32f8930.js new file mode 100644 index 000000000..fb5f48f64 --- /dev/null +++ b/assets/js/19f4ae8e.f32f8930.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8161],{25680:e=>{e.exports=JSON.parse('{"label":"log","permalink":"/tags/log","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.6f43a2a9.js b/assets/js/1a4e3797.6f43a2a9.js deleted file mode 100644 index 495e436d5..000000000 --- a/assets/js/1a4e3797.6f43a2a9.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1a4e3797.6f43a2a9.js.LICENSE.txt */ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7920],{7331:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,a,s,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(a=this._events[e]))return!1;if(r(a))switch(arguments.length){case 1:a.call(this);break;case 2:a.call(this,arguments[1]);break;case 3:a.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),a.apply(this,c)}else if(n(a))for(c=Array.prototype.slice.call(arguments,1),s=(o=a.slice()).length,u=0;u0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,a,s,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(i=this._events[e]).length,a=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=s;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){a=c;break}if(a<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},8131:(e,t,r)=>{"use strict";var n=r(9374),i=r(7775),a=r(3076);function s(e,t,r){return new n(e,t,r)}s.version=r(4336),s.AlgoliaSearchHelper=n,s.SearchParameters=i,s.SearchResults=a,e.exports=s},8078:(e,t,r)=>{"use strict";var n=r(7331);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(4853)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},2437:(e,t,r)=>{"use strict";var n=r(2344),i=r(9803),a=r(116),s={addRefinement:function(e,t,r){if(s.isRefined(e,t,r))return e;var i=""+r,a=e[t]?e[t].concat(i):[i],c={};return c[t]=a,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return s.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return s.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return s.isRefined(e,t,r)?s.removeRefinement(e,t,r):s.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return a(e)?{}:e;if("string"==typeof t)return i(e,[t]);if("function"==typeof t){var n=!1,s=Object.keys(e).reduce((function(i,a){var s=e[a]||[],c=s.filter((function(e){return!t(e,a,r)}));return c.length!==s.length&&(n=!0),i[a]=c,i}),{});return n?s:e}},isRefined:function(e,t,r){var n=!!e[t]&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=s},7775:(e,t,r)=>{"use strict";var n=r(185),i=r(2344),a=r(2686),s=r(7888),c=r(8023),u=r(9803),o=r(116),h=r(6801),f=r(2437);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return n({},e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&o(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):o(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var i=c(r);if(this.isNumericRefined(e,t,i))return this;var a=n({},this.numericRefinements);return a[e]=n({},a[e]),a[e][t]?(a[e][t]=a[e][t].slice(),a[e][t].push(i)):a[e][t]=[i],this.setQueryParameters({numericRefinements:a})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){return void 0!==r?this.isNumericRefined(e,t,r)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(n,i){return i===e&&n.op===t&&l(n.val,c(r))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return o(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var a=r[i],s={};return a=a||{},Object.keys(a).forEach((function(r){var n=a[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),s[r]=c})),n[i]=s,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),n={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?n[e]=[]:n[e]=[t.slice(0,t.lastIndexOf(r))]:n[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i({},n,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:i({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return!!this.numericRefinements[e];var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var i,a,u=c(r),o=void 0!==(i=this.numericRefinements[e][t],a=u,s(i,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=a(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets())},getRefinedHierarchicalFacets:function(){var e=this;return a(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0})))},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),a=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(a)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return s(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},210:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var s=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[s.name]&&e.hierarchicalFacetsRefinements[s.name][0]||"",h=e._getHierarchicalFacetSeparator(s),f=e._getHierarchicalRootPath(s),l=e._getHierarchicalShowParentLevel(s),m=a(e._getHierarchicalFacetSortBy(s)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,a,s){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m{"use strict";var n=r(185),i=r(2344),a=r(2148),s=r(4587),c=r(7888),u=r(9725),o=r(2293),h=r(4039),f=h.escapeFacetValue,l=h.unescapeFacetValue,m=r(210);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var a=t[0];this._rawResults=t;var o=this;Object.keys(a).forEach((function(e){o[e]=a[e]})),Object.keys(r||{}).forEach((function(e){o[e]=r[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var h=e.getRefinedDisjunctiveFacets(),f=d(e.facets),v=d(e.disjunctiveFacets),g=1,y=a.facets||{};Object.keys(y).forEach((function(t){var r,n,i=y[t],s=(r=e.hierarchicalFacets,n=t,c(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(s){var h=s.attributes.indexOf(t),l=u(e.hierarchicalFacets,(function(e){return e.name===s.name}));o.hierarchicalFacets[l][h]={attribute:t,data:i,exhaustive:a.exhaustiveFacetsCount}}else{var m,d=-1!==e.disjunctiveFacets.indexOf(t),g=-1!==e.facets.indexOf(t);d&&(m=v[t],o.disjunctiveFacets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(o.disjunctiveFacets[m],a.facets_stats,t)),g&&(m=f[t],o.facets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(o.facets[m],a.facets_stats,t))}})),this.hierarchicalFacets=s(this.hierarchicalFacets),h.forEach((function(r){var s=t[g],c=s&&s.facets?s.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(c).forEach((function(t){var r,f=c[t];if(h){r=u(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=u(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=n({},o.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=a.facets&&a.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],s.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),g++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),a=e._getHierarchicalFacetSeparator(n),s=e.getHierarchicalRefinement(r);0===s.length||s[0].split(a).length<2||t.slice(g).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var c=r[t],h=u(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=u(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(s.length>0){var m=s[0].split(a)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,c,o.hierarchicalFacets[h][f].data)}})),g++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=f[t];o.facets[n]={name:t,data:a.facets[t],exhaustive:a.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=s(this.facets),this.disjunctiveFacets=s(this.disjunctiveFacets),this._state=e}function g(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var a=t.data.map((function(t){return g(e,t,r,n+1)})),s=e(a,r[n]);return i({data:s},t)}function y(e,t){var r=c(e,(function(e){return e.name===t}));return r&&r.stats}function R(e,t,r,n,i){var a=c(i,(function(e){return e.name===r})),s=a&&a.data&&a.data[n]?a.data[n]:0,u=a&&a.exhaustive||!1;return{type:t,attributeName:r,name:n,count:s,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return c(this.facets,t)||c(this.disjunctiveFacets,t)||c(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=function(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=c(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=c(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t))return c(e.hierarchicalFacets,r)}(this,e);if(r){var n,s=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),u=this;if(Array.isArray(r))n=[e];else n=u._state.getHierarchicalFacetByName(r.name).attributes;return g((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(u,t);if(Boolean(r))return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var s,c=t.sortRemainingBy;return"hidden"===c?r:(s="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(a(n,s[0],s[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,v.DEFAULT_SORT);return a(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?y(this.facets,e):this._state.isDisjunctiveFacet(e)?y(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(R(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(R(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(R(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),a=e._getHierarchicalFacetSeparator(i),s=r.split(a),u=c(n,(function(e){return e.name===t})),o=s.reduce((function(e,t){var r=e&&c(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},9374:(e,t,r)=>{"use strict";var n=r(7775),i=r(3076),a=r(8078),s=r(6394),c=r(7331),u=r(4853),o=r(116),h=r(9803),f=r(185),l=r(4336),m=r(4039).escapeFacetValue;function d(e,t,r){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+l+")"),this.setClient(e);var i=r||{};i.index=t,this.state=n.make(i),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}u(d,c),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return s._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=s._getQueries(r.index,r),a=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),{content:new i(r,e.results),state:r,_originalResponse:e}}),(function(e){throw a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),t(null,new i(r,e.results),r)})).catch((function(e){a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=f({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:h(s._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),a="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(a);var c=this.client.initIndex(n.index);if("function"!=typeof c.findAnswers)throw new Error(a);return c.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=s.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:o}]):a?h=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=m(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:n.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new n(e),this},d.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=s._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=s._getQueries(n.index,n);return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),a=Array.prototype.concat.apply(n,i),c=this._queryId++;this._currentNbQueries++;try{this.client.search(a).then(this._dispatchAlgoliaResponse.bind(this,r,c)).catch(this._dispatchAlgoliaError.bind(this,c))}catch(u){this.emit("error",{error:u})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){if(!(t0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+l+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new a(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},4587:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},2344:e=>{"use strict";e.exports=function(){var e=Array.prototype.slice.call(arguments);return e.reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},4039:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},7888:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{"use strict";var n=r(7888);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),a=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!a?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(a[0]),e[1].push(a[1]),e)}),[[],[]])}},4853:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},2686:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},185:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i){var a=n[i],s=e[i];void 0!==s&&void 0===a||(t(s)&&t(a)?e[i]=r(s,a):e[i]="object"==typeof(c=a)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},9803:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},2148:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,a=null===t;if(!a&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?a:"desc"===n[i]?-a:a}return e.index-r.index})),i.map((function(e){return e.value}))}},8023:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},6394:(e,t,r)=>{"use strict";var n=r(185);function i(e){return Object.keys(e).sort((function(e,t){return e.localeCompare(t)})).reduce((function(t,r){return t[r]=e[r],t}),{})}var a={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:a._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:a._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),s=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(s.length>0&&s[0].split(c).length>1){var u=s[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,s){var c=a._getDisjunctiveFacetSearchParams(t,n.attribute,0===s);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[s-1];c.facetFilters=s>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(a._getHitsHierarchicalFacetsAttributes(e)),r=a._getFacetFilters(e),s=a._getNumericFilters(e),c=a._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),s.length>0&&(u.numericFilters=s),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var s=a._getFacetFilters(e,t,r),c=a._getNumericFilters(e,t),u=a._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?a._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),s.length>0&&(o.facetFilters=s),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var a=i[e]||[];t!==n&&a.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).forEach((function(e){(i[e]||[]).forEach((function(t){n.push(e+":"+t)}))}));var a=e.facetsExcludes||{};Object.keys(a).forEach((function(e){(a[e]||[]).forEach((function(t){n.push(e+":-"+t)}))}));var s=e.disjunctiveFacetsRefinements||{};Object.keys(s).forEach((function(e){var r=s[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).forEach((function(i){var a=(c[i]||[])[0];if(void 0!==a){var s,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===a.indexOf(h)||!f&&!0===r||f&&f.split(h).length===a.split(h).length)return;f?(u=f.split(h).length-1,a=f):(u=a.split(h).length-2,a=a.slice(0,a.lastIndexOf(h))),s=o.attributes[u]}else u=a.split(h).length-1,s=o.attributes[u];s&&n.push([s+":"+a])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),a=n.split(i).length,s=r.attributes.slice(0,a+1);return t.concat(s)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),a=0;return i&&(a=i.split(n).length),[t.attributes[a]]}var s=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,s+1)},getSearchForFacetQuery:function(e,t,r,s){var c=s.isDisjunctiveFacet(e)?s.clearRefinements(e):s,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},a._getHitsSearchParams(c),u))}};e.exports=a},6801:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},4336:e=>{"use strict";e.exports="3.11.1"},290:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,a=void 0;try{for(var s,c=e[Symbol.iterator]();!(n=(s=c.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){i=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw a}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var r=JSON.stringify(e),n=a()[r];return Promise.all([n||t(),void 0!==n])})).then((function(e){var t=i(e,2),n=t[0],a=t[1];return Promise.all([n,a||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=a();return i[JSON.stringify(e)]=t,n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=a();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=a(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=n(),c=i&&i.miss||function(){return Promise.resolve()};return s.then((function(e){return c(e)})).then((function(){return s}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function P(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(a(r),a(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function j(e,t,n,i){var s=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,a){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:w(s)};var m={data:c,headers:u,method:o,url:E(h,n.path,f),connectTimeout:a(l,e.timeouts.connect),responseTimeout:a(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return s.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",O(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,a)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,w(s))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return P(e.hostsCache,t).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function _(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function E(e,t,r){var n=x(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function x(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function w(e){return e.map((function(e){return O(e)}))}function O(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var N=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),a=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,a=e.requestsCache,s=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:a,responsesCache:s,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var a={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(a,(function(){return f.requestsCache.get(a,(function(){return f.requestsCache.set(a,n()).then((function(e){return Promise.all([f.requestsCache.delete(a),e])}),(function(e){return Promise.all([f.requestsCache.delete(a),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(a,e)}})},write:function(e,t){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:a,appId:t,addAlgoliaAgent:function(e,t){a.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:x(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var a=t.params,s=a.facetName,c=a.facetQuery,u=n(a,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:k}}).searchForFacetValues(s,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},k=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,I=2,q=3;function V(e,t,n){var i,a={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},a=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(a),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(a),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(a),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return I>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[s({key:"".concat("4.14.2","-").concat(e)}),u()]}),userAgent:_("4.14.2").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return N(r(r(r({},a),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:A,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:k,findAnswers:Q}})}}}}))}return V.version="4.14.2",V}()},8824:(e,t,r)=>{"use strict";r.d(t,{c:()=>o});var n=r(7294),i=r(2263);const a=["zero","one","two","few","many","other"];function s(e){return a.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,i.Z)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function o(){const e=u();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),a=r.pluralForms.indexOf(i);return n[Math.min(a,n.length-1)]}(r,t,e)}}},9172:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>q});var n=r(7294),i=r(6010),a=r(8131),s=r.n(a),c=r(290),u=r.n(c),o=r(412),h=r(5742),f=r(9960),l=r(143),m=r(8824),d=r(902),p=r(833),v=r(6177),g=r(2128),y=r(5999),R=r(2263),F=r(6278),b=r(239),P=r(4774);const j="searchQueryInput_u2C7",_="searchVersionInput_m0Ui",E="searchResultsColumn_JPFH",x="algoliaLogo_rT1R",w="algoliaLogoPathFill_WdUC",O="searchResultItem_Tv2o",N="searchResultItemHeading_KbCB",A="searchResultItemPath_lhe1",H="searchResultItemSummary_AEaO",S="searchQueryColumn_RTkw",T="searchVersionColumn_ypXd",Q="searchLogoColumn_rJIA",C="loadingSpinner_XVxU",k="loader_vvXV";function D(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return n.createElement("div",{className:(0,i.Z)("col","col--3","padding-left--none",T)},r.map((e=>{let[i,a]=e;const s=r.length>1?`${i}: `:"";return n.createElement("select",{key:i,onChange:e=>t.setSearchVersion(i,e.target.value),defaultValue:t.searchVersions[i],className:_},a.versions.map(((e,t)=>n.createElement("option",{key:t,label:`${s}${e.label}`,value:e.name}))))})))}function I(){const{i18n:{currentLocale:e}}=(0,R.Z)(),{algolia:{appId:t,apiKey:r,indexName:a}}=(0,F.L)(),c=(0,b.l)(),p=function(){const{selectMessage:e}=(0,m.c)();return t=>e(t,(0,y.I)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),_=function(){const e=(0,l._r)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),{searchQuery:T,setSearchQuery:I}=(0,v.O)(),q={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[V,L]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return q;case"loading":return{...e,loading:!0};case"update":return T!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),q),B=u()(t,r),z=s()(B,a,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});z.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:a}}=e;if(""===t||!Array.isArray(r))return void L({type:"reset"});const s=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>s(r[e].value)));return{title:i.pop(),url:c(t),summary:n.content?`${s(n.content.value)}...`:"",breadcrumbs:i}}));L({type:"update",value:{items:u,query:t,totalResults:i,totalPages:a,lastPage:n,hasMore:a>n+1,loading:!1}})}));const[M,J]=(0,n.useState)(null),W=(0,n.useRef)(0),U=(0,n.useRef)(o.Z.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&W.current>r&&L({type:"advance"}),W.current=r}),{threshold:1})),Z=()=>T?(0,y.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:T}):(0,y.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),$=(0,d.zX)((function(t){void 0===t&&(t=0),z.addDisjunctiveFacetRefinement("docusaurus_tag","default"),z.addDisjunctiveFacetRefinement("language",e),Object.entries(_.searchVersions).forEach((e=>{let[t,r]=e;z.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),z.setQuery(T).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!M)return;const e=U.current;return e?(e.observe(M),()=>e.unobserve(M)):()=>!0}),[M]),(0,n.useEffect)((()=>{L({type:"reset"}),T&&(L({type:"loading"}),setTimeout((()=>{$()}),300))}),[T,_.searchVersions,$]),(0,n.useEffect)((()=>{V.lastPage&&0!==V.lastPage&&$(V.lastPage)}),[$,V.lastPage]),n.createElement(P.Z,null,n.createElement(h.Z,null,n.createElement("title",null,(0,g.p)(Z())),n.createElement("meta",{property:"robots",content:"noindex, follow"})),n.createElement("div",{className:"container margin-vert--lg"},n.createElement("h1",null,Z()),n.createElement("form",{className:"row",onSubmit:e=>e.preventDefault()},n.createElement("div",{className:(0,i.Z)("col",S,{"col--9":_.versioningEnabled,"col--12":!_.versioningEnabled})},n.createElement("input",{type:"search",name:"q",className:j,placeholder:(0,y.I)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,y.I)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>I(e.target.value),value:T,autoComplete:"off",autoFocus:!0})),_.versioningEnabled&&n.createElement(D,{docsSearchVersionsHelpers:_})),n.createElement("div",{className:"row"},n.createElement("div",{className:(0,i.Z)("col","col--8",E)},!!V.totalResults&&p(V.totalResults)),n.createElement("div",{className:(0,i.Z)("col","col--4","text--right",Q)},n.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://www.algolia.com/","aria-label":(0,y.I)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"})},n.createElement("svg",{viewBox:"0 0 168 24",className:x},n.createElement("g",{fill:"none"},n.createElement("path",{className:w,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),n.createElement("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),n.createElement("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})))))),V.items.length>0?n.createElement("main",null,V.items.map(((e,t)=>{let{title:r,url:a,summary:s,breadcrumbs:c}=e;return n.createElement("article",{key:t,className:O},n.createElement("h2",{className:N},n.createElement(f.Z,{to:a,dangerouslySetInnerHTML:{__html:r}})),c.length>0&&n.createElement("nav",{"aria-label":"breadcrumbs"},n.createElement("ul",{className:(0,i.Z)("breadcrumbs",A)},c.map(((e,t)=>n.createElement("li",{key:t,className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}}))))),s&&n.createElement("p",{className:H,dangerouslySetInnerHTML:{__html:s}}))}))):[T&&!V.loading&&n.createElement("p",{key:"no-results"},n.createElement(y.Z,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result"},"No results were found")),!!V.loading&&n.createElement("div",{key:"spinner",className:C})],V.hasMore&&n.createElement("div",{className:k,ref:J},n.createElement(y.Z,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results"},"Fetching new results..."))))}function q(){return n.createElement(p.FG,{className:"search-page-wrapper"},n.createElement(I,null))}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.d4af1946.js b/assets/js/1a4e3797.d4af1946.js new file mode 100644 index 000000000..d99e3fe9d --- /dev/null +++ b/assets/js/1a4e3797.d4af1946.js @@ -0,0 +1,2 @@ +/*! For license information please see 1a4e3797.d4af1946.js.LICENSE.txt */ +(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7920],{17331:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,a,s,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(a=this._events[e]))return!1;if(r(a))switch(arguments.length){case 1:a.call(this);break;case 2:a.call(this,arguments[1]);break;case 3:a.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),a.apply(this,c)}else if(n(a))for(c=Array.prototype.slice.call(arguments,1),s=(o=a.slice()).length,u=0;u0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,a,s,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(i=this._events[e]).length,a=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=s;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){a=c;break}if(a<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},8131:(e,t,r)=>{"use strict";var n=r(49374),i=r(17775),a=r(23076);function s(e,t,r){return new n(e,t,r)}s.version=r(24336),s.AlgoliaSearchHelper=n,s.SearchParameters=i,s.SearchResults=a,e.exports=s},68078:(e,t,r)=>{"use strict";var n=r(17331);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(14853)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},82437:(e,t,r)=>{"use strict";var n=r(52344),i=r(49803),a=r(90116),s={addRefinement:function(e,t,r){if(s.isRefined(e,t,r))return e;var i=""+r,a=e[t]?e[t].concat(i):[i],c={};return c[t]=a,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return s.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return s.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return s.isRefined(e,t,r)?s.removeRefinement(e,t,r):s.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return a(e)?{}:e;if("string"==typeof t)return i(e,[t]);if("function"==typeof t){var n=!1,s=Object.keys(e).reduce((function(i,a){var s=e[a]||[],c=s.filter((function(e){return!t(e,a,r)}));return c.length!==s.length&&(n=!0),i[a]=c,i}),{});return n?s:e}},isRefined:function(e,t,r){var n=!!e[t]&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=s},17775:(e,t,r)=>{"use strict";var n=r(60185),i=r(52344),a=r(22686),s=r(7888),c=r(28023),u=r(49803),o=r(90116),h=r(46801),f=r(82437);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return n({},e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&o(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):o(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var i=c(r);if(this.isNumericRefined(e,t,i))return this;var a=n({},this.numericRefinements);return a[e]=n({},a[e]),a[e][t]?(a[e][t]=a[e][t].slice(),a[e][t].push(i)):a[e][t]=[i],this.setQueryParameters({numericRefinements:a})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){return void 0!==r?this.isNumericRefined(e,t,r)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(n,i){return i===e&&n.op===t&&l(n.val,c(r))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return o(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var a=r[i],s={};return a=a||{},Object.keys(a).forEach((function(r){var n=a[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),s[r]=c})),n[i]=s,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),n={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?n[e]=[]:n[e]=[t.slice(0,t.lastIndexOf(r))]:n[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i({},n,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:i({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return!!this.numericRefinements[e];var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var i,a,u=c(r),o=void 0!==(i=this.numericRefinements[e][t],a=u,s(i,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=a(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets())},getRefinedHierarchicalFacets:function(){var e=this;return a(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0})))},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),a=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(a)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return s(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},10210:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var s=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[s.name]&&e.hierarchicalFacetsRefinements[s.name][0]||"",h=e._getHierarchicalFacetSeparator(s),f=e._getHierarchicalRootPath(s),l=e._getHierarchicalShowParentLevel(s),m=a(e._getHierarchicalFacetSortBy(s)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,a,s){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m{"use strict";var n=r(60185),i=r(52344),a=r(42148),s=r(74587),c=r(7888),u=r(69725),o=r(82293),h=r(94039),f=h.escapeFacetValue,l=h.unescapeFacetValue,m=r(10210);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var a=t[0];this._rawResults=t;var o=this;Object.keys(a).forEach((function(e){o[e]=a[e]})),Object.keys(r||{}).forEach((function(e){o[e]=r[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var h=e.getRefinedDisjunctiveFacets(),f=d(e.facets),v=d(e.disjunctiveFacets),g=1,y=a.facets||{};Object.keys(y).forEach((function(t){var r,n,i=y[t],s=(r=e.hierarchicalFacets,n=t,c(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(s){var h=s.attributes.indexOf(t),l=u(e.hierarchicalFacets,(function(e){return e.name===s.name}));o.hierarchicalFacets[l][h]={attribute:t,data:i,exhaustive:a.exhaustiveFacetsCount}}else{var m,d=-1!==e.disjunctiveFacets.indexOf(t),g=-1!==e.facets.indexOf(t);d&&(m=v[t],o.disjunctiveFacets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(o.disjunctiveFacets[m],a.facets_stats,t)),g&&(m=f[t],o.facets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(o.facets[m],a.facets_stats,t))}})),this.hierarchicalFacets=s(this.hierarchicalFacets),h.forEach((function(r){var s=t[g],c=s&&s.facets?s.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(c).forEach((function(t){var r,f=c[t];if(h){r=u(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=u(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=n({},o.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=a.facets&&a.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],s.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),g++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),a=e._getHierarchicalFacetSeparator(n),s=e.getHierarchicalRefinement(r);0===s.length||s[0].split(a).length<2||t.slice(g).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var c=r[t],h=u(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=u(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(s.length>0){var m=s[0].split(a)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,c,o.hierarchicalFacets[h][f].data)}})),g++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=f[t];o.facets[n]={name:t,data:a.facets[t],exhaustive:a.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=s(this.facets),this.disjunctiveFacets=s(this.disjunctiveFacets),this._state=e}function g(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var a=t.data.map((function(t){return g(e,t,r,n+1)})),s=e(a,r[n]);return i({data:s},t)}function y(e,t){var r=c(e,(function(e){return e.name===t}));return r&&r.stats}function R(e,t,r,n,i){var a=c(i,(function(e){return e.name===r})),s=a&&a.data&&a.data[n]?a.data[n]:0,u=a&&a.exhaustive||!1;return{type:t,attributeName:r,name:n,count:s,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return c(this.facets,t)||c(this.disjunctiveFacets,t)||c(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=function(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=c(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=c(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t))return c(e.hierarchicalFacets,r)}(this,e);if(r){var n,s=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),u=this;if(Array.isArray(r))n=[e];else n=u._state.getHierarchicalFacetByName(r.name).attributes;return g((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(u,t);if(Boolean(r))return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var s,c=t.sortRemainingBy;return"hidden"===c?r:(s="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(a(n,s[0],s[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,v.DEFAULT_SORT);return a(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?y(this.facets,e):this._state.isDisjunctiveFacet(e)?y(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(R(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(R(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(R(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),a=e._getHierarchicalFacetSeparator(i),s=r.split(a),u=c(n,(function(e){return e.name===t})),o=s.reduce((function(e,t){var r=e&&c(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},49374:(e,t,r)=>{"use strict";var n=r(17775),i=r(23076),a=r(68078),s=r(96394),c=r(17331),u=r(14853),o=r(90116),h=r(49803),f=r(60185),l=r(24336),m=r(94039).escapeFacetValue;function d(e,t,r){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+l+")"),this.setClient(e);var i=r||{};i.index=t,this.state=n.make(i),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}u(d,c),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return s._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=s._getQueries(r.index,r),a=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),{content:new i(r,e.results),state:r,_originalResponse:e}}),(function(e){throw a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),t(null,new i(r,e.results),r)})).catch((function(e){a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=f({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:h(s._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),a="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(a);var c=this.client.initIndex(n.index);if("function"!=typeof c.findAnswers)throw new Error(a);return c.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=s.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:o}]):a?h=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=m(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:n.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new n(e),this},d.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=s._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=s._getQueries(n.index,n);return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),a=Array.prototype.concat.apply(n,i),c=this._queryId++;this._currentNbQueries++;try{this.client.search(a).then(this._dispatchAlgoliaResponse.bind(this,r,c)).catch(this._dispatchAlgoliaError.bind(this,c))}catch(u){this.emit("error",{error:u})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){if(!(t0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+l+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new a(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},74587:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},52344:e=>{"use strict";e.exports=function(){var e=Array.prototype.slice.call(arguments);return e.reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},94039:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},7888:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{"use strict";var n=r(7888);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),a=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!a?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(a[0]),e[1].push(a[1]),e)}),[[],[]])}},14853:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},22686:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},60185:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i){var a=n[i],s=e[i];void 0!==s&&void 0===a||(t(s)&&t(a)?e[i]=r(s,a):e[i]="object"==typeof(c=a)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},49803:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},42148:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,a=null===t;if(!a&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?a:"desc"===n[i]?-a:a}return e.index-r.index})),i.map((function(e){return e.value}))}},28023:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},96394:(e,t,r)=>{"use strict";var n=r(60185);function i(e){return Object.keys(e).sort((function(e,t){return e.localeCompare(t)})).reduce((function(t,r){return t[r]=e[r],t}),{})}var a={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:a._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:a._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),s=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(s.length>0&&s[0].split(c).length>1){var u=s[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,s){var c=a._getDisjunctiveFacetSearchParams(t,n.attribute,0===s);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[s-1];c.facetFilters=s>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(a._getHitsHierarchicalFacetsAttributes(e)),r=a._getFacetFilters(e),s=a._getNumericFilters(e),c=a._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),s.length>0&&(u.numericFilters=s),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var s=a._getFacetFilters(e,t,r),c=a._getNumericFilters(e,t),u=a._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?a._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),s.length>0&&(o.facetFilters=s),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var a=i[e]||[];t!==n&&a.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).forEach((function(e){(i[e]||[]).forEach((function(t){n.push(e+":"+t)}))}));var a=e.facetsExcludes||{};Object.keys(a).forEach((function(e){(a[e]||[]).forEach((function(t){n.push(e+":-"+t)}))}));var s=e.disjunctiveFacetsRefinements||{};Object.keys(s).forEach((function(e){var r=s[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).forEach((function(i){var a=(c[i]||[])[0];if(void 0!==a){var s,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===a.indexOf(h)||!f&&!0===r||f&&f.split(h).length===a.split(h).length)return;f?(u=f.split(h).length-1,a=f):(u=a.split(h).length-2,a=a.slice(0,a.lastIndexOf(h))),s=o.attributes[u]}else u=a.split(h).length-1,s=o.attributes[u];s&&n.push([s+":"+a])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),a=n.split(i).length,s=r.attributes.slice(0,a+1);return t.concat(s)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),a=0;return i&&(a=i.split(n).length),[t.attributes[a]]}var s=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,s+1)},getSearchForFacetQuery:function(e,t,r,s){var c=s.isDisjunctiveFacet(e)?s.clearRefinements(e):s,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},a._getHitsSearchParams(c),u))}};e.exports=a},46801:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},24336:e=>{"use strict";e.exports="3.11.1"},70290:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,a=void 0;try{for(var s,c=e[Symbol.iterator]();!(n=(s=c.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){i=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw a}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var r=JSON.stringify(e),n=a()[r];return Promise.all([n||t(),void 0!==n])})).then((function(e){var t=i(e,2),n=t[0],a=t[1];return Promise.all([n,a||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=a();return i[JSON.stringify(e)]=t,n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=a();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=a(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=n(),c=i&&i.miss||function(){return Promise.resolve()};return s.then((function(e){return c(e)})).then((function(){return s}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function P(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(a(r),a(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function j(e,t,n,i){var s=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,a){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:w(s)};var m={data:c,headers:u,method:o,url:E(h,n.path,f),connectTimeout:a(l,e.timeouts.connect),responseTimeout:a(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return s.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",O(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,a)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,w(s))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return P(e.hostsCache,t).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function _(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function E(e,t,r){var n=x(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function x(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function w(e){return e.map((function(e){return O(e)}))}function O(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var N=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),a=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,a=e.requestsCache,s=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:a,responsesCache:s,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var a={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(a,(function(){return f.requestsCache.get(a,(function(){return f.requestsCache.set(a,n()).then((function(e){return Promise.all([f.requestsCache.delete(a),e])}),(function(e){return Promise.all([f.requestsCache.delete(a),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(a,e)}})},write:function(e,t){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:a,appId:t,addAlgoliaAgent:function(e,t){a.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:x(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var a=t.params,s=a.facetName,c=a.facetQuery,u=n(a,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:k}}).searchForFacetValues(s,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},k=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,I=2,q=3;function V(e,t,n){var i,a={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},a=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(a),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(a),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(a),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return I>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[s({key:"".concat("4.14.2","-").concat(e)}),u()]}),userAgent:_("4.14.2").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return N(r(r(r({},a),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:A,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:k,findAnswers:Q}})}}}}))}return V.version="4.14.2",V}()},88824:(e,t,r)=>{"use strict";r.d(t,{c:()=>o});var n=r(67294),i=r(52263);const a=["zero","one","two","few","many","other"];function s(e){return a.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,i.Z)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function o(){const e=u();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),a=r.pluralForms.indexOf(i);return n[Math.min(a,n.length-1)]}(r,t,e)}}},39172:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>q});var n=r(67294),i=r(86010),a=r(8131),s=r.n(a),c=r(70290),u=r.n(c),o=r(10412),h=r(35742),f=r(39960),l=r(80143),m=r(88824),d=r(902),p=r(10833),v=r(66177),g=r(82128),y=r(95999),R=r(52263),F=r(6278),b=r(239),P=r(54774);const j="searchQueryInput_u2C7",_="searchVersionInput_m0Ui",E="searchResultsColumn_JPFH",x="algoliaLogo_rT1R",w="algoliaLogoPathFill_WdUC",O="searchResultItem_Tv2o",N="searchResultItemHeading_KbCB",A="searchResultItemPath_lhe1",H="searchResultItemSummary_AEaO",S="searchQueryColumn_RTkw",T="searchVersionColumn_ypXd",Q="searchLogoColumn_rJIA",C="loadingSpinner_XVxU",k="loader_vvXV";function D(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return n.createElement("div",{className:(0,i.Z)("col","col--3","padding-left--none",T)},r.map((e=>{let[i,a]=e;const s=r.length>1?`${i}: `:"";return n.createElement("select",{key:i,onChange:e=>t.setSearchVersion(i,e.target.value),defaultValue:t.searchVersions[i],className:_},a.versions.map(((e,t)=>n.createElement("option",{key:t,label:`${s}${e.label}`,value:e.name}))))})))}function I(){const{i18n:{currentLocale:e}}=(0,R.Z)(),{algolia:{appId:t,apiKey:r,indexName:a}}=(0,F.L)(),c=(0,b.l)(),p=function(){const{selectMessage:e}=(0,m.c)();return t=>e(t,(0,y.I)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),_=function(){const e=(0,l._r)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),{searchQuery:T,setSearchQuery:I}=(0,v.O)(),q={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[V,L]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return q;case"loading":return{...e,loading:!0};case"update":return T!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),q),B=u()(t,r),z=s()(B,a,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});z.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:a}}=e;if(""===t||!Array.isArray(r))return void L({type:"reset"});const s=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>s(r[e].value)));return{title:i.pop(),url:c(t),summary:n.content?`${s(n.content.value)}...`:"",breadcrumbs:i}}));L({type:"update",value:{items:u,query:t,totalResults:i,totalPages:a,lastPage:n,hasMore:a>n+1,loading:!1}})}));const[M,J]=(0,n.useState)(null),W=(0,n.useRef)(0),U=(0,n.useRef)(o.Z.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&W.current>r&&L({type:"advance"}),W.current=r}),{threshold:1})),Z=()=>T?(0,y.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:T}):(0,y.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),$=(0,d.zX)((function(t){void 0===t&&(t=0),z.addDisjunctiveFacetRefinement("docusaurus_tag","default"),z.addDisjunctiveFacetRefinement("language",e),Object.entries(_.searchVersions).forEach((e=>{let[t,r]=e;z.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),z.setQuery(T).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!M)return;const e=U.current;return e?(e.observe(M),()=>e.unobserve(M)):()=>!0}),[M]),(0,n.useEffect)((()=>{L({type:"reset"}),T&&(L({type:"loading"}),setTimeout((()=>{$()}),300))}),[T,_.searchVersions,$]),(0,n.useEffect)((()=>{V.lastPage&&0!==V.lastPage&&$(V.lastPage)}),[$,V.lastPage]),n.createElement(P.Z,null,n.createElement(h.Z,null,n.createElement("title",null,(0,g.p)(Z())),n.createElement("meta",{property:"robots",content:"noindex, follow"})),n.createElement("div",{className:"container margin-vert--lg"},n.createElement("h1",null,Z()),n.createElement("form",{className:"row",onSubmit:e=>e.preventDefault()},n.createElement("div",{className:(0,i.Z)("col",S,{"col--9":_.versioningEnabled,"col--12":!_.versioningEnabled})},n.createElement("input",{type:"search",name:"q",className:j,placeholder:(0,y.I)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,y.I)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>I(e.target.value),value:T,autoComplete:"off",autoFocus:!0})),_.versioningEnabled&&n.createElement(D,{docsSearchVersionsHelpers:_})),n.createElement("div",{className:"row"},n.createElement("div",{className:(0,i.Z)("col","col--8",E)},!!V.totalResults&&p(V.totalResults)),n.createElement("div",{className:(0,i.Z)("col","col--4","text--right",Q)},n.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://www.algolia.com/","aria-label":(0,y.I)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"})},n.createElement("svg",{viewBox:"0 0 168 24",className:x},n.createElement("g",{fill:"none"},n.createElement("path",{className:w,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),n.createElement("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),n.createElement("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})))))),V.items.length>0?n.createElement("main",null,V.items.map(((e,t)=>{let{title:r,url:a,summary:s,breadcrumbs:c}=e;return n.createElement("article",{key:t,className:O},n.createElement("h2",{className:N},n.createElement(f.Z,{to:a,dangerouslySetInnerHTML:{__html:r}})),c.length>0&&n.createElement("nav",{"aria-label":"breadcrumbs"},n.createElement("ul",{className:(0,i.Z)("breadcrumbs",A)},c.map(((e,t)=>n.createElement("li",{key:t,className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}}))))),s&&n.createElement("p",{className:H,dangerouslySetInnerHTML:{__html:s}}))}))):[T&&!V.loading&&n.createElement("p",{key:"no-results"},n.createElement(y.Z,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result"},"No results were found")),!!V.loading&&n.createElement("div",{key:"spinner",className:C})],V.hasMore&&n.createElement("div",{className:k,ref:J},n.createElement(y.Z,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results"},"Fetching new results..."))))}function q(){return n.createElement(p.FG,{className:"search-page-wrapper"},n.createElement(I,null))}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.6f43a2a9.js.LICENSE.txt b/assets/js/1a4e3797.d4af1946.js.LICENSE.txt similarity index 100% rename from assets/js/1a4e3797.6f43a2a9.js.LICENSE.txt rename to assets/js/1a4e3797.d4af1946.js.LICENSE.txt diff --git a/assets/js/1a665c6f.1921d234.js b/assets/js/1a665c6f.1921d234.js deleted file mode 100644 index 207a511df..000000000 --- a/assets/js/1a665c6f.1921d234.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[454],{8767:e=>{e.exports=JSON.parse('{"permalink":"/tags/test","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/1a665c6f.9a808da6.js b/assets/js/1a665c6f.9a808da6.js new file mode 100644 index 000000000..aa16d201f --- /dev/null +++ b/assets/js/1a665c6f.9a808da6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[454],{28767:e=>{e.exports=JSON.parse('{"permalink":"/tags/test","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/1a6b9123.2138ce03.js b/assets/js/1a6b9123.2138ce03.js new file mode 100644 index 000000000..b3ee1bb37 --- /dev/null +++ b/assets/js/1a6b9123.2138ce03.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9874],{14343:e=>{e.exports=JSON.parse('{"label":"TecoChat","permalink":"/tags/teco-chat","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/1a6b9123.76699387.js b/assets/js/1a6b9123.76699387.js deleted file mode 100644 index 52763fa7b..000000000 --- a/assets/js/1a6b9123.76699387.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9874],{4343:e=>{e.exports=JSON.parse('{"label":"TecoChat","permalink":"/tags/teco-chat","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/1be78505.145589fb.js b/assets/js/1be78505.145589fb.js new file mode 100644 index 000000000..9cb5c3a2e --- /dev/null +++ b/assets/js/1be78505.145589fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9514,4972],{19963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>Ce});var a=n(67294),l=n(86010),o=n(10833),r=n(35281),i=n(43320),c=n(53438),s=n(74477),d=n(1116),m=n(54774),u=n(95999),b=n(12466),p=n(85936);const h="backToTopButton_sjWU",E="backToTopButtonShow_xfvO";function f(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,l]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:r,cancelScroll:i}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(o.current?o.current=!1:a>=r?(i(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h,e&&E),type:"button",onClick:t})}var v=n(16550),g=n(87524),_=n(86668),k=n(21327),C=n(87462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const I="collapseSidebarButton_PEFL",N="collapseSidebarButtonIcon_kv0_";function Z(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,l.Z)("button button--secondary button--outline",I),onClick:t},a.createElement(S,{className:N}))}var y=n(59689),x=n(902);const T=Symbol("EmptyContext"),w=a.createContext(T);function L(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(w.Provider,{value:o},t)}var A=n(86043),M=n(48596),B=n(39960),F=n(72389);function H(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function P(e){let{item:t,onItemClick:n,activePath:o,level:i,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,_.L)(),f=function(e){const t=(0,F.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,c.Wl)(e):void 0),[e,t])}(t),v=(0,c._F)(t,o),g=(0,M.Mg)(h,o),{collapsed:k,setCollapsed:S}=(0,A.u)({initialState:()=>!!b&&(!v&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(w);if(e===T)throw new x.i6("DocSidebarItemsExpandedStateProvider");return e}(),Z=function(e){void 0===e&&(e=!k),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,x.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:v,collapsed:k,updateCollapsed:Z}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(i),"menu__list-item",{"menu__list-item--collapsed":k},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g})},a.createElement(B.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":v}),onClick:b?e=>{n?.(t),h?Z(!1):(e.preventDefault(),Z())}:()=>{n?.(t)},"aria-current":g?"page":void 0,"aria-expanded":b?!k:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(H,{categoryLabel:u,onClick:e=>{e.preventDefault(),Z()}})),a.createElement(A.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:k},a.createElement(q,{items:m,tabIndex:k?-1:0,onItemClick:n,activePath:o,level:i+1})))}var D=n(13919),W=n(39471);const R="menuExternalLink_NmtK";function V(e){let{item:t,onItemClick:n,activePath:o,level:i,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,c._F)(t,o),E=(0,D.Z)(m);return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(i),"menu__list-item",b),key:u},a.createElement(B.Z,(0,C.Z)({className:(0,l.Z)("menu__link",!E&&R,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.Z,null)))}const z="menuHtmlItem_M9Kj";function U(e){let{item:t,level:n,index:o}=e;const{value:i,defaultStyle:c,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),c&&[z,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:i}})}function K(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(P,(0,C.Z)({item:t},n));case"html":return a.createElement(U,(0,C.Z)({item:t},n));default:return a.createElement(V,(0,C.Z)({item:t},n))}}function j(e){let{items:t,...n}=e;return a.createElement(L,null,t.map(((e,t)=>a.createElement(K,(0,C.Z)({key:t,item:e,index:t},n)))))}const q=(0,a.memo)(j),G="menu_SIkG",Y="menuWithAnnouncementBar_GW3s";function O(e){let{path:t,sidebar:n,className:o}=e;const i=function(){const{isActive:e}=(0,y.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,l.Z)("menu thin-scrollbar",G,i&&Y,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(q,{items:n,activePath:t,level:1})))}const X="sidebar_njMd",J="sidebarWithHideableNavbar_wUlq",Q="sidebarHidden_VK0M",$="sidebarLogo_isFc";function ee(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:i},docs:{sidebar:{hideable:c}}}=(0,_.L)();return a.createElement("div",{className:(0,l.Z)(X,i&&J,r&&Q)},i&&a.createElement(k.Z,{tabIndex:-1,className:$}),a.createElement(O,{path:t,sidebar:n}),c&&a.createElement(Z,{onClick:o}))}const te=a.memo(ee);var ne=n(13102),ae=n(93163);const le=e=>{let{sidebar:t,path:n}=e;const o=(0,ae.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(q,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function oe(e){return a.createElement(ne.Zo,{component:le,props:e})}const re=a.memo(oe);function ie(e){const t=(0,g.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement(te,e),l&&a.createElement(re,e))}const ce="expandButton_m80_",se="expandButtonIcon_BlDH";function de(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:ce,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(S,{className:se}))}const me={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function ue(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function be(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e;const{pathname:i}=(0,v.TH)(),[c,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{c&&s(!1),o((e=>!e))}),[o,c]);return a.createElement("aside",{className:(0,l.Z)(r.k.docs.docSidebarContainer,me.docSidebarContainer,n&&me.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(me.docSidebarContainer)&&n&&s(!0)}},a.createElement(ue,null,a.createElement("div",{className:(0,l.Z)(me.sidebarViewport,c&&me.sidebarViewportHidden)},a.createElement(ie,{sidebar:t,path:i,onCollapse:d,isHidden:c}),c&&a.createElement(de,{toggleSidebar:d}))))}const pe={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function he(e){let{hiddenSidebarContainer:t,children:n}=e;const o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(pe.docMainContainer,(t||!o)&&pe.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.Z)("container padding-top--md padding-bottom--lg",pe.docItemWrapper,t&&pe.docItemWrapperEnhanced)},n))}const Ee="docPage__5DB",fe="docsWrapper_BCFX";function ve(e){let{children:t}=e;const n=(0,d.V)(),[l,o]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:fe},a.createElement(f,null),a.createElement("div",{className:Ee},n&&a.createElement(be,{sidebar:n.items,hiddenSidebarContainer:l,setHiddenSidebarContainer:o}),a.createElement(he,{hiddenSidebarContainer:l},t)))}var ge=n(4972),_e=n(90197);function ke(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(_e.Z,{version:t.version,tag:(0,i.os)(t.pluginId,t.version)}),a.createElement(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function Ce(e){const{versionMetadata:t}=e,n=(0,c.hI)(e);if(!n)return a.createElement(ge.default,null);const{docElement:i,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(ke,e),a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(ve,null,i)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(67294),l=n(95999),o=n(10833),r=n(54774);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}},74477:(e,t,n)=>{n.d(t,{E:()=>i,q:()=>r});var a=n(67294),l=n(902);const o=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(o.Provider,{value:n},t)}function i(){const e=(0,a.useContext)(o);if(null===e)throw new l.i6("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/1be78505.2b90426b.js b/assets/js/1be78505.2b90426b.js deleted file mode 100644 index 3ce66818a..000000000 --- a/assets/js/1be78505.2b90426b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9514,4972],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>Ce});var a=n(7294),l=n(6010),o=n(833),r=n(5281),i=n(3320),c=n(3438),s=n(4477),d=n(1116),m=n(4774),u=n(5999),b=n(2466),p=n(5936);const h="backToTopButton_sjWU",E="backToTopButtonShow_xfvO";function f(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,l]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:r,cancelScroll:i}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(o.current?o.current=!1:a>=r?(i(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h,e&&E),type:"button",onClick:t})}var v=n(6550),g=n(7524),_=n(6668),k=n(1327),C=n(7462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const I="collapseSidebarButton_PEFL",N="collapseSidebarButtonIcon_kv0_";function Z(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,l.Z)("button button--secondary button--outline",I),onClick:t},a.createElement(S,{className:N}))}var y=n(9689),x=n(902);const T=Symbol("EmptyContext"),w=a.createContext(T);function L(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(w.Provider,{value:o},t)}var A=n(6043),M=n(8596),B=n(9960),F=n(2389);function H(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function P(e){let{item:t,onItemClick:n,activePath:o,level:i,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,_.L)(),f=function(e){const t=(0,F.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,c.Wl)(e):void 0),[e,t])}(t),v=(0,c._F)(t,o),g=(0,M.Mg)(h,o),{collapsed:k,setCollapsed:S}=(0,A.u)({initialState:()=>!!b&&(!v&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(w);if(e===T)throw new x.i6("DocSidebarItemsExpandedStateProvider");return e}(),Z=function(e){void 0===e&&(e=!k),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,x.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:v,collapsed:k,updateCollapsed:Z}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(i),"menu__list-item",{"menu__list-item--collapsed":k},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g})},a.createElement(B.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":v}),onClick:b?e=>{n?.(t),h?Z(!1):(e.preventDefault(),Z())}:()=>{n?.(t)},"aria-current":g?"page":void 0,"aria-expanded":b?!k:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(H,{categoryLabel:u,onClick:e=>{e.preventDefault(),Z()}})),a.createElement(A.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:k},a.createElement(q,{items:m,tabIndex:k?-1:0,onItemClick:n,activePath:o,level:i+1})))}var D=n(3919),W=n(9471);const R="menuExternalLink_NmtK";function V(e){let{item:t,onItemClick:n,activePath:o,level:i,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,c._F)(t,o),E=(0,D.Z)(m);return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(i),"menu__list-item",b),key:u},a.createElement(B.Z,(0,C.Z)({className:(0,l.Z)("menu__link",!E&&R,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.Z,null)))}const z="menuHtmlItem_M9Kj";function U(e){let{item:t,level:n,index:o}=e;const{value:i,defaultStyle:c,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),c&&[z,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:i}})}function K(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(P,(0,C.Z)({item:t},n));case"html":return a.createElement(U,(0,C.Z)({item:t},n));default:return a.createElement(V,(0,C.Z)({item:t},n))}}function j(e){let{items:t,...n}=e;return a.createElement(L,null,t.map(((e,t)=>a.createElement(K,(0,C.Z)({key:t,item:e,index:t},n)))))}const q=(0,a.memo)(j),G="menu_SIkG",Y="menuWithAnnouncementBar_GW3s";function O(e){let{path:t,sidebar:n,className:o}=e;const i=function(){const{isActive:e}=(0,y.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,l.Z)("menu thin-scrollbar",G,i&&Y,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(q,{items:n,activePath:t,level:1})))}const X="sidebar_njMd",J="sidebarWithHideableNavbar_wUlq",Q="sidebarHidden_VK0M",$="sidebarLogo_isFc";function ee(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:i},docs:{sidebar:{hideable:c}}}=(0,_.L)();return a.createElement("div",{className:(0,l.Z)(X,i&&J,r&&Q)},i&&a.createElement(k.Z,{tabIndex:-1,className:$}),a.createElement(O,{path:t,sidebar:n}),c&&a.createElement(Z,{onClick:o}))}const te=a.memo(ee);var ne=n(3102),ae=n(3163);const le=e=>{let{sidebar:t,path:n}=e;const o=(0,ae.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(q,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function oe(e){return a.createElement(ne.Zo,{component:le,props:e})}const re=a.memo(oe);function ie(e){const t=(0,g.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement(te,e),l&&a.createElement(re,e))}const ce="expandButton_m80_",se="expandButtonIcon_BlDH";function de(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:ce,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(S,{className:se}))}const me={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function ue(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function be(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e;const{pathname:i}=(0,v.TH)(),[c,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{c&&s(!1),o((e=>!e))}),[o,c]);return a.createElement("aside",{className:(0,l.Z)(r.k.docs.docSidebarContainer,me.docSidebarContainer,n&&me.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(me.docSidebarContainer)&&n&&s(!0)}},a.createElement(ue,null,a.createElement("div",{className:(0,l.Z)(me.sidebarViewport,c&&me.sidebarViewportHidden)},a.createElement(ie,{sidebar:t,path:i,onCollapse:d,isHidden:c}),c&&a.createElement(de,{toggleSidebar:d}))))}const pe={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function he(e){let{hiddenSidebarContainer:t,children:n}=e;const o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(pe.docMainContainer,(t||!o)&&pe.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.Z)("container padding-top--md padding-bottom--lg",pe.docItemWrapper,t&&pe.docItemWrapperEnhanced)},n))}const Ee="docPage__5DB",fe="docsWrapper_BCFX";function ve(e){let{children:t}=e;const n=(0,d.V)(),[l,o]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:fe},a.createElement(f,null),a.createElement("div",{className:Ee},n&&a.createElement(be,{sidebar:n.items,hiddenSidebarContainer:l,setHiddenSidebarContainer:o}),a.createElement(he,{hiddenSidebarContainer:l},t)))}var ge=n(4972),_e=n(197);function ke(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(_e.Z,{version:t.version,tag:(0,i.os)(t.pluginId,t.version)}),a.createElement(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function Ce(e){const{versionMetadata:t}=e,n=(0,c.hI)(e);if(!n)return a.createElement(ge.default,null);const{docElement:i,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(ke,e),a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(ve,null,i)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(7294),l=n(5999),o=n(833),r=n(4774);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}},4477:(e,t,n)=>{n.d(t,{E:()=>i,q:()=>r});var a=n(7294),l=n(902);const o=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(o.Provider,{value:n},t)}function i(){const e=(0,a.useContext)(o);if(null===e)throw new l.i6("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/1c5d8736.87b3f575.js b/assets/js/1c5d8736.87b3f575.js deleted file mode 100644 index 1e236d323..000000000 --- a/assets/js/1c5d8736.87b3f575.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7011],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>d});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),m=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=m(e.components);return r.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=m(a),d=n,f=s["".concat(p,".").concat(d)]||s[d]||u[d]||l;return a?r.createElement(f,o(o({ref:t},c),{},{components:a})):r.createElement(f,o({ref:t},c))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:n,o[1]=i;for(var m=2;m{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var r=a(7462),n=(a(7294),a(3905));const l={title:"JSR-310",slug:4,tags:["Java","Time"]},o=void 0,i={permalink:"/4",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-08-JSR-310.mdx",source:"@site/blog/2023/2023-01-08-JSR-310.mdx",title:"JSR-310",description:"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",date:"2023-01-08T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 8\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Time",permalink:"/tags/time"}],readingTime:1.685,hasTruncateMarker:!1,authors:[],frontMatter:{title:"JSR-310",slug:"4",tags:["Java","Time"]},prevItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"},nextItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"}},p={authorsImageUrls:[]},m=[{value:"LocalDate, LocalTime, LocalDateTime",id:"localdate-localtime-localdatetime",level:3},{value:"Instant",id:"instant",level:3},{value:"Duration, Period",id:"duration-period",level:3},{value:"TemporalAdjusters",id:"temporaladjusters",level:3},{value:"DateTimeFormatter",id:"datetimeformatter",level:3},{value:"ZoneId, ZoneOffset",id:"zoneid-zoneoffset",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:m};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",(0,n.kt)("br",{parentName:"p"}),"\n","ISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131",(0,n.kt)("br",{parentName:"p"}),"\n","\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131"),(0,n.kt)("admonition",{title:"ISO-8601",type:"note"},(0,n.kt)("p",{parentName:"admonition"},"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900")),(0,n.kt)("h3",{id:"localdate-localtime-localdatetime"},"LocalDate, LocalTime, LocalDateTime"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"instant"},"Instant"),(0,n.kt)("p",null,"\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604"),(0,n.kt)("h3",{id:"duration-period"},"Duration, Period"),(0,n.kt)("p",null,"\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"temporaladjusters"},"TemporalAdjusters"),(0,n.kt)("p",null,"\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface TemporalAdjuster {\n Temporal adjustInto(Temporal temporal);\n}\n")),(0,n.kt)("h3",{id:"datetimeformatter"},"DateTimeFormatter"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5"),(0,n.kt)("h3",{id:"zoneid-zoneoffset"},"ZoneId, ZoneOffset"),(0,n.kt)("p",null,"ZoneId\ub294 \uc9c0\uc5ed ID\ub294 ",(0,n.kt)("inlineCode",{parentName:"p"},"\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019")," \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","ZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"Instant instant = Instant.now();\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\n")),(0,n.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001810171"},"\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://d2.naver.com/helloworld/645609"},"Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.w3.org/TR/NOTE-datetime"},"ISO-8601")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4"},"JSR-310 Spec")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.baeldung.com/java-temporal-adjuster"},"Temporal Adjuster")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html"},"DateTimeFormatter"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1c5d8736.da315bad.js b/assets/js/1c5d8736.da315bad.js new file mode 100644 index 000000000..904ae25ea --- /dev/null +++ b/assets/js/1c5d8736.da315bad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7011],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),m=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=m(e.components);return r.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=m(a),d=n,f=s["".concat(p,".").concat(d)]||s[d]||u[d]||l;return a?r.createElement(f,o(o({ref:t},c),{},{components:a})):r.createElement(f,o({ref:t},c))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:n,o[1]=i;for(var m=2;m{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var r=a(87462),n=(a(67294),a(3905));const l={title:"JSR-310",slug:4,tags:["Java","Time"]},o=void 0,i={permalink:"/4",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-08-JSR-310.mdx",source:"@site/blog/2023/2023-01-08-JSR-310.mdx",title:"JSR-310",description:"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",date:"2023-01-08T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 8\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Time",permalink:"/tags/time"}],readingTime:1.685,hasTruncateMarker:!1,authors:[],frontMatter:{title:"JSR-310",slug:"4",tags:["Java","Time"]},prevItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"},nextItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"}},p={authorsImageUrls:[]},m=[{value:"LocalDate, LocalTime, LocalDateTime",id:"localdate-localtime-localdatetime",level:3},{value:"Instant",id:"instant",level:3},{value:"Duration, Period",id:"duration-period",level:3},{value:"TemporalAdjusters",id:"temporaladjusters",level:3},{value:"DateTimeFormatter",id:"datetimeformatter",level:3},{value:"ZoneId, ZoneOffset",id:"zoneid-zoneoffset",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:m};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",(0,n.kt)("br",{parentName:"p"}),"\n","ISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131",(0,n.kt)("br",{parentName:"p"}),"\n","\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131"),(0,n.kt)("admonition",{title:"ISO-8601",type:"note"},(0,n.kt)("p",{parentName:"admonition"},"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900")),(0,n.kt)("h3",{id:"localdate-localtime-localdatetime"},"LocalDate, LocalTime, LocalDateTime"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"instant"},"Instant"),(0,n.kt)("p",null,"\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604"),(0,n.kt)("h3",{id:"duration-period"},"Duration, Period"),(0,n.kt)("p",null,"\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"temporaladjusters"},"TemporalAdjusters"),(0,n.kt)("p",null,"\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface TemporalAdjuster {\n Temporal adjustInto(Temporal temporal);\n}\n")),(0,n.kt)("h3",{id:"datetimeformatter"},"DateTimeFormatter"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5"),(0,n.kt)("h3",{id:"zoneid-zoneoffset"},"ZoneId, ZoneOffset"),(0,n.kt)("p",null,"ZoneId\ub294 \uc9c0\uc5ed ID\ub294 ",(0,n.kt)("inlineCode",{parentName:"p"},"\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019")," \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","ZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"Instant instant = Instant.now();\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\n")),(0,n.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001810171"},"\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://d2.naver.com/helloworld/645609"},"Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.w3.org/TR/NOTE-datetime"},"ISO-8601")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4"},"JSR-310 Spec")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.baeldung.com/java-temporal-adjuster"},"Temporal Adjuster")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html"},"DateTimeFormatter"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1c74a8fd.a7647166.js b/assets/js/1c74a8fd.a7647166.js deleted file mode 100644 index f7f1a640c..000000000 --- a/assets/js/1c74a8fd.a7647166.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2007],{3905:(e,t,l)=>{l.d(t,{Zo:()=>c,kt:()=>m});var n=l(7294);function r(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function a(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,n)}return l}function o(e){for(var t=1;t=0||(r[l]=e[l]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),l=t;return e&&(l="function"==typeof e?e(t):o(o({},t),e)),l},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var l=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(l),m=r,d=s["".concat(p,".").concat(m)]||s[m]||k[m]||a;return l?n.createElement(d,o(o({ref:t},c),{},{components:l})):n.createElement(d,o({ref:t},c))}));function m(e,t){var l=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=l.length,o=new Array(a);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var u=2;u{l.r(t),l.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>k,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var n=l(7462),r=(l(7294),l(3905));const a={title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:11,tags:["GRASP","OOP"]},o=void 0,i={permalink:"/11",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-30-GRASP.mdx",source:"@site/blog/2023/2023-03-30-GRASP.mdx",title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",description:"GRASP(General Responsibility Assignment Software Pattern)",date:"2023-03-30T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 30\uc77c",tags:[{label:"GRASP",permalink:"/tags/grasp"},{label:"OOP",permalink:"/tags/oop"}],readingTime:8.085,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:"11",tags:["GRASP","OOP"]},prevItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"},nextItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"}},p={authorsImageUrls:[]},u=[{value:"GRASP(General Responsibility Assignment Software Pattern)",id:"graspgeneral-responsibility-assignment-software-pattern",level:3},{value:"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)",id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert",level:3},{value:"\ucc3d\uc870\uc790 \ud328\ud134(Creator)",id:"\ucc3d\uc870\uc790-\ud328\ud134creator",level:3},{value:"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)",id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling",level:3},{value:"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)",id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion",level:3},{value:"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)",id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller",level:3},{value:"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)",id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism",level:3},{value:"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)",id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations",level:3},{value:"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)",id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection",level:3},{value:"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)",id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:u};function k(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"graspgeneral-responsibility-assignment-software-pattern"},"GRASP(General Responsibility Assignment Software Pattern)"),(0,r.kt)("p",null,"\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134"),(0,r.kt)("p",null,"\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert"},"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)"),(0,r.kt)("p",null,"Q: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?"),(0,r.kt)("p",null,"A: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\ucc3d\uc870\uc790-\ud328\ud134creator"},"\ucc3d\uc870\uc790 \ud328\ud134(Creator)"),(0,r.kt)("p",null,"Q: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?"),(0,r.kt)("p",null,"A: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.")),(0,r.kt)("p",null,"\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)"),(0,r.kt)("p",null,"Q: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?"),(0,r.kt)("p",null,"A: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uacb0\ud569\ub3c4(Coupling)\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.17"))),(0,r.kt)("p",null,"\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)")),(0,r.kt)("h3",{id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion"},"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uc751\uc9d1\ub3c4(Cohesion)\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.26"))),(0,r.kt)("p",null,"\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)"),(0,r.kt)("li",{parentName:"ul"},"\uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.")),(0,r.kt)("h3",{id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller"},"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)"),(0,r.kt)("p",null,"Q. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?"),(0,r.kt)("p",null,"A. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("p",null,"\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.")),(0,r.kt)("h3",{id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism"},"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)"),(0,r.kt)("p",null,"\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4."),(0,r.kt)("p",null,"\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations"},"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)"),(0,r.kt)("p",null,"Q. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?"),(0,r.kt)("p",null,"A. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection"},"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)"),(0,r.kt)("p",null,"Q. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication"},"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)"),(0,r.kt)("p",null,"Q. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("p",null,"\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, ",(0,r.kt)("a",{parentName:"p",href:"http://aeternum.egloos.com/"},"\uc870\uc601\ud638")),(0,r.kt)("p",null,"Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397"},"GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1c74a8fd.fab7ed2c.js b/assets/js/1c74a8fd.fab7ed2c.js new file mode 100644 index 000000000..0b836ff44 --- /dev/null +++ b/assets/js/1c74a8fd.fab7ed2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2007],{3905:(e,t,l)=>{l.d(t,{Zo:()=>c,kt:()=>m});var n=l(67294);function r(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function a(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,n)}return l}function o(e){for(var t=1;t=0||(r[l]=e[l]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),l=t;return e&&(l="function"==typeof e?e(t):o(o({},t),e)),l},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var l=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(l),m=r,d=s["".concat(p,".").concat(m)]||s[m]||k[m]||a;return l?n.createElement(d,o(o({ref:t},c),{},{components:l})):n.createElement(d,o({ref:t},c))}));function m(e,t){var l=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=l.length,o=new Array(a);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var u=2;u{l.r(t),l.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>k,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var n=l(87462),r=(l(67294),l(3905));const a={title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:11,tags:["GRASP","OOP"]},o=void 0,i={permalink:"/11",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-30-GRASP.mdx",source:"@site/blog/2023/2023-03-30-GRASP.mdx",title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",description:"GRASP(General Responsibility Assignment Software Pattern)",date:"2023-03-30T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 30\uc77c",tags:[{label:"GRASP",permalink:"/tags/grasp"},{label:"OOP",permalink:"/tags/oop"}],readingTime:8.085,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:"11",tags:["GRASP","OOP"]},prevItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"},nextItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"}},p={authorsImageUrls:[]},u=[{value:"GRASP(General Responsibility Assignment Software Pattern)",id:"graspgeneral-responsibility-assignment-software-pattern",level:3},{value:"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)",id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert",level:3},{value:"\ucc3d\uc870\uc790 \ud328\ud134(Creator)",id:"\ucc3d\uc870\uc790-\ud328\ud134creator",level:3},{value:"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)",id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling",level:3},{value:"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)",id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion",level:3},{value:"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)",id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller",level:3},{value:"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)",id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism",level:3},{value:"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)",id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations",level:3},{value:"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)",id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection",level:3},{value:"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)",id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:u};function k(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"graspgeneral-responsibility-assignment-software-pattern"},"GRASP(General Responsibility Assignment Software Pattern)"),(0,r.kt)("p",null,"\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134"),(0,r.kt)("p",null,"\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert"},"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)"),(0,r.kt)("p",null,"Q: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?"),(0,r.kt)("p",null,"A: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\ucc3d\uc870\uc790-\ud328\ud134creator"},"\ucc3d\uc870\uc790 \ud328\ud134(Creator)"),(0,r.kt)("p",null,"Q: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?"),(0,r.kt)("p",null,"A: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.")),(0,r.kt)("p",null,"\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)"),(0,r.kt)("p",null,"Q: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?"),(0,r.kt)("p",null,"A: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uacb0\ud569\ub3c4(Coupling)\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.17"))),(0,r.kt)("p",null,"\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)")),(0,r.kt)("h3",{id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion"},"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uc751\uc9d1\ub3c4(Cohesion)\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.26"))),(0,r.kt)("p",null,"\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)"),(0,r.kt)("li",{parentName:"ul"},"\uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.")),(0,r.kt)("h3",{id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller"},"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)"),(0,r.kt)("p",null,"Q. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?"),(0,r.kt)("p",null,"A. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("p",null,"\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.")),(0,r.kt)("h3",{id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism"},"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)"),(0,r.kt)("p",null,"\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4."),(0,r.kt)("p",null,"\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations"},"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)"),(0,r.kt)("p",null,"Q. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?"),(0,r.kt)("p",null,"A. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection"},"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)"),(0,r.kt)("p",null,"Q. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication"},"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)"),(0,r.kt)("p",null,"Q. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("p",null,"\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, ",(0,r.kt)("a",{parentName:"p",href:"http://aeternum.egloos.com/"},"\uc870\uc601\ud638")),(0,r.kt)("p",null,"Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397"},"GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1c93669b.2c87ec5f.js b/assets/js/1c93669b.2c87ec5f.js deleted file mode 100644 index 2ad627fc2..000000000 --- a/assets/js/1c93669b.2c87ec5f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6526],{7579:e=>{e.exports=JSON.parse('{"label":"monitoring","permalink":"/docs/tags/monitoring","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","title":"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","description":"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4","permalink":"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131"}]}')}}]); \ No newline at end of file diff --git a/assets/js/1c93669b.ba188e36.js b/assets/js/1c93669b.ba188e36.js new file mode 100644 index 000000000..2a3653c67 --- /dev/null +++ b/assets/js/1c93669b.ba188e36.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6526],{37579:e=>{e.exports=JSON.parse('{"label":"monitoring","permalink":"/docs/tags/monitoring","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","title":"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","description":"\ubaa8\ub2c8\ud130\ub9c1 3\ub2e8\uacc4","permalink":"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131"}]}')}}]); \ No newline at end of file diff --git a/assets/js/1d81daa1.6ca0dfe3.js b/assets/js/1d81daa1.6ca0dfe3.js deleted file mode 100644 index 4fc37a79f..000000000 --- a/assets/js/1d81daa1.6ca0dfe3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7681],{6725:e=>{e.exports=JSON.parse('{"label":"Mock","permalink":"/tags/mock","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/1d81daa1.821e44e6.js b/assets/js/1d81daa1.821e44e6.js new file mode 100644 index 000000000..d54dd4f70 --- /dev/null +++ b/assets/js/1d81daa1.821e44e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7681],{76725:e=>{e.exports=JSON.parse('{"label":"Mock","permalink":"/tags/mock","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/1e4ebcd5.8671725c.js b/assets/js/1e4ebcd5.8671725c.js new file mode 100644 index 000000000..23a78c36e --- /dev/null +++ b/assets/js/1e4ebcd5.8671725c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[311],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,g=d["".concat(p,".").concat(m)]||d[m]||c[m]||i;return n?r.createElement(g,l(l({ref:t},s),{},{components:n})):r.createElement(g,l({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(67294),a=n(86010);const i="tabItem_Ymn6";function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(i,l),hidden:n},t)}},74866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(87462),a=n(67294),i=n(86010),l=n(12466),o=n(16550),p=n(91980),u=n(67392),s=n(50012);function c(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??c(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:n}=e;const r=(0,o.k6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,p._X)(i),(0,a.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=d(e),[l,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:i}))),[p,u]=g({queryString:n,groupId:r}),[c,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,s.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),b=(()=>{const e=p??c;return m({value:e,tabValues:i})?e:null})();(0,a.useEffect)((()=>{b&&o(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),v(e)}),[u,v,i]),tabValues:i}}var b=n(72389);const h="tabList__CuJ",k="tabItem_LNqP";function f(e){let{className:t,block:n,selectedValue:o,selectValue:p,tabValues:u}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),d=e=>{const t=e.currentTarget,n=s.indexOf(t),r=u[n].value;r!==o&&(c(t),p(r))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>s.push(e),onKeyDown:m,onClick:d},l,{className:(0,i.Z)("tabs__item",k,l?.className,{"tabs__item--active":o===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:r}=e;if(t){const e=n.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function T(e){const t=v(e);return a.createElement("div",{className:(0,i.Z)("tabs-container",h)},a.createElement(f,(0,r.Z)({},e,t)),a.createElement(y,(0,r.Z)({},e,t)))}function E(e){const t=(0,b.Z)();return a.createElement(T,(0,r.Z)({key:String(t)},e))}},20692:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>c});var r=n(87462),a=(n(67294),n(3905)),i=n(74866),l=n(85162);const o={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:40,tags:["async","event"]},p=void 0,u={permalink:"/40",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",source:"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",description:"\uc774\uc804 \uae00",date:"2023-08-13T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 13\uc77c",tags:[{label:"async",permalink:"/tags/async"},{label:"event",permalink:"/tags/event"}],readingTime:11.2,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:"40",tags:["async","event"]},prevItem:{title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",permalink:"/41"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"}},s={authorsImageUrls:[]},c=[{value:"\uc774\uc804 \uae00",id:"\uc774\uc804-\uae00",level:2},{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120",id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120",level:3},{value:"\ud655\uc7a5\uc131 \ub300\ube44",id:"\ud655\uc7a5\uc131-\ub300\ube44",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac",level:2},{value:"\ube44\ub3d9\uae30 \uc124\uc815",id:"\ube44\ub3d9\uae30-\uc124\uc815",level:3},{value:"@Async \uc801\uc6a9",id:"async-\uc801\uc6a9",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810",level:3},{value:"\uc774\ubca4\ud2b8 \uc0ac\uc6a9",id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9",level:2},{value:"\uc774\ubca4\ud2b8 \ubc1c\ud589",id:"\uc774\ubca4\ud2b8-\ubc1c\ud589",level:3},{value:"\uc774\ubca4\ud2b8 \uad6c\ub3c5",id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5",level:3},{value:"\ud14c\uc2a4\ud2b8",id:"\ud14c\uc2a4\ud2b8",level:3},{value:"\uacb0\uacfc",id:"\uacb0\uacfc",level:2},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],d={toc:c};function m(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"\uc774\uc804-\uae00"},"\uc774\uc804 \uae00"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"./36"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"./39"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604")),(0,a.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120"},"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120"),(0,a.kt)("p",null,"\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\ud655\uc7a5\uc131-\ub300\ube44"},"\ud655\uc7a5\uc131 \ub300\ube44"),(0,a.kt)("p",null,"\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. "),(0,a.kt)("h2",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac"},"\ube44\ub3d9\uae30 \ucc98\ub9ac"),(0,a.kt)("p",null,"@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\uc124\uc815"},"\ube44\ub3d9\uae30 \uc124\uc815"),(0,a.kt)("p",null,"\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="AsyncConfig"',title:'"AsyncConfig"'},"@EnableAsync\n@Configuration\npublic class AsyncConfig {\n}\n")),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. "),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\n7.7. Task Execution and Scheduling, Spring Boot Docs")),(0,a.kt)("h3",{id:"async-\uc801\uc6a9"},"@Async \uc801\uc6a9"),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator"',title:'"RouteImageGenerator"'},"@Async\npublic void generate(\n List latitudes,\n List longitudes,\n List pointedLatitudes,\n List pointedLongitudes,\n Long tripId\n) {\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\n\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\n\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\n routeImageDrawer.dispose();\n\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\n Trip trip = tripRepository.findById(tripId)\n .orElseThrow();\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n}\n")),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810"},"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810"),(0,a.kt)("p",null,"\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\n draw --\x3e trip"}),(0,a.kt)("p",null,"\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n\tsubgraph draw\n\t\tdirection LR\n\t\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\n\tend\n subgraph trip\n\t\tdirection LR\n\t\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\n\t\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\n\tend\n\n\ttrip --\x3e draw"}),(0,a.kt)("p",null,"\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9"},"\uc774\ubca4\ud2b8 \uc0ac\uc6a9"),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\ubc1c\ud589"},"\uc774\ubca4\ud2b8 \ubc1c\ud589"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripService & TripUpdateEvent"',title:'"TripService',"&":!0,'TripUpdateEvent"':!0},"public void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\n ...\n\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\n}\n\npublic record TripUpdateEvent(Long tripId) {\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5"},"\uc774\ubca4\ud2b8 \uad6c\ub3c5"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec ",(0,a.kt)("inlineCode",{parentName:"p"},"@Async")," \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 ",(0,a.kt)("inlineCode",{parentName:"p"},"@TransactionalEventListener"),"\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,a.kt)("admonition",{title:"TransactionPhase \uc124\uc815",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"TransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("p",{parentName:"admonition"},"AFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","BEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 ")),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripUpdateEventHandler"',title:'"TripUpdateEventHandler"'},"@Component\npublic class TripUpdateEventHandler {\n\n private final RouteImageGenerator routeImageGenerator;\n private final TripRepository tripRepository;\n\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\n this.routeImageGenerator = routeImageGenerator;\n this.tripRepository = tripRepository;\n }\n\n @Async\n @TransactionalEventListener(phase = AFTER_COMMIT)\n public void handle(TripUpdateEvent tripUpdateEvent) {\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\n\n String imageUrl = routeImageGenerator.generate(\n trip.getLatitudes(),\n trip.getLongitudes(),\n trip.getPointedLatitudes(),\n trip.getPointedLongitudes()\n );\n\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n }\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4."),(0,a.kt)("mermaid",{value:"graph LR\n subgraph trip\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\n TripRepository\n end\n\n subgraph draw\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\n end"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8"},"\ud14c\uc2a4\ud2b8"),(0,a.kt)("p",null,"\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. "),(0,a.kt)(i.Z,{mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",label:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(Mockito.timeout(5000).times(1))\n .generate(any(), any(), any(), any());\n }\n}\n"))),(0,a.kt)(l.Z,{value:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",label:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ContextConfiguration(classes = TestSyncConfig.class)\n@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(times(1))\n .generate(any(), any(), any(), any());\n }\n}\n")))),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0")," \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c ",(0,a.kt)("inlineCode",{parentName:"p"},"Mockito.timeout")," \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uacb0\uacfc"},"\uacb0\uacfc"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"./time.png",src:n(39711).Z,width:"1682",height:"678"})),(0,a.kt)("p",null,"\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. "),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling"},"7.7. Task Execution and Scheduling, Spring Boot Docs"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/spring-events"},"Spring Events, Baeldung"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/7835/"},"\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30")))}m.isMDXComponent=!0},39711:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/time-8bef9a6cf2dcace85f12ae5624da94f5.png"}}]); \ No newline at end of file diff --git a/assets/js/1e4ebcd5.aa2c23a6.js b/assets/js/1e4ebcd5.aa2c23a6.js deleted file mode 100644 index f68a2119f..000000000 --- a/assets/js/1e4ebcd5.aa2c23a6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[311],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,g=d["".concat(p,".").concat(m)]||d[m]||c[m]||i;return n?r.createElement(g,l(l({ref:t},s),{},{components:n})):r.createElement(g,l({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{n.d(t,{Z:()=>l});var r=n(7294),a=n(6010);const i="tabItem_Ymn6";function l(e){let{children:t,hidden:n,className:l}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(i,l),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>E});var r=n(7462),a=n(7294),i=n(6010),l=n(2466),o=n(6550),p=n(1980),u=n(7392),s=n(12);function c(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??c(n);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:n}=e;const r=(0,o.k6)(),i=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,p._X)(i),(0,a.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function v(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,i=d(e),[l,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:i}))),[p,u]=g({queryString:n,groupId:r}),[c,v]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,i]=(0,s.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&i.set(e)}),[n,i])]}({groupId:r}),b=(()=>{const e=p??c;return m({value:e,tabValues:i})?e:null})();(0,a.useEffect)((()=>{b&&o(b)}),[b]);return{selectedValue:l,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),v(e)}),[u,v,i]),tabValues:i}}var b=n(2389);const h="tabList__CuJ",k="tabItem_LNqP";function f(e){let{className:t,block:n,selectedValue:o,selectValue:p,tabValues:u}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),d=e=>{const t=e.currentTarget,n=s.indexOf(t),r=u[n].value;r!==o&&(c(t),p(r))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=s.indexOf(e.currentTarget)+1;t=s[n]??s[0];break}case"ArrowLeft":{const n=s.indexOf(e.currentTarget)-1;t=s[n]??s[s.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:l}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>s.push(e),onKeyDown:m,onClick:d},l,{className:(0,i.Z)("tabs__item",k,l?.className,{"tabs__item--active":o===t})}),n??t)})))}function y(e){let{lazy:t,children:n,selectedValue:r}=e;if(t){const e=n.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function T(e){const t=v(e);return a.createElement("div",{className:(0,i.Z)("tabs-container",h)},a.createElement(f,(0,r.Z)({},e,t)),a.createElement(y,(0,r.Z)({},e,t)))}function E(e){const t=(0,b.Z)();return a.createElement(T,(0,r.Z)({key:String(t)},e))}},692:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>c});var r=n(7462),a=(n(7294),n(3905)),i=n(4866),l=n(5162);const o={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:40,tags:["async","event"]},p=void 0,u={permalink:"/40",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",source:"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",description:"\uc774\uc804 \uae00",date:"2023-08-13T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 13\uc77c",tags:[{label:"async",permalink:"/tags/async"},{label:"event",permalink:"/tags/event"}],readingTime:11.2,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",slug:"40",tags:["async","event"]},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"}},s={authorsImageUrls:[]},c=[{value:"\uc774\uc804 \uae00",id:"\uc774\uc804-\uae00",level:2},{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120",id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120",level:3},{value:"\ud655\uc7a5\uc131 \ub300\ube44",id:"\ud655\uc7a5\uc131-\ub300\ube44",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac",level:2},{value:"\ube44\ub3d9\uae30 \uc124\uc815",id:"\ube44\ub3d9\uae30-\uc124\uc815",level:3},{value:"@Async \uc801\uc6a9",id:"async-\uc801\uc6a9",level:3},{value:"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810",id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810",level:3},{value:"\uc774\ubca4\ud2b8 \uc0ac\uc6a9",id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9",level:2},{value:"\uc774\ubca4\ud2b8 \ubc1c\ud589",id:"\uc774\ubca4\ud2b8-\ubc1c\ud589",level:3},{value:"\uc774\ubca4\ud2b8 \uad6c\ub3c5",id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5",level:3},{value:"\ud14c\uc2a4\ud2b8",id:"\ud14c\uc2a4\ud2b8",level:3},{value:"\uacb0\uacfc",id:"\uacb0\uacfc",level:2},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],d={toc:c};function m(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"\uc774\uc804-\uae00"},"\uc774\uc804 \uae00"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"./36"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"./39"},"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604")),(0,a.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\uc8fc\uae30\ub2a5\uc758-\uc751\ub2f5\uc18d\ub3c4-\uac1c\uc120"},"\uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120"),(0,a.kt)("p",null,"\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\ud655\uc7a5\uc131-\ub300\ube44"},"\ud655\uc7a5\uc131 \ub300\ube44"),(0,a.kt)("p",null,"\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. "),(0,a.kt)("h2",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac"},"\ube44\ub3d9\uae30 \ucc98\ub9ac"),(0,a.kt)("p",null,"@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\uc124\uc815"},"\ube44\ub3d9\uae30 \uc124\uc815"),(0,a.kt)("p",null,"\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="AsyncConfig"',title:'"AsyncConfig"'},"@EnableAsync\n@Configuration\npublic class AsyncConfig {\n}\n")),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. "),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\n7.7. Task Execution and Scheduling, Spring Boot Docs")),(0,a.kt)("h3",{id:"async-\uc801\uc6a9"},"@Async \uc801\uc6a9"),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator"',title:'"RouteImageGenerator"'},"@Async\npublic void generate(\n List latitudes,\n List longitudes,\n List pointedLatitudes,\n List pointedLongitudes,\n Long tripId\n) {\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\n\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\n\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\n routeImageDrawer.dispose();\n\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\n Trip trip = tripRepository.findById(tripId)\n .orElseThrow();\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n}\n")),(0,a.kt)("h3",{id:"\ube44\ub3d9\uae30-\ucc98\ub9ac\uc2dc-\ubb38\uc81c\uc810"},"\ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810"),(0,a.kt)("p",null,"\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\n draw --\x3e trip"}),(0,a.kt)("p",null,"\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. "),(0,a.kt)("mermaid",{value:"graph LR\n\tsubgraph draw\n\t\tdirection LR\n\t\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\n\tend\n subgraph trip\n\t\tdirection LR\n\t\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\n\t\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\n\tend\n\n\ttrip --\x3e draw"}),(0,a.kt)("p",null,"\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uc774\ubca4\ud2b8-\uc0ac\uc6a9"},"\uc774\ubca4\ud2b8 \uc0ac\uc6a9"),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\ubc1c\ud589"},"\uc774\ubca4\ud2b8 \ubc1c\ud589"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripService & TripUpdateEvent"',title:'"TripService',"&":!0,'TripUpdateEvent"':!0},"public void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\n ...\n\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\n}\n\npublic record TripUpdateEvent(Long tripId) {\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. "),(0,a.kt)("h3",{id:"\uc774\ubca4\ud2b8-\uad6c\ub3c5"},"\uc774\ubca4\ud2b8 \uad6c\ub3c5"),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec ",(0,a.kt)("inlineCode",{parentName:"p"},"@Async")," \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 ",(0,a.kt)("inlineCode",{parentName:"p"},"@TransactionalEventListener"),"\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,a.kt)("admonition",{title:"TransactionPhase \uc124\uc815",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"TransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("p",{parentName:"admonition"},"AFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","AFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589",(0,a.kt)("br",{parentName:"p"}),"\n","BEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 ")),(0,a.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="TripUpdateEventHandler"',title:'"TripUpdateEventHandler"'},"@Component\npublic class TripUpdateEventHandler {\n\n private final RouteImageGenerator routeImageGenerator;\n private final TripRepository tripRepository;\n\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\n this.routeImageGenerator = routeImageGenerator;\n this.tripRepository = tripRepository;\n }\n\n @Async\n @TransactionalEventListener(phase = AFTER_COMMIT)\n public void handle(TripUpdateEvent tripUpdateEvent) {\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\n\n String imageUrl = routeImageGenerator.generate(\n trip.getLatitudes(),\n trip.getLongitudes(),\n trip.getPointedLatitudes(),\n trip.getPointedLongitudes()\n );\n\n trip.changeRouteImageUrl(imageUrl);\n tripRepository.save(trip);\n }\n}\n")),(0,a.kt)("p",null,"\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4."),(0,a.kt)("mermaid",{value:"graph LR\n subgraph trip\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\n TripRepository\n end\n\n subgraph draw\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\n end"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8"},"\ud14c\uc2a4\ud2b8"),(0,a.kt)("p",null,"\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. "),(0,a.kt)(i.Z,{mdxType:"Tabs"},(0,a.kt)(l.Z,{value:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",label:"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(Mockito.timeout(5000).times(1))\n .generate(any(), any(), any(), any());\n }\n}\n"))),(0,a.kt)(l.Z,{value:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",label:"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ContextConfiguration(classes = TestSyncConfig.class)\n@SpringBootTest\npublic class TripUpdateEventHandlerIntegrationTest {\n\n ...\n\n @Test\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\n // given\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\n .willReturn(\uc5ec\ud589());\n\n // when\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\n\n // then\n then(routeImageGenerator)\n .should(times(1))\n .generate(any(), any(), any(), any());\n }\n}\n")))),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0")," \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c ",(0,a.kt)("inlineCode",{parentName:"p"},"Mockito.timeout")," \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. "),(0,a.kt)("h2",{id:"\uacb0\uacfc"},"\uacb0\uacfc"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"./time.png",src:n(9711).Z,width:"1682",height:"678"})),(0,a.kt)("p",null,"\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. "),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling"},"7.7. Task Execution and Scheduling, Spring Boot Docs"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/spring-events"},"Spring Events, Baeldung"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/7835/"},"\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30")))}m.isMDXComponent=!0},9711:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/time-8bef9a6cf2dcace85f12ae5624da94f5.png"}}]); \ No newline at end of file diff --git a/assets/js/c037d168.1ed5ba36.js b/assets/js/1fbde614.de74c976.js similarity index 50% rename from assets/js/c037d168.1ed5ba36.js rename to assets/js/1fbde614.de74c976.js index 3ccb9ad47..e2dc2230f 100644 --- a/assets/js/c037d168.1ed5ba36.js +++ b/assets/js/1fbde614.de74c976.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6587],{1235:e=>{e.exports=JSON.parse('{"permalink":"/tags/transaction","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8243],{87304:e=>{e.exports=JSON.parse('{"permalink":"/tags/monitoring","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/20e99c2a.6847aa4d.js b/assets/js/20e99c2a.6847aa4d.js deleted file mode 100644 index 55bd5e395..000000000 --- a/assets/js/20e99c2a.6847aa4d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3530],{9507:e=>{e.exports=JSON.parse('{"permalink":"/tags/documentation","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/20e99c2a.90a43ac9.js b/assets/js/20e99c2a.90a43ac9.js new file mode 100644 index 000000000..a9d767b08 --- /dev/null +++ b/assets/js/20e99c2a.90a43ac9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3530],{19507:e=>{e.exports=JSON.parse('{"permalink":"/tags/documentation","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/21d253a0.2b7ad81c.js b/assets/js/21d253a0.2b7ad81c.js deleted file mode 100644 index a31a96c65..000000000 --- a/assets/js/21d253a0.2b7ad81c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1853],{3986:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/10","page":10,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/9","nextPage":"/tags/woowahan-techcourse/page/11","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/21d253a0.843456ee.js b/assets/js/21d253a0.843456ee.js new file mode 100644 index 000000000..dd5a83acf --- /dev/null +++ b/assets/js/21d253a0.843456ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1853],{63986:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/10","page":10,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/9","nextPage":"/tags/woowahan-techcourse/page/11","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/226700de.0c8f4048.js b/assets/js/226700de.0c8f4048.js deleted file mode 100644 index 121ae5a06..000000000 --- a/assets/js/226700de.0c8f4048.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6035],{1961:e=>{e.exports=JSON.parse('{"permalink":"/page/25","page":25,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/24","nextPage":"/page/26","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/226700de.6396719e.js b/assets/js/226700de.6396719e.js new file mode 100644 index 000000000..2f721b08b --- /dev/null +++ b/assets/js/226700de.6396719e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6035],{41961:e=>{e.exports=JSON.parse('{"permalink":"/page/25","page":25,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/24","nextPage":"/page/26","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/24214711.55f6e51c.js b/assets/js/24214711.55f6e51c.js new file mode 100644 index 000000000..f304a8bd7 --- /dev/null +++ b/assets/js/24214711.55f6e51c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4041],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||s[d]||p;return n?r.createElement(k,l(l({ref:t},u),{},{components:n})):r.createElement(k,l({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const p={title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:21,tags:["TecoChat","Retrospective"]},l=void 0,o={permalink:"/21",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",description:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",date:"2023-04-22T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 22\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:"21",tags:["TecoChat","Retrospective"]},prevItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"},nextItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"}},i={authorsImageUrls:[]},c=[{value:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c",level:3},{value:"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?",id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5",level:3},{value:"\ub9d0\ub791\uc758 DM",id:"\ub9d0\ub791\uc758-dm",level:3},{value:"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec",id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec",level:3},{value:"GPT",id:"gpt",level:3},{value:"Sonarcloud",id:"sonarcloud",level:3},{value:"Tiptap",id:"tiptap",level:3},{value:"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9",id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9",level:3}],u={toc:c};function s(e){let{components:t,...p}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,p,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c"},"4\uc6d4 21\uc77c \uae08\uc694\uc77c"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?")," "),(0,a.kt)("p",null,"\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\uac74 \ubabb\ucc38\uc9c0"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5"},"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?"),(0,a.kt)("p",null,"\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","dev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ub9d0\ub791\uc758-dm"},"\ub9d0\ub791\uc758 DM"),(0,a.kt)("p",null,"\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec"},"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec"),(0,a.kt)("p",null,"\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. "),(0,a.kt)("h3",{id:"gpt"},"GPT"),(0,a.kt)("p",null,"\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. "),(0,a.kt)("h3",{id:"sonarcloud"},"Sonarcloud"),(0,a.kt)("p",null,"\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124"),(0,a.kt)("h3",{id:"tiptap"},"Tiptap"),(0,a.kt)("p",null,"\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Tiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","api \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c ",(0,a.kt)("inlineCode",{parentName:"p"},"\\n"),"\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const replaceCodeFences = (input: String) => {\n const codeFencesRegex = /```([\\w-]*)\\n([\\s\\S]*?)\\n```/g;\n return input\n .replace(codeFencesRegex, (match, p1, p2) => {\n const languageClass = p1 ? ` class="language-${p1}"` : "";\n return `
${p2}
`;\n })\n .replace(/\\n/g, "
");\n};\n')),(0,a.kt)("p",null,"Tiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"tecochat",src:n(6246).Z,width:"2388",height:"1500"})),(0,a.kt)("h3",{id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9"},"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9"),(0,a.kt)("p",null,"\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."))}s.isMDXComponent=!0},6246:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/teco-chat-6b4f31b3d961878efc5c506fc167df1f.png"}}]); \ No newline at end of file diff --git a/assets/js/24214711.e04b839f.js b/assets/js/24214711.e04b839f.js deleted file mode 100644 index b60bdcc04..000000000 --- a/assets/js/24214711.e04b839f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4041],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||s[d]||p;return n?r.createElement(k,l(l({ref:t},u),{},{components:n})):r.createElement(k,l({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const p={title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:21,tags:["TecoChat","Retrospective"]},l=void 0,o={permalink:"/21",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",description:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",date:"2023-04-22T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 22\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:"21",tags:["TecoChat","Retrospective"]},prevItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"},nextItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"}},i={authorsImageUrls:[]},c=[{value:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c",level:3},{value:"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?",id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5",level:3},{value:"\ub9d0\ub791\uc758 DM",id:"\ub9d0\ub791\uc758-dm",level:3},{value:"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec",id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec",level:3},{value:"GPT",id:"gpt",level:3},{value:"Sonarcloud",id:"sonarcloud",level:3},{value:"Tiptap",id:"tiptap",level:3},{value:"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9",id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9",level:3}],u={toc:c};function s(e){let{components:t,...p}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,p,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c"},"4\uc6d4 21\uc77c \uae08\uc694\uc77c"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?")," "),(0,a.kt)("p",null,"\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\uac74 \ubabb\ucc38\uc9c0"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5"},"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?"),(0,a.kt)("p",null,"\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","dev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ub9d0\ub791\uc758-dm"},"\ub9d0\ub791\uc758 DM"),(0,a.kt)("p",null,"\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec"},"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec"),(0,a.kt)("p",null,"\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. "),(0,a.kt)("h3",{id:"gpt"},"GPT"),(0,a.kt)("p",null,"\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. "),(0,a.kt)("h3",{id:"sonarcloud"},"Sonarcloud"),(0,a.kt)("p",null,"\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124"),(0,a.kt)("h3",{id:"tiptap"},"Tiptap"),(0,a.kt)("p",null,"\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Tiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","api \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c ",(0,a.kt)("inlineCode",{parentName:"p"},"\\n"),"\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const replaceCodeFences = (input: String) => {\n const codeFencesRegex = /```([\\w-]*)\\n([\\s\\S]*?)\\n```/g;\n return input\n .replace(codeFencesRegex, (match, p1, p2) => {\n const languageClass = p1 ? ` class="language-${p1}"` : "";\n return `
${p2}
`;\n })\n .replace(/\\n/g, "
");\n};\n')),(0,a.kt)("p",null,"Tiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"tecochat",src:n(6246).Z,width:"2388",height:"1500"})),(0,a.kt)("h3",{id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9"},"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9"),(0,a.kt)("p",null,"\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."))}s.isMDXComponent=!0},6246:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/teco-chat-6b4f31b3d961878efc5c506fc167df1f.png"}}]); \ No newline at end of file diff --git a/assets/js/255134d9.a1e74e37.js b/assets/js/255134d9.a1e74e37.js new file mode 100644 index 000000000..4480f657d --- /dev/null +++ b/assets/js/255134d9.a1e74e37.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8151],{30753:e=>{e.exports=JSON.parse('{"label":"Composite","permalink":"/tags/composite","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/255134d9.ec767e97.js b/assets/js/255134d9.ec767e97.js deleted file mode 100644 index d0ae1a9bc..000000000 --- a/assets/js/255134d9.ec767e97.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8151],{753:e=>{e.exports=JSON.parse('{"label":"Composite","permalink":"/tags/composite","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/268e20d0.28416a83.js b/assets/js/268e20d0.28416a83.js deleted file mode 100644 index fe99e0ff9..000000000 --- a/assets/js/268e20d0.28416a83.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5164],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),i=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=i(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),b=i(r),m=o,u=b["".concat(p,".").concat(m)]||b[m]||k[m]||a;return r?n.createElement(u,c(c({ref:t},s),{},{components:r})):n.createElement(u,c({ref:t},s))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=b;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:o,c[1]=l;for(var i=2;i{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>k,frontMatter:()=>a,metadata:()=>l,toc:()=>i});var n=r(7462),o=(r(7294),r(3905));const a={title:"\uc6f9\uc18c\ucf13",slug:34,tags:["WebSocket"]},c=void 0,l={permalink:"/34",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-26-WebSocket.mdx",source:"@site/blog/2023/2023-06-26-WebSocket.mdx",title:"\uc6f9\uc18c\ucf13",description:"\uc6f9\uc18c\ucf13",date:"2023-06-26T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 26\uc77c",tags:[{label:"WebSocket",permalink:"/tags/web-socket"}],readingTime:2.965,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9\uc18c\ucf13",slug:"34",tags:["WebSocket"]},prevItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"},nextItem:{title:"Docusaurus",permalink:"/33"}},p={authorsImageUrls:[]},i=[{value:"\uc6f9\uc18c\ucf13",id:"\uc6f9\uc18c\ucf13",level:3},{value:"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd",id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd",level:3},{value:"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791",id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791",level:3},{value:"1. Upgrade \uc694\uccad",id:"1-upgrade-\uc694\uccad",level:3},{value:"2. Switching Protocols",id:"2-switching-protocols",level:3},{value:"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc",id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],s={toc:i};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13"},"\uc6f9\uc18c\ucf13"),(0,o.kt)("p",null,"\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd"},"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd"),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791"},"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791"),(0,o.kt)("mermaid",{value:"sequenceDiagram\n participant Client\n participant Server\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\n\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\n Server->>Client: \n\n Client->>Server: \uc885\ub8cc\n Server->>Client: "}),(0,o.kt)("h3",{id:"1-upgrade-\uc694\uccad"},"1. Upgrade \uc694\uccad"),(0,o.kt)("p",null,"WebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"GET /chats HTTP/1.1\nHost: localhost:8080\nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\nSec-WebSocket-Version: 13\nOrigin: http://localhost:8080\n")),(0,o.kt)("h3",{id:"2-switching-protocols"},"2. Switching Protocols"),(0,o.kt)("p",null,"\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 ",(0,o.kt)("inlineCode",{parentName:"p"},"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"),"\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"HTTP/1.1 101 Switching Protocols \nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\nSec-WebSocket-Protocol: v10.stomp\n")),(0,o.kt)("h3",{id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc"},"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc"),(0,o.kt)("p",null,"\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc6455"},"https://datatracker.ietf.org/doc/html/rfc6455"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-framework/reference/web/websocket.html"},"https://docs.spring.io/spring-framework/reference/web/websocket.html")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/268e20d0.9a248619.js b/assets/js/268e20d0.9a248619.js new file mode 100644 index 000000000..ed5f7f19e --- /dev/null +++ b/assets/js/268e20d0.9a248619.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5164],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),i=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=i(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),b=i(r),m=o,u=b["".concat(p,".").concat(m)]||b[m]||k[m]||a;return r?n.createElement(u,c(c({ref:t},s),{},{components:r})):n.createElement(u,c({ref:t},s))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=b;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:o,c[1]=l;for(var i=2;i{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>k,frontMatter:()=>a,metadata:()=>l,toc:()=>i});var n=r(87462),o=(r(67294),r(3905));const a={title:"\uc6f9\uc18c\ucf13",slug:34,tags:["WebSocket"]},c=void 0,l={permalink:"/34",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-26-WebSocket.mdx",source:"@site/blog/2023/2023-06-26-WebSocket.mdx",title:"\uc6f9\uc18c\ucf13",description:"\uc6f9\uc18c\ucf13",date:"2023-06-26T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 26\uc77c",tags:[{label:"WebSocket",permalink:"/tags/web-socket"}],readingTime:2.965,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9\uc18c\ucf13",slug:"34",tags:["WebSocket"]},prevItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"},nextItem:{title:"Docusaurus",permalink:"/33"}},p={authorsImageUrls:[]},i=[{value:"\uc6f9\uc18c\ucf13",id:"\uc6f9\uc18c\ucf13",level:3},{value:"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd",id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd",level:3},{value:"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791",id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791",level:3},{value:"1. Upgrade \uc694\uccad",id:"1-upgrade-\uc694\uccad",level:3},{value:"2. Switching Protocols",id:"2-switching-protocols",level:3},{value:"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc",id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],s={toc:i};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13"},"\uc6f9\uc18c\ucf13"),(0,o.kt)("p",null,"\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd"},"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd"),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791"},"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791"),(0,o.kt)("mermaid",{value:"sequenceDiagram\n participant Client\n participant Server\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\n\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\n Server->>Client: \n\n Client->>Server: \uc885\ub8cc\n Server->>Client: "}),(0,o.kt)("h3",{id:"1-upgrade-\uc694\uccad"},"1. Upgrade \uc694\uccad"),(0,o.kt)("p",null,"WebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"GET /chats HTTP/1.1\nHost: localhost:8080\nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\nSec-WebSocket-Version: 13\nOrigin: http://localhost:8080\n")),(0,o.kt)("h3",{id:"2-switching-protocols"},"2. Switching Protocols"),(0,o.kt)("p",null,"\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 ",(0,o.kt)("inlineCode",{parentName:"p"},"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"),"\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"HTTP/1.1 101 Switching Protocols \nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\nSec-WebSocket-Protocol: v10.stomp\n")),(0,o.kt)("h3",{id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc"},"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc"),(0,o.kt)("p",null,"\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc6455"},"https://datatracker.ietf.org/doc/html/rfc6455"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-framework/reference/web/websocket.html"},"https://docs.spring.io/spring-framework/reference/web/websocket.html")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/269a2f75.03ef05b2.js b/assets/js/269a2f75.03ef05b2.js deleted file mode 100644 index a9e7f78ef..000000000 --- a/assets/js/269a2f75.03ef05b2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1994],{8414:s=>{s.exports=JSON.parse('{"label":"static","permalink":"/tags/static","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/269a2f75.5474eea4.js b/assets/js/269a2f75.5474eea4.js new file mode 100644 index 000000000..642f021fd --- /dev/null +++ b/assets/js/269a2f75.5474eea4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1994],{52358:s=>{s.exports=JSON.parse('{"label":"static","permalink":"/tags/static","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/270346fa.163d0510.js b/assets/js/270346fa.163d0510.js deleted file mode 100644 index e0f9facff..000000000 --- a/assets/js/270346fa.163d0510.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7975],{9424:e=>{e.exports=JSON.parse('{"permalink":"/page/28","page":28,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/27","nextPage":"/page/29","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/270346fa.dbc966c2.js b/assets/js/270346fa.dbc966c2.js new file mode 100644 index 000000000..af9e1d251 --- /dev/null +++ b/assets/js/270346fa.dbc966c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7975],{89424:e=>{e.exports=JSON.parse('{"permalink":"/page/28","page":28,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/27","nextPage":"/page/29","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/274c9143.29a9f319.js b/assets/js/274c9143.29a9f319.js deleted file mode 100644 index 3e11f991d..000000000 --- a/assets/js/274c9143.29a9f319.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6984],{58:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/274c9143.f313ce06.js b/assets/js/274c9143.f313ce06.js new file mode 100644 index 000000000..fa1b9aeee --- /dev/null +++ b/assets/js/274c9143.f313ce06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6984],{90058:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/2832e534.6a921631.js b/assets/js/2832e534.6a921631.js deleted file mode 100644 index 39817e83c..000000000 --- a/assets/js/2832e534.6a921631.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2476],{9870:e=>{e.exports=JSON.parse('{"permalink":"/page/13","page":13,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/12","nextPage":"/page/14","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2832e534.cbb20739.js b/assets/js/2832e534.cbb20739.js new file mode 100644 index 000000000..7ade50ea7 --- /dev/null +++ b/assets/js/2832e534.cbb20739.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2476],{69870:e=>{e.exports=JSON.parse('{"permalink":"/page/13","page":13,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/12","nextPage":"/page/14","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/28a1570f.0cae8263.js b/assets/js/28a1570f.0cae8263.js new file mode 100644 index 000000000..3c3ee22e1 --- /dev/null +++ b/assets/js/28a1570f.0cae8263.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[448],{92252:a=>{a.exports=JSON.parse('{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/28a1570f.586865ca.js b/assets/js/28a1570f.586865ca.js deleted file mode 100644 index 1cf941eda..000000000 --- a/assets/js/28a1570f.586865ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[448],{2252:a=>{a.exports=JSON.parse('{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/29476979.3e44be9d.js b/assets/js/29476979.3e44be9d.js deleted file mode 100644 index cf1df0152..000000000 --- a/assets/js/29476979.3e44be9d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4030],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function p(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var i=n.createContext({}),s=function(e){var t=n.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=s(a),f=r,m=d["".concat(i,".").concat(f)]||d[f]||c[f]||p;return a?n.createElement(m,l(l({ref:t},u),{},{components:a})):n.createElement(m,l({ref:t},u))}));function f(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var p=a.length,l=new Array(p);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>p,metadata:()=>o,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const p={title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",last_update:{date:"2023/07/20",author:"\ud5c8\ube0c"}},l=void 0,o={unversionedId:"\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",id:"\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",description:"Swap \uba54\ubaa8\ub9ac",source:"@site/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815.md",sourceDirName:"\ub9ac\ub205\uc2a4",slug:"/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815.md",tags:[],version:"current",lastUpdatedBy:"\ud5c8\ube0c",lastUpdatedAt:1689811200,formattedLastUpdatedAt:"2023\ub144 7\uc6d4 20\uc77c",frontMatter:{title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",last_update:{date:"2023/07/20",author:"\ud5c8\ube0c"}},sidebar:"tutorialSidebar",previous:{title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",permalink:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30"},next:{title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815"}},i={},s=[{value:"Swap \uba54\ubaa8\ub9ac",id:"swap-\uba54\ubaa8\ub9ac",level:3},{value:"\uc124\uc815",id:"\uc124\uc815",level:3},{value:"Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9",id:"swap-\uba54\ubaa8\ub9ac-\ubd80\ud305\uc2dc-\uc790\ub3d9\uc73c\ub85c-\ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d-\uc801\uc6a9",level:3},{value:"Swap \uba54\ubaa8\ub9ac \uc801\uc6a9\ub418\uc5c8\ub294\uc9c0 \ud655\uc778",id:"swap-\uba54\ubaa8\ub9ac-\uc801\uc6a9\ub418\uc5c8\ub294\uc9c0-\ud655\uc778",level:3},{value:"Swap \uba54\ubaa8\ub9ac \ube44\ud65c\uc131\ud654",id:"swap-\uba54\ubaa8\ub9ac-\ube44\ud65c\uc131\ud654",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],u={toc:s};function c(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac"},"Swap \uba54\ubaa8\ub9ac"),(0,r.kt)("p",null,"\ud558\ub4dc\ub514\uc2a4\ud06c \uacf5\uac04\uc758 \uc77c\ubd80\ubd84\uc744 \uba54\ubaa8\ub9ac\ub85c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud558\ub4dc\ub514\uc2a4\ud06c\ub97c \uc0ac\uc6a9\ud558\ub294 \ub9cc\ud07c \uae30\uc874 \uba54\ubaa8\ub9ac\ubcf4\ub2e4 \uc18d\ub3c4\uac00 \ud604\uc800\ud788 \ub5a8\uc5b4\uc9c4\ub2e4."),(0,r.kt)("h3",{id:"\uc124\uc815"},"\uc124\uc815"),(0,r.kt)("p",null,"\ubcf4\ud1b5 Swap \ud30c\uc77c\uc758 \uc6a9\ub7c9\uc740 \uae30\uc874 \uba54\ubaa8\ub9ac\uc758 1.5~2\ubc30 \uc815\ub3c4\uc758 \uc6a9\ub7c9\uc744 \uad8c\uc7a5\ud558\uace0 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","fallocate\ub610\ub294 dd \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c\uc744 \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# fallocate\nsudo fallocate -l 2G /swapfile\n\n# dd\nsudo dd if=/dev/zero of=/swapfile bs=1MiB count=2048\n")),(0,r.kt)("p",null,"\uc77c\ubc18 \uc0ac\uc6a9\uc790\uac00 \ud574\ub2f9 \ud30c\uc77c\uc5d0 \uc811\uadfc\ud560 \uc218 \uc5c6\ub3c4\ub85d \uad8c\ud55c\uc744 \uc124\uc815\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo chmod 600 /swapfile\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\ud55c\ub2e4.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo mkswap /swapfile\nsudo swapon /swapfile\n")),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac-\ubd80\ud305\uc2dc-\uc790\ub3d9\uc73c\ub85c-\ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d-\uc801\uc6a9"},"Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9"),(0,r.kt)("p",null,"\uc778\uc2a4\ud134\uc2a4\uac00 \uc885\ub8cc\ub418\uac70\ub098 \uc7ac\ubd80\ud305\uc744 \ud558\ub294 \uacbd\uc6b0 Swap \uc124\uc815\uc774 \ucd08\uae30\ud654\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/fstab")," \ud30c\uc77c\uc744 \uc218\uc815\ud558\uc5ec Swap \uba54\ubaa8\ub9ac\ub97c \uc601\uad6c\uc801\uc73c\ub85c \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud30c\uc77c\uc740 \ub9ac\ub205\uc2a4 \ubd80\ud305\uc2dc \ub9c8\uc6b4\ud2b8\uc815\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uc788\ub2e4.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# vim\uc744 \uc774\uc6a9\ud558\uc5ec \ud574\ub2f9 \ud30c\uc77c\uc744 \uc218\uc815\ud55c\ub2e4.\nsudo vim /etc/fstab\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ud558\uba74 \ub41c\ub2e4.\n/swapfile swap swap defaults 0 0\n")),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac-\uc801\uc6a9\ub418\uc5c8\ub294\uc9c0-\ud655\uc778"},"Swap \uba54\ubaa8\ub9ac \uc801\uc6a9\ub418\uc5c8\ub294\uc9c0 \ud655\uc778"),(0,r.kt)("p",null,"\ub9ac\ub205\uc2a4\uc5d0\uc11c\ub294 ",(0,r.kt)("inlineCode",{parentName:"p"},"free")," \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uba54\ubaa8\ub9ac\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","-h \uc635\uc158\uc744 \uc8fc\uba74 \uc880 \ub354 \uc77d\uae30 \ud3b8\ud55c \ud615\ud0dc\ub85c \ucd9c\ub825\ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"free -h\n total used free shared buff/cache available\nMem: 905Mi 570Mi 65Mi 0.0Ki 270Mi 186Mi\nSwap: 2.0Gi 626Mi 1.4Gi\n")),(0,r.kt)("p",null,"\uc544\ub798\uc5d0 Swap \uba54\ubaa8\ub9ac\uac00 \uc801\uc6a9\ub418\uc5b4\uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c ",(0,r.kt)("inlineCode",{parentName:"p"},"swapon")," \uba85\ub839\uc5b4\ub85c\ub3c4 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac-\ube44\ud65c\uc131\ud654"},"Swap \uba54\ubaa8\ub9ac \ube44\ud65c\uc131\ud654"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"swapoff")," \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ud65c\uc131\ud654 \ud55c \ud6c4 \ud30c\uc77c\uc744 \uc0ad\uc81c\ud558\uba74 \ub41c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# swap \uc124\uc815\ud55c \ud30c\uc77c \ube44\ud65c\uc131\ud654\nsudo swapoff -v /swapfile\n# \uc0ad\uc81c\nsudo rm /swapfile\n")),(0,r.kt)("p",null,"\ub9cc\uc57d ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/fstab"),"\uc5d0 \uac12\uc744 \uc124\uc815\ud588\uc744 \uacbd\uc6b0 \ud574\ub2f9 \uac12\uc744 \uc9c0\uc6cc\uc57c\ud55c\ub2e4."),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://linuxize.com/post/how-to-add-swap-space-on-ubuntu-20-04/"},"How to Add Swap Space on Ubuntu 20.04, Lunuxize")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/29476979.4cc23032.js b/assets/js/29476979.4cc23032.js new file mode 100644 index 000000000..543ac34af --- /dev/null +++ b/assets/js/29476979.4cc23032.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4030],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>f});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function p(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var i=n.createContext({}),s=function(e){var t=n.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=s(a),f=r,m=d["".concat(i,".").concat(f)]||d[f]||c[f]||p;return a?n.createElement(m,l(l({ref:t},u),{},{components:a})):n.createElement(m,l({ref:t},u))}));function f(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var p=a.length,l=new Array(p);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>p,metadata:()=>o,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const p={title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",last_update:{date:"2023/07/20",author:"\ud5c8\ube0c"}},l=void 0,o={unversionedId:"\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",id:"\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",description:"Swap \uba54\ubaa8\ub9ac",source:"@site/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815.md",sourceDirName:"\ub9ac\ub205\uc2a4",slug:"/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815.md",tags:[],version:"current",lastUpdatedBy:"\ud5c8\ube0c",lastUpdatedAt:1689811200,formattedLastUpdatedAt:"2023\ub144 7\uc6d4 20\uc77c",frontMatter:{title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",last_update:{date:"2023/07/20",author:"\ud5c8\ube0c"}},sidebar:"tutorialSidebar",previous:{title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",permalink:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30"},next:{title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815"}},i={},s=[{value:"Swap \uba54\ubaa8\ub9ac",id:"swap-\uba54\ubaa8\ub9ac",level:3},{value:"\uc124\uc815",id:"\uc124\uc815",level:3},{value:"Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9",id:"swap-\uba54\ubaa8\ub9ac-\ubd80\ud305\uc2dc-\uc790\ub3d9\uc73c\ub85c-\ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d-\uc801\uc6a9",level:3},{value:"Swap \uba54\ubaa8\ub9ac \uc801\uc6a9\ub418\uc5c8\ub294\uc9c0 \ud655\uc778",id:"swap-\uba54\ubaa8\ub9ac-\uc801\uc6a9\ub418\uc5c8\ub294\uc9c0-\ud655\uc778",level:3},{value:"Swap \uba54\ubaa8\ub9ac \ube44\ud65c\uc131\ud654",id:"swap-\uba54\ubaa8\ub9ac-\ube44\ud65c\uc131\ud654",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],u={toc:s};function c(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac"},"Swap \uba54\ubaa8\ub9ac"),(0,r.kt)("p",null,"\ud558\ub4dc\ub514\uc2a4\ud06c \uacf5\uac04\uc758 \uc77c\ubd80\ubd84\uc744 \uba54\ubaa8\ub9ac\ub85c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud558\ub4dc\ub514\uc2a4\ud06c\ub97c \uc0ac\uc6a9\ud558\ub294 \ub9cc\ud07c \uae30\uc874 \uba54\ubaa8\ub9ac\ubcf4\ub2e4 \uc18d\ub3c4\uac00 \ud604\uc800\ud788 \ub5a8\uc5b4\uc9c4\ub2e4."),(0,r.kt)("h3",{id:"\uc124\uc815"},"\uc124\uc815"),(0,r.kt)("p",null,"\ubcf4\ud1b5 Swap \ud30c\uc77c\uc758 \uc6a9\ub7c9\uc740 \uae30\uc874 \uba54\ubaa8\ub9ac\uc758 1.5~2\ubc30 \uc815\ub3c4\uc758 \uc6a9\ub7c9\uc744 \uad8c\uc7a5\ud558\uace0 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","fallocate\ub610\ub294 dd \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c\uc744 \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# fallocate\nsudo fallocate -l 2G /swapfile\n\n# dd\nsudo dd if=/dev/zero of=/swapfile bs=1MiB count=2048\n")),(0,r.kt)("p",null,"\uc77c\ubc18 \uc0ac\uc6a9\uc790\uac00 \ud574\ub2f9 \ud30c\uc77c\uc5d0 \uc811\uadfc\ud560 \uc218 \uc5c6\ub3c4\ub85d \uad8c\ud55c\uc744 \uc124\uc815\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo chmod 600 /swapfile\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\ud55c\ub2e4.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo mkswap /swapfile\nsudo swapon /swapfile\n")),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac-\ubd80\ud305\uc2dc-\uc790\ub3d9\uc73c\ub85c-\ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d-\uc801\uc6a9"},"Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9"),(0,r.kt)("p",null,"\uc778\uc2a4\ud134\uc2a4\uac00 \uc885\ub8cc\ub418\uac70\ub098 \uc7ac\ubd80\ud305\uc744 \ud558\ub294 \uacbd\uc6b0 Swap \uc124\uc815\uc774 \ucd08\uae30\ud654\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/fstab")," \ud30c\uc77c\uc744 \uc218\uc815\ud558\uc5ec Swap \uba54\ubaa8\ub9ac\ub97c \uc601\uad6c\uc801\uc73c\ub85c \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud30c\uc77c\uc740 \ub9ac\ub205\uc2a4 \ubd80\ud305\uc2dc \ub9c8\uc6b4\ud2b8\uc815\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uc788\ub2e4.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# vim\uc744 \uc774\uc6a9\ud558\uc5ec \ud574\ub2f9 \ud30c\uc77c\uc744 \uc218\uc815\ud55c\ub2e4.\nsudo vim /etc/fstab\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ud558\uba74 \ub41c\ub2e4.\n/swapfile swap swap defaults 0 0\n")),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac-\uc801\uc6a9\ub418\uc5c8\ub294\uc9c0-\ud655\uc778"},"Swap \uba54\ubaa8\ub9ac \uc801\uc6a9\ub418\uc5c8\ub294\uc9c0 \ud655\uc778"),(0,r.kt)("p",null,"\ub9ac\ub205\uc2a4\uc5d0\uc11c\ub294 ",(0,r.kt)("inlineCode",{parentName:"p"},"free")," \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uba54\ubaa8\ub9ac\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","-h \uc635\uc158\uc744 \uc8fc\uba74 \uc880 \ub354 \uc77d\uae30 \ud3b8\ud55c \ud615\ud0dc\ub85c \ucd9c\ub825\ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"free -h\n total used free shared buff/cache available\nMem: 905Mi 570Mi 65Mi 0.0Ki 270Mi 186Mi\nSwap: 2.0Gi 626Mi 1.4Gi\n")),(0,r.kt)("p",null,"\uc544\ub798\uc5d0 Swap \uba54\ubaa8\ub9ac\uac00 \uc801\uc6a9\ub418\uc5b4\uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c ",(0,r.kt)("inlineCode",{parentName:"p"},"swapon")," \uba85\ub839\uc5b4\ub85c\ub3c4 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"swap-\uba54\ubaa8\ub9ac-\ube44\ud65c\uc131\ud654"},"Swap \uba54\ubaa8\ub9ac \ube44\ud65c\uc131\ud654"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"swapoff")," \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ud65c\uc131\ud654 \ud55c \ud6c4 \ud30c\uc77c\uc744 \uc0ad\uc81c\ud558\uba74 \ub41c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# swap \uc124\uc815\ud55c \ud30c\uc77c \ube44\ud65c\uc131\ud654\nsudo swapoff -v /swapfile\n# \uc0ad\uc81c\nsudo rm /swapfile\n")),(0,r.kt)("p",null,"\ub9cc\uc57d ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/fstab"),"\uc5d0 \uac12\uc744 \uc124\uc815\ud588\uc744 \uacbd\uc6b0 \ud574\ub2f9 \uac12\uc744 \uc9c0\uc6cc\uc57c\ud55c\ub2e4."),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://linuxize.com/post/how-to-add-swap-space-on-ubuntu-20-04/"},"How to Add Swap Space on Ubuntu 20.04, Lunuxize")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2b22d492.0b05329f.js b/assets/js/2b22d492.0b05329f.js deleted file mode 100644 index 9ad32f477..000000000 --- a/assets/js/2b22d492.0b05329f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7652],{6986:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/3","page":3,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/2","nextPage":"/tags/retrospective/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2b22d492.6a8444b5.js b/assets/js/2b22d492.6a8444b5.js new file mode 100644 index 000000000..b4cf6a207 --- /dev/null +++ b/assets/js/2b22d492.6a8444b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7652],{56986:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/3","page":3,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/2","nextPage":"/tags/retrospective/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2b479afe.31ea2b46.js b/assets/js/2b479afe.31ea2b46.js new file mode 100644 index 000000000..7eb22f7e8 --- /dev/null +++ b/assets/js/2b479afe.31ea2b46.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9591],{16973:e=>{e.exports=JSON.parse('{"permalink":"/tags/mockito","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2bfe7c0b.247f4dec.js b/assets/js/2bfe7c0b.247f4dec.js deleted file mode 100644 index c74f1541b..000000000 --- a/assets/js/2bfe7c0b.247f4dec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1762],{2670:e=>{e.exports=JSON.parse('{"label":"Book","permalink":"/tags/book","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/2bfe7c0b.417a3763.js b/assets/js/2bfe7c0b.417a3763.js new file mode 100644 index 000000000..50e39e8f7 --- /dev/null +++ b/assets/js/2bfe7c0b.417a3763.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1762],{82670:e=>{e.exports=JSON.parse('{"label":"Book","permalink":"/tags/book","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/2d3b202f.ab493f73.js b/assets/js/2d3b202f.ab493f73.js deleted file mode 100644 index 0d54755cc..000000000 --- a/assets/js/2d3b202f.ab493f73.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1196],{2524:e=>{e.exports=JSON.parse('{"label":"Book","permalink":"/tags/book","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/2d3b202f.fad40be0.js b/assets/js/2d3b202f.fad40be0.js new file mode 100644 index 000000000..d4f4f1386 --- /dev/null +++ b/assets/js/2d3b202f.fad40be0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1196],{42524:e=>{e.exports=JSON.parse('{"label":"Book","permalink":"/tags/book","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/2d9296e4.a52c556a.js b/assets/js/2d9296e4.a52c556a.js new file mode 100644 index 000000000..68894a521 --- /dev/null +++ b/assets/js/2d9296e4.a52c556a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3483],{89429:e=>{e.exports=JSON.parse('{"label":"Pattern","permalink":"/tags/pattern","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/2d9296e4.a57ec288.js b/assets/js/2d9296e4.a57ec288.js deleted file mode 100644 index 12169e07d..000000000 --- a/assets/js/2d9296e4.a57ec288.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3483],{9429:e=>{e.exports=JSON.parse('{"label":"Pattern","permalink":"/tags/pattern","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/2e10a69c.2fcc65e8.js b/assets/js/2e10a69c.0f41a7b3.js similarity index 57% rename from assets/js/2e10a69c.2fcc65e8.js rename to assets/js/2e10a69c.0f41a7b3.js index e7a9d8aa7..9217c8096 100644 --- a/assets/js/2e10a69c.2fcc65e8.js +++ b/assets/js/2e10a69c.0f41a7b3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7581],{9981:e=>{e.exports=JSON.parse('{"permalink":"/page/38","page":38,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/37","nextPage":"/page/39","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7581],{9981:e=>{e.exports=JSON.parse('{"permalink":"/page/38","page":38,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/37","nextPage":"/page/39","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2e892090.2a2c3e38.js b/assets/js/2e892090.2a2c3e38.js deleted file mode 100644 index 6abb84b47..000000000 --- a/assets/js/2e892090.2a2c3e38.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1560],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),k=r,f=m["".concat(p,".").concat(k)]||m[k]||s[k]||l;return n?a.createElement(f,i(i({ref:t},u),{},{components:n})):a.createElement(f,i({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const l={title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:28,tags:["Pattern","Composite"]},i=void 0,o={permalink:"/28",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",source:"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",description:"\uc694\uad6c\uc0ac\ud56d",date:"2023-05-26T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 26\uc77c",tags:[{label:"Pattern",permalink:"/tags/pattern"},{label:"Composite",permalink:"/tags/composite"}],readingTime:4.74,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:"28",tags:["Pattern","Composite"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"},nextItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"}},p={authorsImageUrls:[]},c=[{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9",level:3},{value:"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30",id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30",level:3},{value:"\uc815\ucc45\uc758 \uc21c\uc11c",id:"\uc815\ucc45\uc758-\uc21c\uc11c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c",level:3},{value:"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84",id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45")),(0,r.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9"},"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9"),(0,r.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public interface FarePolicy {\n int calculate(Path path, Passenger passenger, int fare);\n}\n\npublic class BaseFarePolicy implements FarePolicy { ... }\npublic class DistanceFarePolicy implements FarePolicy { ... }\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite1",src:n(1769).Z,width:"1768",height:"554"})),(0,r.kt)("h3",{id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30"},"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30"),(0,r.kt)("p",null,"\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public class SubwayFarePolicy implements FarePolicy {\n\n private final List farePolicies;\n\n public SubwayFarePolicy(final List farePolicies) {\n this.farePolicies = farePolicies;\n }\n\n @Override\n public int calculate(final Path path, final Passenger passenger, final int fare) {\n int calculatedFare = fare;\n for (FarePolicy farePolicy : farePolicies) {\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\n }\n return calculatedFare;\n }\n}\n")),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite2",src:n(3417).Z,width:"2020",height:"954"})),(0,r.kt)("h3",{id:"\uc815\ucc45\uc758-\uc21c\uc11c"},"\uc815\ucc45\uc758 \uc21c\uc11c"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Configuration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"@Configuration\npublic class FareConfiguration {\n\n @Bean\n public FarePolicy farePolicy() {\n return new SubwayFarePolicy(List.of(\n new BaseFarePolicy(),\n new DistanceFarePolicy(),\n new AgeDiscountFarePolicy()\n ));\n }\n}\n")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite3",src:n(6388).Z,width:"1848",height:"482"})),(0,r.kt)("p",null,"GOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.")),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c"),(0,r.kt)("p",null,"Component"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc694\uae08 \uc815\ucc45(FarePolicy) ")),(0,r.kt)("p",null,"Leaf"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) ")),(0,r.kt)("p",null,"Composite"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) ")),(0,r.kt)("p",null,"Client"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c"),(0,r.kt)("p",null,"\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c",(0,r.kt)("br",{parentName:"p"}),"\n","Client \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c"),(0,r.kt)("h3",{id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84"},"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84"),(0,r.kt)("p",null,"\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134",(0,r.kt)("br",{parentName:"p"}),"\n","\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"))}s.isMDXComponent=!0},1769:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite1-6117733e5244b235d9405ba72afb53ed.png"},3417:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite2-ac487a832bf12267cc91996ea3a5b9c7.png"},6388:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite3-016bf41863692b1f738bc89011687166.png"}}]); \ No newline at end of file diff --git a/assets/js/2e892090.966a9a04.js b/assets/js/2e892090.966a9a04.js new file mode 100644 index 000000000..ef02d6f4c --- /dev/null +++ b/assets/js/2e892090.966a9a04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1560],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),k=r,f=m["".concat(p,".").concat(k)]||m[k]||s[k]||l;return n?a.createElement(f,i(i({ref:t},u),{},{components:n})):a.createElement(f,i({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const l={title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:28,tags:["Pattern","Composite"]},i=void 0,o={permalink:"/28",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",source:"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",description:"\uc694\uad6c\uc0ac\ud56d",date:"2023-05-26T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 26\uc77c",tags:[{label:"Pattern",permalink:"/tags/pattern"},{label:"Composite",permalink:"/tags/composite"}],readingTime:4.74,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:"28",tags:["Pattern","Composite"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"},nextItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"}},p={authorsImageUrls:[]},c=[{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9",level:3},{value:"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30",id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30",level:3},{value:"\uc815\ucc45\uc758 \uc21c\uc11c",id:"\uc815\ucc45\uc758-\uc21c\uc11c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c",level:3},{value:"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84",id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45")),(0,r.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9"},"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9"),(0,r.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public interface FarePolicy {\n int calculate(Path path, Passenger passenger, int fare);\n}\n\npublic class BaseFarePolicy implements FarePolicy { ... }\npublic class DistanceFarePolicy implements FarePolicy { ... }\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite1",src:n(71769).Z,width:"1768",height:"554"})),(0,r.kt)("h3",{id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30"},"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30"),(0,r.kt)("p",null,"\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public class SubwayFarePolicy implements FarePolicy {\n\n private final List farePolicies;\n\n public SubwayFarePolicy(final List farePolicies) {\n this.farePolicies = farePolicies;\n }\n\n @Override\n public int calculate(final Path path, final Passenger passenger, final int fare) {\n int calculatedFare = fare;\n for (FarePolicy farePolicy : farePolicies) {\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\n }\n return calculatedFare;\n }\n}\n")),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite2",src:n(43417).Z,width:"2020",height:"954"})),(0,r.kt)("h3",{id:"\uc815\ucc45\uc758-\uc21c\uc11c"},"\uc815\ucc45\uc758 \uc21c\uc11c"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Configuration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"@Configuration\npublic class FareConfiguration {\n\n @Bean\n public FarePolicy farePolicy() {\n return new SubwayFarePolicy(List.of(\n new BaseFarePolicy(),\n new DistanceFarePolicy(),\n new AgeDiscountFarePolicy()\n ));\n }\n}\n")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite3",src:n(36388).Z,width:"1848",height:"482"})),(0,r.kt)("p",null,"GOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.")),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c"),(0,r.kt)("p",null,"Component"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc694\uae08 \uc815\ucc45(FarePolicy) ")),(0,r.kt)("p",null,"Leaf"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) ")),(0,r.kt)("p",null,"Composite"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) ")),(0,r.kt)("p",null,"Client"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c"),(0,r.kt)("p",null,"\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c",(0,r.kt)("br",{parentName:"p"}),"\n","Client \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c"),(0,r.kt)("h3",{id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84"},"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84"),(0,r.kt)("p",null,"\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134",(0,r.kt)("br",{parentName:"p"}),"\n","\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"))}s.isMDXComponent=!0},71769:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite1-6117733e5244b235d9405ba72afb53ed.png"},43417:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite2-ac487a832bf12267cc91996ea3a5b9c7.png"},36388:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite3-016bf41863692b1f738bc89011687166.png"}}]); \ No newline at end of file diff --git a/assets/js/2f43e44a.31f6617e.js b/assets/js/2f43e44a.31f6617e.js new file mode 100644 index 000000000..d2ca21ffb --- /dev/null +++ b/assets/js/2f43e44a.31f6617e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6743],{52396:e=>{e.exports=JSON.parse('{"permalink":"/tags/grasp","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2f43e44a.3ee3a127.js b/assets/js/2f43e44a.3ee3a127.js deleted file mode 100644 index 02ae57906..000000000 --- a/assets/js/2f43e44a.3ee3a127.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6743],{2396:e=>{e.exports=JSON.parse('{"permalink":"/tags/grasp","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2f7a5a88.3876177c.js b/assets/js/2f7a5a88.3876177c.js deleted file mode 100644 index 16dc7f013..000000000 --- a/assets/js/2f7a5a88.3876177c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8927],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||s[d]||p;return n?r.createElement(k,l(l({ref:t},u),{},{components:n})):r.createElement(k,l({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const p={title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:21,tags:["TecoChat","Retrospective"]},l=void 0,o={permalink:"/21",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",description:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",date:"2023-04-22T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 22\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:"21",tags:["TecoChat","Retrospective"]},prevItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"},nextItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"}},i={authorsImageUrls:[]},c=[{value:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c",level:3},{value:"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?",id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5",level:3},{value:"\ub9d0\ub791\uc758 DM",id:"\ub9d0\ub791\uc758-dm",level:3},{value:"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec",id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec",level:3},{value:"GPT",id:"gpt",level:3},{value:"Sonarcloud",id:"sonarcloud",level:3},{value:"Tiptap",id:"tiptap",level:3},{value:"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9",id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9",level:3}],u={toc:c};function s(e){let{components:t,...p}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,p,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c"},"4\uc6d4 21\uc77c \uae08\uc694\uc77c"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?")," "),(0,a.kt)("p",null,"\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\uac74 \ubabb\ucc38\uc9c0"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5"},"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?"),(0,a.kt)("p",null,"\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","dev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ub9d0\ub791\uc758-dm"},"\ub9d0\ub791\uc758 DM"),(0,a.kt)("p",null,"\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec"},"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec"),(0,a.kt)("p",null,"\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. "),(0,a.kt)("h3",{id:"gpt"},"GPT"),(0,a.kt)("p",null,"\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. "),(0,a.kt)("h3",{id:"sonarcloud"},"Sonarcloud"),(0,a.kt)("p",null,"\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124"),(0,a.kt)("h3",{id:"tiptap"},"Tiptap"),(0,a.kt)("p",null,"\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Tiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","api \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c ",(0,a.kt)("inlineCode",{parentName:"p"},"\\n"),"\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const replaceCodeFences = (input: String) => {\n const codeFencesRegex = /```([\\w-]*)\\n([\\s\\S]*?)\\n```/g;\n return input\n .replace(codeFencesRegex, (match, p1, p2) => {\n const languageClass = p1 ? ` class="language-${p1}"` : "";\n return `
${p2}
`;\n })\n .replace(/\\n/g, "
");\n};\n')),(0,a.kt)("p",null,"Tiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"tecochat",src:n(6246).Z,width:"2388",height:"1500"})),(0,a.kt)("h3",{id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9"},"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9"),(0,a.kt)("p",null,"\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."))}s.isMDXComponent=!0},6246:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/teco-chat-6b4f31b3d961878efc5c506fc167df1f.png"}}]); \ No newline at end of file diff --git a/assets/js/2f7a5a88.c8dbab0e.js b/assets/js/2f7a5a88.c8dbab0e.js new file mode 100644 index 000000000..5ea9b5c76 --- /dev/null +++ b/assets/js/2f7a5a88.c8dbab0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8927],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||s[d]||p;return n?r.createElement(k,l(l({ref:t},u),{},{components:n})):r.createElement(k,l({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const p={title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:21,tags:["TecoChat","Retrospective"]},l=void 0,o={permalink:"/21",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",description:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",date:"2023-04-22T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 22\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",slug:"21",tags:["TecoChat","Retrospective"]},prevItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"},nextItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"}},i={authorsImageUrls:[]},c=[{value:"4\uc6d4 21\uc77c \uae08\uc694\uc77c",id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c",level:3},{value:"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?",id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5",level:3},{value:"\ub9d0\ub791\uc758 DM",id:"\ub9d0\ub791\uc758-dm",level:3},{value:"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec",id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec",level:3},{value:"GPT",id:"gpt",level:3},{value:"Sonarcloud",id:"sonarcloud",level:3},{value:"Tiptap",id:"tiptap",level:3},{value:"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9",id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9",level:3}],u={toc:c};function s(e){let{components:t,...p}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,p,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"4\uc6d4-21\uc77c-\uae08\uc694\uc77c"},"4\uc6d4 21\uc77c \uae08\uc694\uc77c"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?")," "),(0,a.kt)("p",null,"\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\uac74 \ubabb\ucc38\uc9c0"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uad6c\uc785-\uc131\uacf5"},"\ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?"),(0,a.kt)("p",null,"\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","dev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ub9d0\ub791\uc758-dm"},"\ub9d0\ub791\uc758 DM"),(0,a.kt)("p",null,"\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!"),(0,a.kt)("h3",{id:"\ub3c4\uba54\uc778-\uc124\uc815-\ubc0f-\ubc30\ud3ec"},"\ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec"),(0,a.kt)("p",null,"\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. "),(0,a.kt)("h3",{id:"gpt"},"GPT"),(0,a.kt)("p",null,"\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. "),(0,a.kt)("h3",{id:"sonarcloud"},"Sonarcloud"),(0,a.kt)("p",null,"\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Sonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124"),(0,a.kt)("h3",{id:"tiptap"},"Tiptap"),(0,a.kt)("p",null,"\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Tiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","api \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c ",(0,a.kt)("inlineCode",{parentName:"p"},"\\n"),"\ub97c ",(0,a.kt)("inlineCode",{parentName:"p"},"
"),"\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const replaceCodeFences = (input: String) => {\n const codeFencesRegex = /```([\\w-]*)\\n([\\s\\S]*?)\\n```/g;\n return input\n .replace(codeFencesRegex, (match, p1, p2) => {\n const languageClass = p1 ? ` class="language-${p1}"` : "";\n return `
${p2}
`;\n })\n .replace(/\\n/g, "
");\n};\n')),(0,a.kt)("p",null,"Tiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"tecochat",src:n(6246).Z,width:"2388",height:"1500"})),(0,a.kt)("h3",{id:"\ud3f0\ud2b8-\ubc0f-favicon-\uc801\uc6a9"},"\ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9"),(0,a.kt)("p",null,"\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."))}s.isMDXComponent=!0},6246:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/teco-chat-6b4f31b3d961878efc5c506fc167df1f.png"}}]); \ No newline at end of file diff --git a/assets/js/3028ca57.d6772d07.js b/assets/js/3028ca57.d6772d07.js new file mode 100644 index 000000000..50b1316e8 --- /dev/null +++ b/assets/js/3028ca57.d6772d07.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3211],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),i=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=i(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),b=i(r),m=o,u=b["".concat(p,".").concat(m)]||b[m]||k[m]||a;return r?n.createElement(u,c(c({ref:t},s),{},{components:r})):n.createElement(u,c({ref:t},s))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=b;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:o,c[1]=l;for(var i=2;i{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>k,frontMatter:()=>a,metadata:()=>l,toc:()=>i});var n=r(87462),o=(r(67294),r(3905));const a={title:"\uc6f9\uc18c\ucf13",slug:34,tags:["WebSocket"]},c=void 0,l={permalink:"/34",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-26-WebSocket.mdx",source:"@site/blog/2023/2023-06-26-WebSocket.mdx",title:"\uc6f9\uc18c\ucf13",description:"\uc6f9\uc18c\ucf13",date:"2023-06-26T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 26\uc77c",tags:[{label:"WebSocket",permalink:"/tags/web-socket"}],readingTime:2.965,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9\uc18c\ucf13",slug:"34",tags:["WebSocket"]},prevItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"},nextItem:{title:"Docusaurus",permalink:"/33"}},p={authorsImageUrls:[]},i=[{value:"\uc6f9\uc18c\ucf13",id:"\uc6f9\uc18c\ucf13",level:3},{value:"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd",id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd",level:3},{value:"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791",id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791",level:3},{value:"1. Upgrade \uc694\uccad",id:"1-upgrade-\uc694\uccad",level:3},{value:"2. Switching Protocols",id:"2-switching-protocols",level:3},{value:"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc",id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],s={toc:i};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13"},"\uc6f9\uc18c\ucf13"),(0,o.kt)("p",null,"\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd"},"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd"),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791"},"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791"),(0,o.kt)("mermaid",{value:"sequenceDiagram\n participant Client\n participant Server\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\n\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\n Server->>Client: \n\n Client->>Server: \uc885\ub8cc\n Server->>Client: "}),(0,o.kt)("h3",{id:"1-upgrade-\uc694\uccad"},"1. Upgrade \uc694\uccad"),(0,o.kt)("p",null,"WebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"GET /chats HTTP/1.1\nHost: localhost:8080\nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\nSec-WebSocket-Version: 13\nOrigin: http://localhost:8080\n")),(0,o.kt)("h3",{id:"2-switching-protocols"},"2. Switching Protocols"),(0,o.kt)("p",null,"\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 ",(0,o.kt)("inlineCode",{parentName:"p"},"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"),"\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"HTTP/1.1 101 Switching Protocols \nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\nSec-WebSocket-Protocol: v10.stomp\n")),(0,o.kt)("h3",{id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc"},"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc"),(0,o.kt)("p",null,"\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc6455"},"https://datatracker.ietf.org/doc/html/rfc6455"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-framework/reference/web/websocket.html"},"https://docs.spring.io/spring-framework/reference/web/websocket.html")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3028ca57.e393ded3.js b/assets/js/3028ca57.e393ded3.js deleted file mode 100644 index 94b71f503..000000000 --- a/assets/js/3028ca57.e393ded3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3211],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),i=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=i(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),b=i(r),m=o,u=b["".concat(p,".").concat(m)]||b[m]||k[m]||a;return r?n.createElement(u,c(c({ref:t},s),{},{components:r})):n.createElement(u,c({ref:t},s))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=b;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:o,c[1]=l;for(var i=2;i{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>k,frontMatter:()=>a,metadata:()=>l,toc:()=>i});var n=r(7462),o=(r(7294),r(3905));const a={title:"\uc6f9\uc18c\ucf13",slug:34,tags:["WebSocket"]},c=void 0,l={permalink:"/34",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-26-WebSocket.mdx",source:"@site/blog/2023/2023-06-26-WebSocket.mdx",title:"\uc6f9\uc18c\ucf13",description:"\uc6f9\uc18c\ucf13",date:"2023-06-26T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 26\uc77c",tags:[{label:"WebSocket",permalink:"/tags/web-socket"}],readingTime:2.965,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9\uc18c\ucf13",slug:"34",tags:["WebSocket"]},prevItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"},nextItem:{title:"Docusaurus",permalink:"/33"}},p={authorsImageUrls:[]},i=[{value:"\uc6f9\uc18c\ucf13",id:"\uc6f9\uc18c\ucf13",level:3},{value:"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd",id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd",level:3},{value:"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791",id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791",level:3},{value:"1. Upgrade \uc694\uccad",id:"1-upgrade-\uc694\uccad",level:3},{value:"2. Switching Protocols",id:"2-switching-protocols",level:3},{value:"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc",id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],s={toc:i};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13"},"\uc6f9\uc18c\ucf13"),(0,o.kt)("p",null,"\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13-\ub4f1\uc7a5-\ubc30\uacbd"},"\uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd"),(0,o.kt)("p",null,"\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. "),(0,o.kt)("h3",{id:"\uc6f9\uc18c\ucf13\uc758-\ub3d9\uc791"},"\uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791"),(0,o.kt)("mermaid",{value:"sequenceDiagram\n participant Client\n participant Server\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\n\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\n Server->>Client: \n\n Client->>Server: \uc885\ub8cc\n Server->>Client: "}),(0,o.kt)("h3",{id:"1-upgrade-\uc694\uccad"},"1. Upgrade \uc694\uccad"),(0,o.kt)("p",null,"WebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"GET /chats HTTP/1.1\nHost: localhost:8080\nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\nSec-WebSocket-Version: 13\nOrigin: http://localhost:8080\n")),(0,o.kt)("h3",{id:"2-switching-protocols"},"2. Switching Protocols"),(0,o.kt)("p",null,"\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","Sec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 ",(0,o.kt)("inlineCode",{parentName:"p"},"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"),"\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"HTTP/1.1 101 Switching Protocols \nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\nSec-WebSocket-Protocol: v10.stomp\n")),(0,o.kt)("h3",{id:"3-\ud1b5\uc2e0-\ud6c4-\uc885\ub8cc"},"3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc"),(0,o.kt)("p",null,"\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. "),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc6455"},"https://datatracker.ietf.org/doc/html/rfc6455"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"},"https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-framework/reference/web/websocket.html"},"https://docs.spring.io/spring-framework/reference/web/websocket.html")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/303c1e60.db6eb0ad.js b/assets/js/303c1e60.db6eb0ad.js new file mode 100644 index 000000000..c673e2e5a --- /dev/null +++ b/assets/js/303c1e60.db6eb0ad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2656],{39529:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/309173fa.e0abcecd.js b/assets/js/309173fa.e0abcecd.js deleted file mode 100644 index 2a1a66ac4..000000000 --- a/assets/js/309173fa.e0abcecd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1793],{2684:e=>{e.exports=JSON.parse('{"permalink":"/tags/data-base","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/data-base/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/309173fa.f6e5e77a.js b/assets/js/309173fa.f6e5e77a.js new file mode 100644 index 000000000..4bd8b54c4 --- /dev/null +++ b/assets/js/309173fa.f6e5e77a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1793],{22684:e=>{e.exports=JSON.parse('{"permalink":"/tags/data-base","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/data-base/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/3216290d.1d046dd8.js b/assets/js/3216290d.1d046dd8.js new file mode 100644 index 000000000..850a39c10 --- /dev/null +++ b/assets/js/3216290d.1d046dd8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6799],{3905:(t,e,a)=>{a.d(e,{Zo:()=>m,kt:()=>d});var n=a(67294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},m=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},c=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,r=t.originalType,o=t.parentName,m=p(t,["components","mdxType","originalType","parentName"]),c=u(a),d=l,s=c["".concat(o,".").concat(d)]||c[d]||k[d]||r;return a?n.createElement(s,i(i({ref:e},m),{},{components:a})):n.createElement(s,i({ref:e},m))}));function d(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var r=a.length,i=new Array(r);i[0]=c;var p={};for(var o in e)hasOwnProperty.call(e,o)&&(p[o]=e[o]);p.originalType=t,p.mdxType="string"==typeof t?t:l,i[1]=p;for(var u=2;u{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>i,default:()=>k,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=a(87462),l=(a(67294),a(3905));const r={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:36,tags:["image","awt"]},i=void 0,p={permalink:"/36",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",source:"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",description:"./route.png",date:"2023-07-27T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 27\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:5.28,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:"36",tags:["image","awt"]},prevItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"},nextItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"}},o={authorsImageUrls:[]},u=[{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784",level:2},{value:"\uace0\ub824\ud55c \uae30\uc220",id:"\uace0\ub824\ud55c-\uae30\uc220",level:2},{value:"Python & Matplotlib",id:"python--matplotlib",level:2},{value:"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac",id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac",level:2},{value:"Java & AWT(Abstract Window Toolkit)",id:"java--awtabstract-window-toolkit",level:2},{value:"\uae30\uc220 \uc120\ud0dd",id:"\uae30\uc220-\uc120\ud0dd",level:2},{value:"\uc720\uc9c0 \ubcf4\uc218",id:"\uc720\uc9c0-\ubcf4\uc218",level:2}],m={toc:u};function k(t){let{components:e,...r}=t;return(0,l.kt)("wrapper",(0,n.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"./route.png",src:a(31887).Z,width:"1014",height:"902"})),(0,l.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784"),(0,l.kt)("p",null,"\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac"),"\uc640 ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0"),"\uc758 \uacbd\uc6b0, \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4."),(0,l.kt)("p",null,"\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,l.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,l.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9")),(0,l.kt)("p",null,"\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4."),(0,l.kt)("h2",{id:"\uace0\ub824\ud55c-\uae30\uc220"},"\uace0\ub824\ud55c \uae30\uc220"),(0,l.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Python\uc758 Matplotlib"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"AWT(Abstract Window Toolkit) ","[\ucd5c\uc885 \uc120\ud0dd]")),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)"),(0,l.kt)("li",{parentName:"ul"},"Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)")),(0,l.kt)("h2",{id:"python--matplotlib"},"Python & Matplotlib"),(0,l.kt)("p",null,"\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. "),(0,l.kt)("li",{parentName:"ul"},"AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.")),(0,l.kt)("h2",{id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac"},"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("p",null,"Python\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"\ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc81c\uc678 \uc774\uc720"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Swing"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"JavaFX"),(0,l.kt)("td",{parentName:"tr",align:null},"Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/yuriy-g/simple-java-plot"},"simple-java-plot")),(0,l.kt)("td",{parentName:"tr",align:null},"AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/sh0nk/matplotlib4j"},"matplotlib4j")),(0,l.kt)("td",{parentName:"tr",align:null},"Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c")))),(0,l.kt)("h2",{id:"java--awtabstract-window-toolkit"},"Java & AWT(Abstract Window Toolkit)"),(0,l.kt)("p",null,"\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.")),(0,l.kt)("h2",{id:"\uae30\uc220-\uc120\ud0dd"},"\uae30\uc220 \uc120\ud0dd"),(0,l.kt)("p",null,"AWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4."),(0,l.kt)("h2",{id:"\uc720\uc9c0-\ubcf4\uc218"},"\uc720\uc9c0 \ubcf4\uc218"),(0,l.kt)("p",null,"AWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. "),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4.")))}k.isMDXComponent=!0},31887:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"}}]); \ No newline at end of file diff --git a/assets/js/3216290d.7f152de2.js b/assets/js/3216290d.7f152de2.js deleted file mode 100644 index 720f5ee63..000000000 --- a/assets/js/3216290d.7f152de2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6799],{3905:(t,e,a)=>{a.d(e,{Zo:()=>m,kt:()=>d});var n=a(7294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},m=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},c=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,r=t.originalType,o=t.parentName,m=p(t,["components","mdxType","originalType","parentName"]),c=u(a),d=l,s=c["".concat(o,".").concat(d)]||c[d]||k[d]||r;return a?n.createElement(s,i(i({ref:e},m),{},{components:a})):n.createElement(s,i({ref:e},m))}));function d(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var r=a.length,i=new Array(r);i[0]=c;var p={};for(var o in e)hasOwnProperty.call(e,o)&&(p[o]=e[o]);p.originalType=t,p.mdxType="string"==typeof t?t:l,i[1]=p;for(var u=2;u{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>i,default:()=>k,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=a(7462),l=(a(7294),a(3905));const r={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:36,tags:["image","awt"]},i=void 0,p={permalink:"/36",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",source:"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",description:"./route.png",date:"2023-07-27T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 27\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:5.28,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",slug:"36",tags:["image","awt"]},prevItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"},nextItem:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",permalink:"/35"}},o={authorsImageUrls:[]},u=[{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784",level:2},{value:"\uace0\ub824\ud55c \uae30\uc220",id:"\uace0\ub824\ud55c-\uae30\uc220",level:2},{value:"Python & Matplotlib",id:"python--matplotlib",level:2},{value:"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac",id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac",level:2},{value:"Java & AWT(Abstract Window Toolkit)",id:"java--awtabstract-window-toolkit",level:2},{value:"\uae30\uc220 \uc120\ud0dd",id:"\uae30\uc220-\uc120\ud0dd",level:2},{value:"\uc720\uc9c0 \ubcf4\uc218",id:"\uc720\uc9c0-\ubcf4\uc218",level:2}],m={toc:u};function k(t){let{components:e,...r}=t;return(0,l.kt)("wrapper",(0,n.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"./route.png",src:a(1887).Z,width:"1014",height:"902"})),(0,l.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc758-\ucc45\uc784"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784"),(0,l.kt)("p",null,"\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac"),"\uc640 ",(0,l.kt)("inlineCode",{parentName:"p"},"\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0"),"\uc758 \uacbd\uc6b0, \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4."),(0,l.kt)("p",null,"\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,l.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,l.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9")),(0,l.kt)("p",null,"\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4."),(0,l.kt)("h2",{id:"\uace0\ub824\ud55c-\uae30\uc220"},"\uace0\ub824\ud55c \uae30\uc220"),(0,l.kt)("p",null,"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Python\uc758 Matplotlib"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"AWT(Abstract Window Toolkit) ","[\ucd5c\uc885 \uc120\ud0dd]")),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)"),(0,l.kt)("li",{parentName:"ul"},"Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)")),(0,l.kt)("h2",{id:"python--matplotlib"},"Python & Matplotlib"),(0,l.kt)("p",null,"\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. "),(0,l.kt)("li",{parentName:"ul"},"AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.")),(0,l.kt)("h2",{id:"java-awt-\uc774\uc678\uc758-\ub77c\uc774\ube0c\ub7ec\ub9ac"},"Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("p",null,"Python\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"\ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,l.kt)("th",{parentName:"tr",align:null},"\uc81c\uc678 \uc774\uc720"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Swing"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"JavaFX"),(0,l.kt)("td",{parentName:"tr",align:null},"Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568"),(0,l.kt)("td",{parentName:"tr",align:null},"\uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/yuriy-g/simple-java-plot"},"simple-java-plot")),(0,l.kt)("td",{parentName:"tr",align:null},"AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/sh0nk/matplotlib4j"},"matplotlib4j")),(0,l.kt)("td",{parentName:"tr",align:null},"Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac"),(0,l.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c")))),(0,l.kt)("h2",{id:"java--awtabstract-window-toolkit"},"Java & AWT(Abstract Window Toolkit)"),(0,l.kt)("p",null,"\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c",(0,l.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 "),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4."),(0,l.kt)("li",{parentName:"ul"},"\ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.")),(0,l.kt)("h2",{id:"\uae30\uc220-\uc120\ud0dd"},"\uae30\uc220 \uc120\ud0dd"),(0,l.kt)("p",null,"AWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4."),(0,l.kt)("h2",{id:"\uc720\uc9c0-\ubcf4\uc218"},"\uc720\uc9c0 \ubcf4\uc218"),(0,l.kt)("p",null,"AWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. "),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4.")))}k.isMDXComponent=!0},1887:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"}}]); \ No newline at end of file diff --git a/assets/js/32397cb2.79ba529e.js b/assets/js/32397cb2.79ba529e.js new file mode 100644 index 000000000..163777e8f --- /dev/null +++ b/assets/js/32397cb2.79ba529e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[548],{22050:e=>{e.exports=JSON.parse('{"permalink":"/tags/awt/page/2","page":2,"postsPerPage":1,"totalPages":2,"totalCount":2,"previousPage":"/tags/awt","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/32397cb2.acf73335.js b/assets/js/32397cb2.acf73335.js deleted file mode 100644 index 1c1d2d70d..000000000 --- a/assets/js/32397cb2.acf73335.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[548],{2050:e=>{e.exports=JSON.parse('{"permalink":"/tags/awt/page/2","page":2,"postsPerPage":1,"totalPages":2,"totalCount":2,"previousPage":"/tags/awt","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/32b2299c.d11c3a7d.js b/assets/js/32b2299c.d11c3a7d.js new file mode 100644 index 000000000..3ab3bac74 --- /dev/null +++ b/assets/js/32b2299c.d11c3a7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[970],{5280:e=>{e.exports=JSON.parse('{"permalink":"/page/41","page":41,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/40","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/33736670.01b3f5e5.js b/assets/js/33736670.01b3f5e5.js new file mode 100644 index 000000000..f1986bc17 --- /dev/null +++ b/assets/js/33736670.01b3f5e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2742],{80700:s=>{s.exports=JSON.parse('{"label":"Class","permalink":"/tags/class","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/33736670.5fac410b.js b/assets/js/33736670.5fac410b.js deleted file mode 100644 index 79b07488c..000000000 --- a/assets/js/33736670.5fac410b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2742],{700:s=>{s.exports=JSON.parse('{"label":"Class","permalink":"/tags/class","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/33ae6a7e.2e88b883.js b/assets/js/33ae6a7e.2e88b883.js deleted file mode 100644 index 9dafff8b3..000000000 --- a/assets/js/33ae6a7e.2e88b883.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5005],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),i=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=i(r),k=a,b=m["".concat(c,".").concat(k)]||m[k]||s[k]||l;return r?n.createElement(b,o(o({ref:t},u),{},{components:r})):n.createElement(b,o({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=m;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:a,o[1]=p;for(var i=2;i{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const l={title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:25,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,p={permalink:"/25",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",date:"2023-05-12T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 12\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.78,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:"25",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"},nextItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"}},c={authorsImageUrls:[]},i=[{value:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:i};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158"},"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Interceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5")),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto1",src:r(8960).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto2",src:r(4885).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9")),(0,a.kt)("p",null,"\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\ub85d")),(0,a.kt)("p",null,"\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"))}s.isMDXComponent=!0},8960:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto1-ccd4f91674b224578f2b295b3fccaf2c.png"},4885:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto2-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/33ae6a7e.bd927f0f.js b/assets/js/33ae6a7e.bd927f0f.js new file mode 100644 index 000000000..04eeb97de --- /dev/null +++ b/assets/js/33ae6a7e.bd927f0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5005],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),i=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=i(r),k=a,b=m["".concat(c,".").concat(k)]||m[k]||s[k]||l;return r?n.createElement(b,o(o({ref:t},u),{},{components:r})):n.createElement(b,o({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=m;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:a,o[1]=p;for(var i=2;i{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var n=r(87462),a=(r(67294),r(3905));const l={title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:25,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,p={permalink:"/25",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",date:"2023-05-12T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 12\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.78,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:"25",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"},nextItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"}},c={authorsImageUrls:[]},i=[{value:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:i};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158"},"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Interceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5")),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto1",src:r(78960).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto2",src:r(14885).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9")),(0,a.kt)("p",null,"\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\ub85d")),(0,a.kt)("p",null,"\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"))}s.isMDXComponent=!0},78960:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto1-ccd4f91674b224578f2b295b3fccaf2c.png"},14885:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto2-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/34a9e1b6.4c3c8c26.js b/assets/js/34a9e1b6.4c3c8c26.js deleted file mode 100644 index e4bd3fda5..000000000 --- a/assets/js/34a9e1b6.4c3c8c26.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7381],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),m=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=m(e.components);return n.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=m(r),s=a,b=c["".concat(u,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var m=2;m{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>m});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:12,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/12",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",description:"\uccb4\uc2a4",date:"2023-03-31T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 31\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:"12",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"},nextItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"}},u={authorsImageUrls:[]},m=[{value:"\uccb4\uc2a4",id:"\uccb4\uc2a4",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],i={toc:m};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uccb4\uc2a4"},"\uccb4\uc2a4"),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","Rank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2)",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 "),(0,a.kt)("li",{parentName:"ul"},"\uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 ")),(0,a.kt)("p",null,"\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. ")),(0,a.kt)("p",null,"\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac)",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)"),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubd80\uac00\uc801\uc778 \ubd80\ubd84")),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 "),(0,a.kt)("li",{parentName:"ul"},"ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac "),(0,a.kt)("li",{parentName:"ul"},"\uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) ")),(0,a.kt)("p",null,"\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","DB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO \uc911\ubcf5 \uc81c\uac70")),(0,a.kt)("p",null,"\ud504\ub864\ub85c\uadf8\uc5d0 ",(0,a.kt)("a",{parentName:"p",href:"https://prolog.techcourse.co.kr/studylogs/2947"},"\uae00"),"\uc744 \uc791\uc131\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d"),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158 \ubab0\uc785\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc194\uc9c1\ud568"),(0,a.kt)("br",{parentName:"p"}),"\n","\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/34a9e1b6.d43251bc.js b/assets/js/34a9e1b6.d43251bc.js new file mode 100644 index 000000000..2933fdbb6 --- /dev/null +++ b/assets/js/34a9e1b6.d43251bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7381],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),m=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=m(e.components);return n.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=m(r),s=a,b=c["".concat(u,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var m=2;m{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>m});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:12,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/12",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",description:"\uccb4\uc2a4",date:"2023-03-31T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 31\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:"12",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"},nextItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"}},u={authorsImageUrls:[]},m=[{value:"\uccb4\uc2a4",id:"\uccb4\uc2a4",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],i={toc:m};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uccb4\uc2a4"},"\uccb4\uc2a4"),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","Rank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2)",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 "),(0,a.kt)("li",{parentName:"ul"},"\uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 ")),(0,a.kt)("p",null,"\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. ")),(0,a.kt)("p",null,"\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac)",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)"),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubd80\uac00\uc801\uc778 \ubd80\ubd84")),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 "),(0,a.kt)("li",{parentName:"ul"},"ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac "),(0,a.kt)("li",{parentName:"ul"},"\uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) ")),(0,a.kt)("p",null,"\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","DB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO \uc911\ubcf5 \uc81c\uac70")),(0,a.kt)("p",null,"\ud504\ub864\ub85c\uadf8\uc5d0 ",(0,a.kt)("a",{parentName:"p",href:"https://prolog.techcourse.co.kr/studylogs/2947"},"\uae00"),"\uc744 \uc791\uc131\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d"),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158 \ubab0\uc785\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc194\uc9c1\ud568"),(0,a.kt)("br",{parentName:"p"}),"\n","\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35293ec4.488f144f.js b/assets/js/35293ec4.9c9fbde9.js similarity index 57% rename from assets/js/35293ec4.488f144f.js rename to assets/js/35293ec4.9c9fbde9.js index cdd70eb6e..2e5020328 100644 --- a/assets/js/35293ec4.488f144f.js +++ b/assets/js/35293ec4.9c9fbde9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7697],{14:e=>{e.exports=JSON.parse('{"permalink":"/page/20","page":20,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/19","nextPage":"/page/21","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7697],{14:e=>{e.exports=JSON.parse('{"permalink":"/page/20","page":20,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/19","nextPage":"/page/21","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/35b2eb5a.5a1d68a7.js b/assets/js/35b2eb5a.5a1d68a7.js deleted file mode 100644 index b7de0601d..000000000 --- a/assets/js/35b2eb5a.5a1d68a7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[372],{7815:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/5","page":5,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/35b2eb5a.9ac55f69.js b/assets/js/35b2eb5a.9ac55f69.js new file mode 100644 index 000000000..955ad1eec --- /dev/null +++ b/assets/js/35b2eb5a.9ac55f69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[372],{97815:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/5","page":5,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/3720c009.9a58b73e.js b/assets/js/3720c009.9a58b73e.js deleted file mode 100644 index 899652b07..000000000 --- a/assets/js/3720c009.9a58b73e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3751],{727:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294),n=a(6010),r=a(5155),c=a(833),s=a(5281),m=a(4774),o=a(6090),i=a(197);function u(e){let{tags:t}=e;const a=(0,r.M)();return l.createElement(c.FG,{className:(0,n.Z)(s.k.wrapper.docsPages,s.k.page.docsTagsListPage)},l.createElement(c.d,{title:a}),l.createElement(i.Z,{tag:"doc_tags_list"}),l.createElement(m.Z,null,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement("main",{className:"col col--8 col--offset-2"},l.createElement("h1",null,a),l.createElement(o.Z,{tags:t}))))))}},3008:(e,t,a)=>{a.d(t,{Z:()=>o});var l=a(7294),n=a(6010),r=a(9960);const c="tag_zVej",s="tagRegular_sFm0",m="tagWithCount_h2kH";function o(e){let{permalink:t,label:a,count:o}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(c,o?m:s)},a,o&&l.createElement("span",null,o))}},6090:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(7294),n=a(5155),r=a(3008);const c="tag_Nnez";function s(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:c},l.createElement(r.Z,e))))),l.createElement("hr",null))}function m(e){let{tags:t}=e;const a=(0,n.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(s,{key:e.letter,letterEntry:e}))))}},5155:(e,t,a)=>{a.d(t,{M:()=>n,P:()=>r});var l=a(5999);const n=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/3720c009.bcd87bc4.js b/assets/js/3720c009.bcd87bc4.js new file mode 100644 index 000000000..dc212067c --- /dev/null +++ b/assets/js/3720c009.bcd87bc4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3751],{10727:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(67294),n=a(86010),r=a(35155),c=a(10833),s=a(35281),m=a(54774),o=a(26090),i=a(90197);function u(e){let{tags:t}=e;const a=(0,r.M)();return l.createElement(c.FG,{className:(0,n.Z)(s.k.wrapper.docsPages,s.k.page.docsTagsListPage)},l.createElement(c.d,{title:a}),l.createElement(i.Z,{tag:"doc_tags_list"}),l.createElement(m.Z,null,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement("main",{className:"col col--8 col--offset-2"},l.createElement("h1",null,a),l.createElement(o.Z,{tags:t}))))))}},13008:(e,t,a)=>{a.d(t,{Z:()=>o});var l=a(67294),n=a(86010),r=a(39960);const c="tag_zVej",s="tagRegular_sFm0",m="tagWithCount_h2kH";function o(e){let{permalink:t,label:a,count:o}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(c,o?m:s)},a,o&&l.createElement("span",null,o))}},26090:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(67294),n=a(35155),r=a(13008);const c="tag_Nnez";function s(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:c},l.createElement(r.Z,e))))),l.createElement("hr",null))}function m(e){let{tags:t}=e;const a=(0,n.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(s,{key:e.letter,letterEntry:e}))))}},35155:(e,t,a)=>{a.d(t,{M:()=>n,P:()=>r});var l=a(95999);const n=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/38d8699e.572462f2.js b/assets/js/38d8699e.572462f2.js new file mode 100644 index 000000000..1216b9686 --- /dev/null +++ b/assets/js/38d8699e.572462f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[471],{97481:e=>{e.exports=JSON.parse('{"permalink":"/page/15","page":15,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/14","nextPage":"/page/16","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/38d8699e.6d730b30.js b/assets/js/38d8699e.6d730b30.js deleted file mode 100644 index 9b5731025..000000000 --- a/assets/js/38d8699e.6d730b30.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[471],{7481:e=>{e.exports=JSON.parse('{"permalink":"/page/15","page":15,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/14","nextPage":"/page/16","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/3972c49f.411ee9ac.js b/assets/js/3972c49f.411ee9ac.js new file mode 100644 index 000000000..dc196c227 --- /dev/null +++ b/assets/js/3972c49f.411ee9ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6629],{91782:e=>{e.exports=JSON.parse('{"permalink":"/tags/web-socket","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/397e7345.1ada09b5.js b/assets/js/397e7345.1ada09b5.js deleted file mode 100644 index e87437ab2..000000000 --- a/assets/js/397e7345.1ada09b5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1892],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,k=m["".concat(i,".").concat(b)]||m[b]||u[b]||p;return r?n.createElement(k,o(o({ref:t},s),{},{components:r})):n.createElement(k,o({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:24,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/24",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",date:"2023-05-02T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 2\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.535,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:"24",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"},nextItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"}},i={authorsImageUrls:[]},c=[{value:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158"},"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ub09c\uc774\ub3c4 \ub192\uc774\uae30"),"\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@SuppressWarnings("NonAsciiCharacters")\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\n@Transactional\n@AutoConfigureMockMvc\n@SpringBootTest\npublic class RacingGameIntegrationTest {\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ube44\ubc84\uc758 \uc131\uaca9"),(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/397e7345.531aff95.js b/assets/js/397e7345.531aff95.js new file mode 100644 index 000000000..9180c2b22 --- /dev/null +++ b/assets/js/397e7345.531aff95.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1892],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,k=m["".concat(i,".").concat(b)]||m[b]||u[b]||p;return r?n.createElement(k,o(o({ref:t},s),{},{components:r})):n.createElement(k,o({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:24,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/24",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",date:"2023-05-02T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 2\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.535,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:"24",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"},nextItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"}},i={authorsImageUrls:[]},c=[{value:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158"},"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ub09c\uc774\ub3c4 \ub192\uc774\uae30"),"\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@SuppressWarnings("NonAsciiCharacters")\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\n@Transactional\n@AutoConfigureMockMvc\n@SpringBootTest\npublic class RacingGameIntegrationTest {\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ube44\ubc84\uc758 \uc131\uaca9"),(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/39ee6679.0e49477c.js b/assets/js/39ee6679.0e49477c.js new file mode 100644 index 000000000..2eb382ce9 --- /dev/null +++ b/assets/js/39ee6679.0e49477c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5717],{83636:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/3b0d95bc.11787215.js b/assets/js/3b0d95bc.11787215.js new file mode 100644 index 000000000..41f8fc6a6 --- /dev/null +++ b/assets/js/3b0d95bc.11787215.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5140],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,E=d["".concat(p,".").concat(m)]||d[m]||s[m]||l;return n?r.createElement(E,i(i({ref:t},c),{},{components:n})):r.createElement(E,i({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,i=new Array(l);i[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:a,i[1]=o;for(var u=2;u{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const l={title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",tags:["JPA"]},i=void 0,o={unversionedId:"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",id:"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",description:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",source:"@site/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551.mdx",sourceDirName:"JPA",slug:"/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",permalink:"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551.mdx",tags:[{label:"JPA",permalink:"/docs/tags/jpa"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",tags:["JPA"]},sidebar:"tutorialSidebar",next:{title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",permalink:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4"}},p={},u=[{value:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",id:"\uae30\ubcf8-\ud0a4-\ub9e4\ud551",level:3},{value:"\uc9c1\uc811 \ud560\ub2f9",id:"\uc9c1\uc811-\ud560\ub2f9",level:3},{value:"IDENTITY",id:"identity",level:3},{value:"SEQUENCE",id:"sequence",level:3},{value:"TABLE",id:"table",level:3},{value:"AUTO",id:"auto",level:3},{value:"UUID",id:"uuid",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:u};function s(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uae30\ubcf8-\ud0a4-\ub9e4\ud551"},"\uae30\ubcf8 \ud0a4 \ub9e4\ud551"),(0,a.kt)("p",null,"\uae30\ubcf8 \ud0a4 \ub9e4\ud551 \uc804\ub7b5\uc5d0\ub294 \uc9c1\uc811 \ud560\ub2f9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uace0 \uc790\ub3d9 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ub3d9 \uc0dd\uc131\uc744 \uc120\ud0dd\ud55c\ub2e4\uba74 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ud0a4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc9c1\uc811 \ud560\ub2f9\ud558\uc9c0 \uc54a\uace0, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc0dd\uc131\ud574\uc8fc\ub294 \uac12\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uc9c1\uc811-\ud560\ub2f9"},"\uc9c1\uc811 \ud560\ub2f9"),(0,a.kt)("p",null,"\uae30\ubcf8 \ud0a4\ub97c \uc9c1\uc811 \ud560\ub2f9\ud558\ub294 \uacbd\uc6b0\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"@Id"),"\ub9cc \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ub3d9 \ud560\ub2f9\ud558\ub294 \uacbd\uc6b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"@Id"),"\uc5d0 \ucd94\uac00\uc801\uc73c\ub85c ",(0,a.kt)("inlineCode",{parentName:"p"},"@GeneratedValue"),"\ub97c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"identity"},"IDENTITY"),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc0dd\uc131\ud55c \ud0a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uc804\ub7b5",(0,a.kt)("br",{parentName:"p"}),"\n","MySQL, PostgreSQL\uacfc \uac19\uc740 DB\uc5d0\uc11c \uc8fc\ub85c \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Hibernate\ub294 JDBC3\uc5d0 \ucd94\uac00\ub41c ",(0,a.kt)("inlineCode",{parentName:"p"},"Statement.getGeneratedKeys()"),"\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0dd\uc131\uacfc \ub3d9\uc2dc\uc5d0 \ud0a4 \uac12\uc744 \uc5bb\uc5b4 \uc62c \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.IDENTITY)\n private Long id;\n}\n")),(0,a.kt)("h3",{id:"sequence"},"SEQUENCE"),(0,a.kt)("p",null,"\uc2dc\ud000\uc2a4\ub294 \uc720\uc77c\ud55c \uac12\uc744 \uc21c\uc11c\ub300\ub85c \uc0dd\uc131\ud558\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc624\ube0c\uc81d\ud2b8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","IDENTITY\uc758 \uacbd\uc6b0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud55c \ud6c4 \uc2dd\ubcc4\uc790\ub97c \uc870\ud68c\ud574\uc11c \uc5d4\ud2f0\ud2f0\uc758 \uc2dd\ubcc4\uc790\uc5d0 \ud560\ub2f9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","SEQUENCE\uc758 \uacbd\uc6b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"call next value for member_seq"),"\uc640 \uac19\uc774 \uc2dc\ud000\uc2a4\ub97c \uc0ac\uc6a9\ud574\uc11c \uc2dd\ubcc4\uc790\ub97c "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@SequenceGenerator(\n name = "MEMBER_SEQ_GENERATOR",\n sequenceName = "MEMBER_SEQ",\n initialValue = 1,\n allocationSize = 1\n)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")\n private Long id;\n}\n')),(0,a.kt)("h3",{id:"table"},"TABLE"),(0,a.kt)("p",null,"\ud0a4 \uc0dd\uc131\uc6a9 \ud14c\uc774\ube14\uc744 \ubcc4\ub3c4\ub85c \ub450\uc5b4 \uc2dc\ud000\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \uc2dd\ubcc4\uc790 \ud0a4\ub97c \uc5bb\ub294 \uc804\ub7b5\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\ud68c\uc640 \uc5c5\ub370\uc774\ud2b8\ub97c \ud574\uc57c\ud55c\ub2e4\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@TableGenerator(\n name = "MEMBER_SEQ_GENERATOR",\n table = "MEMBER_SEQUENCES",\n pkColumnValue = "MEMBER_SEQ",\n allocationSize = 1\n)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")\n private Long id;\n}\n')),(0,a.kt)("h3",{id:"auto"},"AUTO"),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub530\ub77c \uc704\uc5d0 \uc5b8\uae09\ub41c \uc804\ub7b5 \uc911 \ud558\ub098\ub97c \uc790\ub3d9\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","MySQL\uc758 \uacbd\uc6b0 IDENTITY Oracle\uc758 \uacbd\uc6b0 SEQUENCE\ub97c \uc120\ud0dd\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"uuid"},"UUID"),(0,a.kt)("p",null,"JPA 3.1.0 UUID \uc0dd\uc131 \uc804\ub7b5\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Hibernate 6.2\ubd80\ud130 JPA 3.1.0\uc744 \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1 \uc774\uc0c1\uc778 \uacbd\uc6b0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.UUID)\n @UuidGenerator(style = Style.RANDOM)\n private Long id;\n}\n")),(0,a.kt)("p",null,"UuidGenerator\ub97c \uc774\uc6a9\ud558\uc5ec UUID \uc0dd\uc131 \ubc29\uc2dd\ub3c4 \uc124\uc815\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0dd\uc131 \ubc29\uc2dd\uc740 3\uac00\uc9c0\uac00 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"RANDOM - \ub09c\uc218 \uae30\ubc18 UUID \uc0dd\uc131(uuid v4)"),(0,a.kt)("li",{parentName:"ul"},"TIME \u2013 \uc2dc\uac04 \uae30\ubc18 UUID \uc0dd\uc131(uuid v1)"),(0,a.kt)("li",{parentName:"ul"},"AUTO \u2013 \uae30\ubcf8 \uc635\uc158, RANDOM\uacfc \ub3d9\uc77c")),(0,a.kt)("p",null,"UUID\uc758 \uacbd\uc6b0 \ub9ce\uc740 \uc591\uc758 \uc800\uc7a5 \uacf5\uac04\uc744 \ud544\uc694\ub85c \ud558\uace0, \uc131\ub2a5 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uae30\uc5d0 UUID\ub97c \uc0ac\uc6a9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 TSID\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc790\ubc14 ORM \ud45c\uc900 JPA \ud504\ub85c\uadf8\ub798\ubc0d, \uae40\uc601\ud55c p.131 ~ p.144",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/java-hibernate-uuid-primary-key"},"Generate UUIDs as Primary Keys With Hibernate")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3b0d95bc.8909d704.js b/assets/js/3b0d95bc.8909d704.js deleted file mode 100644 index ffda19316..000000000 --- a/assets/js/3b0d95bc.8909d704.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[970],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,E=d["".concat(p,".").concat(m)]||d[m]||s[m]||l;return n?r.createElement(E,i(i({ref:t},c),{},{components:n})):r.createElement(E,i({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,i=new Array(l);i[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:a,i[1]=o;for(var u=2;u{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var r=n(7462),a=(n(7294),n(3905));const l={title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",tags:["JPA"]},i=void 0,o={unversionedId:"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",id:"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",description:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",source:"@site/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551.mdx",sourceDirName:"JPA",slug:"/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",permalink:"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551.mdx",tags:[{label:"JPA",permalink:"/docs/tags/jpa"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",tags:["JPA"]},sidebar:"tutorialSidebar",next:{title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",permalink:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4"}},p={},u=[{value:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",id:"\uae30\ubcf8-\ud0a4-\ub9e4\ud551",level:3},{value:"\uc9c1\uc811 \ud560\ub2f9",id:"\uc9c1\uc811-\ud560\ub2f9",level:3},{value:"IDENTITY",id:"identity",level:3},{value:"SEQUENCE",id:"sequence",level:3},{value:"TABLE",id:"table",level:3},{value:"AUTO",id:"auto",level:3},{value:"UUID",id:"uuid",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:u};function s(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uae30\ubcf8-\ud0a4-\ub9e4\ud551"},"\uae30\ubcf8 \ud0a4 \ub9e4\ud551"),(0,a.kt)("p",null,"\uae30\ubcf8 \ud0a4 \ub9e4\ud551 \uc804\ub7b5\uc5d0\ub294 \uc9c1\uc811 \ud560\ub2f9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uace0 \uc790\ub3d9 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ub3d9 \uc0dd\uc131\uc744 \uc120\ud0dd\ud55c\ub2e4\uba74 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ud0a4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc9c1\uc811 \ud560\ub2f9\ud558\uc9c0 \uc54a\uace0, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc0dd\uc131\ud574\uc8fc\ub294 \uac12\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uc9c1\uc811-\ud560\ub2f9"},"\uc9c1\uc811 \ud560\ub2f9"),(0,a.kt)("p",null,"\uae30\ubcf8 \ud0a4\ub97c \uc9c1\uc811 \ud560\ub2f9\ud558\ub294 \uacbd\uc6b0\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"@Id"),"\ub9cc \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ub3d9 \ud560\ub2f9\ud558\ub294 \uacbd\uc6b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"@Id"),"\uc5d0 \ucd94\uac00\uc801\uc73c\ub85c ",(0,a.kt)("inlineCode",{parentName:"p"},"@GeneratedValue"),"\ub97c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"identity"},"IDENTITY"),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc0dd\uc131\ud55c \ud0a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uc804\ub7b5",(0,a.kt)("br",{parentName:"p"}),"\n","MySQL, PostgreSQL\uacfc \uac19\uc740 DB\uc5d0\uc11c \uc8fc\ub85c \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Hibernate\ub294 JDBC3\uc5d0 \ucd94\uac00\ub41c ",(0,a.kt)("inlineCode",{parentName:"p"},"Statement.getGeneratedKeys()"),"\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0dd\uc131\uacfc \ub3d9\uc2dc\uc5d0 \ud0a4 \uac12\uc744 \uc5bb\uc5b4 \uc62c \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.IDENTITY)\n private Long id;\n}\n")),(0,a.kt)("h3",{id:"sequence"},"SEQUENCE"),(0,a.kt)("p",null,"\uc2dc\ud000\uc2a4\ub294 \uc720\uc77c\ud55c \uac12\uc744 \uc21c\uc11c\ub300\ub85c \uc0dd\uc131\ud558\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc624\ube0c\uc81d\ud2b8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","IDENTITY\uc758 \uacbd\uc6b0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud55c \ud6c4 \uc2dd\ubcc4\uc790\ub97c \uc870\ud68c\ud574\uc11c \uc5d4\ud2f0\ud2f0\uc758 \uc2dd\ubcc4\uc790\uc5d0 \ud560\ub2f9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","SEQUENCE\uc758 \uacbd\uc6b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"call next value for member_seq"),"\uc640 \uac19\uc774 \uc2dc\ud000\uc2a4\ub97c \uc0ac\uc6a9\ud574\uc11c \uc2dd\ubcc4\uc790\ub97c "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@SequenceGenerator(\n name = "MEMBER_SEQ_GENERATOR",\n sequenceName = "MEMBER_SEQ",\n initialValue = 1,\n allocationSize = 1\n)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")\n private Long id;\n}\n')),(0,a.kt)("h3",{id:"table"},"TABLE"),(0,a.kt)("p",null,"\ud0a4 \uc0dd\uc131\uc6a9 \ud14c\uc774\ube14\uc744 \ubcc4\ub3c4\ub85c \ub450\uc5b4 \uc2dc\ud000\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \uc2dd\ubcc4\uc790 \ud0a4\ub97c \uc5bb\ub294 \uc804\ub7b5\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\ud68c\uc640 \uc5c5\ub370\uc774\ud2b8\ub97c \ud574\uc57c\ud55c\ub2e4\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@TableGenerator(\n name = "MEMBER_SEQ_GENERATOR",\n table = "MEMBER_SEQUENCES",\n pkColumnValue = "MEMBER_SEQ",\n allocationSize = 1\n)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")\n private Long id;\n}\n')),(0,a.kt)("h3",{id:"auto"},"AUTO"),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub530\ub77c \uc704\uc5d0 \uc5b8\uae09\ub41c \uc804\ub7b5 \uc911 \ud558\ub098\ub97c \uc790\ub3d9\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","MySQL\uc758 \uacbd\uc6b0 IDENTITY Oracle\uc758 \uacbd\uc6b0 SEQUENCE\ub97c \uc120\ud0dd\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"uuid"},"UUID"),(0,a.kt)("p",null,"JPA 3.1.0 UUID \uc0dd\uc131 \uc804\ub7b5\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Hibernate 6.2\ubd80\ud130 JPA 3.1.0\uc744 \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1 \uc774\uc0c1\uc778 \uacbd\uc6b0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@Getter\n@NoArgsConstructor(access = AccessLevel.PROTECTED)\n@Entity\npublic class Member {\n\n @Id\n @GeneratedValue(strategy = GenerationType.UUID)\n @UuidGenerator(style = Style.RANDOM)\n private Long id;\n}\n")),(0,a.kt)("p",null,"UuidGenerator\ub97c \uc774\uc6a9\ud558\uc5ec UUID \uc0dd\uc131 \ubc29\uc2dd\ub3c4 \uc124\uc815\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0dd\uc131 \ubc29\uc2dd\uc740 3\uac00\uc9c0\uac00 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"RANDOM - \ub09c\uc218 \uae30\ubc18 UUID \uc0dd\uc131(uuid v4)"),(0,a.kt)("li",{parentName:"ul"},"TIME \u2013 \uc2dc\uac04 \uae30\ubc18 UUID \uc0dd\uc131(uuid v1)"),(0,a.kt)("li",{parentName:"ul"},"AUTO \u2013 \uae30\ubcf8 \uc635\uc158, RANDOM\uacfc \ub3d9\uc77c")),(0,a.kt)("p",null,"UUID\uc758 \uacbd\uc6b0 \ub9ce\uc740 \uc591\uc758 \uc800\uc7a5 \uacf5\uac04\uc744 \ud544\uc694\ub85c \ud558\uace0, \uc131\ub2a5 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uae30\uc5d0 UUID\ub97c \uc0ac\uc6a9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 TSID\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc790\ubc14 ORM \ud45c\uc900 JPA \ud504\ub85c\uadf8\ub798\ubc0d, \uae40\uc601\ud55c p.131 ~ p.144",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/java-hibernate-uuid-primary-key"},"Generate UUIDs as Primary Keys With Hibernate")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3b0f99e8.c4d5d643.js b/assets/js/3b0f99e8.c4d5d643.js new file mode 100644 index 000000000..4d5d92a24 --- /dev/null +++ b/assets/js/3b0f99e8.c4d5d643.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3553],{20034:e=>{e.exports=JSON.parse('{"label":"Jenkins","permalink":"/tags/jenkins","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/3b0f99e8.e32670da.js b/assets/js/3b0f99e8.e32670da.js deleted file mode 100644 index 917f21984..000000000 --- a/assets/js/3b0f99e8.e32670da.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3553],{34:e=>{e.exports=JSON.parse('{"label":"Jenkins","permalink":"/tags/jenkins","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/3c5aea38.4a5515e4.js b/assets/js/3c5aea38.4a5515e4.js new file mode 100644 index 000000000..60a4c81d2 --- /dev/null +++ b/assets/js/3c5aea38.4a5515e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6250],{56516:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/3c5aea38.b978afb2.js b/assets/js/3c5aea38.b978afb2.js deleted file mode 100644 index e24e29f12..000000000 --- a/assets/js/3c5aea38.b978afb2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6250],{6516:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/3cc6ebf8.9e81eace.js b/assets/js/3cc6ebf8.9e81eace.js deleted file mode 100644 index dd3e0c99a..000000000 --- a/assets/js/3cc6ebf8.9e81eace.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8405],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),f=i,d=m["".concat(p,".").concat(f)]||m[f]||u[f]||o;return r?n.createElement(d,a(a({ref:t},s),{},{components:r})):n.createElement(d,a({ref:t},s))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:i,a[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(7462),i=(r(7294),r(3905));const o={title:"IntelliJ \uc124\uc815",slug:6,tags:["IntelliJ"]},a=void 0,l={permalink:"/6",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",source:"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",title:"IntelliJ \uc124\uc815",description:"Import \uc790\ub3d9 \uc801\uc6a9",date:"2023-01-30T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 30\uc77c",tags:[{label:"IntelliJ",permalink:"/tags/intelli-j"}],readingTime:.465,hasTruncateMarker:!1,authors:[],frontMatter:{title:"IntelliJ \uc124\uc815",slug:"6",tags:["IntelliJ"]},prevItem:{title:"Parameterized Tests",permalink:"/7"},nextItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"}},p={authorsImageUrls:[]},c=[{value:"Import \uc790\ub3d9 \uc801\uc6a9",id:"import-\uc790\ub3d9-\uc801\uc6a9",level:3},{value:"\uc800\uc7a5\uc2dc \ub3d9\uc791",id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791",level:3},{value:"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9",id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9",level:3}],s={toc:c};function u(e){let{components:t,...o}=e;return(0,i.kt)("wrapper",(0,n.Z)({},s,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"import-\uc790\ub3d9-\uc801\uc6a9"},"Import \uc790\ub3d9 \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"auto-import",src:r(2055).Z,width:"2558",height:"1656"})),(0,i.kt)("h3",{id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791"},"\uc800\uc7a5\uc2dc \ub3d9\uc791"),(0,i.kt)("p",null,"Prefrences > Tools > Actions on Save"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"actions-on-save",src:r(5782).Z,width:"2558",height:"1656"})),(0,i.kt)("p",null,"Reformat Code: Code Reformmating"),(0,i.kt)("p",null,"Optimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70"),(0,i.kt)("p",null,"Rearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c"),(0,i.kt)("h3",{id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9"},"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"final-modifier",src:r(52).Z,width:"2558",height:"1656"})))}u.isMDXComponent=!0},5782:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/actions-on-save-6c1203027c28ff08919e045812c7d456.png"},2055:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/auto-import-3dbe46f0109af17296039d52d498225e.png"},52:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/final-modifier-1dd2aea35979423a30869a7b0ebe501a.png"}}]); \ No newline at end of file diff --git a/assets/js/3cc6ebf8.9f67cf37.js b/assets/js/3cc6ebf8.9f67cf37.js new file mode 100644 index 000000000..8543b4713 --- /dev/null +++ b/assets/js/3cc6ebf8.9f67cf37.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8405],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),f=i,d=m["".concat(p,".").concat(f)]||m[f]||u[f]||o;return r?n.createElement(d,a(a({ref:t},s),{},{components:r})):n.createElement(d,a({ref:t},s))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:i,a[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),i=(r(67294),r(3905));const o={title:"IntelliJ \uc124\uc815",slug:6,tags:["IntelliJ"]},a=void 0,l={permalink:"/6",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",source:"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",title:"IntelliJ \uc124\uc815",description:"Import \uc790\ub3d9 \uc801\uc6a9",date:"2023-01-30T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 30\uc77c",tags:[{label:"IntelliJ",permalink:"/tags/intelli-j"}],readingTime:.465,hasTruncateMarker:!1,authors:[],frontMatter:{title:"IntelliJ \uc124\uc815",slug:"6",tags:["IntelliJ"]},prevItem:{title:"Parameterized Tests",permalink:"/7"},nextItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"}},p={authorsImageUrls:[]},c=[{value:"Import \uc790\ub3d9 \uc801\uc6a9",id:"import-\uc790\ub3d9-\uc801\uc6a9",level:3},{value:"\uc800\uc7a5\uc2dc \ub3d9\uc791",id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791",level:3},{value:"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9",id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9",level:3}],s={toc:c};function u(e){let{components:t,...o}=e;return(0,i.kt)("wrapper",(0,n.Z)({},s,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"import-\uc790\ub3d9-\uc801\uc6a9"},"Import \uc790\ub3d9 \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"auto-import",src:r(42055).Z,width:"2558",height:"1656"})),(0,i.kt)("h3",{id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791"},"\uc800\uc7a5\uc2dc \ub3d9\uc791"),(0,i.kt)("p",null,"Prefrences > Tools > Actions on Save"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"actions-on-save",src:r(15782).Z,width:"2558",height:"1656"})),(0,i.kt)("p",null,"Reformat Code: Code Reformmating"),(0,i.kt)("p",null,"Optimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70"),(0,i.kt)("p",null,"Rearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c"),(0,i.kt)("h3",{id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9"},"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"final-modifier",src:r(80052).Z,width:"2558",height:"1656"})))}u.isMDXComponent=!0},15782:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/actions-on-save-6c1203027c28ff08919e045812c7d456.png"},42055:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/auto-import-3dbe46f0109af17296039d52d498225e.png"},80052:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/final-modifier-1dd2aea35979423a30869a7b0ebe501a.png"}}]); \ No newline at end of file diff --git a/assets/js/3d6c40c1.6216fe06.js b/assets/js/3d6c40c1.6216fe06.js new file mode 100644 index 000000000..532278c90 --- /dev/null +++ b/assets/js/3d6c40c1.6216fe06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8509],{3440:e=>{e.exports=JSON.parse('{"label":"monitoring","permalink":"/tags/monitoring","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/3ed04b60.66eaad96.js b/assets/js/3ed04b60.66eaad96.js deleted file mode 100644 index 0a8c6fee1..000000000 --- a/assets/js/3ed04b60.66eaad96.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7157],{4792:e=>{e.exports=JSON.parse('{"label":"Spring","permalink":"/tags/spring","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/3ed04b60.f8fa3b6d.js b/assets/js/3ed04b60.f8fa3b6d.js new file mode 100644 index 000000000..35cdc6879 --- /dev/null +++ b/assets/js/3ed04b60.f8fa3b6d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7157],{84792:e=>{e.exports=JSON.parse('{"label":"Spring","permalink":"/tags/spring","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/3f4fb381.afa64519.js b/assets/js/3f4fb381.afa64519.js deleted file mode 100644 index e1c1fd036..000000000 --- a/assets/js/3f4fb381.afa64519.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5356],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(n),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return n?r.createElement(b,l(l({ref:t},u),{},{components:n})):r.createElement(b,l({ref:t},u))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const p={title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:27,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/27",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",description:"\uc9c0\ud558\ucca0 \ubbf8\uc158",date:"2023-05-25T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 25\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.91,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:"27",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"},nextItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"}},i={authorsImageUrls:[]},c=[{value:"\uc9c0\ud558\ucca0 \ubbf8\uc158",id:"\uc9c0\ud558\ucca0-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc9c0\ud558\ucca0-\ubbf8\uc158"},"\uc9c0\ud558\ucca0 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","API\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c")),(0,a.kt)("p",null,"\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"\ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654")),(0,a.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac")),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("admonition",{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131")),(0,a.kt)("p",null,"\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4."),(0,a.kt)("p",null,"\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Nested\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\n\n @Test\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\n // given\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\ucd08\ub85d", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", 5);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5", \uc624\ub978\ucabd, 5);\n\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uace0\ub3d9", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", 3);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804", \uc624\ub978\ucabd, 7);\n\n // when\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\n\n // then\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\n \uc870\ud68c_\uacb0\uacfc,\n \ub178\uc120_\uc815\ubcf4("2\ud638\uc120", "\ucd08\ub85d", 0, "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5"),\n \ub178\uc120_\uc815\ubcf4("9\ud638\uc120", "\uace0\ub3d9", 0, "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804")\n );\n }\n}\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc870\uc728\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud3b8\ud55c \ubd84\uc704\uae30")),(0,a.kt)("p",null,"\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3f4fb381.bbf99073.js b/assets/js/3f4fb381.bbf99073.js new file mode 100644 index 000000000..affaf273c --- /dev/null +++ b/assets/js/3f4fb381.bbf99073.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5356],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(n),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return n?r.createElement(b,l(l({ref:t},u),{},{components:n})):r.createElement(b,l({ref:t},u))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const p={title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:27,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/27",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",description:"\uc9c0\ud558\ucca0 \ubbf8\uc158",date:"2023-05-25T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 25\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.91,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:"27",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"},nextItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"}},i={authorsImageUrls:[]},c=[{value:"\uc9c0\ud558\ucca0 \ubbf8\uc158",id:"\uc9c0\ud558\ucca0-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc9c0\ud558\ucca0-\ubbf8\uc158"},"\uc9c0\ud558\ucca0 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","API\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c")),(0,a.kt)("p",null,"\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"\ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654")),(0,a.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac")),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("admonition",{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131")),(0,a.kt)("p",null,"\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4."),(0,a.kt)("p",null,"\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Nested\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\n\n @Test\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\n // given\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\ucd08\ub85d", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", 5);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5", \uc624\ub978\ucabd, 5);\n\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uace0\ub3d9", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", 3);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804", \uc624\ub978\ucabd, 7);\n\n // when\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\n\n // then\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\n \uc870\ud68c_\uacb0\uacfc,\n \ub178\uc120_\uc815\ubcf4("2\ud638\uc120", "\ucd08\ub85d", 0, "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5"),\n \ub178\uc120_\uc815\ubcf4("9\ud638\uc120", "\uace0\ub3d9", 0, "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804")\n );\n }\n}\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc870\uc728\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud3b8\ud55c \ubd84\uc704\uae30")),(0,a.kt)("p",null,"\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3fc16fd0.312bbaa9.js b/assets/js/3fc16fd0.312bbaa9.js deleted file mode 100644 index b25932566..000000000 --- a/assets/js/3fc16fd0.312bbaa9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3886],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>d});var n=r(7294);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=l,k=s["".concat(p,".").concat(d)]||s[d]||u[d]||a;return r?n.createElement(k,o(o({ref:t},m),{},{components:r})):n.createElement(k,o({ref:t},m))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:l,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(7462),l=(r(7294),r(3905));const a={title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",tags:["book"]},o=void 0,i={unversionedId:"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",id:"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",description:"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac",source:"@site/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30.mdx",sourceDirName:"\ub3c4\uc11c",slug:"/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",permalink:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30.mdx",tags:[{label:"book",permalink:"/docs/tags/book"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",tags:["book"]},sidebar:"tutorialSidebar",previous:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",permalink:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30"},next:{title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815"}},p={},c=[{value:"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac",id:"\ufe0f-\uc790\uae30\ubc30\ubc18\uc758-\uc6d0\ub9ac",level:3},{value:"\u274c \uc0c1\uc790 \uc548\uc5d0\uc11c \uc18c\uc6a9\uc5c6\ub294 \uc77c",id:"-\uc0c1\uc790-\uc548\uc5d0\uc11c-\uc18c\uc6a9\uc5c6\ub294-\uc77c",level:3},{value:"\ud83d\udcd6 \ud559\uc2b5\uc790\ub8cc",id:"-\ud559\uc2b5\uc790\ub8cc",level:3},{value:"\ud83c\udfc3 \uc2e4\ucc9c\ud558\uae30",id:"-\uc2e4\ucc9c\ud558\uae30",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:c};function u(e){let{components:t,...r}=e;return(0,l.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h3",{id:"\ufe0f-\uc790\uae30\ubc30\ubc18\uc758-\uc6d0\ub9ac"},"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \ubb34\uc5c7\uc778\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uacfc \ub290\ub08c\uc5d0 \ub300\ud574 \ubc18\ud558\ub294 \ud589\uc704\ub97c \uc790\uae30\ubc30\ubc18\uc774\ub77c\uace0 \ud55c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\ub0b4\uac00 \uc790\uae30\ubc30\ubc18\ud560 \ub54c, \ub098\ub294 \uc790\uae30\ubc30\ubc18\uc744 \uc815\ub2f9\ud654\uc2dc\ud0a4\ub294 \ubc29\uc2dd\uc73c\ub85c \uc138\uc0c1\uc744 \ubcf4\uae30 \uc2dc\uc791\ud55c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc790\uc2e0\uc744 \uc815\ub2f9\ud654\uc2dc\ud0a4\ub294 \ubc29\uc2dd\uc73c\ub85c \uc138\uc0c1\uc744 \ubcfc \ub54c, \uc0ac\uc2e4\uc744 \ubcf4\ub294 \ub098\uc758 \uc2dc\uac01\uc740 \uc65c\uace1\ub41c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc790\uae30\ubc30\ubc18\ud560 \ub54c, \ub098\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac00\uac8c \ub41c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc5b4\ub5a4 \uc0c1\uc790\ub4e4\uc740 \ub098\uc758 \ud2b9\uc131\uc774 \ub418\uace0 \uc77c\uc0c1\uc801\uc73c\ub85c \ub098\ub294 \uadf8 \uc0c1\uc790\ub4e4\uc744 \uc9c0\ub2c8\uace0 \ub2e4\ub2cc\ub2e4."),(0,l.kt)("li",{parentName:"ol"},"\ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\uc74c\uc73c\ub85c \uc778\ud558\uc5ec, \ub098\ub294 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\ub3c4 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac00\ub3c4\ub85d \uc774\ub04c\uac8c \ub41c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc0c1\uc790 \uc548\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uc11c\ub85c \uc798\ubabb \ub300\ud558\ub294 \uac83\uc744 \ubd80\ucd94\uae30\uace0 \uc0c1\ud638 \uc815\ub2f9\ud654\ub97c \uc5bb\uac8c \ub41c\ub2e4. \uc6b0\ub9ac\ub294 \uc11c\ub85c\uc5d0\uac8c \uc0c1\uc790 \uc548\uc5d0 \uba38\ubb3c\uae30 \uc704\ud55c \uc774\uc720\ub97c \uc8fc\ub3c4\ub85d \uacf5\ubaa8\ud55c\ub2e4. ")),(0,l.kt)("h3",{id:"-\uc0c1\uc790-\uc548\uc5d0\uc11c-\uc18c\uc6a9\uc5c6\ub294-\uc77c"},"\u274c \uc0c1\uc790 \uc548\uc5d0\uc11c \uc18c\uc6a9\uc5c6\ub294 \uc77c"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc744 \ubcc0\ud654\uc2dc\ud0a4\ub824\uace0 \ud558\ub294 \uac83"),(0,l.kt)("li",{parentName:"ol"},'\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c "\ub9de\ucdb0\uc8fc\uae30" \uc704\ud574 \ucd5c\uc120\uc744 \ub2e4\ud558\uae30'),(0,l.kt)("li",{parentName:"ol"},"\ub450\uace0 \ub5a0\ub098\uae30"),(0,l.kt)("li",{parentName:"ol"},"\ucee4\ubba4\ub2c8\ucf00\uc774\uc158"),(0,l.kt)("li",{parentName:"ol"},"\uc0c8\ub85c\uc6b4 \uae30\uc220\uc774\ub098 \ud14c\ud06c\ub2c9 \ud65c\uc6a9\ud558\uae30"),(0,l.kt)("li",{parentName:"ol"},"\ub098\uc758 \ud589\ub3d9\uc744 \ubcc0\ud654\uc2dc\ud0a4\ub294 \uac83")),(0,l.kt)("h3",{id:"-\ud559\uc2b5\uc790\ub8cc"},"\ud83d\udcd6 \ud559\uc2b5\uc790\ub8cc"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},'\uc790\uae30\ubc30\ubc18\uc740 \uc790\uae30\uae30\ub9cc\uacfc "\uc0c1\uc790"\uc548\uc73c\ub85c \uc774\ub048\ub2e4. '),(0,l.kt)("li",{parentName:"ol"},"\uc0c1\uc790 \uc548\uc5d0 \uc788\uc744 \ub54c, \ub2f9\uc2e0\uc740 \uacb0\uacfc(\uc131\uacfc)\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc5c6\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\ub2f9\uc2e0\uc758 \uc601\ud5a5\ub825\uacfc \uc131\uacf5\uc758 \ud06c\uae30\ub294 \uc5bc\ub9c8\ub098 \uc0c1\uc790 \ubc16\uc5d0 \uc874\uc7ac\ud558\ub290\ub0d0\uc5d0 \ub2ec\ub824\uc788\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \uc800\ud56d\ud558\ub294 \uac83\uc744 \uadf8\ub9cc\ub458 \ub54c \ub2f9\uc2e0\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\uac8c \ub41c\ub2e4. ")),(0,l.kt)("h3",{id:"-\uc2e4\ucc9c\ud558\uae30"},"\ud83c\udfc3 \uc2e4\ucc9c\ud558\uae30"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\uc644\ubcbd\ud574\uc9c0\ub824\uace0 \ub178\ub825\ud558\uc9c0 \ub9d0\uace0, \uc9c0\uae08\ubcf4\ub2e4 \ub354 \uc88b\uc544\uc9c0\ub824\uace0 \ub178\ub825\ud558\ub77c. "),(0,l.kt)("li",{parentName:"ol"},"\uc544\uc9c1 \ud559\uc2b5\ub0b4\uc6a9\uc744 \uc54c\uc9c0 \ubabb\ud558\ub294 \uc0ac\ub78c\ub4e4\uc5d0\uac8c '\uc0c1\uc790'\ub098 \uae30\ud0c0 \ub2e8\uc5b4\ub4e4\uc744 \uc0ac\uc6a9\ud558\uc9c0 \ub9c8\ub77c. \ub2e4\ub9cc \ub2f9\uc2e0 \uc790\uc2e0\uc758 \uc0b6\uc5d0\uc11c \uadf8 \uc6d0\ub9ac\ub4e4\uc744 \uc801\uc6a9\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc0c1\uc790\ub97c \ucc3e\uc9c0 \ub9d0\uace0, \uba3c\uc800 \ub2f9\uc2e0 \uc790\uc2e0\uc758 \uc0c1\uc790\ub97c \ucc3e\uc544\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub2e4\uace0 \ud790\ub09c\ud558\uc9c0 \ub9d0\uace0, \ub2f9\uc2e0\uc774 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub3c4\ub85d \ub178\ub825\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2f9\uc2e0\uc774 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub2e4\ub294 \uac83\uc744 \ubc1c\uacac\ud588\uc744 \ub54c \uc790\uc2e0\uc5d0 \ub300\ud574 \ud3ec\uae30\ud558\uc9c0 \ub9c8\ub77c. \uacc4\uc18d \ub178\ub825\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2f9\uc2e0\uc774 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub2e4\ub294 \uac83\uc744 \ubd80\uc778\ud558\uc9c0 \ub9c8\ub77c. \uc0ac\uacfc\ud558\uace0, \uacc4\uc18d\ud574\uc11c \uc804\uc9c4\ud558\ub77c. \ubbf8\ub798\uc5d0 \ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \ub354 \ub3c4\uc6c0\uc774 \ub418\ub3c4\ub85d \ub178\ub825\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc798\ubabb\ud558\uace0 \uc788\ub294 \uac83\uc5d0 \ucd08\uc810\uc744 \ub9de\ucd94\uc9c0 \ub9c8\ub77c. \uadf8\ub4e4\uc744 \ub3d5\uae30 \uc704\ud574 \ub2f9\uc2e0\uc774 \uc62c\ubc14\ub974\uac8c \ud589\ud560 \uc218 \uc788\ub294 \uc77c\uc5d0 \ucd08\uc810\uc744 \ub9de\ucdb0\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \ub2f9\uc2e0\uc744 \ub3d5\uace0 \uc788\ub294\uc9c0\uc5d0 \ub300\ud574 \uc5fc\ub824\ud558\uc9c0 \ub9c8\ub77c. \ub2f9\uc2e0\uc774 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc744 \ub3d5\uace0 \uc788\ub294\uc9c0\uc5d0 \ub300\ud574 \uac71\uc815\ud558\ub77c. ")),(0,l.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,l.kt)("p",null,"\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c, \uc544\ube48\uc800\uc5f0\uad6c\uc18c"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3fc16fd0.9b18a836.js b/assets/js/3fc16fd0.9b18a836.js new file mode 100644 index 000000000..a7b5306c6 --- /dev/null +++ b/assets/js/3fc16fd0.9b18a836.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3886],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>d});var n=r(67294);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=l,k=s["".concat(p,".").concat(d)]||s[d]||u[d]||a;return r?n.createElement(k,o(o({ref:t},m),{},{components:r})):n.createElement(k,o({ref:t},m))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:l,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(87462),l=(r(67294),r(3905));const a={title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",tags:["book"]},o=void 0,i={unversionedId:"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",id:"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",description:"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac",source:"@site/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30.mdx",sourceDirName:"\ub3c4\uc11c",slug:"/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",permalink:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30.mdx",tags:[{label:"book",permalink:"/docs/tags/book"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",tags:["book"]},sidebar:"tutorialSidebar",previous:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",permalink:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30"},next:{title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815"}},p={},c=[{value:"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac",id:"\ufe0f-\uc790\uae30\ubc30\ubc18\uc758-\uc6d0\ub9ac",level:3},{value:"\u274c \uc0c1\uc790 \uc548\uc5d0\uc11c \uc18c\uc6a9\uc5c6\ub294 \uc77c",id:"-\uc0c1\uc790-\uc548\uc5d0\uc11c-\uc18c\uc6a9\uc5c6\ub294-\uc77c",level:3},{value:"\ud83d\udcd6 \ud559\uc2b5\uc790\ub8cc",id:"-\ud559\uc2b5\uc790\ub8cc",level:3},{value:"\ud83c\udfc3 \uc2e4\ucc9c\ud558\uae30",id:"-\uc2e4\ucc9c\ud558\uae30",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:c};function u(e){let{components:t,...r}=e;return(0,l.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h3",{id:"\ufe0f-\uc790\uae30\ubc30\ubc18\uc758-\uc6d0\ub9ac"},"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \ubb34\uc5c7\uc778\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uacfc \ub290\ub08c\uc5d0 \ub300\ud574 \ubc18\ud558\ub294 \ud589\uc704\ub97c \uc790\uae30\ubc30\ubc18\uc774\ub77c\uace0 \ud55c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\ub0b4\uac00 \uc790\uae30\ubc30\ubc18\ud560 \ub54c, \ub098\ub294 \uc790\uae30\ubc30\ubc18\uc744 \uc815\ub2f9\ud654\uc2dc\ud0a4\ub294 \ubc29\uc2dd\uc73c\ub85c \uc138\uc0c1\uc744 \ubcf4\uae30 \uc2dc\uc791\ud55c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc790\uc2e0\uc744 \uc815\ub2f9\ud654\uc2dc\ud0a4\ub294 \ubc29\uc2dd\uc73c\ub85c \uc138\uc0c1\uc744 \ubcfc \ub54c, \uc0ac\uc2e4\uc744 \ubcf4\ub294 \ub098\uc758 \uc2dc\uac01\uc740 \uc65c\uace1\ub41c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc790\uae30\ubc30\ubc18\ud560 \ub54c, \ub098\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac00\uac8c \ub41c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc5b4\ub5a4 \uc0c1\uc790\ub4e4\uc740 \ub098\uc758 \ud2b9\uc131\uc774 \ub418\uace0 \uc77c\uc0c1\uc801\uc73c\ub85c \ub098\ub294 \uadf8 \uc0c1\uc790\ub4e4\uc744 \uc9c0\ub2c8\uace0 \ub2e4\ub2cc\ub2e4."),(0,l.kt)("li",{parentName:"ol"},"\ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\uc74c\uc73c\ub85c \uc778\ud558\uc5ec, \ub098\ub294 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\ub3c4 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac00\ub3c4\ub85d \uc774\ub04c\uac8c \ub41c\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\uc0c1\uc790 \uc548\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uc11c\ub85c \uc798\ubabb \ub300\ud558\ub294 \uac83\uc744 \ubd80\ucd94\uae30\uace0 \uc0c1\ud638 \uc815\ub2f9\ud654\ub97c \uc5bb\uac8c \ub41c\ub2e4. \uc6b0\ub9ac\ub294 \uc11c\ub85c\uc5d0\uac8c \uc0c1\uc790 \uc548\uc5d0 \uba38\ubb3c\uae30 \uc704\ud55c \uc774\uc720\ub97c \uc8fc\ub3c4\ub85d \uacf5\ubaa8\ud55c\ub2e4. ")),(0,l.kt)("h3",{id:"-\uc0c1\uc790-\uc548\uc5d0\uc11c-\uc18c\uc6a9\uc5c6\ub294-\uc77c"},"\u274c \uc0c1\uc790 \uc548\uc5d0\uc11c \uc18c\uc6a9\uc5c6\ub294 \uc77c"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc744 \ubcc0\ud654\uc2dc\ud0a4\ub824\uace0 \ud558\ub294 \uac83"),(0,l.kt)("li",{parentName:"ol"},'\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c "\ub9de\ucdb0\uc8fc\uae30" \uc704\ud574 \ucd5c\uc120\uc744 \ub2e4\ud558\uae30'),(0,l.kt)("li",{parentName:"ol"},"\ub450\uace0 \ub5a0\ub098\uae30"),(0,l.kt)("li",{parentName:"ol"},"\ucee4\ubba4\ub2c8\ucf00\uc774\uc158"),(0,l.kt)("li",{parentName:"ol"},"\uc0c8\ub85c\uc6b4 \uae30\uc220\uc774\ub098 \ud14c\ud06c\ub2c9 \ud65c\uc6a9\ud558\uae30"),(0,l.kt)("li",{parentName:"ol"},"\ub098\uc758 \ud589\ub3d9\uc744 \ubcc0\ud654\uc2dc\ud0a4\ub294 \uac83")),(0,l.kt)("h3",{id:"-\ud559\uc2b5\uc790\ub8cc"},"\ud83d\udcd6 \ud559\uc2b5\uc790\ub8cc"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},'\uc790\uae30\ubc30\ubc18\uc740 \uc790\uae30\uae30\ub9cc\uacfc "\uc0c1\uc790"\uc548\uc73c\ub85c \uc774\ub048\ub2e4. '),(0,l.kt)("li",{parentName:"ol"},"\uc0c1\uc790 \uc548\uc5d0 \uc788\uc744 \ub54c, \ub2f9\uc2e0\uc740 \uacb0\uacfc(\uc131\uacfc)\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc5c6\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\ub2f9\uc2e0\uc758 \uc601\ud5a5\ub825\uacfc \uc131\uacf5\uc758 \ud06c\uae30\ub294 \uc5bc\ub9c8\ub098 \uc0c1\uc790 \ubc16\uc5d0 \uc874\uc7ac\ud558\ub290\ub0d0\uc5d0 \ub2ec\ub824\uc788\ub2e4. "),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \uc800\ud56d\ud558\ub294 \uac83\uc744 \uadf8\ub9cc\ub458 \ub54c \ub2f9\uc2e0\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\uac8c \ub41c\ub2e4. ")),(0,l.kt)("h3",{id:"-\uc2e4\ucc9c\ud558\uae30"},"\ud83c\udfc3 \uc2e4\ucc9c\ud558\uae30"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\uc644\ubcbd\ud574\uc9c0\ub824\uace0 \ub178\ub825\ud558\uc9c0 \ub9d0\uace0, \uc9c0\uae08\ubcf4\ub2e4 \ub354 \uc88b\uc544\uc9c0\ub824\uace0 \ub178\ub825\ud558\ub77c. "),(0,l.kt)("li",{parentName:"ol"},"\uc544\uc9c1 \ud559\uc2b5\ub0b4\uc6a9\uc744 \uc54c\uc9c0 \ubabb\ud558\ub294 \uc0ac\ub78c\ub4e4\uc5d0\uac8c '\uc0c1\uc790'\ub098 \uae30\ud0c0 \ub2e8\uc5b4\ub4e4\uc744 \uc0ac\uc6a9\ud558\uc9c0 \ub9c8\ub77c. \ub2e4\ub9cc \ub2f9\uc2e0 \uc790\uc2e0\uc758 \uc0b6\uc5d0\uc11c \uadf8 \uc6d0\ub9ac\ub4e4\uc744 \uc801\uc6a9\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc0c1\uc790\ub97c \ucc3e\uc9c0 \ub9d0\uace0, \uba3c\uc800 \ub2f9\uc2e0 \uc790\uc2e0\uc758 \uc0c1\uc790\ub97c \ucc3e\uc544\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub2e4\uace0 \ud790\ub09c\ud558\uc9c0 \ub9d0\uace0, \ub2f9\uc2e0\uc774 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub3c4\ub85d \ub178\ub825\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2f9\uc2e0\uc774 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub2e4\ub294 \uac83\uc744 \ubc1c\uacac\ud588\uc744 \ub54c \uc790\uc2e0\uc5d0 \ub300\ud574 \ud3ec\uae30\ud558\uc9c0 \ub9c8\ub77c. \uacc4\uc18d \ub178\ub825\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2f9\uc2e0\uc774 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub2e4\ub294 \uac83\uc744 \ubd80\uc778\ud558\uc9c0 \ub9c8\ub77c. \uc0ac\uacfc\ud558\uace0, \uacc4\uc18d\ud574\uc11c \uc804\uc9c4\ud558\ub77c. \ubbf8\ub798\uc5d0 \ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \ub354 \ub3c4\uc6c0\uc774 \ub418\ub3c4\ub85d \ub178\ub825\ud558\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc798\ubabb\ud558\uace0 \uc788\ub294 \uac83\uc5d0 \ucd08\uc810\uc744 \ub9de\ucd94\uc9c0 \ub9c8\ub77c. \uadf8\ub4e4\uc744 \ub3d5\uae30 \uc704\ud574 \ub2f9\uc2e0\uc774 \uc62c\ubc14\ub974\uac8c \ud589\ud560 \uc218 \uc788\ub294 \uc77c\uc5d0 \ucd08\uc810\uc744 \ub9de\ucdb0\ub77c."),(0,l.kt)("li",{parentName:"ol"},"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \ub2f9\uc2e0\uc744 \ub3d5\uace0 \uc788\ub294\uc9c0\uc5d0 \ub300\ud574 \uc5fc\ub824\ud558\uc9c0 \ub9c8\ub77c. \ub2f9\uc2e0\uc774 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc744 \ub3d5\uace0 \uc788\ub294\uc9c0\uc5d0 \ub300\ud574 \uac71\uc815\ud558\ub77c. ")),(0,l.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,l.kt)("p",null,"\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c, \uc544\ube48\uc800\uc5f0\uad6c\uc18c"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4177cd87.3a97e607.js b/assets/js/4177cd87.3a97e607.js deleted file mode 100644 index b362c25df..000000000 --- a/assets/js/4177cd87.3a97e607.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7450],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),i=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):u(u({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(o.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=i(r),d=a,v=p["".concat(o,".").concat(d)]||p[d]||m[d]||l;return r?n.createElement(v,u(u({ref:t},c),{},{components:r})):n.createElement(v,u({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,u=new Array(l);u[0]=p;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s.mdxType="string"==typeof e?e:a,u[1]=s;for(var i=2;i{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const l={title:"Parameterized Tests",slug:7,tags:["Java"]},u=void 0,s={permalink:"/7",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-12-Parameterized Tests.mdx",source:"@site/blog/2023/2023-02-12-Parameterized Tests.mdx",title:"Parameterized Tests",description:"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",date:"2023-02-12T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 12\uc77c",tags:[{label:"Java",permalink:"/tags/java"}],readingTime:3.17,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Parameterized Tests",slug:"7",tags:["Java"]},prevItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"},nextItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"}},o={authorsImageUrls:[]},i=[{value:"Argument Sources",id:"argument-sources",level:2},{value:"Value Source",id:"value-source",level:3},{value:"Null & Empty Source",id:"null--empty-source",level:3},{value:"Enum Source",id:"enum-source",level:3},{value:"CSV Source",id:"csv-source",level:3},{value:"Method Source",id:"method-source",level:3},{value:"ETC.",id:"etc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:i};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c ",(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h2",{id:"argument-sources"},"Argument Sources"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","JUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"value-source"},"Value Source"),(0,a.kt)("p",null,"\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"short, int, long, float, double"),(0,a.kt)("li",{parentName:"ul"},"byte, char, boolean, String, Class ")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\nvoid valueTest(final int value) {\n Assertions.assertThat(value).isPositive();\n}\n")),(0,a.kt)("h3",{id:"null--empty-source"},"Null & Empty Source"),(0,a.kt)("p",null,"null \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Empty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"String"),(0,a.kt)("li",{parentName:"ul"},"java.util.List, java.util.Set, java.util.Map"),(0,a.kt)("li",{parentName:"ul"},"primitive arrays \u2014 ex) int[]"),(0,a.kt)("li",{parentName:"ul"},"object arrays \u2014 ex) String[]")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@NullAndEmptySource\nvoid nullAndEmptyTest(final String value) {\n Assertions.assertThat(value).isNullOrEmpty();\n}\n")),(0,a.kt)("h3",{id:"enum-source"},"Enum Source"),(0,a.kt)("p",null,"EnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"enum Day {\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n}\n\n@ParameterizedTest\n@EnumSource(Day.class)\nvoid enumTest(final Day day) {\n assertThat(day).isInstanceOf(Day.class);\n}\n")),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)\nvoid enumTest(final Day day) {\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\n assertThat(day).isInstanceOf(Day.class);\n}\n')),(0,a.kt)("h3",{id:"csv-source"},"CSV Source"),(0,a.kt)("p",null,"csv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@CsvSource({"1,1", "2,4", "3,9", "4,16"})\nvoid csvTest(final int number, final int result) {\n assertThat(number * number).isEqualTo(result);\n}\n')),(0,a.kt)("h3",{id:"method-source"},"Method Source"),(0,a.kt)("p",null,"\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@MethodSource\nvoid methodTest(final List numbers, final int count) {\n assertThat(numbers).hasSize(count);\n}\n\nprivate static Stream methodTest() {\n return Stream.of(\n Arguments.of(List.of(1), 1),\n Arguments.of(List.of(1, 2), 2),\n Arguments.of(List.of(1, 2, 3), 3)\n );\n}\n")),(0,a.kt)("h3",{id:"etc"},"ETC."),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource"),(0,a.kt)("li",{parentName:"ul"},"ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource")),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/parameterized-tests-junit-5"},"Guide to JUnit 5 Parameterized Tests"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4177cd87.904755c2.js b/assets/js/4177cd87.904755c2.js new file mode 100644 index 000000000..9b11d574f --- /dev/null +++ b/assets/js/4177cd87.904755c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7450],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),i=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):u(u({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(o.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=i(r),d=a,v=p["".concat(o,".").concat(d)]||p[d]||m[d]||l;return r?n.createElement(v,u(u({ref:t},c),{},{components:r})):n.createElement(v,u({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,u=new Array(l);u[0]=p;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s.mdxType="string"==typeof e?e:a,u[1]=s;for(var i=2;i{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>i});var n=r(87462),a=(r(67294),r(3905));const l={title:"Parameterized Tests",slug:7,tags:["Java"]},u=void 0,s={permalink:"/7",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-12-Parameterized Tests.mdx",source:"@site/blog/2023/2023-02-12-Parameterized Tests.mdx",title:"Parameterized Tests",description:"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",date:"2023-02-12T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 12\uc77c",tags:[{label:"Java",permalink:"/tags/java"}],readingTime:3.17,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Parameterized Tests",slug:"7",tags:["Java"]},prevItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"},nextItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"}},o={authorsImageUrls:[]},i=[{value:"Argument Sources",id:"argument-sources",level:2},{value:"Value Source",id:"value-source",level:3},{value:"Null & Empty Source",id:"null--empty-source",level:3},{value:"Enum Source",id:"enum-source",level:3},{value:"CSV Source",id:"csv-source",level:3},{value:"Method Source",id:"method-source",level:3},{value:"ETC.",id:"etc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:i};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c ",(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h2",{id:"argument-sources"},"Argument Sources"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","JUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"value-source"},"Value Source"),(0,a.kt)("p",null,"\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"short, int, long, float, double"),(0,a.kt)("li",{parentName:"ul"},"byte, char, boolean, String, Class ")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\nvoid valueTest(final int value) {\n Assertions.assertThat(value).isPositive();\n}\n")),(0,a.kt)("h3",{id:"null--empty-source"},"Null & Empty Source"),(0,a.kt)("p",null,"null \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Empty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"String"),(0,a.kt)("li",{parentName:"ul"},"java.util.List, java.util.Set, java.util.Map"),(0,a.kt)("li",{parentName:"ul"},"primitive arrays \u2014 ex) int[]"),(0,a.kt)("li",{parentName:"ul"},"object arrays \u2014 ex) String[]")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@NullAndEmptySource\nvoid nullAndEmptyTest(final String value) {\n Assertions.assertThat(value).isNullOrEmpty();\n}\n")),(0,a.kt)("h3",{id:"enum-source"},"Enum Source"),(0,a.kt)("p",null,"EnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"enum Day {\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n}\n\n@ParameterizedTest\n@EnumSource(Day.class)\nvoid enumTest(final Day day) {\n assertThat(day).isInstanceOf(Day.class);\n}\n")),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)\nvoid enumTest(final Day day) {\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\n assertThat(day).isInstanceOf(Day.class);\n}\n')),(0,a.kt)("h3",{id:"csv-source"},"CSV Source"),(0,a.kt)("p",null,"csv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@CsvSource({"1,1", "2,4", "3,9", "4,16"})\nvoid csvTest(final int number, final int result) {\n assertThat(number * number).isEqualTo(result);\n}\n')),(0,a.kt)("h3",{id:"method-source"},"Method Source"),(0,a.kt)("p",null,"\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@MethodSource\nvoid methodTest(final List numbers, final int count) {\n assertThat(numbers).hasSize(count);\n}\n\nprivate static Stream methodTest() {\n return Stream.of(\n Arguments.of(List.of(1), 1),\n Arguments.of(List.of(1, 2), 2),\n Arguments.of(List.of(1, 2, 3), 3)\n );\n}\n")),(0,a.kt)("h3",{id:"etc"},"ETC."),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource"),(0,a.kt)("li",{parentName:"ul"},"ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource")),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/parameterized-tests-junit-5"},"Guide to JUnit 5 Parameterized Tests"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/41b4728f.0a266023.js b/assets/js/41b4728f.0a266023.js new file mode 100644 index 000000000..beacdca72 --- /dev/null +++ b/assets/js/41b4728f.0a266023.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8628],{30171:e=>{e.exports=JSON.parse('{"permalink":"/tags/spring-boot","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/43a97218.a079467f.js b/assets/js/43a97218.a079467f.js deleted file mode 100644 index 1c8c6b3f8..000000000 --- a/assets/js/43a97218.a079467f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4815],{5215:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/5","page":5,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/4","nextPage":"/tags/retrospective/page/6","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/43a97218.a25b5b23.js b/assets/js/43a97218.a25b5b23.js new file mode 100644 index 000000000..95aed3b15 --- /dev/null +++ b/assets/js/43a97218.a25b5b23.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4815],{65215:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/5","page":5,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/4","nextPage":"/tags/retrospective/page/6","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/43f49b9e.433b686b.js b/assets/js/43f49b9e.433b686b.js new file mode 100644 index 000000000..e40b6c1cd --- /dev/null +++ b/assets/js/43f49b9e.433b686b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4670],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),c=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,d=m["".concat(o,".").concat(b)]||m[b]||u[b]||l;return r?n.createElement(d,p(p({ref:t},s),{},{components:r})):n.createElement(d,p({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,p=new Array(l);p[0]=m;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:a,p[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const l={title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:29,tags:["TecoChat","Retrospective"]},p=void 0,i={permalink:"/29",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",source:"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",description:"\uac1c\uc694",date:"2023-06-01T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.005,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:"29",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"},nextItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"}},o={authorsImageUrls:[]},c=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5",id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5",level:3},{value:"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c",id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c",level:3},{value:"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30",id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30",level:3},{value:"\ud5a5\ud6c4 \uacc4\ud68d",id:"\ud5a5\ud6c4-\uacc4\ud68d",level:3}],s={toc:c};function u(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc6d0\ub798 \ubaa9\uc801\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0"),"\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"GPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat1",src:r(90663).Z,width:"2878",height:"1316"})),(0,a.kt)("h3",{id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5"},"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c"},"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c"),(0,a.kt)("p",null,"\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","CSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat2",src:r(25276).Z,width:"2394",height:"1048"})),(0,a.kt)("h3",{id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30"},"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat3",src:r(14143).Z,width:"1668",height:"718"})),(0,a.kt)("p",null,"\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud5a5\ud6c4-\uacc4\ud68d"},"\ud5a5\ud6c4 \uacc4\ud68d"),(0,a.kt)("p",null,"\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0},90663:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat1-e9408e2e2f13bb192541de194ffccc6a.png"},25276:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat2-4b3b653eb2b23b88f19e8cb4177a786c.png"},14143:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat3-12a510067e4d210c13e46b7b99313307.png"}}]); \ No newline at end of file diff --git a/assets/js/43f49b9e.a236905f.js b/assets/js/43f49b9e.a236905f.js deleted file mode 100644 index 174ed8f05..000000000 --- a/assets/js/43f49b9e.a236905f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4670],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),c=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,d=m["".concat(o,".").concat(b)]||m[b]||u[b]||l;return r?n.createElement(d,p(p({ref:t},s),{},{components:r})):n.createElement(d,p({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,p=new Array(l);p[0]=m;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:a,p[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const l={title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:29,tags:["TecoChat","Retrospective"]},p=void 0,i={permalink:"/29",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",source:"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",description:"\uac1c\uc694",date:"2023-06-01T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.005,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",slug:"29",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"},nextItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"}},o={authorsImageUrls:[]},c=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5",id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5",level:3},{value:"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c",id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c",level:3},{value:"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5",id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5",level:3},{value:"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30",id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30",level:3},{value:"\ud5a5\ud6c4 \uacc4\ud68d",id:"\ud5a5\ud6c4-\uacc4\ud68d",level:3}],s={toc:c};function u(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc6d0\ub798 \ubaa9\uc801\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0"),"\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ub098\uc758-\ucc44\ud305-\ud655\uc778\ud558\uace0-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"GPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat1",src:r(663).Z,width:"2878",height:"1316"})),(0,a.kt)("h3",{id:"\uc88b\uc544\uc694\uc640-\ub313\uae00-\uae30\ub2a5"},"\uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ud0a4\uc6cc\ub4dc-\ucd94\ucd9c"},"\ud0a4\uc6cc\ub4dc \ucd94\ucd9c"),(0,a.kt)("p",null,"\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","CSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat2",src:r(5276).Z,width:"2394",height:"1048"})),(0,a.kt)("h3",{id:"\ub2e4\ub978-\ud06c\ub8e8\uc758-\ucc44\ud305-\ubcf5\uc0ac\ud574\uc11c-\uc774\uc5b4\ud558\ub294-\uae30\ub2a5"},"\ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5"),(0,a.kt)("p",null,"\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc0ac\uc6a9\uc131-\uace0\ub824\ud558\uae30"},"\uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"chat3",src:r(4143).Z,width:"1668",height:"718"})),(0,a.kt)("p",null,"\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud5a5\ud6c4-\uacc4\ud68d"},"\ud5a5\ud6c4 \uacc4\ud68d"),(0,a.kt)("p",null,"\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0},663:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat1-e9408e2e2f13bb192541de194ffccc6a.png"},5276:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat2-4b3b653eb2b23b88f19e8cb4177a786c.png"},4143:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/chat3-12a510067e4d210c13e46b7b99313307.png"}}]); \ No newline at end of file diff --git a/assets/js/43fcf0e9.72093a68.js b/assets/js/43fcf0e9.72093a68.js new file mode 100644 index 000000000..b445fdd58 --- /dev/null +++ b/assets/js/43fcf0e9.72093a68.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6468],{94822:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/4413b451.4040184d.js b/assets/js/4413b451.4040184d.js new file mode 100644 index 000000000..64f7cc133 --- /dev/null +++ b/assets/js/4413b451.4040184d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2048],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(k,p(p({ref:t},s),{},{components:n})):r.createElement(k,p({ref:t},s))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:30,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/30",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",description:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",date:"2023-06-04T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 4\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.595,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:"30",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"},nextItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"}},i={authorsImageUrls:[]},c=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158",level:3},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84",id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158"},"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158"),(0,a.kt)("p",null,"\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,a.kt)("p",null,"\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'echo "Start Deploy Script"\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\nPROJECT_NAME=jwp-shopping-order\n\necho "Change Directory"\ncd $REPOSITORY_NAME\n\necho "Git Pull"\ngit pull origin step2\n\necho "Build"\n./gradlew bootJar\n\necho "Copy, Start Server"\nmv ./build/libs/$PROJECT_NAME.jar .\n\nPID=$(pgrep -f $PROJECT_NAME)\n\nif [ -n $PID ]; then\n kill -9 $PID\n sleep 5\nfi\n\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\n')),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30")),(0,a.kt)("p",null,"\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84"},"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"expose headers")),(0,a.kt)("p",null,"\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c ",(0,a.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header"},"\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354"),"\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","nginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"add_header 'Access-Control-Expose-Headers' 'Location'\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158")," "),(0,a.kt)("p",null,"\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Transactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("p",null,"setReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.")),(0,a.kt)("p",null,"ORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"strong"},"@Transactional")," \uc801\uc6a9")," "),(0,a.kt)("p",null,"DAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Service \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) ",(0,a.kt)("inlineCode",{parentName:"p"},"@Transactional"),"\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4413b451.e29d2d91.js b/assets/js/4413b451.e29d2d91.js deleted file mode 100644 index dede7c041..000000000 --- a/assets/js/4413b451.e29d2d91.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2048],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,k=m["".concat(i,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(k,p(p({ref:t},s),{},{components:n})):r.createElement(k,p({ref:t},s))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:30,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/30",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",description:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",date:"2023-06-04T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 4\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.595,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",slug:"30",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"},nextItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"}},i={authorsImageUrls:[]},c=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158",id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158",level:3},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84",id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\uc8fc\ubb38-\ubbf8\uc158"},"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158"),(0,a.kt)("p",null,"\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,a.kt)("p",null,"\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'echo "Start Deploy Script"\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\nPROJECT_NAME=jwp-shopping-order\n\necho "Change Directory"\ncd $REPOSITORY_NAME\n\necho "Git Pull"\ngit pull origin step2\n\necho "Build"\n./gradlew bootJar\n\necho "Copy, Start Server"\nmv ./build/libs/$PROJECT_NAME.jar .\n\nPID=$(pgrep -f $PROJECT_NAME)\n\nif [ -n $PID ]; then\n kill -9 $PID\n sleep 5\nfi\n\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\n')),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30")),(0,a.kt)("p",null,"\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ubc30\uc6b4-\ubd80\ubd84"},"\uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"expose headers")),(0,a.kt)("p",null,"\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c ",(0,a.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header"},"\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354"),"\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","nginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"add_header 'Access-Control-Expose-Headers' 'Location'\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158")," "),(0,a.kt)("p",null,"\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Transactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("p",null,"setReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.")),(0,a.kt)("p",null,"ORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"strong"},"@Transactional")," \uc801\uc6a9")," "),(0,a.kt)("p",null,"DAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Service \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) ",(0,a.kt)("inlineCode",{parentName:"p"},"@Transactional"),"\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/456b5fae.1425c1d5.js b/assets/js/456b5fae.1425c1d5.js new file mode 100644 index 000000000..e32ad59e0 --- /dev/null +++ b/assets/js/456b5fae.1425c1d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1865],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>d});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),g=u(n),d=r,c=g["".concat(s,".").concat(d)]||g[d]||p[d]||i;return n?a.createElement(c,o(o({ref:t},m),{},{components:n})):a.createElement(c,o({ref:t},m))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,o[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const i={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:39,tags:["image","awt"]},o=void 0,l={permalink:"/39",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",source:"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",description:"\uac1c\uc694",date:"2023-08-02T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 2\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:11.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:"39",tags:["image","awt"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",permalink:"/40"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"}},s={authorsImageUrls:[]},u=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uad6c\ud604 \uacb0\uacfc",id:"\uad6c\ud604-\uacb0\uacfc",level:3},{value:"IMAGE_SIZE & ROUTE_SIZE",id:"image_size--route_size",level:3},{value:"\uc8fc\uc694 \ud074\ub798\uc2a4",id:"\uc8fc\uc694-\ud074\ub798\uc2a4",level:2},{value:"\uc694\uc57d",id:"\uc694\uc57d",level:3},{value:"\uc758\uc874\uad00\uacc4",id:"\uc758\uc874\uad00\uacc4",level:3},{value:"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)",id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158",level:3},{value:"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)",id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58",level:3},{value:"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)",id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4",level:3},{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow",level:2},{value:"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44",id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44",level:3},{value:"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad",id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad",id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"4. \uc5c5\ub85c\ub4dc \uc694\uccad",id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad",level:3},{value:"\uc804\uccb4 Flow",id:"\uc804\uccb4-flow",level:3}],m={toc:u};function p(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"./36"},"\ub9c1\ud06c"),"\uc5d0 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uad6c\ud604-\uacb0\uacfc"},"\uad6c\ud604 \uacb0\uacfc"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./result.png",src:n(10452).Z,width:"1840",height:"714"})),(0,r.kt)("p",null,"\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"\uc11c\uc6b8\uc5ed(\uc810)")," \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 ",(0,r.kt)("strong",{parentName:"p"},"\uad6c\ub85c\uc5ed(\uc810)")," \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="\uc608\uc2dc \ub370\uc774\ud130"',title:'"\uc608\uc2dc','\ub370\uc774\ud130"':!0},"List x = List.of(\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\n);\nList y = List.of(\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\n);\nList xPoints = List.of(126.97094933811682, 126.88474839801178);\nList yPoints = List.of(37.55302829553499, 37.50129417536773);\n")),(0,r.kt)("h3",{id:"image_size--route_size"},"IMAGE_SIZE & ROUTE_SIZE"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator.java"',title:'"RouteImageGenerator.java"'},"private static final int IMAGE_SIZE = 800;\nprivate static final int ROUTE_SIZE = 600;\n")),(0,r.kt)("p",null,"\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc774\ubbf8\uc9c0 \ud06c\uae30\uc640 \uacbd\ub85c \ud06c\uae30\uac00 \uc788\uc2b5\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \ud06c\uae30\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \ud06c\uae30\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uadf8\ub824\uc9c0\ub294 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./600.png",src:n(35804).Z,width:"976",height:"970"})),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720")),(0,r.kt)("p",null,"255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370 \ud654\uc9c8\uc774 \ub108\ubb34 \uc548\uc88b\uc544\uc11c 800\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc8fc\uc694-\ud074\ub798\uc2a4"},"\uc8fc\uc694 \ud074\ub798\uc2a4"),(0,r.kt)("h3",{id:"\uc694\uc57d"},"\uc694\uc57d"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\ud074\ub798\uc2a4\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud2b9\uc774\uc0ac\ud56d"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc Point\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinates"),(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Position"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Positions"),(0,r.kt)("td",{parentName:"tr",align:null},"Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageDrawer"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageUploader"),(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageGenerator"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Graphics2D(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc"),(0,r.kt)("td",{parentName:"tr",align:null},"JDK1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131")))),(0,r.kt)("h3",{id:"\uc758\uc874\uad00\uacc4"},"\uc758\uc874\uad00\uacc4"),(0,r.kt)("mermaid",{value:'graph TD\n C1[Coordinates] --\x3e C[Coordinate]\n P1[Positions] --\x3e P[Position]\n\n\tRID[RouteImageDrawer] -- "\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131" --\x3e P1\n\tRID --\x3e B[BufferedImage]\n\tRID --\x3e G[Graphics2D]\n\n\tC1 -- "calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0" --\x3e P1\n\n\tRIU[RouteImageUploader] --\x3e B\n\tRIG[RouteImageGenerator] --\x3e RID\n\tRIG --\x3e RIU\n\tRIG --\x3e C1\n\tRIG --\x3e P1'}),(0,r.kt)("h3",{id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158"},"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"List")," 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Coordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658"),(0,r.kt)("li",{parentName:"ul"},"indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 ")),(0,r.kt)("p",null,"Positions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Coordinates.java"',title:'"Coordinates.java"'},"// \ud638\ucd9c\n// List xPositions = toPositions(xValues, maxDifference, routeImageSize);\n// List yPositions = toPositions(yValues, maxDifference, routeImageSize);\n\nprivate List toPositions(List values, Double maxDifference, Integer routeImageSize) {\n Double minValue = Collections.min(values);\n return values.stream()\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\n .map(value -> mapToPosition(value, routeImageSize))\n .toList();\n}\n\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\n return (coordinate - minValue) / maxDifference;\n}\n\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\n return (int) (coordinate * routeImageSize);\n}\n")),(0,r.kt)("p",null,"\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Collections.min(values) \u2192 \uc704\ub3c4\ub97c \ubc1b\uc544 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"normalizeCoordinate \u2192 \uac01 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 ",(0,r.kt)("strong",{parentName:"li"},"\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774"),"\ub85c \ub098\ub208\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58"},"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)"),(0,r.kt)("p",null,"Positions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Positions.java"',title:'"Positions.java"'},"public Positions align(int imageSize, int routeSize) {\n int xOffset = calculateOffset(Position::x, imageSize);\n int yOffset = calculateOffset(Position::y, imageSize);\n\n return items.stream()\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\n .collect(collectingAndThen(toList(), Positions::new));\n}\n\nprivate int calculateOffset(ToIntFunction positionToInteger, int imageSize) {\n List positions = items.stream()\n .mapToInt(positionToInteger)\n .boxed()\n .toList();\n\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\n return imageSize / 2 - midValue;\n}\n")),(0,r.kt)("p",null,"\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","BufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./800.png",src:n(3959).Z,width:"968",height:"978"})),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4."),(0,r.kt)("p",null,"x \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","y \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. "),(0,r.kt)("h3",{id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4"},"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)"),(0,r.kt)("p",null,"BufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageDrawer.java"',title:'"RouteImageDrawer.java"'},"// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\n// \ubc30\uacbd \ud22c\uba85\uc0c9\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\nprivate static final int LINE_STROKE_WIDTH = 7;\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\nprivate static final int POINT_STROKE_WIDTH = 20;\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8\uc774 \uc548\uc88b\uc740 \uc774\ubbf8\uc9c0\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud55c \uc124\uc815\nprivate static final Map renderingHints = Map.of(\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\n);\n")),(0,r.kt)("p",null,"RouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. ")),(0,r.kt)("p",null,"dispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4."),(0,r.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow"),(0,r.kt)("h3",{id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44"},"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n"}),(0,r.kt)("h3",{id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad"},"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad"},"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad"},"4. \uc5c5\ub85c\ub4dc \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n \tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n \tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658"}),(0,r.kt)("h3",{id:"\uc804\uccb4-flow"},"\uc804\uccb4 Flow"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n\t"}))}p.isMDXComponent=!0},35804:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/600-50ee65176288cb73d2c777d255460f4f.png"},3959:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/800-88542ba3914ad40b45b999e95df96cdf.png"},10452:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/result-c2887223d62510a96c9c8f733bf5edf6.png"}}]); \ No newline at end of file diff --git a/assets/js/456b5fae.5b386dbb.js b/assets/js/456b5fae.5b386dbb.js deleted file mode 100644 index 1870c0564..000000000 --- a/assets/js/456b5fae.5b386dbb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1865],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>d});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),g=u(n),d=r,c=g["".concat(s,".").concat(d)]||g[d]||p[d]||i;return n?a.createElement(c,o(o({ref:t},m),{},{components:n})):a.createElement(c,o({ref:t},m))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,o[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const i={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:39,tags:["image","awt"]},o=void 0,l={permalink:"/39",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",source:"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",description:"\uac1c\uc694",date:"2023-08-02T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 2\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:11.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:"39",tags:["image","awt"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",permalink:"/40"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"}},s={authorsImageUrls:[]},u=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uad6c\ud604 \uacb0\uacfc",id:"\uad6c\ud604-\uacb0\uacfc",level:3},{value:"IMAGE_SIZE & ROUTE_SIZE",id:"image_size--route_size",level:3},{value:"\uc8fc\uc694 \ud074\ub798\uc2a4",id:"\uc8fc\uc694-\ud074\ub798\uc2a4",level:2},{value:"\uc694\uc57d",id:"\uc694\uc57d",level:3},{value:"\uc758\uc874\uad00\uacc4",id:"\uc758\uc874\uad00\uacc4",level:3},{value:"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)",id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158",level:3},{value:"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)",id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58",level:3},{value:"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)",id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4",level:3},{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow",level:2},{value:"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44",id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44",level:3},{value:"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad",id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad",id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"4. \uc5c5\ub85c\ub4dc \uc694\uccad",id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad",level:3},{value:"\uc804\uccb4 Flow",id:"\uc804\uccb4-flow",level:3}],m={toc:u};function p(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"./36"},"\ub9c1\ud06c"),"\uc5d0 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uad6c\ud604-\uacb0\uacfc"},"\uad6c\ud604 \uacb0\uacfc"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./result.png",src:n(452).Z,width:"1840",height:"714"})),(0,r.kt)("p",null,"\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"\uc11c\uc6b8\uc5ed(\uc810)")," \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 ",(0,r.kt)("strong",{parentName:"p"},"\uad6c\ub85c\uc5ed(\uc810)")," \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="\uc608\uc2dc \ub370\uc774\ud130"',title:'"\uc608\uc2dc','\ub370\uc774\ud130"':!0},"List x = List.of(\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\n);\nList y = List.of(\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\n);\nList xPoints = List.of(126.97094933811682, 126.88474839801178);\nList yPoints = List.of(37.55302829553499, 37.50129417536773);\n")),(0,r.kt)("h3",{id:"image_size--route_size"},"IMAGE_SIZE & ROUTE_SIZE"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator.java"',title:'"RouteImageGenerator.java"'},"private static final int IMAGE_SIZE = 800;\nprivate static final int ROUTE_SIZE = 600;\n")),(0,r.kt)("p",null,"\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc774\ubbf8\uc9c0 \ud06c\uae30\uc640 \uacbd\ub85c \ud06c\uae30\uac00 \uc788\uc2b5\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \ud06c\uae30\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \ud06c\uae30\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uadf8\ub824\uc9c0\ub294 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./600.png",src:n(5804).Z,width:"976",height:"970"})),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720")),(0,r.kt)("p",null,"255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370 \ud654\uc9c8\uc774 \ub108\ubb34 \uc548\uc88b\uc544\uc11c 800\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc8fc\uc694-\ud074\ub798\uc2a4"},"\uc8fc\uc694 \ud074\ub798\uc2a4"),(0,r.kt)("h3",{id:"\uc694\uc57d"},"\uc694\uc57d"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\ud074\ub798\uc2a4\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud2b9\uc774\uc0ac\ud56d"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc Point\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinates"),(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Position"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Positions"),(0,r.kt)("td",{parentName:"tr",align:null},"Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageDrawer"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageUploader"),(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageGenerator"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Graphics2D(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc"),(0,r.kt)("td",{parentName:"tr",align:null},"JDK1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131")))),(0,r.kt)("h3",{id:"\uc758\uc874\uad00\uacc4"},"\uc758\uc874\uad00\uacc4"),(0,r.kt)("mermaid",{value:'graph TD\n C1[Coordinates] --\x3e C[Coordinate]\n P1[Positions] --\x3e P[Position]\n\n\tRID[RouteImageDrawer] -- "\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131" --\x3e P1\n\tRID --\x3e B[BufferedImage]\n\tRID --\x3e G[Graphics2D]\n\n\tC1 -- "calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0" --\x3e P1\n\n\tRIU[RouteImageUploader] --\x3e B\n\tRIG[RouteImageGenerator] --\x3e RID\n\tRIG --\x3e RIU\n\tRIG --\x3e C1\n\tRIG --\x3e P1'}),(0,r.kt)("h3",{id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158"},"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"List")," 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Coordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658"),(0,r.kt)("li",{parentName:"ul"},"indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 ")),(0,r.kt)("p",null,"Positions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Coordinates.java"',title:'"Coordinates.java"'},"// \ud638\ucd9c\n// List xPositions = toPositions(xValues, maxDifference, routeImageSize);\n// List yPositions = toPositions(yValues, maxDifference, routeImageSize);\n\nprivate List toPositions(List values, Double maxDifference, Integer routeImageSize) {\n Double minValue = Collections.min(values);\n return values.stream()\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\n .map(value -> mapToPosition(value, routeImageSize))\n .toList();\n}\n\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\n return (coordinate - minValue) / maxDifference;\n}\n\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\n return (int) (coordinate * routeImageSize);\n}\n")),(0,r.kt)("p",null,"\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Collections.min(values) \u2192 \uc704\ub3c4\ub97c \ubc1b\uc544 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"normalizeCoordinate \u2192 \uac01 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 ",(0,r.kt)("strong",{parentName:"li"},"\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774"),"\ub85c \ub098\ub208\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58"},"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)"),(0,r.kt)("p",null,"Positions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Positions.java"',title:'"Positions.java"'},"public Positions align(int imageSize, int routeSize) {\n int xOffset = calculateOffset(Position::x, imageSize);\n int yOffset = calculateOffset(Position::y, imageSize);\n\n return items.stream()\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\n .collect(collectingAndThen(toList(), Positions::new));\n}\n\nprivate int calculateOffset(ToIntFunction positionToInteger, int imageSize) {\n List positions = items.stream()\n .mapToInt(positionToInteger)\n .boxed()\n .toList();\n\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\n return imageSize / 2 - midValue;\n}\n")),(0,r.kt)("p",null,"\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","BufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./800.png",src:n(3959).Z,width:"968",height:"978"})),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4."),(0,r.kt)("p",null,"x \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","y \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. "),(0,r.kt)("h3",{id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4"},"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)"),(0,r.kt)("p",null,"BufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageDrawer.java"',title:'"RouteImageDrawer.java"'},"// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\n// \ubc30\uacbd \ud22c\uba85\uc0c9\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\nprivate static final int LINE_STROKE_WIDTH = 7;\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\nprivate static final int POINT_STROKE_WIDTH = 20;\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8\uc774 \uc548\uc88b\uc740 \uc774\ubbf8\uc9c0\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud55c \uc124\uc815\nprivate static final Map renderingHints = Map.of(\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\n);\n")),(0,r.kt)("p",null,"RouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. ")),(0,r.kt)("p",null,"dispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4."),(0,r.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow"),(0,r.kt)("h3",{id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44"},"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n"}),(0,r.kt)("h3",{id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad"},"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad"},"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad"},"4. \uc5c5\ub85c\ub4dc \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n \tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n \tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658"}),(0,r.kt)("h3",{id:"\uc804\uccb4-flow"},"\uc804\uccb4 Flow"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n\t"}))}p.isMDXComponent=!0},5804:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/600-50ee65176288cb73d2c777d255460f4f.png"},3959:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/800-88542ba3914ad40b45b999e95df96cdf.png"},452:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/result-c2887223d62510a96c9c8f733bf5edf6.png"}}]); \ No newline at end of file diff --git a/assets/js/459bd227.21873721.js b/assets/js/459bd227.21873721.js deleted file mode 100644 index 5618f726c..000000000 --- a/assets/js/459bd227.21873721.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9094],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(r),d=a,b=m["".concat(i,".").concat(d)]||m[d]||s[d]||l;return r?n.createElement(b,p(p({ref:t},u),{},{components:r})):n.createElement(b,p({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,p=new Array(l);p[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,p[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const l={title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",tags:["etc"]},p=void 0,o={unversionedId:"\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",id:"\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",description:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c",source:"@site/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30.mdx",sourceDirName:"\uae30\ud0c0",slug:"/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",permalink:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30.mdx",tags:[{label:"etc",permalink:"/docs/tags/etc"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",tags:["etc"]},sidebar:"tutorialSidebar",previous:{title:"\ubb38\uc11c",permalink:"/docs/"},next:{title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",permalink:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30"}},i={},c=[{value:"\uc790\uc874\uac10 \uae30\ub465 \ub9cc\ub4e4\uae30",id:"\uc790\uc874\uac10-\uae30\ub465-\ub9cc\ub4e4\uae30",level:3},{value:"\ub098\ub9cc\uc758 \ud559\uc2b5 \ubc29\ubc95 \ucc3e\uae30",id:"\ub098\ub9cc\uc758-\ud559\uc2b5-\ubc29\ubc95-\ucc3e\uae30",level:3},{value:"\uc0c8\ub85c\uc6b4 \ud658\uacbd\uc744 \uc798 \ubc30\uc6b0\ub294 \ubc29\ubc95",id:"\uc0c8\ub85c\uc6b4-\ud658\uacbd\uc744-\uc798-\ubc30\uc6b0\ub294-\ubc29\ubc95",level:3},{value:"\ud559\uc2b5 \uc8fc\uc81c",id:"\ud559\uc2b5-\uc8fc\uc81c",level:3},{value:"\uc0b0\ub9cc\ud568 \uad00\ub9ac\ud558\uae30",id:"\uc0b0\ub9cc\ud568-\uad00\ub9ac\ud558\uae30",level:3},{value:"\uac70\uc778\uc5d0 \uc5b4\uae68\uc704\uc5d0 \uc62c\ub77c\ud0c0\uae30",id:"\uac70\uc778\uc5d0-\uc5b4\uae68\uc704\uc5d0-\uc62c\ub77c\ud0c0\uae30",level:3},{value:"\ubcf4\uc0c1",id:"\ubcf4\uc0c1",level:3},{value:"\ub0a8\uc744 \uc124\ub4dd\ud558\ub294 \ubc29\ubc95 \ubc30\uc6b0\uae30",id:"\ub0a8\uc744-\uc124\ub4dd\ud558\ub294-\ubc29\ubc95-\ubc30\uc6b0\uae30",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub3d9\uc6b1\ub2d8 \ud2b9\uac15"),(0,a.kt)("h3",{id:"\uc790\uc874\uac10-\uae30\ub465-\ub9cc\ub4e4\uae30"},"\uc790\uc874\uac10 \uae30\ub465 \ub9cc\ub4e4\uae30"),(0,a.kt)("p",null,"\ub6f0\uc5b4\ub09c \ub3d9\ub8cc, \uc0c8\ub85c\uc6b4 \ud658\uacbd \uadf8\ub9ac\uace0 \ud504\ub85c\uc81d\ud2b8\ub97c \uc2e4\ud328\ud558\uba74\uc11c \uc790\uc874\uac10\uc774 \ub5a8\uc5b4\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\uc874\uac10\uc774 \ubb34\ub108\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \ub098\ub97c \uc9c0\ud0f1\ud560 \uc218 \uc788\ub294 \uae30\ub465\uc774 \ud544\uc694\ud558\ub2e4. (\ud55c \uac1c\uac00 \uc544\ub2cc \uc5ec\ub7ec \uac1c) "),(0,a.kt)("h3",{id:"\ub098\ub9cc\uc758-\ud559\uc2b5-\ubc29\ubc95-\ucc3e\uae30"},"\ub098\ub9cc\uc758 \ud559\uc2b5 \ubc29\ubc95 \ucc3e\uae30"),(0,a.kt)("p",null,"\ud68c\uc0ac \uc77c\uc744 \uc9c0\uc18d\uc801\uc73c\ub85c \ud55c\ub2e4\uba74 \ud68c\uc0ac \uc77c\uc758 \uc219\ub828\uc790\uac00 \ub418\uc9c0\ub9cc, \uac1c\ubc1c \uc804\ubb38\uac00\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc8fc\ub2c8\uc5b4 \uc77c\ub54c\ub294 \uc131\uacfc\uac00 \uc544\ub2cc \ud559\uc2b5\uc73c\ub85c!",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uc0ac\ub78c\uc778\uc9c0? \uace0\ubbfc\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3d9\uc6b1\ub2d8\uc774 \uadf8\ub3d9\uc548 \uc2dc\ub3c4\ud55c \ubc29\ubc95")),(0,a.kt)("p",null,"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8 \uc9c4\ud589\ud558\uae30 \u2192 A-Z \uad6c\ud604 \uacbd\ud5d8",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc45 \uc2a4\ud130\ub514 \u2192 \ub192\uc740 \uc644\uc8fc\uc728, \ud558\uc9c0\ub9cc \ub0b4\uac00 \ubc1c\ud45c\ud55c \uc8fc\uc81c\ub9cc \uae30\uc5b5\uc5d0 \ub0a8\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac15\uc758 \uc900\ube44 \u2192 100% \ub0b4\uc6a9 \uc2b5\ub4dd, \ub0ae\uc740 \uc2dc\uac04 \uac00\uc131\ube44, \uac15\uc758 \uc678\uc801\uc778 \ubd80\uac00\uc791\uc5c5",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub85c\uadf8 \u2192 \uc628\ub77c\uc778 \ubaa8\ub450\uac00 \ub9ac\ubdf0\uc5b4, \ub3d9\ub8cc\uc640 \uacf5\uc720 \uac00\ub2a5, \ud53c\ub4dc\ubc31\uc758 \ubd80\ub044\ub7ec\uc6c0 \ud83d\ude33 "),(0,a.kt)("p",null,"\uc2e4\ud328\ud558\uac70\ub098, \uc798\ubabb \uc801\uc5b4\ub3c4 \ub0a8\ub4e4\uc758 \uc2dc\uc120\ubcf4\ub2e8 \ub098 \uc790\uc2e0\uc758 \uc131\uc7a5\uc774 \uc911\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ub2a5\ud558\uba74 \uc778\uc99d\ub418\uace0, \uc815\uc81c\ub41c \uc790\ub8cc\ub85c \uc2b5\ub4dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc5d0\uac8c \ub9de\ub294 \uac00\uc7a5 \ud6a8\uc728\uc774 \uc88b\uc740 \ud559\uc2b5 \ubc29\ubc95\uc73c\ub85c \ucc3e\uace0, \uc218\uc2dc\ub85c \uc810\uac80\ud558\uc5ec \ub354 \uc88b\uc740 \ubc29\ubc95\uc744 \ucc3e\uace0 \uc2dc\ub3c4\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c\uc6b4-\ud658\uacbd\uc744-\uc798-\ubc30\uc6b0\ub294-\ubc29\ubc95"},"\uc0c8\ub85c\uc6b4 \ud658\uacbd\uc744 \uc798 \ubc30\uc6b0\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"\uc2dc\uac04 > \ub3c8\uc774\uae30 \ub54c\ubb38\uc5d0 \uc2dc\uac04\uc744 \ub3c8\uc73c\ub85c \uad6c\ub9e4\ud558\uc790.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2e0\ub8b0\ud560\ub9cc\ud55c \ubd84\uaed8 \uc9c8\ubb38 \ub610\ub294 \ucf54\ub4dc \ub9ac\ubdf0\uac00 \uac00\ub2a5\ud55c \uac15\uc758\ub97c \uad6c\ub9e4\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b4\ub5a4 \ud559\uc2b5 \ubc29\uc2dd, \uc5b8\uc81c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0, \uc5b4\ub5a4 \ud658\uacbd\uc5d0\uc11c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ud559\uc2b5-\uc8fc\uc81c"},"\ud559\uc2b5 \uc8fc\uc81c"),(0,a.kt)("p",null,"\ud68c\uc0ac \uc5c5\ubb34\uc5d0\uc11c \ub9cc\ub09c \ubb38\uc81c\ub97c \uc5f0\uad6c, \uc815\ub9ac, \ud574\uacb0\ud574\uc11c \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uacf5\uc720\ud558\uace0 \ud53c\ub4dc\ubc31\uc744 \ubc1b\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc8fc\ubcc0 \ub3d9\ub8cc\ub4e4\uc5d0\uac8c \uc778\uc815\ubc1b\ub294\uac8c \uc6b0\uc120\uc774\ub2e4. "),(0,a.kt)("h3",{id:"\uc0b0\ub9cc\ud568-\uad00\ub9ac\ud558\uae30"},"\uc0b0\ub9cc\ud568 \uad00\ub9ac\ud558\uae30"),(0,a.kt)("p",null,"\ucee8\ud14d\uc2a4\ud2b8 \uc2a4\uc704\uce6d\uc774 \uc790\uc8fc \uc77c\uc5b4\ub098\uba74 \uc0b0\ub9cc\ud574\uc9c0\uae30 \ub54c\ubb38\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc744 \uac00\uc838\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","ex) \uc9d1\uc911\uc774 \uc798 \ub418\ub294 \ud658\uacbd \uad6c\uc131\ud558\uae30, \ucd9c\uadfc \uc804 1~2\uc2dc\uac04 \uc9d1\uc911\ud558\uace0 \ucd9c\uadfc\ud558\uae30, \uc810\uc2ec \uc800\ub141 \uc0b0\ucc45\ud558\uae30, \uc8fc 2~3\ud68c \uc6b4\ub3d9\ud558\uae30"),(0,a.kt)("h3",{id:"\uac70\uc778\uc5d0-\uc5b4\uae68\uc704\uc5d0-\uc62c\ub77c\ud0c0\uae30"},"\uac70\uc778\uc5d0 \uc5b4\uae68\uc704\uc5d0 \uc62c\ub77c\ud0c0\uae30"),(0,a.kt)("p",null,"\ub6f0\uc5b4\ub09c \uc0ac\ub78c \uc606\uc5d0\uc11c \ubc30\uc6cc\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","C\ub808\ubca8, \ud14c\ud06c \ub9ac\ub4dc\uc640 \uac19\uc774 \uc77c\ud560 \uc218 \uc788\ub294 \uac83\uc740 \ud070 \uae30\ud68c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucee4\ubba4\ub2c8\ucf00\uc774\uc158 \ubc29\ubc95, \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud558\ub294 \ubc29\ubc95, \ubb38\ud654\ub97c \ub9cc\ub4e4\uc5b4\uac00\ub294 \ubc29\ubc95, \uacb0\uc815\uc758 \uae30\uc900\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \ud559\uc2b5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"\ubcf4\uc0c1"},"\ubcf4\uc0c1"),(0,a.kt)("p",null,"\uc2dc\ub828 \ub4a4\uc5d0\ub294 \ud56d\uc0c1 \ubcf4\ubb3c\uc774 \uae30\ub2e4\ub9ac\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf4\uc0c1\uc744 \ud1b5\ud574 \uafb8\uc900\ud568\uc744 \uc720\uc9c0\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\ub77c. "),(0,a.kt)("h3",{id:"\ub0a8\uc744-\uc124\ub4dd\ud558\ub294-\ubc29\ubc95-\ubc30\uc6b0\uae30"},"\ub0a8\uc744 \uc124\ub4dd\ud558\ub294 \ubc29\ubc95 \ubc30\uc6b0\uae30"),(0,a.kt)("p",null,"\ud300\uc6d0\ub4e4\uc774 \ub9e4\ubc88 \ub0b4 \uc758\uacac\uc744 \ubc18\ub300\ud55c\ub2e4\uba74 \uc644\ubcbd\ud55c \ub17c\ub9ac\uac00 \uc911\uc694\ud55c\uac8c \uc544\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b4\ub5bb\uac8c \ud558\uba74 \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\ub294\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\ucee4\ubba4\ub2c8\ucf00\uc774\uc158, \ud611\uc5c5, \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0\uc11c \ubd80\uc871\ud568\uc774 \uc788\uc73c\uba74 \uc548\ub41c\ub2e4."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/459bd227.af578946.js b/assets/js/459bd227.af578946.js new file mode 100644 index 000000000..65e94e369 --- /dev/null +++ b/assets/js/459bd227.af578946.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9094],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(r),d=a,b=m["".concat(i,".").concat(d)]||m[d]||s[d]||l;return r?n.createElement(b,p(p({ref:t},u),{},{components:r})):n.createElement(b,p({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,p=new Array(l);p[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,p[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const l={title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",tags:["etc"]},p=void 0,o={unversionedId:"\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",id:"\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",description:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c",source:"@site/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30.mdx",sourceDirName:"\uae30\ud0c0",slug:"/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",permalink:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30.mdx",tags:[{label:"etc",permalink:"/docs/tags/etc"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",tags:["etc"]},sidebar:"tutorialSidebar",previous:{title:"\ubb38\uc11c",permalink:"/docs/"},next:{title:"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30",permalink:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30"}},i={},c=[{value:"\uc790\uc874\uac10 \uae30\ub465 \ub9cc\ub4e4\uae30",id:"\uc790\uc874\uac10-\uae30\ub465-\ub9cc\ub4e4\uae30",level:3},{value:"\ub098\ub9cc\uc758 \ud559\uc2b5 \ubc29\ubc95 \ucc3e\uae30",id:"\ub098\ub9cc\uc758-\ud559\uc2b5-\ubc29\ubc95-\ucc3e\uae30",level:3},{value:"\uc0c8\ub85c\uc6b4 \ud658\uacbd\uc744 \uc798 \ubc30\uc6b0\ub294 \ubc29\ubc95",id:"\uc0c8\ub85c\uc6b4-\ud658\uacbd\uc744-\uc798-\ubc30\uc6b0\ub294-\ubc29\ubc95",level:3},{value:"\ud559\uc2b5 \uc8fc\uc81c",id:"\ud559\uc2b5-\uc8fc\uc81c",level:3},{value:"\uc0b0\ub9cc\ud568 \uad00\ub9ac\ud558\uae30",id:"\uc0b0\ub9cc\ud568-\uad00\ub9ac\ud558\uae30",level:3},{value:"\uac70\uc778\uc5d0 \uc5b4\uae68\uc704\uc5d0 \uc62c\ub77c\ud0c0\uae30",id:"\uac70\uc778\uc5d0-\uc5b4\uae68\uc704\uc5d0-\uc62c\ub77c\ud0c0\uae30",level:3},{value:"\ubcf4\uc0c1",id:"\ubcf4\uc0c1",level:3},{value:"\ub0a8\uc744 \uc124\ub4dd\ud558\ub294 \ubc29\ubc95 \ubc30\uc6b0\uae30",id:"\ub0a8\uc744-\uc124\ub4dd\ud558\ub294-\ubc29\ubc95-\ubc30\uc6b0\uae30",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 2023\ub144 4\uc6d4 19\uc77c",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub3d9\uc6b1\ub2d8 \ud2b9\uac15"),(0,a.kt)("h3",{id:"\uc790\uc874\uac10-\uae30\ub465-\ub9cc\ub4e4\uae30"},"\uc790\uc874\uac10 \uae30\ub465 \ub9cc\ub4e4\uae30"),(0,a.kt)("p",null,"\ub6f0\uc5b4\ub09c \ub3d9\ub8cc, \uc0c8\ub85c\uc6b4 \ud658\uacbd \uadf8\ub9ac\uace0 \ud504\ub85c\uc81d\ud2b8\ub97c \uc2e4\ud328\ud558\uba74\uc11c \uc790\uc874\uac10\uc774 \ub5a8\uc5b4\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\uc874\uac10\uc774 \ubb34\ub108\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \ub098\ub97c \uc9c0\ud0f1\ud560 \uc218 \uc788\ub294 \uae30\ub465\uc774 \ud544\uc694\ud558\ub2e4. (\ud55c \uac1c\uac00 \uc544\ub2cc \uc5ec\ub7ec \uac1c) "),(0,a.kt)("h3",{id:"\ub098\ub9cc\uc758-\ud559\uc2b5-\ubc29\ubc95-\ucc3e\uae30"},"\ub098\ub9cc\uc758 \ud559\uc2b5 \ubc29\ubc95 \ucc3e\uae30"),(0,a.kt)("p",null,"\ud68c\uc0ac \uc77c\uc744 \uc9c0\uc18d\uc801\uc73c\ub85c \ud55c\ub2e4\uba74 \ud68c\uc0ac \uc77c\uc758 \uc219\ub828\uc790\uac00 \ub418\uc9c0\ub9cc, \uac1c\ubc1c \uc804\ubb38\uac00\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc8fc\ub2c8\uc5b4 \uc77c\ub54c\ub294 \uc131\uacfc\uac00 \uc544\ub2cc \ud559\uc2b5\uc73c\ub85c!",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uc0ac\ub78c\uc778\uc9c0? \uace0\ubbfc\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3d9\uc6b1\ub2d8\uc774 \uadf8\ub3d9\uc548 \uc2dc\ub3c4\ud55c \ubc29\ubc95")),(0,a.kt)("p",null,"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8 \uc9c4\ud589\ud558\uae30 \u2192 A-Z \uad6c\ud604 \uacbd\ud5d8",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc45 \uc2a4\ud130\ub514 \u2192 \ub192\uc740 \uc644\uc8fc\uc728, \ud558\uc9c0\ub9cc \ub0b4\uac00 \ubc1c\ud45c\ud55c \uc8fc\uc81c\ub9cc \uae30\uc5b5\uc5d0 \ub0a8\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac15\uc758 \uc900\ube44 \u2192 100% \ub0b4\uc6a9 \uc2b5\ub4dd, \ub0ae\uc740 \uc2dc\uac04 \uac00\uc131\ube44, \uac15\uc758 \uc678\uc801\uc778 \ubd80\uac00\uc791\uc5c5",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub85c\uadf8 \u2192 \uc628\ub77c\uc778 \ubaa8\ub450\uac00 \ub9ac\ubdf0\uc5b4, \ub3d9\ub8cc\uc640 \uacf5\uc720 \uac00\ub2a5, \ud53c\ub4dc\ubc31\uc758 \ubd80\ub044\ub7ec\uc6c0 \ud83d\ude33 "),(0,a.kt)("p",null,"\uc2e4\ud328\ud558\uac70\ub098, \uc798\ubabb \uc801\uc5b4\ub3c4 \ub0a8\ub4e4\uc758 \uc2dc\uc120\ubcf4\ub2e8 \ub098 \uc790\uc2e0\uc758 \uc131\uc7a5\uc774 \uc911\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ub2a5\ud558\uba74 \uc778\uc99d\ub418\uace0, \uc815\uc81c\ub41c \uc790\ub8cc\ub85c \uc2b5\ub4dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc5d0\uac8c \ub9de\ub294 \uac00\uc7a5 \ud6a8\uc728\uc774 \uc88b\uc740 \ud559\uc2b5 \ubc29\ubc95\uc73c\ub85c \ucc3e\uace0, \uc218\uc2dc\ub85c \uc810\uac80\ud558\uc5ec \ub354 \uc88b\uc740 \ubc29\ubc95\uc744 \ucc3e\uace0 \uc2dc\ub3c4\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c\uc6b4-\ud658\uacbd\uc744-\uc798-\ubc30\uc6b0\ub294-\ubc29\ubc95"},"\uc0c8\ub85c\uc6b4 \ud658\uacbd\uc744 \uc798 \ubc30\uc6b0\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"\uc2dc\uac04 > \ub3c8\uc774\uae30 \ub54c\ubb38\uc5d0 \uc2dc\uac04\uc744 \ub3c8\uc73c\ub85c \uad6c\ub9e4\ud558\uc790.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2e0\ub8b0\ud560\ub9cc\ud55c \ubd84\uaed8 \uc9c8\ubb38 \ub610\ub294 \ucf54\ub4dc \ub9ac\ubdf0\uac00 \uac00\ub2a5\ud55c \uac15\uc758\ub97c \uad6c\ub9e4\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b4\ub5a4 \ud559\uc2b5 \ubc29\uc2dd, \uc5b8\uc81c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0, \uc5b4\ub5a4 \ud658\uacbd\uc5d0\uc11c \uc9d1\uc911\uc774 \uc798 \ub418\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ud559\uc2b5-\uc8fc\uc81c"},"\ud559\uc2b5 \uc8fc\uc81c"),(0,a.kt)("p",null,"\ud68c\uc0ac \uc5c5\ubb34\uc5d0\uc11c \ub9cc\ub09c \ubb38\uc81c\ub97c \uc5f0\uad6c, \uc815\ub9ac, \ud574\uacb0\ud574\uc11c \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uacf5\uc720\ud558\uace0 \ud53c\ub4dc\ubc31\uc744 \ubc1b\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc8fc\ubcc0 \ub3d9\ub8cc\ub4e4\uc5d0\uac8c \uc778\uc815\ubc1b\ub294\uac8c \uc6b0\uc120\uc774\ub2e4. "),(0,a.kt)("h3",{id:"\uc0b0\ub9cc\ud568-\uad00\ub9ac\ud558\uae30"},"\uc0b0\ub9cc\ud568 \uad00\ub9ac\ud558\uae30"),(0,a.kt)("p",null,"\ucee8\ud14d\uc2a4\ud2b8 \uc2a4\uc704\uce6d\uc774 \uc790\uc8fc \uc77c\uc5b4\ub098\uba74 \uc0b0\ub9cc\ud574\uc9c0\uae30 \ub54c\ubb38\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc744 \uac00\uc838\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","ex) \uc9d1\uc911\uc774 \uc798 \ub418\ub294 \ud658\uacbd \uad6c\uc131\ud558\uae30, \ucd9c\uadfc \uc804 1~2\uc2dc\uac04 \uc9d1\uc911\ud558\uace0 \ucd9c\uadfc\ud558\uae30, \uc810\uc2ec \uc800\ub141 \uc0b0\ucc45\ud558\uae30, \uc8fc 2~3\ud68c \uc6b4\ub3d9\ud558\uae30"),(0,a.kt)("h3",{id:"\uac70\uc778\uc5d0-\uc5b4\uae68\uc704\uc5d0-\uc62c\ub77c\ud0c0\uae30"},"\uac70\uc778\uc5d0 \uc5b4\uae68\uc704\uc5d0 \uc62c\ub77c\ud0c0\uae30"),(0,a.kt)("p",null,"\ub6f0\uc5b4\ub09c \uc0ac\ub78c \uc606\uc5d0\uc11c \ubc30\uc6cc\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","C\ub808\ubca8, \ud14c\ud06c \ub9ac\ub4dc\uc640 \uac19\uc774 \uc77c\ud560 \uc218 \uc788\ub294 \uac83\uc740 \ud070 \uae30\ud68c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucee4\ubba4\ub2c8\ucf00\uc774\uc158 \ubc29\ubc95, \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud558\ub294 \ubc29\ubc95, \ubb38\ud654\ub97c \ub9cc\ub4e4\uc5b4\uac00\ub294 \ubc29\ubc95, \uacb0\uc815\uc758 \uae30\uc900\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \ud559\uc2b5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"\ubcf4\uc0c1"},"\ubcf4\uc0c1"),(0,a.kt)("p",null,"\uc2dc\ub828 \ub4a4\uc5d0\ub294 \ud56d\uc0c1 \ubcf4\ubb3c\uc774 \uae30\ub2e4\ub9ac\uace0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf4\uc0c1\uc744 \ud1b5\ud574 \uafb8\uc900\ud568\uc744 \uc720\uc9c0\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\ub77c. "),(0,a.kt)("h3",{id:"\ub0a8\uc744-\uc124\ub4dd\ud558\ub294-\ubc29\ubc95-\ubc30\uc6b0\uae30"},"\ub0a8\uc744 \uc124\ub4dd\ud558\ub294 \ubc29\ubc95 \ubc30\uc6b0\uae30"),(0,a.kt)("p",null,"\ud300\uc6d0\ub4e4\uc774 \ub9e4\ubc88 \ub0b4 \uc758\uacac\uc744 \ubc18\ub300\ud55c\ub2e4\uba74 \uc644\ubcbd\ud55c \ub17c\ub9ac\uac00 \uc911\uc694\ud55c\uac8c \uc544\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b4\ub5bb\uac8c \ud558\uba74 \uc2e0\ub8b0 \uc790\uc0b0\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\ub294\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\ucee4\ubba4\ub2c8\ucf00\uc774\uc158, \ud611\uc5c5, \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0\uc11c \ubd80\uc871\ud568\uc774 \uc788\uc73c\uba74 \uc548\ub41c\ub2e4."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/489347ff.6c7f25ae.js b/assets/js/489347ff.6c7f25ae.js deleted file mode 100644 index d5fd93a0d..000000000 --- a/assets/js/489347ff.6c7f25ae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2793],{526:e=>{e.exports=JSON.parse('{"label":"WebSocket","permalink":"/tags/web-socket","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/489347ff.b84e267c.js b/assets/js/489347ff.b84e267c.js new file mode 100644 index 000000000..1be0ed5ef --- /dev/null +++ b/assets/js/489347ff.b84e267c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2793],{40526:e=>{e.exports=JSON.parse('{"label":"WebSocket","permalink":"/tags/web-socket","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/48bd1d32.aa5508b4.js b/assets/js/48bd1d32.aa5508b4.js deleted file mode 100644 index e35bfbc62..000000000 --- a/assets/js/48bd1d32.aa5508b4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9563],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=s(r),d=a,f=m["".concat(c,".").concat(d)]||m[d]||u[d]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(7462),a=(r(7294),r(3905));const i={title:"TDD heuristics",tags:["test"]},o=void 0,l={unversionedId:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",id:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",title:"TDD heuristics",description:"TDD heuristics",source:"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59.mdx",sourceDirName:"\ud14c\uc2a4\ud2b8",slug:"/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59.mdx",tags:[{label:"test",permalink:"/docs/tags/test"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"TDD heuristics",tags:["test"]},sidebar:"tutorialSidebar",previous:{title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",permalink:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8"},next:{title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd"}},c={},s=[{value:"TDD heuristics",id:"tdd-heuristics",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],p={toc:s};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"tdd-heuristics"},"TDD heuristics"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\uc5ec\ub7ec\ubd84\uc774 \uc791\uc131\ud558\uace0 \uc2f6\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\uc2e4\ud328\uc2dc\ucf1c\ub77c. \ud1b5\uacfc\uc2dc\ucf1c\ub77c. \uadf8\ub9ac\uace0 \uc815\ub9ac\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ucd5c\uc0c1\uc758 \uacb0\uacfc\ub97c \ucd94\uad6c\ud558\uc9c0 \ub9d0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\uc2e4\ud328\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud558\uace0, \uac00\uc7a5 \uad6c\uccb4\uc801\uc774\uba70, \uac00\uc7a5 \ud1f4\ud654\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\uac00\ub2a5\ud558\uba74 \uc77c\ubc18\ud654\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ucf54\ub4dc\uac00 \ud2c0\ub838\ub2e4\uace0 \ub290\uaef4\uc9c0\uba74 \uc7a0\uc2dc \uba48\ucdb0\uc11c \uc124\uacc4\ub97c \uace0\uccd0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ub354 \ubcf5\uc7a1\ud55c \ub2e4\uc74c \uacbd\uc6b0\ub85c \ub118\uc5b4\uac00\uae30 \uc804, \uc9c0\uae08 \ub2e4\ub8e8\uace0 \uc788\ub294 \ub354 \ub2e8\uc21c\ud55c \uacbd\uc6b0\ub97c \ubaa8\uc870\ub9ac \ud14c\uc2a4\ud2b8\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud604\uc7ac \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\uc2dc\ud0a4\uae30 \uc704\ud574 \ub108\ubb34 \ub9ce\uc740 \uad6c\ud604\uc744 \ud574\uc57c \ud55c\ub2e4\uba74, \ud14c\uc2a4\ud2b8\ub97c \uc9c0\uc6b0\uace0 \ub354 \uc27d\uac8c \ud1b5\uacfc\ud560 \uc218 \uc788\ub294 \ub354 \ub2e8\uc21c\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8 \uacf5\uac04(test space)\uc744 \uc804\ubd80 \ud3ec\uad04\ud558\ub294 \uc2e0\uc911\ud558\uace0 \uc810\uc9c4\uc801\uc778 \ud328\ud134\uc744 \ub530\ub974\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud544\uc694 \uc5c6\ub294 \uac83\uc744 \uc5ec\ub7ec\ubd84\uc758 \ud14c\uc2a4\ud2b8\uc5d0 \ub123\uc9c0 \ub9d0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8\uc5d0 \uc2e4\uc81c \uc11c\ube44\uc2a4 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud558\uc9c0 \ub9d0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8 \uad6c\uc870\ub97c \uc81c\ud488 \ucf54\ub4dc \uad6c\uc870\ub85c\ubd80\ud130 \ubd84\ub9ac\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8\uac00 \uad6c\uccb4\uc801(specific)\uc774 \ub420\uc218\ub85d \ucf54\ub4dc\ub294 \uc77c\ubc18\uc801(generic)\uc774 \ub41c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\ubcc0\ud658\uc744 \uc801\uc6a9\ud55c \uacb0\uacfc \ucd5c\uc801\uc774 \uc544\ub2cc \ud574\ub2f5\uc5d0 \ub3c4\ub2ec\ud588\ub2e4\uba74 \ub2e4\ub978 \ubcc0\ud658\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ub514\ubc84\uac70 \uc0ac\uc6a9\uc744 \ud53c\ud558\ub77c")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 p.44 ~ p.209"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/48bd1d32.c6f0690c.js b/assets/js/48bd1d32.c6f0690c.js new file mode 100644 index 000000000..38a9c8d3f --- /dev/null +++ b/assets/js/48bd1d32.c6f0690c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9563],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=s(r),d=a,f=m["".concat(c,".").concat(d)]||m[d]||u[d]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const i={title:"TDD heuristics",tags:["test"]},o=void 0,l={unversionedId:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",id:"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",title:"TDD heuristics",description:"TDD heuristics",source:"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59.mdx",sourceDirName:"\ud14c\uc2a4\ud2b8",slug:"/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59.mdx",tags:[{label:"test",permalink:"/docs/tags/test"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"TDD heuristics",tags:["test"]},sidebar:"tutorialSidebar",previous:{title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",permalink:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8"},next:{title:"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd"}},c={},s=[{value:"TDD heuristics",id:"tdd-heuristics",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],p={toc:s};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"tdd-heuristics"},"TDD heuristics"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\uc5ec\ub7ec\ubd84\uc774 \uc791\uc131\ud558\uace0 \uc2f6\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\uc2e4\ud328\uc2dc\ucf1c\ub77c. \ud1b5\uacfc\uc2dc\ucf1c\ub77c. \uadf8\ub9ac\uace0 \uc815\ub9ac\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ucd5c\uc0c1\uc758 \uacb0\uacfc\ub97c \ucd94\uad6c\ud558\uc9c0 \ub9d0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\uc2e4\ud328\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud558\uace0, \uac00\uc7a5 \uad6c\uccb4\uc801\uc774\uba70, \uac00\uc7a5 \ud1f4\ud654\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\uac00\ub2a5\ud558\uba74 \uc77c\ubc18\ud654\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ucf54\ub4dc\uac00 \ud2c0\ub838\ub2e4\uace0 \ub290\uaef4\uc9c0\uba74 \uc7a0\uc2dc \uba48\ucdb0\uc11c \uc124\uacc4\ub97c \uace0\uccd0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ub354 \ubcf5\uc7a1\ud55c \ub2e4\uc74c \uacbd\uc6b0\ub85c \ub118\uc5b4\uac00\uae30 \uc804, \uc9c0\uae08 \ub2e4\ub8e8\uace0 \uc788\ub294 \ub354 \ub2e8\uc21c\ud55c \uacbd\uc6b0\ub97c \ubaa8\uc870\ub9ac \ud14c\uc2a4\ud2b8\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud604\uc7ac \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\uc2dc\ud0a4\uae30 \uc704\ud574 \ub108\ubb34 \ub9ce\uc740 \uad6c\ud604\uc744 \ud574\uc57c \ud55c\ub2e4\uba74, \ud14c\uc2a4\ud2b8\ub97c \uc9c0\uc6b0\uace0 \ub354 \uc27d\uac8c \ud1b5\uacfc\ud560 \uc218 \uc788\ub294 \ub354 \ub2e8\uc21c\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8 \uacf5\uac04(test space)\uc744 \uc804\ubd80 \ud3ec\uad04\ud558\ub294 \uc2e0\uc911\ud558\uace0 \uc810\uc9c4\uc801\uc778 \ud328\ud134\uc744 \ub530\ub974\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud544\uc694 \uc5c6\ub294 \uac83\uc744 \uc5ec\ub7ec\ubd84\uc758 \ud14c\uc2a4\ud2b8\uc5d0 \ub123\uc9c0 \ub9d0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8\uc5d0 \uc2e4\uc81c \uc11c\ube44\uc2a4 \ub370\uc774\ud130\ub97c \uc0ac\uc6a9\ud558\uc9c0 \ub9d0\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8 \uad6c\uc870\ub97c \uc81c\ud488 \ucf54\ub4dc \uad6c\uc870\ub85c\ubd80\ud130 \ubd84\ub9ac\ud558\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ud14c\uc2a4\ud2b8\uac00 \uad6c\uccb4\uc801(specific)\uc774 \ub420\uc218\ub85d \ucf54\ub4dc\ub294 \uc77c\ubc18\uc801(generic)\uc774 \ub41c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\ubcc0\ud658\uc744 \uc801\uc6a9\ud55c \uacb0\uacfc \ucd5c\uc801\uc774 \uc544\ub2cc \ud574\ub2f5\uc5d0 \ub3c4\ub2ec\ud588\ub2e4\uba74 \ub2e4\ub978 \ubcc0\ud658\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub77c."),(0,a.kt)("li",{parentName:"ol"},"\ub514\ubc84\uac70 \uc0ac\uc6a9\uc744 \ud53c\ud558\ub77c")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 p.44 ~ p.209"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/492a6565.675baf13.js b/assets/js/492a6565.675baf13.js new file mode 100644 index 000000000..dbe6307ce --- /dev/null +++ b/assets/js/492a6565.675baf13.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4212],{44929:e=>{e.exports=JSON.parse('{"permalink":"/tags/lock/page/2","page":2,"postsPerPage":1,"totalPages":2,"totalCount":2,"previousPage":"/tags/lock","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/492a6565.a55b3cb2.js b/assets/js/492a6565.a55b3cb2.js deleted file mode 100644 index 5b244e381..000000000 --- a/assets/js/492a6565.a55b3cb2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4212],{4929:e=>{e.exports=JSON.parse('{"permalink":"/tags/lock/page/2","page":2,"postsPerPage":1,"totalPages":2,"totalCount":2,"previousPage":"/tags/lock","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/494882d1.b7db3ed7.js b/assets/js/494882d1.972ab65e.js similarity index 57% rename from assets/js/494882d1.b7db3ed7.js rename to assets/js/494882d1.972ab65e.js index 9d9ebcf49..a8db777ef 100644 --- a/assets/js/494882d1.b7db3ed7.js +++ b/assets/js/494882d1.972ab65e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4471],{2098:e=>{e.exports=JSON.parse('{"permalink":"/page/37","page":37,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/36","nextPage":"/page/38","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4471],{2098:e=>{e.exports=JSON.parse('{"permalink":"/page/37","page":37,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/36","nextPage":"/page/38","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4959fc42.a24e9fce.js b/assets/js/4959fc42.a24e9fce.js deleted file mode 100644 index 2010b4758..000000000 --- a/assets/js/4959fc42.a24e9fce.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[240],{897:e=>{e.exports=JSON.parse('{"permalink":"/page/14","page":14,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/13","nextPage":"/page/15","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4959fc42.cda7d2f0.js b/assets/js/4959fc42.cda7d2f0.js new file mode 100644 index 000000000..d5d36ccea --- /dev/null +++ b/assets/js/4959fc42.cda7d2f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[240],{80897:e=>{e.exports=JSON.parse('{"permalink":"/page/14","page":14,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/13","nextPage":"/page/15","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4972.6f1a8649.js b/assets/js/4972.6f1a8649.js deleted file mode 100644 index 21836d12f..000000000 --- a/assets/js/4972.6f1a8649.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4972],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(7294),l=n(5999),o=n(833),r=n(4774);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/4972.8947662a.js b/assets/js/4972.8947662a.js new file mode 100644 index 000000000..21454f620 --- /dev/null +++ b/assets/js/4972.8947662a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4972],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(67294),l=n(95999),o=n(10833),r=n(54774);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/49b8d9dd.b3e617c2.js b/assets/js/49b8d9dd.b3e617c2.js deleted file mode 100644 index 40fd8a795..000000000 --- a/assets/js/49b8d9dd.b3e617c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1103],{4420:e=>{e.exports=JSON.parse('{"label":"InnoDB","permalink":"/tags/inno-db","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/49b8d9dd.ce03beac.js b/assets/js/49b8d9dd.ce03beac.js new file mode 100644 index 000000000..720ecf54e --- /dev/null +++ b/assets/js/49b8d9dd.ce03beac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1103],{64420:e=>{e.exports=JSON.parse('{"label":"InnoDB","permalink":"/tags/inno-db","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/49c232d6.18360dd6.js b/assets/js/49c232d6.18360dd6.js new file mode 100644 index 000000000..bec61a869 --- /dev/null +++ b/assets/js/49c232d6.18360dd6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7176],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),k=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=k(e.components);return n.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},i=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),i=k(r),b=a,s=i["".concat(u,".").concat(b)]||i[b]||m[b]||p;return r?n.createElement(s,o(o({ref:t},c),{},{components:r})):n.createElement(s,o({ref:t},c))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=i;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var k=2;k{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>p,metadata:()=>l,toc:()=>k});var n=r(87462),a=(r(67294),r(3905));const p={title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:20,tags:["Book"]},o=void 0,l={permalink:"/20",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",source:"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",description:"\ucc45 \uc815\ubcf4",date:"2023-04-08T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 8\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.16,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:"20",tags:["Book"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"},nextItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"}},u={authorsImageUrls:[]},k=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18",id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],c={toc:k};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ube48\uc800\uc5f0\uad6c\uc18c")),(0,a.kt)("h3",{id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18"},"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18"),(0,a.kt)("p",null,"\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 "),(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704")),(0,a.kt)("p",null,"\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,a.kt)("p",null,"\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. "),(0,a.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","R. D. \ub7ad",(0,a.kt)("br",{parentName:"p"}),"\n","p.19")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.66")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc54c\ub7ad, \ud0c1\ub2db\ud55c",(0,a.kt)("br",{parentName:"p"}),"\n","p.103")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.175")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0.",(0,a.kt)("br",{parentName:"p"}),"\n","p.188")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.214")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.224")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.280")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/49c232d6.98017ff7.js b/assets/js/49c232d6.98017ff7.js deleted file mode 100644 index a8913a086..000000000 --- a/assets/js/49c232d6.98017ff7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7176],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),k=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=k(e.components);return n.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},i=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),i=k(r),b=a,s=i["".concat(u,".").concat(b)]||i[b]||m[b]||p;return r?n.createElement(s,o(o({ref:t},c),{},{components:r})):n.createElement(s,o({ref:t},c))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=i;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var k=2;k{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>p,metadata:()=>l,toc:()=>k});var n=r(7462),a=(r(7294),r(3905));const p={title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:20,tags:["Book"]},o=void 0,l={permalink:"/20",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",source:"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",description:"\ucc45 \uc815\ubcf4",date:"2023-04-08T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 8\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.16,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:"20",tags:["Book"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"},nextItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"}},u={authorsImageUrls:[]},k=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18",id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],c={toc:k};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ube48\uc800\uc5f0\uad6c\uc18c")),(0,a.kt)("h3",{id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18"},"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18"),(0,a.kt)("p",null,"\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 "),(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704")),(0,a.kt)("p",null,"\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,a.kt)("p",null,"\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. "),(0,a.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","R. D. \ub7ad",(0,a.kt)("br",{parentName:"p"}),"\n","p.19")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.66")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc54c\ub7ad, \ud0c1\ub2db\ud55c",(0,a.kt)("br",{parentName:"p"}),"\n","p.103")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.175")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0.",(0,a.kt)("br",{parentName:"p"}),"\n","p.188")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.214")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.224")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.280")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4aa09797.89d260fe.js b/assets/js/4aa09797.89d260fe.js new file mode 100644 index 000000000..aa1b660a7 --- /dev/null +++ b/assets/js/4aa09797.89d260fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3306],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,g=d["".concat(c,".").concat(m)]||d[m]||s[m]||l;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const l={title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:26,tags:["DTO"]},o=void 0,i={permalink:"/26",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",source:"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",description:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",date:"2023-05-24T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 24\uc77c",tags:[{label:"DTO",permalink:"/tags/dto"}],readingTime:7.525,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:"26",tags:["DTO"]},prevItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"},nextItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"}},c={authorsImageUrls:[]},p=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815",id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815",level:3},{value:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5",level:3},{value:"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c",id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c",level:3},{value:"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc",id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30",level:3},{value:"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30",id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30",level:3},{value:"\uc815\ub9ac",id:"\uc815\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:p};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4."),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815"},"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf51",src:n(71676).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?"),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},(0,a.kt)("inlineCode",{parentName:"p"},"ProductSaveRequest"),"\uc640 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProductUpdateRequest"),"\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e")),(0,a.kt)("p",null,"\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!")),(0,a.kt)("h3",{id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5"},"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5"),(0,a.kt)("p",null,"\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("h3",{id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c"},"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c"),(0,a.kt)("p",null,"\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! "),(0,a.kt)("h3",{id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc"},"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc"),(0,a.kt)("p",null,"\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Controller\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\n\u251c\u2500\u2500 dto\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf52",src:n(35430).Z,width:"1528",height:"912"})),(0,a.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30"},"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf53",src:n(12732).Z,width:"1518",height:"904"})),(0,a.kt)("p",null,"\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public interface ProductSaveRequest {\n\n String getName();\n\n String getImage();\n\n Long getPrice();\n}\n\n// ProductService\npublic Long save(final ProductSaveRequest request) {\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\n return productDao.saveAndGetId(product);\n}\n")),(0,a.kt)("h3",{id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30"},"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf54",src:n(33070).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\n\n @NotBlank(message = "\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n @Size(min = 1, max = 100, message = "\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final String name;\n\n @NotBlank(message = "\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n private final String image;\n\n @Range(message = "\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final long price;\n\n public ProductRequest(final String name, final String image, final long price) {\n this.name = name;\n this.image = image;\n this.price = price;\n }\n\n @Override\n public String getName() {\n return name;\n }\n\n @Override\n public String getImage() {\n return image;\n }\n\n @Override\n public long getPrice() {\n return price;\n }\n}\n\n// ProductController\n@PostMapping("/products")\npublic ResponseEntity save(@Valid @RequestBody final ProductRequest request) {\n final Long id = productService.save(request);\n return ResponseEntity.created(URI.create("/products/" + id)).build();\n}\n')),(0,a.kt)("h3",{id:"\uc815\ub9ac"},"\uc815\ub9ac"),(0,a.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. "),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,"\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/2647/"},"https://techblog.woowahan.com/2647/"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/"},"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/")))}s.isMDXComponent=!0},71676:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf51-ccd4f91674b224578f2b295b3fccaf2c.png"},35430:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf52-0b4f9f493909fc139f0e4579f7569a6b.png"},12732:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf53-1b6b93bc790ba29844083df5b70dbd2c.png"},33070:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf54-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/4aa09797.93086bbd.js b/assets/js/4aa09797.93086bbd.js deleted file mode 100644 index 851886351..000000000 --- a/assets/js/4aa09797.93086bbd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3306],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,g=d["".concat(c,".").concat(m)]||d[m]||s[m]||l;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const l={title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:26,tags:["DTO"]},o=void 0,i={permalink:"/26",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",source:"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",description:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",date:"2023-05-24T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 24\uc77c",tags:[{label:"DTO",permalink:"/tags/dto"}],readingTime:7.525,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:"26",tags:["DTO"]},prevItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"},nextItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"}},c={authorsImageUrls:[]},p=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815",id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815",level:3},{value:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5",level:3},{value:"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c",id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c",level:3},{value:"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc",id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30",level:3},{value:"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30",id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30",level:3},{value:"\uc815\ub9ac",id:"\uc815\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:p};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4."),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815"},"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf51",src:n(1676).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?"),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},(0,a.kt)("inlineCode",{parentName:"p"},"ProductSaveRequest"),"\uc640 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProductUpdateRequest"),"\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e")),(0,a.kt)("p",null,"\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!")),(0,a.kt)("h3",{id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5"},"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5"),(0,a.kt)("p",null,"\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("h3",{id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c"},"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c"),(0,a.kt)("p",null,"\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! "),(0,a.kt)("h3",{id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc"},"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc"),(0,a.kt)("p",null,"\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Controller\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\n\u251c\u2500\u2500 dto\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf52",src:n(5430).Z,width:"1528",height:"912"})),(0,a.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30"},"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf53",src:n(2732).Z,width:"1518",height:"904"})),(0,a.kt)("p",null,"\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public interface ProductSaveRequest {\n\n String getName();\n\n String getImage();\n\n Long getPrice();\n}\n\n// ProductService\npublic Long save(final ProductSaveRequest request) {\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\n return productDao.saveAndGetId(product);\n}\n")),(0,a.kt)("h3",{id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30"},"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf54",src:n(3070).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\n\n @NotBlank(message = "\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n @Size(min = 1, max = 100, message = "\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final String name;\n\n @NotBlank(message = "\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n private final String image;\n\n @Range(message = "\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final long price;\n\n public ProductRequest(final String name, final String image, final long price) {\n this.name = name;\n this.image = image;\n this.price = price;\n }\n\n @Override\n public String getName() {\n return name;\n }\n\n @Override\n public String getImage() {\n return image;\n }\n\n @Override\n public long getPrice() {\n return price;\n }\n}\n\n// ProductController\n@PostMapping("/products")\npublic ResponseEntity save(@Valid @RequestBody final ProductRequest request) {\n final Long id = productService.save(request);\n return ResponseEntity.created(URI.create("/products/" + id)).build();\n}\n')),(0,a.kt)("h3",{id:"\uc815\ub9ac"},"\uc815\ub9ac"),(0,a.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. "),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,"\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/2647/"},"https://techblog.woowahan.com/2647/"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/"},"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/")))}s.isMDXComponent=!0},1676:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf51-ccd4f91674b224578f2b295b3fccaf2c.png"},5430:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf52-0b4f9f493909fc139f0e4579f7569a6b.png"},2732:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf53-1b6b93bc790ba29844083df5b70dbd2c.png"},3070:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf54-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/4b2fba3e.06976912.js b/assets/js/4b2fba3e.06976912.js deleted file mode 100644 index 7575808c3..000000000 --- a/assets/js/4b2fba3e.06976912.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[328],{8234:e=>{e.exports=JSON.parse('{"permalink":"/tags/image/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/image/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4b2fba3e.ee7b0442.js b/assets/js/4b2fba3e.ee7b0442.js new file mode 100644 index 000000000..d58049545 --- /dev/null +++ b/assets/js/4b2fba3e.ee7b0442.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[328],{98234:e=>{e.exports=JSON.parse('{"permalink":"/tags/image/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/image/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4f3c73fd.3f344332.js b/assets/js/4f3c73fd.3f344332.js new file mode 100644 index 000000000..041f7cd45 --- /dev/null +++ b/assets/js/4f3c73fd.3f344332.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8876],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:8,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/8",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",description:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",date:"2023-02-14T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.56,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:"8",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"},nextItem:{title:"Parameterized Tests",permalink:"/7"}},i={authorsImageUrls:[]},c=[{value:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc"},"\uc790\ub3d9\ucc28 \uacbd\uc8fc"),(0,a.kt)("p",null,"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. "),(0,a.kt)("p",null,"\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. "),(0,a.kt)("p",null,"\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("mermaid",{value:"---\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\n---\ngraph TD\n Cars --\x3e Car\n Car --\x3e Name\n Car --\x3e Position\n RacingGame --\x3e Count\n RacingGame --\x3e NumberGenerator\n RacingGame --\x3e Cars\n RacingCarController --\x3e RacingGame\n RandomNumberGenerator -.-> NumberGenerator\n RacingCarController --\x3e InputView\n InputView --\x3e InputValidator\n RacingCarController --\x3e OutputView"}),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4."),(0,a.kt)("p",null,"\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,"\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Assertions extracting")),(0,a.kt)("p",null,"\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Test\nvoid extracting() {\n final Cars cars = new Cars(List.of("car1", "car2"));\n\n assertThat(cars.getCars())\n .extracting(Car::getName)\n .containsExactly("car1", "car2");\n}\n')),(0,a.kt)("hr",null),(0,a.kt)("p",null,"\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?)",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,"\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4f3c73fd.748e6cfa.js b/assets/js/4f3c73fd.748e6cfa.js deleted file mode 100644 index 537f3ba59..000000000 --- a/assets/js/4f3c73fd.748e6cfa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8876],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:8,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/8",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",description:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",date:"2023-02-14T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.56,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:"8",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"},nextItem:{title:"Parameterized Tests",permalink:"/7"}},i={authorsImageUrls:[]},c=[{value:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc"},"\uc790\ub3d9\ucc28 \uacbd\uc8fc"),(0,a.kt)("p",null,"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. "),(0,a.kt)("p",null,"\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. "),(0,a.kt)("p",null,"\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("mermaid",{value:"---\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\n---\ngraph TD\n Cars --\x3e Car\n Car --\x3e Name\n Car --\x3e Position\n RacingGame --\x3e Count\n RacingGame --\x3e NumberGenerator\n RacingGame --\x3e Cars\n RacingCarController --\x3e RacingGame\n RandomNumberGenerator -.-> NumberGenerator\n RacingCarController --\x3e InputView\n InputView --\x3e InputValidator\n RacingCarController --\x3e OutputView"}),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4."),(0,a.kt)("p",null,"\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,"\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Assertions extracting")),(0,a.kt)("p",null,"\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Test\nvoid extracting() {\n final Cars cars = new Cars(List.of("car1", "car2"));\n\n assertThat(cars.getCars())\n .extracting(Car::getName)\n .containsExactly("car1", "car2");\n}\n')),(0,a.kt)("hr",null),(0,a.kt)("p",null,"\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?)",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,"\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5088fe06.2cc977cf.js b/assets/js/5088fe06.2cc977cf.js new file mode 100644 index 000000000..815e0a10e --- /dev/null +++ b/assets/js/5088fe06.2cc977cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[80],{86819:e=>{e.exports=JSON.parse('{"permalink":"/tags/log","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/509d519c.a26c94c2.js b/assets/js/509d519c.a26c94c2.js deleted file mode 100644 index 31b171fd6..000000000 --- a/assets/js/509d519c.a26c94c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[743],{4469:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/509d519c.caf52cd9.js b/assets/js/509d519c.caf52cd9.js new file mode 100644 index 000000000..7f4dc7ebf --- /dev/null +++ b/assets/js/509d519c.caf52cd9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[743],{24469:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/54150be7.a4cc9618.js b/assets/js/54150be7.a4cc9618.js new file mode 100644 index 000000000..d18a967cb --- /dev/null +++ b/assets/js/54150be7.a4cc9618.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5088],{98707:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/2","page":2,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java","nextPage":"/tags/java/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/54150be7.bae7104b.js b/assets/js/54150be7.bae7104b.js deleted file mode 100644 index f0415c2f7..000000000 --- a/assets/js/54150be7.bae7104b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5088],{8707:e=>{e.exports=JSON.parse('{"permalink":"/tags/java/page/2","page":2,"postsPerPage":1,"totalPages":5,"totalCount":5,"previousPage":"/tags/java","nextPage":"/tags/java/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/54cb095e.6cd97186.js b/assets/js/54cb095e.6cd97186.js deleted file mode 100644 index a0d69141e..000000000 --- a/assets/js/54cb095e.6cd97186.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7009],{5159:e=>{e.exports=JSON.parse('{"permalink":"/page/26","page":26,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/25","nextPage":"/page/27","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/54cb095e.924e1a0b.js b/assets/js/54cb095e.924e1a0b.js new file mode 100644 index 000000000..97f9e95e9 --- /dev/null +++ b/assets/js/54cb095e.924e1a0b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7009],{95159:e=>{e.exports=JSON.parse('{"permalink":"/page/26","page":26,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/25","nextPage":"/page/27","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/55960ee5.551a9f19.js b/assets/js/55960ee5.551a9f19.js deleted file mode 100644 index 75536c7d9..000000000 --- a/assets/js/55960ee5.551a9f19.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4121],{8070:e=>{e.exports=JSON.parse('[{"label":"JPA","permalink":"/docs/tags/jpa","count":1},{"label":"nginx","permalink":"/docs/tags/nginx","count":2},{"label":"etc","permalink":"/docs/tags/etc","count":1},{"label":"book","permalink":"/docs/tags/book","count":1},{"label":"monitoring","permalink":"/docs/tags/monitoring","count":1},{"label":"postmortem","permalink":"/docs/tags/postmortem","count":1},{"label":"pacakge","permalink":"/docs/tags/pacakge","count":1},{"label":"test","permalink":"/docs/tags/test","count":3}]')}}]); \ No newline at end of file diff --git a/assets/js/55960ee5.b42099f7.js b/assets/js/55960ee5.b42099f7.js new file mode 100644 index 000000000..9043de9ec --- /dev/null +++ b/assets/js/55960ee5.b42099f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4121],{88070:e=>{e.exports=JSON.parse('[{"label":"JPA","permalink":"/docs/tags/jpa","count":1},{"label":"nginx","permalink":"/docs/tags/nginx","count":2},{"label":"etc","permalink":"/docs/tags/etc","count":1},{"label":"book","permalink":"/docs/tags/book","count":1},{"label":"monitoring","permalink":"/docs/tags/monitoring","count":1},{"label":"postmortem","permalink":"/docs/tags/postmortem","count":1},{"label":"pacakge","permalink":"/docs/tags/pacakge","count":1},{"label":"test","permalink":"/docs/tags/test","count":3}]')}}]); \ No newline at end of file diff --git a/assets/js/562496aa.049bf272.js b/assets/js/562496aa.049bf272.js deleted file mode 100644 index 717c6e49c..000000000 --- a/assets/js/562496aa.049bf272.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6161],{8146:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/tags/image","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/562496aa.a42c37e7.js b/assets/js/562496aa.a42c37e7.js new file mode 100644 index 000000000..e40ccb831 --- /dev/null +++ b/assets/js/562496aa.a42c37e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6161],{68146:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/tags/image","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/5a29fbab.d8c93ec9.js b/assets/js/5a29fbab.d8c93ec9.js new file mode 100644 index 000000000..511ca74aa --- /dev/null +++ b/assets/js/5a29fbab.d8c93ec9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7857],{25381:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse","page":1,"postsPerPage":1,"totalPages":11,"totalCount":11,"nextPage":"/tags/woowahan-techcourse/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/5a29fbab.e6e82d04.js b/assets/js/5a29fbab.e6e82d04.js deleted file mode 100644 index 289aa5945..000000000 --- a/assets/js/5a29fbab.e6e82d04.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7857],{5381:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse","page":1,"postsPerPage":1,"totalPages":11,"totalCount":11,"nextPage":"/tags/woowahan-techcourse/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/5a6c6934.8a355bab.js b/assets/js/5a6c6934.8a355bab.js new file mode 100644 index 000000000..bbe539f9a --- /dev/null +++ b/assets/js/5a6c6934.8a355bab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5953],{48630:e=>{e.exports=JSON.parse('{"label":"DTO","permalink":"/tags/dto","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/5a6c6934.e9ceaffa.js b/assets/js/5a6c6934.e9ceaffa.js deleted file mode 100644 index 3fa3a8784..000000000 --- a/assets/js/5a6c6934.e9ceaffa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5953],{8630:e=>{e.exports=JSON.parse('{"label":"DTO","permalink":"/tags/dto","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/5c38e66e.0da28f48.js b/assets/js/5c38e66e.0da28f48.js deleted file mode 100644 index 1317112c2..000000000 --- a/assets/js/5c38e66e.0da28f48.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5521],{8638:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/5c38e66e.d3b442bf.js b/assets/js/5c38e66e.d3b442bf.js new file mode 100644 index 000000000..ff4743b2b --- /dev/null +++ b/assets/js/5c38e66e.d3b442bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5521],{28638:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/5eed1665.11fbf497.js b/assets/js/5eed1665.11fbf497.js deleted file mode 100644 index ff27ff5ed..000000000 --- a/assets/js/5eed1665.11fbf497.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8142],{9729:e=>{e.exports=JSON.parse('{"permalink":"/tags/lock","page":1,"postsPerPage":1,"totalPages":2,"totalCount":2,"nextPage":"/tags/lock/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/5eed1665.92b60a91.js b/assets/js/5eed1665.92b60a91.js new file mode 100644 index 000000000..2c9c04d37 --- /dev/null +++ b/assets/js/5eed1665.92b60a91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8142],{19729:e=>{e.exports=JSON.parse('{"permalink":"/tags/lock","page":1,"postsPerPage":1,"totalPages":2,"totalCount":2,"nextPage":"/tags/lock/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/5f785aa3.a49be2fc.js b/assets/js/5f785aa3.a49be2fc.js new file mode 100644 index 000000000..3cdd511ef --- /dev/null +++ b/assets/js/5f785aa3.a49be2fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[497],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>d});var a=t(67294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var o=a.createContext({}),p=function(e){var n=a.useContext(o),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(o.Provider,{value:n},e.children)},k={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,i=e.mdxType,s=e.originalType,o=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(t),d=i,m=u["".concat(o,".").concat(d)]||u[d]||k[d]||s;return t?a.createElement(m,r(r({ref:n},c),{},{components:t})):a.createElement(m,r({ref:n},c))}));function d(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var s=t.length,r=new Array(s);r[0]=u;var l={};for(var o in n)hasOwnProperty.call(n,o)&&(l[o]=n[o]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>k,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var a=t(87462),i=(t(67294),t(3905));const s={title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:22,tags:["Jenkins","Elastic Beanstalk"]},r=void 0,l={permalink:"/22",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",source:"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",title:"Jenkins\ub85c CI/CD \uc124\uc815",description:"\uc124\uc815 \ud658\uacbd",date:"2023-04-30T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 30\uc77c",tags:[{label:"Jenkins",permalink:"/tags/jenkins"},{label:"Elastic Beanstalk",permalink:"/tags/elastic-beanstalk"}],readingTime:7.495,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:"22",tags:["Jenkins","Elastic Beanstalk"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"},nextItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"}},o={authorsImageUrls:[]},p=[{value:"\uc124\uc815 \ud658\uacbd",id:"\uc124\uc815-\ud658\uacbd",level:3},{value:"[EC2 CLI] Swap \uba54\ubaa8\ub9ac \uc124\uc815",id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815",level:3},{value:"[EC2 CLI] jenkins \uc124\uce58",id:"ec2-cli-jenkins-\uc124\uce58",level:3},{value:"[EC2 CLI] Jenkins \uc2dc\uc791",id:"ec2-cli-jenkins-\uc2dc\uc791",level:3},{value:"[EC2 CLI] nginx & git \uc124\uce58",id:"ec2-cli-nginx--git-\uc124\uce58",level:3},{value:"[EC2 CLI] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815",id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815",level:3},{value:"[Jenkins] Jenkins \uc811\uc18d",id:"jenkins-jenkins-\uc811\uc18d",level:3},{value:"[Jenkins] Jenkins Blue Ocean \uc124\uce58",id:"jenkins-jenkins-blue-ocean-\uc124\uce58",level:3},{value:"[AWS IAM & EC2] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30",id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30",level:3},{value:"[AWS S3] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131",id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131",level:3},{value:"[Github] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131",id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131",level:3},{value:"[Jenkins] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791",id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791",level:3},{value:"[Github Repsoitory] Jenkinsfile \uc124\uc815",id:"github-repsoitory-jenkinsfile-\uc124\uc815",level:3},{value:"[Github] Webhooks \uc124\uc815",id:"github-webhooks-\uc124\uc815",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:p};function k(e){let{components:n,...s}=e;return(0,i.kt)("wrapper",(0,a.Z)({},c,s,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"\uc124\uc815-\ud658\uacbd"},"\uc124\uc815 \ud658\uacbd"),(0,i.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ud0a4\ud14d\uccd0: ARM",(0,i.kt)("br",{parentName:"p"}),"\n","\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small",(0,i.kt)("br",{parentName:"p"}),"\n","\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk",(0,i.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository"),(0,i.kt)("h3",{id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815"},"[","EC2 CLI","]"," Swap \uba54\ubaa8\ub9ac \uc124\uc815"),(0,i.kt)("p",null,"t4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\nsudo fallocate -l 2G /swapfile\n\n# \uad8c\ud55c \uc124\uc815\nsudo chmod 600 /swapfile\n\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\nsudo mkswap /swapfile\nsudo swapon /swapfile\n\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\nsudo vim /etc/fstab\n")),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc124\uce58"},"[","EC2 CLI","]"," jenkins \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo wget -O /etc/yum.repos.d/jenkins.repo \\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\nsudo yum upgrade\nsudo yum install java-17-amazon-corretto-devel\nsudo yum install jenkins\nsudo systemctl daemon-reload\n")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0")," \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc2dc\uc791"},"[","EC2 CLI","]"," Jenkins \uc2dc\uc791"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl enable jenkins\nsudo systemctl start jenkins\n")),(0,i.kt)("p",null,"enable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx--git-\uc124\uce58"},"[","EC2 CLI","]"," nginx & git \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo yum install nginx\nsudo systemctl enable nginx\nsudo systemctl start nginx\n\nsudo yum install git\n")),(0,i.kt)("p",null,"nginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815"},"[","EC2 CLI","]"," nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815"),(0,i.kt)("p",null,"\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'upstream jenkins {\n keepalive 32; # keepalive connections\n server 127.0.0.1:8080; # jenkins ip and port\n}\n\n# Required for Jenkins websocket agents\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n \'\' close;\n}\n\nserver {\n listen 80; # Listen on port 80 for IPv4 requests\n\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\n\n # this is the jenkins web root directory\n # (mentioned in the output of "systemctl cat jenkins")\n root /var/run/jenkins/war/;\n\n access_log /var/log/nginx/jenkins.access.log;\n error_log /var/log/nginx/jenkins.error.log;\n\n # pass through headers from Jenkins that Nginx considers invalid\n ignore_invalid_headers off;\n\n location ~ "^/static/[0-9a-fA-F]{8}\\/(.*)$" {\n # rewrite all static files into requests to the root\n # E.g /static/12345678/css/something.css will become /css/something.css\n rewrite "^/static/[0-9a-fA-F]{8}\\/(.*)" /$1 last;\n }\n\n location /userContent {\n # have nginx handle all the static requests to userContent folder\n # note : This is the $JENKINS_HOME dir\n root /var/lib/jenkins/;\n if (!-f $request_filename){\n # this file does not exist, might be a directory or a /**view** url\n rewrite (.*) /$1 last;\n break;\n }\n sendfile on;\n }\n\n location / {\n sendfile off;\n proxy_pass http://jenkins;\n proxy_redirect default;\n proxy_http_version 1.1;\n\n # Required for Jenkins websocket agents\n proxy_set_header Connection $connection_upgrade;\n proxy_set_header Upgrade $http_upgrade;\n\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_max_temp_file_size 0;\n\n #this is the maximum upload size\n client_max_body_size 10m;\n client_body_buffer_size 128k;\n\n proxy_connect_timeout 90;\n proxy_send_timeout 90;\n proxy_read_timeout 90;\n proxy_buffering off;\n proxy_request_buffering off; # Required for HTTP CLI commands\n proxy_set_header Connection ""; # Clear for keepalive\n }\n\n}\n')),(0,i.kt)("p",null,"Jenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d"),"\xa0\uc544\ub798\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"default.conf"),"\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","nginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"include /etc/nginx/conf.d/*.conf;"),"\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0",(0,i.kt)("inlineCode",{parentName:"p"},".conf"),"\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc124\uc815 \ud6c4\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo nginx -t"),"\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo systemctl restart nginx"),"\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-\uc811\uc18d"},"[","Jenkins","]"," Jenkins \uc811\uc18d"),(0,i.kt)("p",null,"Jenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","EC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-start",src:t(83374).Z,width:"2008",height:"1836"})),(0,i.kt)("p",null,"\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo cat /var/lib/jenkins/secrets/initialAdminPasswor")," \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"install suggested plugins"),"\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-blue-ocean-\uc124\uce58"},"[","Jenkins","]"," Jenkins Blue Ocean \uc124\uce58"),(0,i.kt)("p",null,"Jenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30"},"[","AWS IAM & EC2","]"," IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30"),(0,i.kt)("p",null,"S3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","IAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"\uc5d4\ud130\ud2f0 \uc120\ud0dd")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam1",src:t(82994).Z,width:"2282",height:"1028"})),(0,i.kt)("ol",{start:2},(0,i.kt)("li",{parentName:"ol"},"\uad8c\ud55c \ucd94\uac00")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam2",src:t(67345).Z,width:"2300",height:"880"})),(0,i.kt)("ol",{start:3},(0,i.kt)("li",{parentName:"ol"},"\uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam3",src:t(30328).Z,width:"1872",height:"1724"})),(0,i.kt)("ol",{start:4},(0,i.kt)("li",{parentName:"ol"},"\uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam4",src:t(30290).Z,width:"2264",height:"602"})),(0,i.kt)("h3",{id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131"},"[","AWS S3","]"," Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131"),(0,i.kt)("p",null,"\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8"))),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-s3",src:t(63649).Z,width:"1636",height:"1258"})),(0,i.kt)("h3",{id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131"},"[","Github","]"," Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131"),(0,i.kt)("p",null,"repo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791"},"[","Jenkins","]"," \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean1",src:t(34590).Z,width:"2390",height:"1372"})),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","Jenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean2",src:t(69685).Z,width:"2076",height:"638"})),(0,i.kt)("p",null,"\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean3",src:t(60658).Z,width:"1084",height:"626"})),(0,i.kt)("h3",{id:"github-repsoitory-jenkinsfile-\uc124\uc815"},"[","Github Repsoitory","]"," Jenkinsfile \uc124\uc815"),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pipeline {\n agent any\n stages {\n stage('build and test') {\n steps {\n sh '/gradlew clean build'\n }\n }\n stage('zip') {\n steps {\n sh 'mv ./build/libs/woowachat.jar .'\n sh 'zip -r woowachat.zip .platform delivery.jar Procfile'\n }\n }\n stage('upload') {\n steps {\n sh 'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2'\n }\n }\n stage('deploy') {\n steps {\n sh 'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\"woowa-chat\",S3Key=\"woowachat.zip\"'\n sh 'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}'\n }\n }\n }\n}\n")),(0,i.kt)("h3",{id:"github-webhooks-\uc124\uc815"},"[","Github","]"," Webhooks \uc124\uc815"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"github-hook",src:t(2326).Z,width:"1428",height:"1148"})),(0,i.kt)("p",null,"push \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c ",(0,i.kt)("inlineCode",{parentName:"p"},"http://Jenkins\uc8fc\uc18c/github-webhook/")," \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Install Jenkins - CentOS, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/"},"Nginx Reverse Proxy Configuration, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html"},"Amazon Corretto 17 JDK Install, AWS"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html"},"Amazon Linux 2023 packages, AWS")))}k.isMDXComponent=!0},82994:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam1-e6d63be6b9f41d63e91d604138e6b07c.png"},67345:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam2-557683fc91b1c22330d081d6050dfe82.png"},30328:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam3-94248e9194dd58bb16d0289af47a4260.png"},30290:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam4-54ccc5a4e64d31f7eeab89d39ebf772f.png"},63649:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-s3-757380d36e5492c962f75dae024994e5.png"},2326:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/github-hook-e9ebe0acb3ff0086ecebbd8c857ffe39.png"},34590:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean1-bd108d887d700ea081e4b0a3d83ad459.png"},69685:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean2-408c6c90e4a5371becc4d1013fba1212.png"},60658:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean3-4050a206b3efe95a3c9f39c3f7a47ad7.png"},83374:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-start-dce0d7051054c398d2a707c75c685234.png"}}]); \ No newline at end of file diff --git a/assets/js/5f785aa3.da498f81.js b/assets/js/5f785aa3.da498f81.js deleted file mode 100644 index d4a3f9775..000000000 --- a/assets/js/5f785aa3.da498f81.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[497],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>d});var a=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var o=a.createContext({}),p=function(e){var n=a.useContext(o),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(o.Provider,{value:n},e.children)},k={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,i=e.mdxType,s=e.originalType,o=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(t),d=i,m=u["".concat(o,".").concat(d)]||u[d]||k[d]||s;return t?a.createElement(m,r(r({ref:n},c),{},{components:t})):a.createElement(m,r({ref:n},c))}));function d(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var s=t.length,r=new Array(s);r[0]=u;var l={};for(var o in n)hasOwnProperty.call(n,o)&&(l[o]=n[o]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>k,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var a=t(7462),i=(t(7294),t(3905));const s={title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:22,tags:["Jenkins","Elastic Beanstalk"]},r=void 0,l={permalink:"/22",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",source:"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",title:"Jenkins\ub85c CI/CD \uc124\uc815",description:"\uc124\uc815 \ud658\uacbd",date:"2023-04-30T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 30\uc77c",tags:[{label:"Jenkins",permalink:"/tags/jenkins"},{label:"Elastic Beanstalk",permalink:"/tags/elastic-beanstalk"}],readingTime:7.495,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:"22",tags:["Jenkins","Elastic Beanstalk"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"},nextItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"}},o={authorsImageUrls:[]},p=[{value:"\uc124\uc815 \ud658\uacbd",id:"\uc124\uc815-\ud658\uacbd",level:3},{value:"[EC2 CLI] Swap \uba54\ubaa8\ub9ac \uc124\uc815",id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815",level:3},{value:"[EC2 CLI] jenkins \uc124\uce58",id:"ec2-cli-jenkins-\uc124\uce58",level:3},{value:"[EC2 CLI] Jenkins \uc2dc\uc791",id:"ec2-cli-jenkins-\uc2dc\uc791",level:3},{value:"[EC2 CLI] nginx & git \uc124\uce58",id:"ec2-cli-nginx--git-\uc124\uce58",level:3},{value:"[EC2 CLI] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815",id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815",level:3},{value:"[Jenkins] Jenkins \uc811\uc18d",id:"jenkins-jenkins-\uc811\uc18d",level:3},{value:"[Jenkins] Jenkins Blue Ocean \uc124\uce58",id:"jenkins-jenkins-blue-ocean-\uc124\uce58",level:3},{value:"[AWS IAM & EC2] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30",id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30",level:3},{value:"[AWS S3] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131",id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131",level:3},{value:"[Github] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131",id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131",level:3},{value:"[Jenkins] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791",id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791",level:3},{value:"[Github Repsoitory] Jenkinsfile \uc124\uc815",id:"github-repsoitory-jenkinsfile-\uc124\uc815",level:3},{value:"[Github] Webhooks \uc124\uc815",id:"github-webhooks-\uc124\uc815",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:p};function k(e){let{components:n,...s}=e;return(0,i.kt)("wrapper",(0,a.Z)({},c,s,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"\uc124\uc815-\ud658\uacbd"},"\uc124\uc815 \ud658\uacbd"),(0,i.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ud0a4\ud14d\uccd0: ARM",(0,i.kt)("br",{parentName:"p"}),"\n","\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small",(0,i.kt)("br",{parentName:"p"}),"\n","\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk",(0,i.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository"),(0,i.kt)("h3",{id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815"},"[","EC2 CLI","]"," Swap \uba54\ubaa8\ub9ac \uc124\uc815"),(0,i.kt)("p",null,"t4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\nsudo fallocate -l 2G /swapfile\n\n# \uad8c\ud55c \uc124\uc815\nsudo chmod 600 /swapfile\n\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\nsudo mkswap /swapfile\nsudo swapon /swapfile\n\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\nsudo vim /etc/fstab\n")),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc124\uce58"},"[","EC2 CLI","]"," jenkins \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo wget -O /etc/yum.repos.d/jenkins.repo \\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\nsudo yum upgrade\nsudo yum install java-17-amazon-corretto-devel\nsudo yum install jenkins\nsudo systemctl daemon-reload\n")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0")," \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc2dc\uc791"},"[","EC2 CLI","]"," Jenkins \uc2dc\uc791"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl enable jenkins\nsudo systemctl start jenkins\n")),(0,i.kt)("p",null,"enable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx--git-\uc124\uce58"},"[","EC2 CLI","]"," nginx & git \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo yum install nginx\nsudo systemctl enable nginx\nsudo systemctl start nginx\n\nsudo yum install git\n")),(0,i.kt)("p",null,"nginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815"},"[","EC2 CLI","]"," nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815"),(0,i.kt)("p",null,"\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'upstream jenkins {\n keepalive 32; # keepalive connections\n server 127.0.0.1:8080; # jenkins ip and port\n}\n\n# Required for Jenkins websocket agents\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n \'\' close;\n}\n\nserver {\n listen 80; # Listen on port 80 for IPv4 requests\n\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\n\n # this is the jenkins web root directory\n # (mentioned in the output of "systemctl cat jenkins")\n root /var/run/jenkins/war/;\n\n access_log /var/log/nginx/jenkins.access.log;\n error_log /var/log/nginx/jenkins.error.log;\n\n # pass through headers from Jenkins that Nginx considers invalid\n ignore_invalid_headers off;\n\n location ~ "^/static/[0-9a-fA-F]{8}\\/(.*)$" {\n # rewrite all static files into requests to the root\n # E.g /static/12345678/css/something.css will become /css/something.css\n rewrite "^/static/[0-9a-fA-F]{8}\\/(.*)" /$1 last;\n }\n\n location /userContent {\n # have nginx handle all the static requests to userContent folder\n # note : This is the $JENKINS_HOME dir\n root /var/lib/jenkins/;\n if (!-f $request_filename){\n # this file does not exist, might be a directory or a /**view** url\n rewrite (.*) /$1 last;\n break;\n }\n sendfile on;\n }\n\n location / {\n sendfile off;\n proxy_pass http://jenkins;\n proxy_redirect default;\n proxy_http_version 1.1;\n\n # Required for Jenkins websocket agents\n proxy_set_header Connection $connection_upgrade;\n proxy_set_header Upgrade $http_upgrade;\n\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_max_temp_file_size 0;\n\n #this is the maximum upload size\n client_max_body_size 10m;\n client_body_buffer_size 128k;\n\n proxy_connect_timeout 90;\n proxy_send_timeout 90;\n proxy_read_timeout 90;\n proxy_buffering off;\n proxy_request_buffering off; # Required for HTTP CLI commands\n proxy_set_header Connection ""; # Clear for keepalive\n }\n\n}\n')),(0,i.kt)("p",null,"Jenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d"),"\xa0\uc544\ub798\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"default.conf"),"\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","nginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"include /etc/nginx/conf.d/*.conf;"),"\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0",(0,i.kt)("inlineCode",{parentName:"p"},".conf"),"\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc124\uc815 \ud6c4\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo nginx -t"),"\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo systemctl restart nginx"),"\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-\uc811\uc18d"},"[","Jenkins","]"," Jenkins \uc811\uc18d"),(0,i.kt)("p",null,"Jenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","EC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-start",src:t(3374).Z,width:"2008",height:"1836"})),(0,i.kt)("p",null,"\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo cat /var/lib/jenkins/secrets/initialAdminPasswor")," \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"install suggested plugins"),"\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-blue-ocean-\uc124\uce58"},"[","Jenkins","]"," Jenkins Blue Ocean \uc124\uce58"),(0,i.kt)("p",null,"Jenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30"},"[","AWS IAM & EC2","]"," IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30"),(0,i.kt)("p",null,"S3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","IAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"\uc5d4\ud130\ud2f0 \uc120\ud0dd")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam1",src:t(2994).Z,width:"2282",height:"1028"})),(0,i.kt)("ol",{start:2},(0,i.kt)("li",{parentName:"ol"},"\uad8c\ud55c \ucd94\uac00")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam2",src:t(7345).Z,width:"2300",height:"880"})),(0,i.kt)("ol",{start:3},(0,i.kt)("li",{parentName:"ol"},"\uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam3",src:t(2542).Z,width:"1872",height:"1724"})),(0,i.kt)("ol",{start:4},(0,i.kt)("li",{parentName:"ol"},"\uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam4",src:t(333).Z,width:"2264",height:"602"})),(0,i.kt)("h3",{id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131"},"[","AWS S3","]"," Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131"),(0,i.kt)("p",null,"\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8"))),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-s3",src:t(3649).Z,width:"1636",height:"1258"})),(0,i.kt)("h3",{id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131"},"[","Github","]"," Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131"),(0,i.kt)("p",null,"repo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791"},"[","Jenkins","]"," \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean1",src:t(4590).Z,width:"2390",height:"1372"})),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","Jenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean2",src:t(9685).Z,width:"2076",height:"638"})),(0,i.kt)("p",null,"\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean3",src:t(658).Z,width:"1084",height:"626"})),(0,i.kt)("h3",{id:"github-repsoitory-jenkinsfile-\uc124\uc815"},"[","Github Repsoitory","]"," Jenkinsfile \uc124\uc815"),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pipeline {\n agent any\n stages {\n stage('build and test') {\n steps {\n sh '/gradlew clean build'\n }\n }\n stage('zip') {\n steps {\n sh 'mv ./build/libs/woowachat.jar .'\n sh 'zip -r woowachat.zip .platform delivery.jar Procfile'\n }\n }\n stage('upload') {\n steps {\n sh 'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2'\n }\n }\n stage('deploy') {\n steps {\n sh 'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\"woowa-chat\",S3Key=\"woowachat.zip\"'\n sh 'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}'\n }\n }\n }\n}\n")),(0,i.kt)("h3",{id:"github-webhooks-\uc124\uc815"},"[","Github","]"," Webhooks \uc124\uc815"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"github-hook",src:t(2326).Z,width:"1428",height:"1148"})),(0,i.kt)("p",null,"push \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c ",(0,i.kt)("inlineCode",{parentName:"p"},"http://Jenkins\uc8fc\uc18c/github-webhook/")," \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Install Jenkins - CentOS, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/"},"Nginx Reverse Proxy Configuration, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html"},"Amazon Corretto 17 JDK Install, AWS"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html"},"Amazon Linux 2023 packages, AWS")))}k.isMDXComponent=!0},2994:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam1-e6d63be6b9f41d63e91d604138e6b07c.png"},7345:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam2-557683fc91b1c22330d081d6050dfe82.png"},2542:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam3-94248e9194dd58bb16d0289af47a4260.png"},333:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam4-54ccc5a4e64d31f7eeab89d39ebf772f.png"},3649:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-s3-757380d36e5492c962f75dae024994e5.png"},2326:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/github-hook-e9ebe0acb3ff0086ecebbd8c857ffe39.png"},4590:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean1-bd108d887d700ea081e4b0a3d83ad459.png"},9685:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean2-408c6c90e4a5371becc4d1013fba1212.png"},658:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean3-4050a206b3efe95a3c9f39c3f7a47ad7.png"},3374:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-start-dce0d7051054c398d2a707c75c685234.png"}}]); \ No newline at end of file diff --git a/assets/js/5f81b25c.772ab286.js b/assets/js/5f81b25c.772ab286.js new file mode 100644 index 000000000..4aa1c42e0 --- /dev/null +++ b/assets/js/5f81b25c.772ab286.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4889],{29492:e=>{e.exports=JSON.parse('{"permalink":"/page/27","page":27,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/26","nextPage":"/page/28","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/5f81b25c.eaba0893.js b/assets/js/5f81b25c.eaba0893.js deleted file mode 100644 index 46f531b53..000000000 --- a/assets/js/5f81b25c.eaba0893.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4889],{9492:e=>{e.exports=JSON.parse('{"permalink":"/page/27","page":27,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/26","nextPage":"/page/28","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/5ffd2c10.18750ca4.js b/assets/js/5ffd2c10.18750ca4.js deleted file mode 100644 index 0bf359ae9..000000000 --- a/assets/js/5ffd2c10.18750ca4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2100],{6515:e=>{e.exports=JSON.parse('{"label":"JPA","permalink":"/docs/tags/jpa","allTagsPath":"/docs/tags","count":1,"items":[{"id":"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","title":"\uae30\ubcf8 \ud0a4 \ub9e4\ud551","description":"\uae30\ubcf8 \ud0a4 \ub9e4\ud551","permalink":"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5ffd2c10.c592d621.js b/assets/js/5ffd2c10.c592d621.js new file mode 100644 index 000000000..d186230b6 --- /dev/null +++ b/assets/js/5ffd2c10.c592d621.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2100],{86515:e=>{e.exports=JSON.parse('{"label":"JPA","permalink":"/docs/tags/jpa","allTagsPath":"/docs/tags","count":1,"items":[{"id":"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","title":"\uae30\ubcf8 \ud0a4 \ub9e4\ud551","description":"\uae30\ubcf8 \ud0a4 \ub9e4\ud551","permalink":"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551"}]}')}}]); \ No newline at end of file diff --git a/assets/js/6048.a886985f.js b/assets/js/6048.a886985f.js new file mode 100644 index 000000000..f0631e225 --- /dev/null +++ b/assets/js/6048.a886985f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6048],{39058:(e,t,a)=>{a.d(t,{Z:()=>N});var l=a(67294),n=a(86010),r=a(54774),o=a(87524),s=a(39960),c=a(95999);const m="sidebar_re4s",i="sidebarItemTitle_pO2u",u="sidebarItemList_Yudw",d="sidebarItem__DBe",g="sidebarItemLink_mo7H",p="sidebarItemLinkActive_I1ZP";function h(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(m,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(i,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(u,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:d},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:g,activeClassName:p},e.title)))))))}var E=a(13102);function f(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function b(e){return l.createElement(E.Zo,{component:f,props:e})}function v(e){let{sidebar:t}=e;const a=(0,o.i)();return t?.items.length?"mobile"===a?l.createElement(b,{sidebar:t}):l.createElement(h,{sidebar:t}):null}function N(e){const{sidebar:t,toc:a,children:o,...s}=e,c=t&&t.items.length>0;return l.createElement(r.Z,s,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(v,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":c,"col--9 col--offset-1":!c}),itemScope:!0,itemType:"http://schema.org/Blog"},o),a&&l.createElement("div",{className:"col col--2"},a))))}},30390:(e,t,a)=>{a.d(t,{Z:()=>x});var l=a(67294),n=a(86010),r=a(9460),o=a(44996);function s(e){let{children:t,className:a}=e;const{frontMatter:n,assets:s}=(0,r.C)(),{withBaseUrl:c}=(0,o.C)(),m=s.image??n.image;return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},m&&l.createElement("meta",{itemProp:"image",content:c(m,{absolute:!0})}),t)}var c=a(39960);const m="title_f1Hy";function i(e){let{className:t}=e;const{metadata:a,isBlogPostPage:o}=(0,r.C)(),{permalink:s,title:i}=a,u=o?"h1":"h2";return l.createElement(u,{className:(0,n.Z)(m,t),itemProp:"headline"},o?i:l.createElement(c.Z,{itemProp:"url",to:s},i))}var u=a(95999),d=a(88824);const g="container_mt6G";function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function f(e){let{className:t}=e;const{metadata:a}=(0,r.C)(),{date:o,formattedDate:s,readingTime:c}=a;return l.createElement("div",{className:(0,n.Z)(g,"margin-vert--md",t)},l.createElement(h,{date:o,formattedDate:s}),void 0!==c&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:c})))}function b(e){return e.href?l.createElement(c.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:r,title:o,url:s,imageURL:c,email:m}=t,i=s||m&&`mailto:${m}`||void 0;return l.createElement("div",{className:(0,n.Z)("avatar margin-bottom--sm",a)},c&&l.createElement(b,{href:i,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:c,alt:r})),r&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(b,{href:i,itemProp:"url"},l.createElement("span",{itemProp:"name"},r))),o&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},o)))}const N="authorCol_Hf19",P="imageOnlyAuthorRow_pa_O",_="imageOnlyAuthorCol_G86a";function Z(e){let{className:t}=e;const{metadata:{authors:a},assets:o}=(0,r.C)();if(0===a.length)return null;const s=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,n.Z)("margin-top--md margin-bottom--sm",s?P:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,n.Z)(!s&&"col col--6",s?_:N),key:t},l.createElement(v,{author:{...e,imageURL:o.authorsImageUrls[t]??e.imageURL}})))))}function k(){return l.createElement("header",null,l.createElement(i,null),l.createElement(f,null),l.createElement(Z,null))}var w=a(18780),C=a(4155);function T(e){let{children:t,className:a}=e;const{isBlogPostPage:o}=(0,r.C)();return l.createElement("div",{id:o?w.blogPostContainerID:void 0,className:(0,n.Z)("markdown",a),itemProp:"articleBody"},l.createElement(C.Z,null,t))}var y=a(84881),B=a(71526),I=a(87462);function F(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function M(e){const{blogPostTitle:t,...a}=e;return l.createElement(c.Z,(0,I.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(F,null))}const L="blogPostFooterDetailsFull_mRVl";function R(){const{metadata:e,isBlogPostPage:t}=(0,r.C)(),{tags:a,title:o,editUrl:s,hasTruncateMarker:c}=e,m=!t&&c,i=a.length>0;return i||m||s?l.createElement("footer",{className:(0,n.Z)("row docusaurus-mt-lg",t&&L)},i&&l.createElement("div",{className:(0,n.Z)("col",{"col--9":m})},l.createElement(B.Z,{tags:a})),t&&s&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(y.Z,{editUrl:s})),m&&l.createElement("div",{className:(0,n.Z)("col text--right",{"col--3":i})},l.createElement(M,{blogPostTitle:o,to:e.permalink}))):null}function x(e){let{children:t,className:a}=e;const o=function(){const{isBlogPostPage:e}=(0,r.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(s,{className:(0,n.Z)(o,a)},l.createElement(k,null),l.createElement(T,null,t),l.createElement(R,null))}},9460:(e,t,a)=>{a.d(t,{C:()=>s,n:()=>o});var l=a(67294),n=a(902);const r=l.createContext(null);function o(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const o=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return l.createElement(r.Provider,{value:o},t)}function s(){const e=(0,l.useContext)(r);if(null===e)throw new n.i6("BlogPostProvider");return e}},88824:(e,t,a)=>{a.d(t,{c:()=>m});var l=a(67294),n=a(52263);const r=["zero","one","two","few","many","other"];function o(e){return r.filter((t=>e.includes(t)))}const s={locale:"en",pluralForms:o(["one","other"]),select:e=>1===e?"one":"other"};function c(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:o(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),s}}),[e])}function m(){const e=c();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return l[Math.min(r,l.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/6048.afc89c49.js b/assets/js/6048.afc89c49.js deleted file mode 100644 index 4dcbdbd7d..000000000 --- a/assets/js/6048.afc89c49.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6048],{9058:(e,t,a)=>{a.d(t,{Z:()=>N});var l=a(7294),n=a(6010),r=a(4774),o=a(7524),s=a(9960),c=a(5999);const m="sidebar_re4s",i="sidebarItemTitle_pO2u",u="sidebarItemList_Yudw",d="sidebarItem__DBe",g="sidebarItemLink_mo7H",p="sidebarItemLinkActive_I1ZP";function h(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(m,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(i,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(u,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:d},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:g,activeClassName:p},e.title)))))))}var E=a(3102);function f(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function b(e){return l.createElement(E.Zo,{component:f,props:e})}function v(e){let{sidebar:t}=e;const a=(0,o.i)();return t?.items.length?"mobile"===a?l.createElement(b,{sidebar:t}):l.createElement(h,{sidebar:t}):null}function N(e){const{sidebar:t,toc:a,children:o,...s}=e,c=t&&t.items.length>0;return l.createElement(r.Z,s,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(v,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":c,"col--9 col--offset-1":!c}),itemScope:!0,itemType:"http://schema.org/Blog"},o),a&&l.createElement("div",{className:"col col--2"},a))))}},390:(e,t,a)=>{a.d(t,{Z:()=>x});var l=a(7294),n=a(6010),r=a(9460),o=a(4996);function s(e){let{children:t,className:a}=e;const{frontMatter:n,assets:s}=(0,r.C)(),{withBaseUrl:c}=(0,o.C)(),m=s.image??n.image;return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},m&&l.createElement("meta",{itemProp:"image",content:c(m,{absolute:!0})}),t)}var c=a(9960);const m="title_f1Hy";function i(e){let{className:t}=e;const{metadata:a,isBlogPostPage:o}=(0,r.C)(),{permalink:s,title:i}=a,u=o?"h1":"h2";return l.createElement(u,{className:(0,n.Z)(m,t),itemProp:"headline"},o?i:l.createElement(c.Z,{itemProp:"url",to:s},i))}var u=a(5999),d=a(8824);const g="container_mt6G";function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function f(e){let{className:t}=e;const{metadata:a}=(0,r.C)(),{date:o,formattedDate:s,readingTime:c}=a;return l.createElement("div",{className:(0,n.Z)(g,"margin-vert--md",t)},l.createElement(h,{date:o,formattedDate:s}),void 0!==c&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:c})))}function b(e){return e.href?l.createElement(c.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:r,title:o,url:s,imageURL:c,email:m}=t,i=s||m&&`mailto:${m}`||void 0;return l.createElement("div",{className:(0,n.Z)("avatar margin-bottom--sm",a)},c&&l.createElement(b,{href:i,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:c,alt:r})),r&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(b,{href:i,itemProp:"url"},l.createElement("span",{itemProp:"name"},r))),o&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},o)))}const N="authorCol_Hf19",P="imageOnlyAuthorRow_pa_O",_="imageOnlyAuthorCol_G86a";function Z(e){let{className:t}=e;const{metadata:{authors:a},assets:o}=(0,r.C)();if(0===a.length)return null;const s=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,n.Z)("margin-top--md margin-bottom--sm",s?P:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,n.Z)(!s&&"col col--6",s?_:N),key:t},l.createElement(v,{author:{...e,imageURL:o.authorsImageUrls[t]??e.imageURL}})))))}function k(){return l.createElement("header",null,l.createElement(i,null),l.createElement(f,null),l.createElement(Z,null))}var w=a(8780),C=a(4155);function T(e){let{children:t,className:a}=e;const{isBlogPostPage:o}=(0,r.C)();return l.createElement("div",{id:o?w.blogPostContainerID:void 0,className:(0,n.Z)("markdown",a),itemProp:"articleBody"},l.createElement(C.Z,null,t))}var y=a(4881),B=a(1526),I=a(7462);function F(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function M(e){const{blogPostTitle:t,...a}=e;return l.createElement(c.Z,(0,I.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(F,null))}const L="blogPostFooterDetailsFull_mRVl";function R(){const{metadata:e,isBlogPostPage:t}=(0,r.C)(),{tags:a,title:o,editUrl:s,hasTruncateMarker:c}=e,m=!t&&c,i=a.length>0;return i||m||s?l.createElement("footer",{className:(0,n.Z)("row docusaurus-mt-lg",t&&L)},i&&l.createElement("div",{className:(0,n.Z)("col",{"col--9":m})},l.createElement(B.Z,{tags:a})),t&&s&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(y.Z,{editUrl:s})),m&&l.createElement("div",{className:(0,n.Z)("col text--right",{"col--3":i})},l.createElement(M,{blogPostTitle:o,to:e.permalink}))):null}function x(e){let{children:t,className:a}=e;const o=function(){const{isBlogPostPage:e}=(0,r.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(s,{className:(0,n.Z)(o,a)},l.createElement(k,null),l.createElement(T,null,t),l.createElement(R,null))}},9460:(e,t,a)=>{a.d(t,{C:()=>s,n:()=>o});var l=a(7294),n=a(902);const r=l.createContext(null);function o(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const o=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return l.createElement(r.Provider,{value:o},t)}function s(){const e=(0,l.useContext)(r);if(null===e)throw new n.i6("BlogPostProvider");return e}},8824:(e,t,a)=>{a.d(t,{c:()=>m});var l=a(7294),n=a(2263);const r=["zero","one","two","few","many","other"];function o(e){return r.filter((t=>e.includes(t)))}const s={locale:"en",pluralForms:o(["one","other"]),select:e=>1===e?"one":"other"};function c(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:o(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),s}}),[e])}function m(){const e=c();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return l[Math.min(r,l.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/6093f82b.0af44a03.js b/assets/js/6093f82b.0af44a03.js new file mode 100644 index 000000000..fd1874176 --- /dev/null +++ b/assets/js/6093f82b.0af44a03.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6017],{30708:e=>{e.exports=JSON.parse('{"permalink":"/page/9","page":9,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/8","nextPage":"/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6093f82b.264aba6a.js b/assets/js/6093f82b.264aba6a.js deleted file mode 100644 index fd1dd152f..000000000 --- a/assets/js/6093f82b.264aba6a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6017],{708:e=>{e.exports=JSON.parse('{"permalink":"/page/9","page":9,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/8","nextPage":"/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/633582b9.05e73941.js b/assets/js/633582b9.05e73941.js new file mode 100644 index 000000000..4a9f64752 --- /dev/null +++ b/assets/js/633582b9.05e73941.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2448],{32401:e=>{e.exports=JSON.parse('{"label":"Kotlin","permalink":"/tags/kotlin","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/633582b9.2de1e802.js b/assets/js/633582b9.2de1e802.js deleted file mode 100644 index f58c9d40c..000000000 --- a/assets/js/633582b9.2de1e802.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2448],{2401:e=>{e.exports=JSON.parse('{"label":"Kotlin","permalink":"/tags/kotlin","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/635a92d5.209b3f46.js b/assets/js/635a92d5.209b3f46.js deleted file mode 100644 index 5e8129b64..000000000 --- a/assets/js/635a92d5.209b3f46.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7891],{2126:e=>{e.exports=JSON.parse('{"permalink":"/page/24","page":24,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/23","nextPage":"/page/25","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/635a92d5.8b6d852a.js b/assets/js/635a92d5.8b6d852a.js new file mode 100644 index 000000000..67c530412 --- /dev/null +++ b/assets/js/635a92d5.8b6d852a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7891],{72126:e=>{e.exports=JSON.parse('{"permalink":"/page/24","page":24,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/23","nextPage":"/page/25","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6425a984.32c0a357.js b/assets/js/6425a984.32c0a357.js new file mode 100644 index 000000000..9fa246e3a --- /dev/null +++ b/assets/js/6425a984.32c0a357.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5467],{95377:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/4","page":4,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/3","nextPage":"/tags/woowahan-techcourse/page/5","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6425a984.5e3d9675.js b/assets/js/6425a984.5e3d9675.js deleted file mode 100644 index 669f15f8e..000000000 --- a/assets/js/6425a984.5e3d9675.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5467],{5377:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/4","page":4,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/3","nextPage":"/tags/woowahan-techcourse/page/5","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/64868a43.2ca5a4da.js b/assets/js/64868a43.2ca5a4da.js new file mode 100644 index 000000000..8e99a35ef --- /dev/null +++ b/assets/js/64868a43.2ca5a4da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1501],{33159:e=>{e.exports=JSON.parse('{"permalink":"/page/39","page":39,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/38","nextPage":"/page/40","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/64868a43.60adcc49.js b/assets/js/64868a43.60adcc49.js deleted file mode 100644 index ded9e0546..000000000 --- a/assets/js/64868a43.60adcc49.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1501],{3159:e=>{e.exports=JSON.parse('{"permalink":"/page/39","page":39,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/38","nextPage":"/page/40","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/64f377d6.1563f3a3.js b/assets/js/64f377d6.1563f3a3.js deleted file mode 100644 index 46f482a5e..000000000 --- a/assets/js/64f377d6.1563f3a3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[732],{2898:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/11","page":11,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/64f377d6.4b09d9ac.js b/assets/js/64f377d6.4b09d9ac.js new file mode 100644 index 000000000..07ad557b6 --- /dev/null +++ b/assets/js/64f377d6.4b09d9ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[732],{62898:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/11","page":11,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6600e5b0.1d72ae8f.js b/assets/js/6600e5b0.1d72ae8f.js deleted file mode 100644 index e561ea6b3..000000000 --- a/assets/js/6600e5b0.1d72ae8f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9572],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),k=s(a),m=r,h=k["".concat(o,".").concat(m)]||k[m]||u[m]||l;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const l={title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:35,tags:["Java","Spring Boot","Spring"]},i=void 0,p={permalink:"/35",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",source:"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",description:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",date:"2023-07-24T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 24\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Spring Boot",permalink:"/tags/spring-boot"},{label:"Spring",permalink:"/tags/spring"}],readingTime:4.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:"35",tags:["Java","Spring Boot","Spring"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"},nextItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"}},o={authorsImageUrls:[]},s=[{value:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31",level:2},{value:"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"Switch Expressions(Java 14)",id:"switch-expressionsjava-14",level:3},{value:"Text Block(Java 15)",id:"text-blockjava-15",level:3},{value:"NPE \uba54\uc2dc\uc9c0(Java 15)",id:"npe-\uba54\uc2dc\uc9c0java-15",level:3},{value:"Record(Java 16)",id:"recordjava-16",level:3},{value:"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d",id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d",level:3},{value:"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd",id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd",level:3},{value:"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c",id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c",level:3},{value:"HTTP interface client",id:"http-interface-client",level:3},{value:"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:s};function u(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31"},"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1"),(0,r.kt)("p",null,"\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,r.kt)("h3",{id:"switch-expressionsjava-14"},"Switch Expressions(Java 14)"),(0,r.kt)("p",null,"Java 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"enum RESULT {\n WIN, LOSE, DRAW\n}\n\nRESULT result = RESULT.WIN;\n\nint prize = switch (result) {\n case WIN -> 10_000_000;\n case LOSE, DRAW -> 5_000_000;\n default -> 0;\n};\n")),(0,r.kt)("p",null,"\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"->")," \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"case\ub97c \ucf64\ub9c8(",(0,r.kt)("inlineCode",{parentName:"li"},","),")\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"text-blockjava-15"},"Text Block(Java 15)"),(0,r.kt)("p",null,"Java 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'@Repository\npublic interface PostRepository extends JpaRepository {\n @Query("""\n SELECT p FROM Post p\n WHERE p.title LIKE %:keyword%\n OR p.content LIKE %:keyword%\n """)\n List findPostsByTitleOrContentContainingKeyword(String keyword);\n}\n')),(0,r.kt)("h3",{id:"npe-\uba54\uc2dc\uc9c0java-15"},"NPE \uba54\uc2dc\uc9c0(Java 15)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'String name = null;\nname.chars();\n\n/** \n# before\njava.lang.NullPointerException\n at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\n\n# after\nCannot invoke "String.chars()" because "name" is null\njava.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null\n*/\n')),(0,r.kt)("h3",{id:"recordjava-16"},"Record(Java 16)"),(0,r.kt)("p",null,"Lombok\uc758 ",(0,r.kt)("inlineCode",{parentName:"p"},"@Data"),", kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Record\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public record PostDto(String title, String content) {\n}\n")),(0,r.kt)("h3",{id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d"},"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("h2",{id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Java 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd"},"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd"),(0,r.kt)("p",null,"Jakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. "),(0,r.kt)("h3",{id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c"},"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c"),(0,r.kt)("p",null,"6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello")'),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello/")'),"\uac00 \ub3d9\uc77c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello"),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello/"),"\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. "),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"PathPatternParser used by default (with the ability to opt into PathMatcher). ")),(0,r.kt)("h3",{id:"http-interface-client"},"HTTP interface client"),(0,r.kt)("p",null,"\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"\ud1a0\ube44\ub2d8\uc758 \uac15\uc758"),"\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Gradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. "),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=1WT6oxchM9M"},"\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=7SlDdzVk6GE"},"\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.samsungsds.com/kr/insights/java_jakarta.html"},"Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x"},"What's New in Spring Framework 6.x"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes"},"Spring Boot 3.0 Release Notes"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes"},"Spring Boot 3.1 Release Notes")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6600e5b0.26e63c3c.js b/assets/js/6600e5b0.26e63c3c.js new file mode 100644 index 000000000..6704ecb65 --- /dev/null +++ b/assets/js/6600e5b0.26e63c3c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9572],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),k=s(a),m=r,h=k["".concat(o,".").concat(m)]||k[m]||u[m]||l;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const l={title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:35,tags:["Java","Spring Boot","Spring"]},i=void 0,p={permalink:"/35",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",source:"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",description:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",date:"2023-07-24T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 24\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Spring Boot",permalink:"/tags/spring-boot"},{label:"Spring",permalink:"/tags/spring"}],readingTime:4.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:"35",tags:["Java","Spring Boot","Spring"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"},nextItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"}},o={authorsImageUrls:[]},s=[{value:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31",level:2},{value:"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"Switch Expressions(Java 14)",id:"switch-expressionsjava-14",level:3},{value:"Text Block(Java 15)",id:"text-blockjava-15",level:3},{value:"NPE \uba54\uc2dc\uc9c0(Java 15)",id:"npe-\uba54\uc2dc\uc9c0java-15",level:3},{value:"Record(Java 16)",id:"recordjava-16",level:3},{value:"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d",id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d",level:3},{value:"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd",id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd",level:3},{value:"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c",id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c",level:3},{value:"HTTP interface client",id:"http-interface-client",level:3},{value:"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:s};function u(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31"},"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1"),(0,r.kt)("p",null,"\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,r.kt)("h3",{id:"switch-expressionsjava-14"},"Switch Expressions(Java 14)"),(0,r.kt)("p",null,"Java 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"enum RESULT {\n WIN, LOSE, DRAW\n}\n\nRESULT result = RESULT.WIN;\n\nint prize = switch (result) {\n case WIN -> 10_000_000;\n case LOSE, DRAW -> 5_000_000;\n default -> 0;\n};\n")),(0,r.kt)("p",null,"\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"->")," \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"case\ub97c \ucf64\ub9c8(",(0,r.kt)("inlineCode",{parentName:"li"},","),")\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"text-blockjava-15"},"Text Block(Java 15)"),(0,r.kt)("p",null,"Java 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'@Repository\npublic interface PostRepository extends JpaRepository {\n @Query("""\n SELECT p FROM Post p\n WHERE p.title LIKE %:keyword%\n OR p.content LIKE %:keyword%\n """)\n List findPostsByTitleOrContentContainingKeyword(String keyword);\n}\n')),(0,r.kt)("h3",{id:"npe-\uba54\uc2dc\uc9c0java-15"},"NPE \uba54\uc2dc\uc9c0(Java 15)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'String name = null;\nname.chars();\n\n/** \n# before\njava.lang.NullPointerException\n at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\n\n# after\nCannot invoke "String.chars()" because "name" is null\njava.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null\n*/\n')),(0,r.kt)("h3",{id:"recordjava-16"},"Record(Java 16)"),(0,r.kt)("p",null,"Lombok\uc758 ",(0,r.kt)("inlineCode",{parentName:"p"},"@Data"),", kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Record\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public record PostDto(String title, String content) {\n}\n")),(0,r.kt)("h3",{id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d"},"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("h2",{id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Java 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd"},"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd"),(0,r.kt)("p",null,"Jakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. "),(0,r.kt)("h3",{id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c"},"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c"),(0,r.kt)("p",null,"6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello")'),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello/")'),"\uac00 \ub3d9\uc77c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello"),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello/"),"\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. "),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"PathPatternParser used by default (with the ability to opt into PathMatcher). ")),(0,r.kt)("h3",{id:"http-interface-client"},"HTTP interface client"),(0,r.kt)("p",null,"\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"\ud1a0\ube44\ub2d8\uc758 \uac15\uc758"),"\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Gradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. "),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=1WT6oxchM9M"},"\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=7SlDdzVk6GE"},"\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.samsungsds.com/kr/insights/java_jakarta.html"},"Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x"},"What's New in Spring Framework 6.x"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes"},"Spring Boot 3.0 Release Notes"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes"},"Spring Boot 3.1 Release Notes")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/66d1c769.0554fad1.js b/assets/js/66d1c769.0554fad1.js new file mode 100644 index 000000000..9e4dd33d5 --- /dev/null +++ b/assets/js/66d1c769.0554fad1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7476],{80122:e=>{e.exports=JSON.parse('{"permalink":"/tags/data-base/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/data-base","nextPage":"/tags/data-base/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/66d1c769.3685429a.js b/assets/js/66d1c769.3685429a.js deleted file mode 100644 index 91309a50d..000000000 --- a/assets/js/66d1c769.3685429a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7476],{122:e=>{e.exports=JSON.parse('{"permalink":"/tags/data-base/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/data-base","nextPage":"/tags/data-base/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/672a376b.4e738ca5.js b/assets/js/672a376b.4e738ca5.js new file mode 100644 index 000000000..b58481867 --- /dev/null +++ b/assets/js/672a376b.4e738ca5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5753],{41690:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/672a376b.e434ebc5.js b/assets/js/672a376b.e434ebc5.js deleted file mode 100644 index 52e62d204..000000000 --- a/assets/js/672a376b.e434ebc5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5753],{1690:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/6780.71665265.js b/assets/js/6780.71665265.js new file mode 100644 index 000000000..13010a04a --- /dev/null +++ b/assets/js/6780.71665265.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6780],{76780:(e,t,r)=>{function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t,r){var a,c=t.initialState;return{getState:function(){return c},dispatch:function(a,i){var l=function(e){for(var t=1;tDr});var f=0;var m=function(){};function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function d(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function h(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t=function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var $,z,W,Q=null,Z=($=-1,z=-1,W=void 0,function(e){var t=++$;return Promise.resolve(e).then((function(e){return W&&t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var ne=/((gt|sm)-|galaxy nexus)|samsung[- ]/i;var oe=["props","refresh","store"],ae=["inputElement","formElement","panelElement"],ce=["inputElement"],ie=["inputElement","maxLength"],le=["item","source"];function se(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ue(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pe(e){var t=e.props,r=e.refresh,n=e.store,o=me(e,oe);return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,a=e.panelElement;function c(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,a].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return ue({onTouchStart:c,onMouseDown:c,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},me(e,ae))},getRootProps:function(e){return ue({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return ue({action:"",noValidate:!0,role:"search",onSubmit:function(a){var c;a.preventDefault(),t.onSubmit(ue({event:a,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(c=e.inputElement)||void 0===c||c.blur()},onReset:function(a){var c;a.preventDefault(),t.onReset(ue({event:a,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(c=e.inputElement)||void 0===c||c.focus()}},me(e,ce))},getLabelProps:function(e){return ue({htmlFor:"".concat(t.id,"-input"),id:"".concat(t.id,"-label")},e)},getInputProps:function(e){var a;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Y(ue({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var i=e||{},l=(i.inputElement,i.maxLength),s=void 0===l?512:l,u=me(i,ie),f=F(n.getState()),p=function(e){return Boolean(e&&e.match(ne))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),d=null!=f&&f.itemUrl&&!p?"go":"search";return ue({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:d,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Y(ue({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,a=re(e,G);if("ArrowUp"===t.key||"ArrowDown"===t.key){var c=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},i=function(){var e=F(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,c=e.itemInputValue,i=e.itemUrl,l=e.source;l.onActive(ee({event:t,item:r,itemInputValue:c,itemUrl:i,refresh:n,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Y(ee({event:t,props:r,query:o.getState().query,refresh:n,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),i(),setTimeout(c,0)})):(o.dispatch(t.key,{}),i(),c())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=F(o.getState()),s=l.item,u=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a)),r.navigator.navigateNewTab({itemUrl:f,item:s,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a)),r.navigator.navigateNewWindow({itemUrl:f,item:s,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a)),void r.navigator.navigate({itemUrl:f,item:s,state:o.getState()});Y(ee({event:t,nextState:{isOpen:!1},props:r,query:u,refresh:n,store:o},a)).then((function(){m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a))}))}}}(ue({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:m,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},u)},getPanelProps:function(e){return ue({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){return ue({role:"listbox","aria-labelledby":"".concat(t.id,"-label"),id:"".concat(t.id,"-list")},e)},getItemProps:function(e){var a=e.item,c=e.source,i=me(e,le);return ue({id:"".concat(t.id,"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=F(n.getState());if(null!==n.getState().activeItemId&&t){var c=t.item,i=t.itemInputValue,l=t.itemUrl,s=t.source;s.onActive(ue({event:e,item:c,itemInputValue:i,itemUrl:l,refresh:r,source:s,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Y(ue({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(ue({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},i)}}}var de=[{segment:"autocomplete-core",version:"1.7.2"}];function he(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ve(e){for(var t=1;t=r?null===n?null:0:o}function Se(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Ee(e){for(var t=1;t0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(f++),plugins:o,initialState:b({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(v(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return h(e,r)}))).then((function(e){return c(e)})).then((function(e){return e.map((function(e){return b(b({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:b({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}(e,t),n=a(we,r,(function(e){var t=e.prevState,n=e.state;r.onStateChange(Ie({prevState:t,state:n,refresh:s},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var r=0,n=e.map((function(e){return l(l({},e),{},{items:c(e.items).map((function(e){return l(l({},e),{},{__autocomplete_id:r++})}))})}));t.dispatch("setCollections",n)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:n}),i=pe(Ie({props:r,refresh:s,store:n},o));function s(){return Y(Ie({event:new Event("input"),nextState:{isOpen:n.getState().isOpen},props:r,query:n.getState().query,refresh:s,store:n},o))}return r.plugins.forEach((function(e){var r;return null===(r=e.subscribe)||void 0===r?void 0:r.call(e,Ie(Ie({},o),{},{refresh:s,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})}}))})),function(e){var t,r,n=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(r=t.userAgent)||void 0===r?void 0:r.includes("Algolia Crawler")){var a=o.document.createElement("meta"),c=o.document.querySelector("head");a.name="algolia:metadata",setTimeout((function(){a.content=JSON.stringify(n),c.appendChild(a)}),0)}}({metadata:ge({plugins:r.plugins,options:e}),environment:r.environment}),Ie(Ie({refresh:s},i),o)}var ke=r(67294);function Ae(e){var t=e.translations,r=(void 0===t?{}:t).searchByText,n=void 0===r?"Search by":r;return ke.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},ke.createElement("span",{className:"DocSearch-Label"},n),ke.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},ke.createElement("defs",null,ke.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),ke.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),ke.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),ke.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),ke.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),ke.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),ke.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),ke.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),ke.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),ke.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function xe(e){return ke.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},ke.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Ne(e){var t=e.translations,r=void 0===t?{}:t,n=r.selectText,o=void 0===n?"to select":n,a=r.selectKeyAriaLabel,c=void 0===a?"Enter key":a,i=r.navigateText,l=void 0===i?"to navigate":i,s=r.navigateUpKeyAriaLabel,u=void 0===s?"Arrow up":s,f=r.navigateDownKeyAriaLabel,m=void 0===f?"Arrow down":f,p=r.closeText,d=void 0===p?"to close":p,h=r.closeKeyAriaLabel,v=void 0===h?"Escape key":h,y=r.searchByText,g=void 0===y?"Search by":y;return ke.createElement(ke.Fragment,null,ke.createElement("div",{className:"DocSearch-Logo"},ke.createElement(Ae,{translations:{searchByText:g}})),ke.createElement("ul",{className:"DocSearch-Commands"},ke.createElement("li",null,ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:c},ke.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),ke.createElement("span",{className:"DocSearch-Label"},o)),ke.createElement("li",null,ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:m},ke.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:u},ke.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),ke.createElement("span",{className:"DocSearch-Label"},l)),ke.createElement("li",null,ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:v},ke.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),ke.createElement("span",{className:"DocSearch-Label"},d))))}function Re(e){var t=e.hit,r=e.children;return ke.createElement("a",{href:t.url},r)}function _e(){return ke.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},ke.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function qe(e){var t=e.translations,r=void 0===t?{}:t,n=r.titleText,o=void 0===n?"Unable to fetch results":n,a=r.helpText,c=void 0===a?"You might want to check your network connection.":a;return ke.createElement("div",{className:"DocSearch-ErrorScreen"},ke.createElement("div",{className:"DocSearch-Screen-Icon"},ke.createElement(_e,null)),ke.createElement("p",{className:"DocSearch-Title"},o),ke.createElement("p",{className:"DocSearch-Help"},c))}function Te(){return ke.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},ke.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}var Le=["translations"];function Me(e){return function(e){if(Array.isArray(e))return He(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return He(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return He(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function He(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ue(e){var t=e.translations,r=void 0===t?{}:t,n=Fe(e,Le),o=r.noResultsText,a=void 0===o?"No results for":o,c=r.suggestedQueryText,i=void 0===c?"Try searching for":c,l=r.reportMissingResultsText,s=void 0===l?"Believe this query should return results?":l,u=r.reportMissingResultsLinkText,f=void 0===u?"Let us know.":u,m=n.state.context.searchSuggestions;return ke.createElement("div",{className:"DocSearch-NoResults"},ke.createElement("div",{className:"DocSearch-Screen-Icon"},ke.createElement(Te,null)),ke.createElement("p",{className:"DocSearch-Title"},a,' "',ke.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&ke.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},ke.createElement("p",{className:"DocSearch-Help"},i,":"),ke.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(Me(e),[ke.createElement("li",{key:t},ke.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&ke.createElement("p",{className:"DocSearch-Help"},"".concat(s," "),ke.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var Be=function(){return ke.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ve(e){switch(e.type){case"lvl1":return ke.createElement(Be,null);case"content":return ke.createElement(Je,null);default:return ke.createElement(Ke,null)}}function Ke(){return ke.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Je(){return ke.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function $e(){return ke.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},ke.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),ke.createElement("path",{d:"M8 17l-6-6 6-6"})))}var ze=["hit","attribute","tagName"];function We(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Qe(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Xe(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,a=Ye(e,ze);return(0,ke.createElement)(o,Qe(Qe({},a),{},{dangerouslySetInnerHTML:{__html:Ge(t,"_snippetResult.".concat(r,".value"))||Ge(t,r)}}))}function et(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,a=[],c=!0,i=!1;try{for(r=r.call(e);!(c=(n=r.next()).done)&&(a.push(n.value),!t||a.length!==t);c=!0);}catch(l){i=!0,o=l}finally{try{c||null==r.return||r.return()}finally{if(i)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return tt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return tt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function tt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r|<\/mark>)/g,ct=RegExp(at.source);function it(e){var t,r,n,o,a,c=e;if(!c.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var i=((c.__docsearch_parent?null===(t=c.__docsearch_parent)||void 0===t||null===(r=t._highlightResult)||void 0===r||null===(n=r.hierarchy)||void 0===n?void 0:n.lvl0:null===(o=e._highlightResult)||void 0===o||null===(a=o.hierarchy)||void 0===a?void 0:a.lvl0)||{}).value;return i&&ct.test(i)?i.replace(at,""):i}function lt(){return lt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vt(e){var t=e.translations,r=void 0===t?{}:t,n=ht(e,pt),o=r.recentSearchesTitle,a=void 0===o?"Recent":o,c=r.noRecentSearchesText,i=void 0===c?"No recent searches":c,l=r.saveRecentSearchButtonTitle,s=void 0===l?"Save this search":l,u=r.removeRecentSearchButtonTitle,f=void 0===u?"Remove this search from history":u,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,d=r.removeFavoriteSearchButtonTitle,h=void 0===d?"Remove this search from favorites":d;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:ke.createElement("div",{className:"DocSearch-StartScreen"},ke.createElement("p",{className:"DocSearch-Help"},i)):!1===n.hasCollections?null:ke.createElement("div",{className:"DocSearch-Dropdown-Container"},ke.createElement(nt,dt({},n,{title:a,collection:n.state.collections[0],renderIcon:function(){return ke.createElement("div",{className:"DocSearch-Hit-icon"},ke.createElement(ut,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return ke.createElement(ke.Fragment,null,ke.createElement("div",{className:"DocSearch-Hit-action"},ke.createElement("button",{className:"DocSearch-Hit-action-button",title:s,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},ke.createElement(ft,null))),ke.createElement("div",{className:"DocSearch-Hit-action"},ke.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},ke.createElement(mt,null))))}})),ke.createElement(nt,dt({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return ke.createElement("div",{className:"DocSearch-Hit-icon"},ke.createElement(ft,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return ke.createElement("div",{className:"DocSearch-Hit-action"},ke.createElement("button",{className:"DocSearch-Hit-action-button",title:h,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},ke.createElement(mt,null)))}})))}var yt=["translations"];function gt(){return gt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ot=ke.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=bt(e,yt);if("error"===n.state.status)return ke.createElement(qe,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?ke.createElement(Ue,gt({},n,{translations:null==r?void 0:r.noResultsScreen})):ke.createElement(st,n):ke.createElement(vt,gt({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function St(){return ke.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},ke.createElement("g",{fill:"none",fillRule:"evenodd"},ke.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},ke.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),ke.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},ke.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var Et=r(20830),jt=["translations"];function wt(){return wt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function It(e){var t=e.translations,r=void 0===t?{}:t,n=Pt(e,jt),o=r.resetButtonTitle,a=void 0===o?"Clear the query":o,c=r.resetButtonAriaLabel,i=void 0===c?"Clear the query":c,l=r.cancelButtonText,s=void 0===l?"Cancel":l,u=r.cancelButtonAriaLabel,f=void 0===u?"Cancel":u,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return ke.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),ke.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),ke.createElement(ke.Fragment,null,ke.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},ke.createElement("label",wt({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),ke.createElement(Et.W,null)),ke.createElement("div",{className:"DocSearch-LoadingIndicator"},ke.createElement(St,null)),ke.createElement("input",wt({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:64}))),ke.createElement("button",{type:"reset",title:a,className:"DocSearch-Reset","aria-label":i,hidden:!n.state.query},ke.createElement(mt,null))),ke.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},s))}var Dt=["_highlightResult","_snippetResult"];function Ct(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function At(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=kt(t),a=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,Ct(t,Dt)),c=a.findIndex((function(e){return e.objectID===r.objectID}));c>-1&&a.splice(c,1),a.unshift(r),a=a.slice(0,n),o.setItem(a)},remove:function(e){a=a.filter((function(t){return t.objectID!==e.objectID})),o.setItem(a)},getAll:function(){return a}}}function xt(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}");return{get:(e,t,r={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{const r=JSON.stringify(e),n=o()[r];return Promise.all([n||t(),void 0!==n])})).then((([e,t])=>Promise.all([e,t||r.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const a=o();return a[JSON.stringify(e)]=r,n().setItem(t,JSON.stringify(a)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Nt(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Nt({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Nt({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Nt({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Nt({caches:t}).clear()))}}function Rt(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);const c=n(),i=o&&o.miss||(()=>Promise.resolve());return c.then((e=>i(e))).then((()=>c))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function _t(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function qt(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Tt(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Lt="4.14.2",Mt={WithinQueryParameters:0,WithinHeaders:1};function Ht(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ft={Read:1,Write:2,Any:3},Ut=1,Bt=2,Vt=3,Kt=12e4;function Jt(e,t=Ut){return{...e,status:t,lastUpdate:Date.now()}}function $t(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ft.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ft.Any}}const zt="GET",Wt="POST";function Qt(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Jt(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===Ut||Date.now()-e.lastUpdate>Kt}(e))),n=e.filter((e=>function(e){return e.status===Vt&&Date.now()-e.lastUpdate<=Kt}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>$t(e))):t}}))}function Zt(e,t,r,n){const o=[],a=function(e,t){if(e.method===zt||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),c=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),i=r.method,l=r.method!==zt?{}:{...r.data,...n.data},s={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let u=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:er(o)};const p={data:a,headers:c,method:i,url:Gt(m,r.path,s),connectTimeout:l(u,e.timeouts.connect),responseTimeout:l(u,n.timeout)},d=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},h={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=d(r);return r.isTimedOut&&u++,Promise.all([e.logger.info("Retryable failure",tr(n)),e.hostsCache.set(m,Jt(m,r.isTimedOut?Vt:Bt))]).then((()=>f(t,l)))},onFail(e){throw d(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,er(o))}};return e.requester.send(p).then((e=>((e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e))(e,h)))};return Qt(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Yt(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Gt(e,t,r){const n=Xt(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Xt(e){return Object.keys(e).map((t=>{return Tt("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function er(e){return e.map((e=>tr(e)))}function tr(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const rr=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Mt.WithinHeaders?n:{},queryParameters:()=>e===Mt.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Mt.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:a,timeouts:c,userAgent:i,hosts:l,queryParameters:s,headers:u}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:a,timeouts:c,userAgent:i,headers:u,queryParameters:s,hosts:l.map((e=>$t(e))),read(e,t){const r=Ht(t,f.timeouts.read),n=()=>Zt(f,f.hosts.filter((e=>0!=(e.accept&Ft.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Zt(f,f.hosts.filter((e=>0!=(e.accept&Ft.Write))),e,Ht(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ft.Read},{url:`${t}.algolia.net`,accept:Ft.Write}].concat(_t([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return qt(o,e.methods)},nr=e=>(t,r)=>t.method===zt?e.transporter.read(t,r):e.transporter.write(t,r),or=e=>(t,r={})=>qt({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),ar=e=>(t,r)=>{const n=t.map((e=>({...e,params:Xt(e.params||{})})));return e.transporter.read({method:Wt,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},cr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...a}=t.params;return or(e)(t.indexName,{methods:{searchForFacetValues:sr}}).searchForFacetValues(n,o,{...r,...a})}))),ir=e=>(t,r,n)=>e.transporter.read({method:Wt,path:Tt("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),lr=e=>(t,r)=>e.transporter.read({method:Wt,path:Tt("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),sr=e=>(t,r,n)=>e.transporter.read({method:Wt,path:Tt("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),ur=1,fr=2,mr=3;function pr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let a;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===a&&(clearTimeout(o),a=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(a),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(a),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=mr,{debug:(e,t)=>(ur>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(fr>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Rt(),requestsCache:Rt({serializable:!1}),hostsCache:Nt({caches:[xt({key:`4.14.2-${e}`}),Rt()]}),userAgent:Yt(Lt).add({segment:"Browser",version:"lite"}),authMode:Mt.WithinQueryParameters};var o;return rr({...n,...r,methods:{search:ar,searchForFacetValues:cr,multipleQueries:ar,multipleSearchForFacetValues:cr,customRequest:nr,initIndex:e=>t=>or(e)(t,{methods:{search:lr,searchForFacetValues:sr,findAnswers:ir}})}})}pr.version=Lt;const dr=pr;var hr="3.3.0";function vr(){}function yr(e){return e}function gr(e,t){return e.reduce((function(e,r){var n=t(r);return e.hasOwnProperty(n)||(e[n]=[]),e[n].length<5&&e[n].push(r),e}),{})}var br=["footer","searchBox"];function Or(){return Or=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Dr(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,a=void 0===o?"Search docs":o,c=e.searchParameters,i=e.onClose,l=void 0===i?vr:i,s=e.transformItems,u=void 0===s?yr:s,f=e.hitComponent,m=void 0===f?Re:f,p=e.resultsFooterComponent,d=void 0===p?function(){return null}:p,h=e.navigator,v=e.initialScrollY,y=void 0===v?0:v,g=e.transformSearchClient,b=void 0===g?yr:g,O=e.disableUserPersonalization,S=void 0!==O&&O,E=e.initialQuery,j=void 0===E?"":E,w=e.translations,P=void 0===w?{}:w,I=e.getMissingResultsUrl,D=P.footer,C=P.searchBox,k=Ir(P,br),A=wr(ke.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),x=A[0],N=A[1],R=ke.useRef(null),_=ke.useRef(null),q=ke.useRef(null),T=ke.useRef(null),L=ke.useRef(null),M=ke.useRef(10),H=ke.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,F=ke.useRef(j||H).current,U=function(e,t,r){return ke.useMemo((function(){var n=dr(e,t);return n.addAlgoliaAgent("docsearch",hr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",hr),r(n)}),[e,t,r])}(t,r,b),B=ke.useRef(At({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,V=ke.useRef(At({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===B.getAll().length?7:4})).current,K=ke.useCallback((function(e){if(!S){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===B.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&V.add(t)}}),[B,V,S]),J=ke.useMemo((function(){return Ce({id:"docsearch",defaultActiveItemId:0,placeholder:a,openOnFocus:!0,initialState:{query:F,context:{searchSuggestions:[]}},navigator:h,onStateChange:function(e){N(e.state)},getSources:function(e){var t=e.query,r=e.state,o=e.setContext,a=e.setStatus;return t?U.search([{query:t,indexName:n,params:Er({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(M.current),"hierarchy.lvl2:".concat(M.current),"hierarchy.lvl3:".concat(M.current),"hierarchy.lvl4:".concat(M.current),"hierarchy.lvl5:".concat(M.current),"hierarchy.lvl6:".concat(M.current),"content:".concat(M.current)],snippetEllipsisText:"\u2026",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20},c)}]).catch((function(e){throw"RetryError"===e.name&&a("error"),e})).then((function(e){var t=e.results[0],n=t.hits,a=t.nbHits,c=gr(n,(function(e){return it(e)}));return r.context.searchSuggestions.length0&&(W(),L.current&&L.current.focus())}),[F,W]),ke.useEffect((function(){function e(){if(_.current){var e=.01*window.innerHeight;_.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),ke.createElement("div",Or({ref:R},z({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===x.status&&"DocSearch-Container--Stalled","error"===x.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&l()}}),ke.createElement("div",{className:"DocSearch-Modal",ref:_},ke.createElement("header",{className:"DocSearch-SearchBar",ref:q},ke.createElement(It,Or({},J,{state:x,autoFocus:0===F.length,inputRef:L,isFromSelection:Boolean(F)&&F===H,translations:C,onClose:l}))),ke.createElement("div",{className:"DocSearch-Dropdown",ref:T},ke.createElement(Ot,Or({},J,{indexName:n,state:x,hitComponent:m,resultsFooterComponent:d,disableUserPersonalization:S,recentSearches:V,favoriteSearches:B,inputRef:L,translations:k,getMissingResultsUrl:I,onItemClick:function(e){K(e),l()}}))),ke.createElement("footer",{className:"DocSearch-Footer"},ke.createElement(Ne,{translations:D}))))}}}]); \ No newline at end of file diff --git a/assets/js/6780.fc914bdb.js b/assets/js/6780.fc914bdb.js deleted file mode 100644 index d899f0158..000000000 --- a/assets/js/6780.fc914bdb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6780],{6780:(e,t,r)=>{function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t,r){var a,c=t.initialState;return{getState:function(){return c},dispatch:function(a,i){var l=function(e){for(var t=1;tDr});var f=0;var m=function(){};function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function d(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function h(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t=function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var $,z,W,Q=null,Z=($=-1,z=-1,W=void 0,function(e){var t=++$;return Promise.resolve(e).then((function(e){return W&&t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var ne=/((gt|sm)-|galaxy nexus)|samsung[- ]/i;var oe=["props","refresh","store"],ae=["inputElement","formElement","panelElement"],ce=["inputElement"],ie=["inputElement","maxLength"],le=["item","source"];function se(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ue(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pe(e){var t=e.props,r=e.refresh,n=e.store,o=me(e,oe);return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,a=e.panelElement;function c(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,a].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return ue({onTouchStart:c,onMouseDown:c,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},me(e,ae))},getRootProps:function(e){return ue({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return ue({action:"",noValidate:!0,role:"search",onSubmit:function(a){var c;a.preventDefault(),t.onSubmit(ue({event:a,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(c=e.inputElement)||void 0===c||c.blur()},onReset:function(a){var c;a.preventDefault(),t.onReset(ue({event:a,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(c=e.inputElement)||void 0===c||c.focus()}},me(e,ce))},getLabelProps:function(e){return ue({htmlFor:"".concat(t.id,"-input"),id:"".concat(t.id,"-label")},e)},getInputProps:function(e){var a;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Y(ue({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var i=e||{},l=(i.inputElement,i.maxLength),s=void 0===l?512:l,u=me(i,ie),f=F(n.getState()),p=function(e){return Boolean(e&&e.match(ne))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),d=null!=f&&f.itemUrl&&!p?"go":"search";return ue({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:d,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Y(ue({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,a=re(e,G);if("ArrowUp"===t.key||"ArrowDown"===t.key){var c=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},i=function(){var e=F(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,c=e.itemInputValue,i=e.itemUrl,l=e.source;l.onActive(ee({event:t,item:r,itemInputValue:c,itemUrl:i,refresh:n,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Y(ee({event:t,props:r,query:o.getState().query,refresh:n,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),i(),setTimeout(c,0)})):(o.dispatch(t.key,{}),i(),c())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=F(o.getState()),s=l.item,u=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a)),r.navigator.navigateNewTab({itemUrl:f,item:s,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a)),r.navigator.navigateNewWindow({itemUrl:f,item:s,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a)),void r.navigator.navigate({itemUrl:f,item:s,state:o.getState()});Y(ee({event:t,nextState:{isOpen:!1},props:r,query:u,refresh:n,store:o},a)).then((function(){m.onSelect(ee({event:t,item:s,itemInputValue:u,itemUrl:f,refresh:n,source:m,state:o.getState()},a))}))}}}(ue({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:m,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},u)},getPanelProps:function(e){return ue({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){return ue({role:"listbox","aria-labelledby":"".concat(t.id,"-label"),id:"".concat(t.id,"-list")},e)},getItemProps:function(e){var a=e.item,c=e.source,i=me(e,le);return ue({id:"".concat(t.id,"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=F(n.getState());if(null!==n.getState().activeItemId&&t){var c=t.item,i=t.itemInputValue,l=t.itemUrl,s=t.source;s.onActive(ue({event:e,item:c,itemInputValue:i,itemUrl:l,refresh:r,source:s,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Y(ue({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(ue({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},i)}}}var de=[{segment:"autocomplete-core",version:"1.7.2"}];function he(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ve(e){for(var t=1;t=r?null===n?null:0:o}function Se(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Ee(e){for(var t=1;t0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(f++),plugins:o,initialState:b({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(v(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return h(e,r)}))).then((function(e){return c(e)})).then((function(e){return e.map((function(e){return b(b({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:b({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}(e,t),n=a(we,r,(function(e){var t=e.prevState,n=e.state;r.onStateChange(Ie({prevState:t,state:n,refresh:s},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var r=0,n=e.map((function(e){return l(l({},e),{},{items:c(e.items).map((function(e){return l(l({},e),{},{__autocomplete_id:r++})}))})}));t.dispatch("setCollections",n)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:n}),i=pe(Ie({props:r,refresh:s,store:n},o));function s(){return Y(Ie({event:new Event("input"),nextState:{isOpen:n.getState().isOpen},props:r,query:n.getState().query,refresh:s,store:n},o))}return r.plugins.forEach((function(e){var r;return null===(r=e.subscribe)||void 0===r?void 0:r.call(e,Ie(Ie({},o),{},{refresh:s,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})}}))})),function(e){var t,r,n=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(r=t.userAgent)||void 0===r?void 0:r.includes("Algolia Crawler")){var a=o.document.createElement("meta"),c=o.document.querySelector("head");a.name="algolia:metadata",setTimeout((function(){a.content=JSON.stringify(n),c.appendChild(a)}),0)}}({metadata:ge({plugins:r.plugins,options:e}),environment:r.environment}),Ie(Ie({refresh:s},i),o)}var ke=r(7294);function Ae(e){var t=e.translations,r=(void 0===t?{}:t).searchByText,n=void 0===r?"Search by":r;return ke.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},ke.createElement("span",{className:"DocSearch-Label"},n),ke.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},ke.createElement("defs",null,ke.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),ke.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),ke.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),ke.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),ke.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),ke.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),ke.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),ke.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),ke.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),ke.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function xe(e){return ke.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},ke.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Ne(e){var t=e.translations,r=void 0===t?{}:t,n=r.selectText,o=void 0===n?"to select":n,a=r.selectKeyAriaLabel,c=void 0===a?"Enter key":a,i=r.navigateText,l=void 0===i?"to navigate":i,s=r.navigateUpKeyAriaLabel,u=void 0===s?"Arrow up":s,f=r.navigateDownKeyAriaLabel,m=void 0===f?"Arrow down":f,p=r.closeText,d=void 0===p?"to close":p,h=r.closeKeyAriaLabel,v=void 0===h?"Escape key":h,y=r.searchByText,g=void 0===y?"Search by":y;return ke.createElement(ke.Fragment,null,ke.createElement("div",{className:"DocSearch-Logo"},ke.createElement(Ae,{translations:{searchByText:g}})),ke.createElement("ul",{className:"DocSearch-Commands"},ke.createElement("li",null,ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:c},ke.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),ke.createElement("span",{className:"DocSearch-Label"},o)),ke.createElement("li",null,ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:m},ke.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:u},ke.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),ke.createElement("span",{className:"DocSearch-Label"},l)),ke.createElement("li",null,ke.createElement("kbd",{className:"DocSearch-Commands-Key"},ke.createElement(xe,{ariaLabel:v},ke.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),ke.createElement("span",{className:"DocSearch-Label"},d))))}function Re(e){var t=e.hit,r=e.children;return ke.createElement("a",{href:t.url},r)}function _e(){return ke.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},ke.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function qe(e){var t=e.translations,r=void 0===t?{}:t,n=r.titleText,o=void 0===n?"Unable to fetch results":n,a=r.helpText,c=void 0===a?"You might want to check your network connection.":a;return ke.createElement("div",{className:"DocSearch-ErrorScreen"},ke.createElement("div",{className:"DocSearch-Screen-Icon"},ke.createElement(_e,null)),ke.createElement("p",{className:"DocSearch-Title"},o),ke.createElement("p",{className:"DocSearch-Help"},c))}function Te(){return ke.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},ke.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}var Le=["translations"];function Me(e){return function(e){if(Array.isArray(e))return He(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return He(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return He(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function He(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ue(e){var t=e.translations,r=void 0===t?{}:t,n=Fe(e,Le),o=r.noResultsText,a=void 0===o?"No results for":o,c=r.suggestedQueryText,i=void 0===c?"Try searching for":c,l=r.reportMissingResultsText,s=void 0===l?"Believe this query should return results?":l,u=r.reportMissingResultsLinkText,f=void 0===u?"Let us know.":u,m=n.state.context.searchSuggestions;return ke.createElement("div",{className:"DocSearch-NoResults"},ke.createElement("div",{className:"DocSearch-Screen-Icon"},ke.createElement(Te,null)),ke.createElement("p",{className:"DocSearch-Title"},a,' "',ke.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&ke.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},ke.createElement("p",{className:"DocSearch-Help"},i,":"),ke.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(Me(e),[ke.createElement("li",{key:t},ke.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&ke.createElement("p",{className:"DocSearch-Help"},"".concat(s," "),ke.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var Be=function(){return ke.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ve(e){switch(e.type){case"lvl1":return ke.createElement(Be,null);case"content":return ke.createElement(Je,null);default:return ke.createElement(Ke,null)}}function Ke(){return ke.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Je(){return ke.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function $e(){return ke.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},ke.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},ke.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),ke.createElement("path",{d:"M8 17l-6-6 6-6"})))}var ze=["hit","attribute","tagName"];function We(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Qe(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Xe(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,a=Ye(e,ze);return(0,ke.createElement)(o,Qe(Qe({},a),{},{dangerouslySetInnerHTML:{__html:Ge(t,"_snippetResult.".concat(r,".value"))||Ge(t,r)}}))}function et(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,a=[],c=!0,i=!1;try{for(r=r.call(e);!(c=(n=r.next()).done)&&(a.push(n.value),!t||a.length!==t);c=!0);}catch(l){i=!0,o=l}finally{try{c||null==r.return||r.return()}finally{if(i)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return tt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return tt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function tt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r|<\/mark>)/g,ct=RegExp(at.source);function it(e){var t,r,n,o,a,c=e;if(!c.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var i=((c.__docsearch_parent?null===(t=c.__docsearch_parent)||void 0===t||null===(r=t._highlightResult)||void 0===r||null===(n=r.hierarchy)||void 0===n?void 0:n.lvl0:null===(o=e._highlightResult)||void 0===o||null===(a=o.hierarchy)||void 0===a?void 0:a.lvl0)||{}).value;return i&&ct.test(i)?i.replace(at,""):i}function lt(){return lt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vt(e){var t=e.translations,r=void 0===t?{}:t,n=ht(e,pt),o=r.recentSearchesTitle,a=void 0===o?"Recent":o,c=r.noRecentSearchesText,i=void 0===c?"No recent searches":c,l=r.saveRecentSearchButtonTitle,s=void 0===l?"Save this search":l,u=r.removeRecentSearchButtonTitle,f=void 0===u?"Remove this search from history":u,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,d=r.removeFavoriteSearchButtonTitle,h=void 0===d?"Remove this search from favorites":d;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:ke.createElement("div",{className:"DocSearch-StartScreen"},ke.createElement("p",{className:"DocSearch-Help"},i)):!1===n.hasCollections?null:ke.createElement("div",{className:"DocSearch-Dropdown-Container"},ke.createElement(nt,dt({},n,{title:a,collection:n.state.collections[0],renderIcon:function(){return ke.createElement("div",{className:"DocSearch-Hit-icon"},ke.createElement(ut,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return ke.createElement(ke.Fragment,null,ke.createElement("div",{className:"DocSearch-Hit-action"},ke.createElement("button",{className:"DocSearch-Hit-action-button",title:s,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},ke.createElement(ft,null))),ke.createElement("div",{className:"DocSearch-Hit-action"},ke.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},ke.createElement(mt,null))))}})),ke.createElement(nt,dt({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return ke.createElement("div",{className:"DocSearch-Hit-icon"},ke.createElement(ft,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return ke.createElement("div",{className:"DocSearch-Hit-action"},ke.createElement("button",{className:"DocSearch-Hit-action-button",title:h,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},ke.createElement(mt,null)))}})))}var yt=["translations"];function gt(){return gt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ot=ke.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=bt(e,yt);if("error"===n.state.status)return ke.createElement(qe,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?ke.createElement(Ue,gt({},n,{translations:null==r?void 0:r.noResultsScreen})):ke.createElement(st,n):ke.createElement(vt,gt({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function St(){return ke.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},ke.createElement("g",{fill:"none",fillRule:"evenodd"},ke.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},ke.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),ke.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},ke.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var Et=r(830),jt=["translations"];function wt(){return wt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function It(e){var t=e.translations,r=void 0===t?{}:t,n=Pt(e,jt),o=r.resetButtonTitle,a=void 0===o?"Clear the query":o,c=r.resetButtonAriaLabel,i=void 0===c?"Clear the query":c,l=r.cancelButtonText,s=void 0===l?"Cancel":l,u=r.cancelButtonAriaLabel,f=void 0===u?"Cancel":u,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return ke.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),ke.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),ke.createElement(ke.Fragment,null,ke.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},ke.createElement("label",wt({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),ke.createElement(Et.W,null)),ke.createElement("div",{className:"DocSearch-LoadingIndicator"},ke.createElement(St,null)),ke.createElement("input",wt({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:64}))),ke.createElement("button",{type:"reset",title:a,className:"DocSearch-Reset","aria-label":i,hidden:!n.state.query},ke.createElement(mt,null))),ke.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},s))}var Dt=["_highlightResult","_snippetResult"];function Ct(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function At(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=kt(t),a=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,Ct(t,Dt)),c=a.findIndex((function(e){return e.objectID===r.objectID}));c>-1&&a.splice(c,1),a.unshift(r),a=a.slice(0,n),o.setItem(a)},remove:function(e){a=a.filter((function(t){return t.objectID!==e.objectID})),o.setItem(a)},getAll:function(){return a}}}function xt(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}");return{get:(e,t,r={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{const r=JSON.stringify(e),n=o()[r];return Promise.all([n||t(),void 0!==n])})).then((([e,t])=>Promise.all([e,t||r.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const a=o();return a[JSON.stringify(e)]=r,n().setItem(t,JSON.stringify(a)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Nt(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Nt({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Nt({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Nt({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Nt({caches:t}).clear()))}}function Rt(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);const c=n(),i=o&&o.miss||(()=>Promise.resolve());return c.then((e=>i(e))).then((()=>c))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function _t(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function qt(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Tt(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Lt="4.14.2",Mt={WithinQueryParameters:0,WithinHeaders:1};function Ht(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ft={Read:1,Write:2,Any:3},Ut=1,Bt=2,Vt=3,Kt=12e4;function Jt(e,t=Ut){return{...e,status:t,lastUpdate:Date.now()}}function $t(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ft.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ft.Any}}const zt="GET",Wt="POST";function Qt(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Jt(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===Ut||Date.now()-e.lastUpdate>Kt}(e))),n=e.filter((e=>function(e){return e.status===Vt&&Date.now()-e.lastUpdate<=Kt}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>$t(e))):t}}))}function Zt(e,t,r,n){const o=[],a=function(e,t){if(e.method===zt||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),c=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),i=r.method,l=r.method!==zt?{}:{...r.data,...n.data},s={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let u=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:er(o)};const p={data:a,headers:c,method:i,url:Gt(m,r.path,s),connectTimeout:l(u,e.timeouts.connect),responseTimeout:l(u,n.timeout)},d=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},h={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=d(r);return r.isTimedOut&&u++,Promise.all([e.logger.info("Retryable failure",tr(n)),e.hostsCache.set(m,Jt(m,r.isTimedOut?Vt:Bt))]).then((()=>f(t,l)))},onFail(e){throw d(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,er(o))}};return e.requester.send(p).then((e=>((e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e))(e,h)))};return Qt(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Yt(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Gt(e,t,r){const n=Xt(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Xt(e){return Object.keys(e).map((t=>{return Tt("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function er(e){return e.map((e=>tr(e)))}function tr(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const rr=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Mt.WithinHeaders?n:{},queryParameters:()=>e===Mt.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Mt.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:a,timeouts:c,userAgent:i,hosts:l,queryParameters:s,headers:u}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:a,timeouts:c,userAgent:i,headers:u,queryParameters:s,hosts:l.map((e=>$t(e))),read(e,t){const r=Ht(t,f.timeouts.read),n=()=>Zt(f,f.hosts.filter((e=>0!=(e.accept&Ft.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Zt(f,f.hosts.filter((e=>0!=(e.accept&Ft.Write))),e,Ht(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ft.Read},{url:`${t}.algolia.net`,accept:Ft.Write}].concat(_t([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return qt(o,e.methods)},nr=e=>(t,r)=>t.method===zt?e.transporter.read(t,r):e.transporter.write(t,r),or=e=>(t,r={})=>qt({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),ar=e=>(t,r)=>{const n=t.map((e=>({...e,params:Xt(e.params||{})})));return e.transporter.read({method:Wt,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},cr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...a}=t.params;return or(e)(t.indexName,{methods:{searchForFacetValues:sr}}).searchForFacetValues(n,o,{...r,...a})}))),ir=e=>(t,r,n)=>e.transporter.read({method:Wt,path:Tt("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),lr=e=>(t,r)=>e.transporter.read({method:Wt,path:Tt("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),sr=e=>(t,r,n)=>e.transporter.read({method:Wt,path:Tt("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),ur=1,fr=2,mr=3;function pr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let a;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===a&&(clearTimeout(o),a=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(a),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(a),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=mr,{debug:(e,t)=>(ur>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(fr>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Rt(),requestsCache:Rt({serializable:!1}),hostsCache:Nt({caches:[xt({key:`4.14.2-${e}`}),Rt()]}),userAgent:Yt(Lt).add({segment:"Browser",version:"lite"}),authMode:Mt.WithinQueryParameters};var o;return rr({...n,...r,methods:{search:ar,searchForFacetValues:cr,multipleQueries:ar,multipleSearchForFacetValues:cr,customRequest:nr,initIndex:e=>t=>or(e)(t,{methods:{search:lr,searchForFacetValues:sr,findAnswers:ir}})}})}pr.version=Lt;const dr=pr;var hr="3.3.0";function vr(){}function yr(e){return e}function gr(e,t){return e.reduce((function(e,r){var n=t(r);return e.hasOwnProperty(n)||(e[n]=[]),e[n].length<5&&e[n].push(r),e}),{})}var br=["footer","searchBox"];function Or(){return Or=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Dr(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,a=void 0===o?"Search docs":o,c=e.searchParameters,i=e.onClose,l=void 0===i?vr:i,s=e.transformItems,u=void 0===s?yr:s,f=e.hitComponent,m=void 0===f?Re:f,p=e.resultsFooterComponent,d=void 0===p?function(){return null}:p,h=e.navigator,v=e.initialScrollY,y=void 0===v?0:v,g=e.transformSearchClient,b=void 0===g?yr:g,O=e.disableUserPersonalization,S=void 0!==O&&O,E=e.initialQuery,j=void 0===E?"":E,w=e.translations,P=void 0===w?{}:w,I=e.getMissingResultsUrl,D=P.footer,C=P.searchBox,k=Ir(P,br),A=wr(ke.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),x=A[0],N=A[1],R=ke.useRef(null),_=ke.useRef(null),q=ke.useRef(null),T=ke.useRef(null),L=ke.useRef(null),M=ke.useRef(10),H=ke.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,F=ke.useRef(j||H).current,U=function(e,t,r){return ke.useMemo((function(){var n=dr(e,t);return n.addAlgoliaAgent("docsearch",hr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",hr),r(n)}),[e,t,r])}(t,r,b),B=ke.useRef(At({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,V=ke.useRef(At({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===B.getAll().length?7:4})).current,K=ke.useCallback((function(e){if(!S){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===B.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&V.add(t)}}),[B,V,S]),J=ke.useMemo((function(){return Ce({id:"docsearch",defaultActiveItemId:0,placeholder:a,openOnFocus:!0,initialState:{query:F,context:{searchSuggestions:[]}},navigator:h,onStateChange:function(e){N(e.state)},getSources:function(e){var t=e.query,r=e.state,o=e.setContext,a=e.setStatus;return t?U.search([{query:t,indexName:n,params:Er({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(M.current),"hierarchy.lvl2:".concat(M.current),"hierarchy.lvl3:".concat(M.current),"hierarchy.lvl4:".concat(M.current),"hierarchy.lvl5:".concat(M.current),"hierarchy.lvl6:".concat(M.current),"content:".concat(M.current)],snippetEllipsisText:"\u2026",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20},c)}]).catch((function(e){throw"RetryError"===e.name&&a("error"),e})).then((function(e){var t=e.results[0],n=t.hits,a=t.nbHits,c=gr(n,(function(e){return it(e)}));return r.context.searchSuggestions.length0&&(W(),L.current&&L.current.focus())}),[F,W]),ke.useEffect((function(){function e(){if(_.current){var e=.01*window.innerHeight;_.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),ke.createElement("div",Or({ref:R},z({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===x.status&&"DocSearch-Container--Stalled","error"===x.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&l()}}),ke.createElement("div",{className:"DocSearch-Modal",ref:_},ke.createElement("header",{className:"DocSearch-SearchBar",ref:q},ke.createElement(It,Or({},J,{state:x,autoFocus:0===F.length,inputRef:L,isFromSelection:Boolean(F)&&F===H,translations:C,onClose:l}))),ke.createElement("div",{className:"DocSearch-Dropdown",ref:T},ke.createElement(Ot,Or({},J,{indexName:n,state:x,hitComponent:m,resultsFooterComponent:d,disableUserPersonalization:S,recentSearches:V,favoriteSearches:B,inputRef:L,translations:k,getMissingResultsUrl:I,onItemClick:function(e){K(e),l()}}))),ke.createElement("footer",{className:"DocSearch-Footer"},ke.createElement(Ne,{translations:D}))))}}}]); \ No newline at end of file diff --git a/assets/js/686688fd.84639f0c.js b/assets/js/686688fd.84639f0c.js new file mode 100644 index 000000000..4e8f931c4 --- /dev/null +++ b/assets/js/686688fd.84639f0c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8193],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function p(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),m=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=m(e.components);return a.createElement(o.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=m(n),c=r,y=d["".concat(o,".").concat(c)]||d[c]||s[c]||l;return n?a.createElement(y,p(p({ref:t},u),{},{components:n})):a.createElement(y,p({ref:t},u))}));function c(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,p=new Array(l);p[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,p[1]=i;for(var m=2;m{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var a=n(87462),r=(n(67294),n(3905));const l={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:38,tags:["Image","Python"]},p=void 0,i={permalink:"/38",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",source:"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",description:"\uac1c\uc694",date:"2023-07-31T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 31\uc77c",tags:[{label:"Image",permalink:"/tags/image"},{label:"Python",permalink:"/tags/python"}],readingTime:6.185,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:"38",tags:["Image","Python"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"},nextItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"}},o={authorsImageUrls:[]},m=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\uc0ac\uc6a9 \uae30\uc220",id:"\uc0ac\uc6a9-\uae30\uc220",level:3},{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd",id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd",level:3},{value:"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604",id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604",level:3},{value:"AWS Lambda",id:"aws-lambda",level:3},{value:"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131",id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131",level:3},{value:"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc",id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc",level:3},{value:"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131",id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"No module named 'numpy.core._multiarray_umath' \uc5d0\ub7ec",id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec",level:3},{value:"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01",id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],u={toc:m};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\uc0ac\uc6a9-\uae30\uc220"},"\uc0ac\uc6a9 \uae30\uc220"),(0,r.kt)("p",null,"\uc5b8\uc5b4: Python 3.10",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib",(0,r.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront "),(0,r.kt)("p",null,"\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("mermaid",{value:"graph LR\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\n Client --\x3e CloudFront --\x3e S3"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./route.png",src:n(94934).Z,width:"1014",height:"902"})),(0,r.kt)("p",null,"\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. "),(0,r.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,r.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,r.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9"),(0,r.kt)("li",{parentName:"ul"},"\uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. ")),(0,r.kt)("h3",{id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd"},"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5"),(0,r.kt)("li",{parentName:"ol"},"\ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5")),(0,r.kt)("p",null,"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604"},"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"import time\n\nimport matplotlib.pyplot as plt\n\n\ndef draw(point):\n start = time.time()\n x, y = zip(*point)\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n draw_lines(pixel_x, pixel_y)\n end = time.time()\n print(end - start)\n \ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n return scaled_coordinates\n\n\ndef draw_lines(x, y):\n figure = plt.gcf()\n figure.set_size_inches(5, 5)\n plt.plot(x, y, c = 'w',linewidth=5)\n plt.scatter(x[3],y[3], c = 'w', s = 125)\n plt.axis('off')\n plt.savefig('name.png', transparent=True, format='png')\n\npoint = [\n [126.96352960597338, 37.590841000217125],\n [126.96987292787792, 37.58435564234159],\n [126.98128481452298, 37.58594375113966],\n [126.99360339342958, 37.58248524741927],\n [126.99867565340067, 37.56778118088622],\n [127.001935378366117, 37.55985240444085],\n [126.9831048919687, 37.548030119488665],\n [126.97189273528845, 37.5119879225856],\n [127.02689859997221, 37.48488593333883]\n]\n\ndraw(point)\n")),(0,r.kt)("p",null,"\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./routeImage.png",src:n(46770).Z,width:"500",height:"500"})),(0,r.kt)("h3",{id:"aws-lambda"},"AWS Lambda"),(0,r.kt)("p",null,"\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131"},"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131"),(0,r.kt)("p",null,"AmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc"},"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc"),(0,r.kt)("p",null,"\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"\nimport io\nimport uuid\n\nimport boto3\nimport matplotlib.pyplot as plt\n\nPIXEL = 255\nBUCKET_NAME = 'image-plot'\nS3 = 's3'\n\ndef lambda_handler(event, context):\n x = event['x']\n y = event['y']\n image_name = str(uuid.uuid4())\n\n img_data = draw(x, y)\n s3 = boto3.client(S3)\n s3.put_object(Body=img_data.getvalue(), ContentType='image/png', Bucket=BUCKET_NAME, Key=image_name)\n url = f'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}'\n\n return {\n 'statusCode': 200,\n 'body': url\n }\n\ndef draw(x, y):\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n img_data = draw_lines(pixel_x, pixel_y)\n plt.close()\n return img_data\n\ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\n return pixel_values\n\ndef draw_lines(x, y):\n plt.plot(x, y, 'k-', linewidth=10)\n plt.axis('off')\n img_data = io.BytesIO()\n plt.savefig(img_data, transparent=True, format='png')\n img_data.seek(0)\n return img_data\n\n")),(0,r.kt)("h3",{id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131"},"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"matplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"pillow.zip\n\u2502 python/PIL\n\u2514 python/Pillow-5.3.0.dist-info\n")),(0,r.kt)("p",null,"Ubuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"sudo apt update\nsudo apt install zip\nsudo apt install python3-pip\n\nmkdir python\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\n")),(0,r.kt)("h3",{id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec"},(0,r.kt)("inlineCode",{parentName:"h3"},"No module named 'numpy.core._multiarray_umath'")," \uc5d0\ub7ec"),(0,r.kt)("p",null,"Layer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01"},"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","AWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/lambda/"},"AWS Lambda"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html"},"Lambda Layer"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html"},"Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b"},"No module named 'numpy.core._multiarray_umath'"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/6217/"},"\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc")))}s.isMDXComponent=!0},94934:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"},46770:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/routeImage-0eac25ba9b356cd034ade6e062c1ce19.png"}}]); \ No newline at end of file diff --git a/assets/js/686688fd.eed53db1.js b/assets/js/686688fd.eed53db1.js deleted file mode 100644 index 78f0af5b7..000000000 --- a/assets/js/686688fd.eed53db1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8193],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function p(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),m=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=m(e.components);return a.createElement(o.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=m(n),c=r,y=d["".concat(o,".").concat(c)]||d[c]||s[c]||l;return n?a.createElement(y,p(p({ref:t},u),{},{components:n})):a.createElement(y,p({ref:t},u))}));function c(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,p=new Array(l);p[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,p[1]=i;for(var m=2;m{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var a=n(7462),r=(n(7294),n(3905));const l={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:38,tags:["Image","Python"]},p=void 0,i={permalink:"/38",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",source:"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",description:"\uac1c\uc694",date:"2023-07-31T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 31\uc77c",tags:[{label:"Image",permalink:"/tags/image"},{label:"Python",permalink:"/tags/python"}],readingTime:6.185,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:"38",tags:["Image","Python"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"},nextItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"}},o={authorsImageUrls:[]},m=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\uc0ac\uc6a9 \uae30\uc220",id:"\uc0ac\uc6a9-\uae30\uc220",level:3},{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd",id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd",level:3},{value:"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604",id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604",level:3},{value:"AWS Lambda",id:"aws-lambda",level:3},{value:"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131",id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131",level:3},{value:"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc",id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc",level:3},{value:"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131",id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"No module named 'numpy.core._multiarray_umath' \uc5d0\ub7ec",id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec",level:3},{value:"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01",id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],u={toc:m};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\uc0ac\uc6a9-\uae30\uc220"},"\uc0ac\uc6a9 \uae30\uc220"),(0,r.kt)("p",null,"\uc5b8\uc5b4: Python 3.10",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib",(0,r.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront "),(0,r.kt)("p",null,"\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("mermaid",{value:"graph LR\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\n Client --\x3e CloudFront --\x3e S3"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./route.png",src:n(4934).Z,width:"1014",height:"902"})),(0,r.kt)("p",null,"\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. "),(0,r.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,r.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,r.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9"),(0,r.kt)("li",{parentName:"ul"},"\uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. ")),(0,r.kt)("h3",{id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd"},"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5"),(0,r.kt)("li",{parentName:"ol"},"\ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5")),(0,r.kt)("p",null,"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604"},"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"import time\n\nimport matplotlib.pyplot as plt\n\n\ndef draw(point):\n start = time.time()\n x, y = zip(*point)\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n draw_lines(pixel_x, pixel_y)\n end = time.time()\n print(end - start)\n \ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n return scaled_coordinates\n\n\ndef draw_lines(x, y):\n figure = plt.gcf()\n figure.set_size_inches(5, 5)\n plt.plot(x, y, c = 'w',linewidth=5)\n plt.scatter(x[3],y[3], c = 'w', s = 125)\n plt.axis('off')\n plt.savefig('name.png', transparent=True, format='png')\n\npoint = [\n [126.96352960597338, 37.590841000217125],\n [126.96987292787792, 37.58435564234159],\n [126.98128481452298, 37.58594375113966],\n [126.99360339342958, 37.58248524741927],\n [126.99867565340067, 37.56778118088622],\n [127.001935378366117, 37.55985240444085],\n [126.9831048919687, 37.548030119488665],\n [126.97189273528845, 37.5119879225856],\n [127.02689859997221, 37.48488593333883]\n]\n\ndraw(point)\n")),(0,r.kt)("p",null,"\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./routeImage.png",src:n(6770).Z,width:"500",height:"500"})),(0,r.kt)("h3",{id:"aws-lambda"},"AWS Lambda"),(0,r.kt)("p",null,"\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131"},"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131"),(0,r.kt)("p",null,"AmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc"},"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc"),(0,r.kt)("p",null,"\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"\nimport io\nimport uuid\n\nimport boto3\nimport matplotlib.pyplot as plt\n\nPIXEL = 255\nBUCKET_NAME = 'image-plot'\nS3 = 's3'\n\ndef lambda_handler(event, context):\n x = event['x']\n y = event['y']\n image_name = str(uuid.uuid4())\n\n img_data = draw(x, y)\n s3 = boto3.client(S3)\n s3.put_object(Body=img_data.getvalue(), ContentType='image/png', Bucket=BUCKET_NAME, Key=image_name)\n url = f'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}'\n\n return {\n 'statusCode': 200,\n 'body': url\n }\n\ndef draw(x, y):\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n img_data = draw_lines(pixel_x, pixel_y)\n plt.close()\n return img_data\n\ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\n return pixel_values\n\ndef draw_lines(x, y):\n plt.plot(x, y, 'k-', linewidth=10)\n plt.axis('off')\n img_data = io.BytesIO()\n plt.savefig(img_data, transparent=True, format='png')\n img_data.seek(0)\n return img_data\n\n")),(0,r.kt)("h3",{id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131"},"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"matplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"pillow.zip\n\u2502 python/PIL\n\u2514 python/Pillow-5.3.0.dist-info\n")),(0,r.kt)("p",null,"Ubuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"sudo apt update\nsudo apt install zip\nsudo apt install python3-pip\n\nmkdir python\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\n")),(0,r.kt)("h3",{id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec"},(0,r.kt)("inlineCode",{parentName:"h3"},"No module named 'numpy.core._multiarray_umath'")," \uc5d0\ub7ec"),(0,r.kt)("p",null,"Layer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01"},"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","AWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/lambda/"},"AWS Lambda"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html"},"Lambda Layer"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html"},"Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b"},"No module named 'numpy.core._multiarray_umath'"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/6217/"},"\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc")))}s.isMDXComponent=!0},4934:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"},6770:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/routeImage-0eac25ba9b356cd034ade6e062c1ce19.png"}}]); \ No newline at end of file diff --git a/assets/js/6875c492.433b927f.js b/assets/js/6875c492.433b927f.js deleted file mode 100644 index 0d9a14308..000000000 --- a/assets/js/6875c492.433b927f.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8610],{9703:(e,t,a)=>{"use strict";a.d(t,{Z:()=>l});var n=a(7294),r=a(5999),s=a(2244);function l(e){const{metadata:t}=e,{previousPage:a,nextPage:l}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,r.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(s.Z,{permalink:a,title:n.createElement(r.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),l&&n.createElement(s.Z,{permalink:l,title:n.createElement(r.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{"use strict";a.d(t,{Z:()=>l});var n=a(7294),r=a(9460),s=a(857);function l(e){let{items:t,component:a=s.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(r.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},1714:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>E});var n=a(7294),r=a(6010),s=a(5999),l=a(8824),i=a(833),o=a(5281),c=a(9960),g=a(9058),u=a(9703),m=a(197),p=a(9985);function d(e){const t=function(){const{selectMessage:e}=(0,l.c)();return t=>e(t,(0,s.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,s.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function b(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(i.d,{title:a}),n.createElement(m.Z,{tag:"blog_tags_posts"}))}function h(e){let{tag:t,items:a,sidebar:r,listMetadata:l}=e;const i=d(t);return n.createElement(g.Z,{sidebar:r},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,i),n.createElement(c.Z,{href:t.allTagsPath},n.createElement(s.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(p.Z,{items:a}),n.createElement(u.Z,{metadata:l}))}function E(e){return n.createElement(i.FG,{className:(0,r.Z)(o.k.wrapper.blogPages,o.k.page.blogTagPostListPage)},n.createElement(b,e),n.createElement(h,e))}},857:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(390),r=a(7294),s=a(2949),l=a(9460);const i=function(e){const{colorMode:t}=(0,s.I)(),{isBlogPostPage:a}=(0,l.C)(),i="dark"===t?"dark":"light",o=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(!a)return;const e=o.current.querySelector("iframe.giscus-frame");e?(()=>{const t={setConfig:{theme:i}};e.contentWindow.postMessage({giscus:t},"https://giscus.app")})():(()=>{const e=document.createElement("script");e.src="https://giscus.app/client.js",e.setAttribute("data-repo","greeng00se/greeng00se.github.io"),e.setAttribute("data-repo-id","R_kgDOIRAC3w"),e.setAttribute("data-category","Announcements"),e.setAttribute("data-category-id","DIC_kwDOIRAC384CTcGg"),e.setAttribute("data-mapping","pathname"),e.setAttribute("data-strict","0"),e.setAttribute("data-reactions-enabled","1"),e.setAttribute("data-emit-metadata","0"),e.setAttribute("data-input-position","bottom"),e.setAttribute("data-theme",i),e.setAttribute("data-lang","ko"),e.crossOrigin="anonymous",e.async=!0,o.current.appendChild(e)})()}),[i]),r.createElement(r.Fragment,null,r.createElement(n.Z,e),a&&r.createElement("div",{ref:o}))}},1748:(e,t,a)=>{var n={"./locale":9234,"./locale.js":9234};function r(e){var t=s(e);return a(t)}function s(e){if(!a.o(n,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return n[e]}r.keys=function(){return Object.keys(n)},r.resolve=s,e.exports=r,r.id=1748}}]); \ No newline at end of file diff --git a/assets/js/6875c492.e43a4554.js b/assets/js/6875c492.e43a4554.js new file mode 100644 index 000000000..c5bf6123c --- /dev/null +++ b/assets/js/6875c492.e43a4554.js @@ -0,0 +1 @@ +(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8610],{99703:(e,t,a)=>{"use strict";a.d(t,{Z:()=>l});var n=a(67294),r=a(95999),s=a(32244);function l(e){const{metadata:t}=e,{previousPage:a,nextPage:l}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,r.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(s.Z,{permalink:a,title:n.createElement(r.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),l&&n.createElement(s.Z,{permalink:l,title:n.createElement(r.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},79985:(e,t,a)=>{"use strict";a.d(t,{Z:()=>l});var n=a(67294),r=a(9460),s=a(857);function l(e){let{items:t,component:a=s.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(r.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},41714:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>E});var n=a(67294),r=a(86010),s=a(95999),l=a(88824),i=a(10833),o=a(35281),c=a(39960),g=a(39058),u=a(99703),m=a(90197),p=a(79985);function d(e){const t=function(){const{selectMessage:e}=(0,l.c)();return t=>e(t,(0,s.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,s.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function b(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(i.d,{title:a}),n.createElement(m.Z,{tag:"blog_tags_posts"}))}function h(e){let{tag:t,items:a,sidebar:r,listMetadata:l}=e;const i=d(t);return n.createElement(g.Z,{sidebar:r},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,i),n.createElement(c.Z,{href:t.allTagsPath},n.createElement(s.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(p.Z,{items:a}),n.createElement(u.Z,{metadata:l}))}function E(e){return n.createElement(i.FG,{className:(0,r.Z)(o.k.wrapper.blogPages,o.k.page.blogTagPostListPage)},n.createElement(b,e),n.createElement(h,e))}},857:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(30390),r=a(67294),s=a(92949),l=a(9460);const i=function(e){const{colorMode:t}=(0,s.I)(),{isBlogPostPage:a}=(0,l.C)(),i="dark"===t?"dark":"light",o=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(!a)return;const e=o.current.querySelector("iframe.giscus-frame");e?(()=>{const t={setConfig:{theme:i}};e.contentWindow.postMessage({giscus:t},"https://giscus.app")})():(()=>{const e=document.createElement("script");e.src="https://giscus.app/client.js",e.setAttribute("data-repo","greeng00se/greeng00se.github.io"),e.setAttribute("data-repo-id","R_kgDOIRAC3w"),e.setAttribute("data-category","Announcements"),e.setAttribute("data-category-id","DIC_kwDOIRAC384CTcGg"),e.setAttribute("data-mapping","pathname"),e.setAttribute("data-strict","0"),e.setAttribute("data-reactions-enabled","1"),e.setAttribute("data-emit-metadata","0"),e.setAttribute("data-input-position","bottom"),e.setAttribute("data-theme",i),e.setAttribute("data-lang","ko"),e.crossOrigin="anonymous",e.async=!0,o.current.appendChild(e)})()}),[i]),r.createElement(r.Fragment,null,r.createElement(n.Z,e),a&&r.createElement("div",{ref:o}))}},11748:(e,t,a)=>{var n={"./locale":89234,"./locale.js":89234};function r(e){var t=s(e);return a(t)}function s(e){if(!a.o(n,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return n[e]}r.keys=function(){return Object.keys(n)},r.resolve=s,e.exports=r,r.id=11748}}]); \ No newline at end of file diff --git a/assets/js/8894.91734414.js b/assets/js/6945.52e6a492.js similarity index 55% rename from assets/js/8894.91734414.js rename to assets/js/6945.52e6a492.js index 5d8e4f93a..aed7dcbe7 100644 --- a/assets/js/8894.91734414.js +++ b/assets/js/6945.52e6a492.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8894],{8894:(e,s,b)=>{b.r(s)}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6945],{46945:(e,s,b)=>{b.r(s)}}]); \ No newline at end of file diff --git a/assets/js/69c28c32.2f49e48f.js b/assets/js/69c28c32.2f49e48f.js new file mode 100644 index 000000000..b7ae95969 --- /dev/null +++ b/assets/js/69c28c32.2f49e48f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1065],{99263:e=>{e.exports=JSON.parse('{"permalink":"/page/36","page":36,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/35","nextPage":"/page/37","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/69c28c32.b75a4f92.js b/assets/js/69c28c32.b75a4f92.js deleted file mode 100644 index 58421a2f0..000000000 --- a/assets/js/69c28c32.b75a4f92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1065],{9263:e=>{e.exports=JSON.parse('{"permalink":"/page/36","page":36,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/35","nextPage":"/page/37","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6a19354d.3f26fdc4.js b/assets/js/6a19354d.3f26fdc4.js deleted file mode 100644 index 5edfa60c3..000000000 --- a/assets/js/6a19354d.3f26fdc4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[693],{6232:e=>{e.exports=JSON.parse('{"label":"Lock","permalink":"/tags/lock","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/9ca52986.09e3d8d5.js b/assets/js/6a19354d.c2212a44.js similarity index 68% rename from assets/js/9ca52986.09e3d8d5.js rename to assets/js/6a19354d.c2212a44.js index 12e07563d..139720068 100644 --- a/assets/js/9ca52986.09e3d8d5.js +++ b/assets/js/6a19354d.c2212a44.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3490],{2016:e=>{e.exports=JSON.parse('{"label":"Lock","permalink":"/tags/lock","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[693],{36232:e=>{e.exports=JSON.parse('{"label":"Lock","permalink":"/tags/lock","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/6b90f600.02ed3c6f.js b/assets/js/6b90f600.02ed3c6f.js deleted file mode 100644 index 4f184503b..000000000 --- a/assets/js/6b90f600.02ed3c6f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4659],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||u[k]||p;return r?n.createElement(b,o(o({ref:t},m),{},{components:r})):n.createElement(b,o({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=s;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:10,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/10",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",description:"\ube14\ub799\uc7ad",date:"2023-03-14T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.105,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:"10",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"},nextItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"}},i={authorsImageUrls:[]},c=[{value:"\ube14\ub799\uc7ad",id:"\ube14\ub799\uc7ad",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ube14\ub799\uc7ad"},"\ube14\ub799\uc7ad"),(0,a.kt)("p",null,"\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. "),(0,a.kt)("p",null,"\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",'"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?" '),(0,a.kt)("p",null,"\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. "),(0,a.kt)("p",null,"\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uccb4\ub825 \uad00\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0c1\ud0dc \ud328\ud134"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0dd\uac01 \uc815\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6b90f600.7ad50e48.js b/assets/js/6b90f600.7ad50e48.js new file mode 100644 index 000000000..635366f76 --- /dev/null +++ b/assets/js/6b90f600.7ad50e48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4659],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||u[k]||p;return r?n.createElement(b,o(o({ref:t},m),{},{components:r})):n.createElement(b,o({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=s;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:10,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/10",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",description:"\ube14\ub799\uc7ad",date:"2023-03-14T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.105,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:"10",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"},nextItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"}},i={authorsImageUrls:[]},c=[{value:"\ube14\ub799\uc7ad",id:"\ube14\ub799\uc7ad",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ube14\ub799\uc7ad"},"\ube14\ub799\uc7ad"),(0,a.kt)("p",null,"\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. "),(0,a.kt)("p",null,"\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",'"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?" '),(0,a.kt)("p",null,"\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. "),(0,a.kt)("p",null,"\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uccb4\ub825 \uad00\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0c1\ud0dc \ud328\ud134"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0dd\uac01 \uc815\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6bc709ad.6993e653.js b/assets/js/6bc709ad.6993e653.js new file mode 100644 index 000000000..4c8b41c6d --- /dev/null +++ b/assets/js/6bc709ad.6993e653.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9393],{81399:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/6","page":6,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/5","nextPage":"/tags/retrospective/page/7","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6bc709ad.d993e681.js b/assets/js/6bc709ad.d993e681.js deleted file mode 100644 index f1e792d51..000000000 --- a/assets/js/6bc709ad.d993e681.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9393],{1399:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/6","page":6,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/5","nextPage":"/tags/retrospective/page/7","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6c60e25f.6fed07ac.js b/assets/js/6c60e25f.6fed07ac.js deleted file mode 100644 index 06767a712..000000000 --- a/assets/js/6c60e25f.6fed07ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2756],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),o=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=o(e.components);return a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),m=o(n),k=r,d=m["".concat(s,".").concat(k)]||m[k]||u[k]||l;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var o=2;o{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var a=n(7462),r=(n(7294),n(3905));const l={title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:23,tags:["TecoChat","Retrospective"]},i=void 0,p={permalink:"/23",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",source:"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",description:"\ud504\ub860\ud2b8\uc5d4\ud2b8",date:"2023-05-01T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.67,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:"23",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"},nextItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"}},s={authorsImageUrls:[]},o=[{value:"\ud504\ub860\ud2b8\uc5d4\ud2b8",id:"\ud504\ub860\ud2b8\uc5d4\ud2b8",level:3},{value:"\ubc31\uc5d4\ub4dc",id:"\ubc31\uc5d4\ub4dc",level:3},{value:"Http Request Header",id:"http-request-header",level:3},{value:"Elastic Beanstalk",id:"elastic-beanstalk",level:3},{value:"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac",id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac",level:3},{value:"Elastic Beanstalk nginx \uc124\uc815",id:"elastic-beanstalk-nginx-\uc124\uc815",level:3},{value:"Jenkins",id:"jenkins",level:3},{value:"Jenkins Blue Ocean",id:"jenkins-blue-ocean",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:o};function u(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud504\ub860\ud2b8\uc5d4\ud2b8"},"\ud504\ub860\ud2b8\uc5d4\ud2b8"),(0,r.kt)("p",null,"\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\ubc31\uc5d4\ub4dc"},"\ubc31\uc5d4\ub4dc"),(0,r.kt)("p",null,"\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,r.kt)("h3",{id:"http-request-header"},"Http Request Header"),(0,r.kt)("p",null,"\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const encodedName = () => {\n const uriComponent = unescape(encodeURIComponent(name.value));\n return btoa(uriComponent);\n};\n")),(0,r.kt)("h3",{id:"elastic-beanstalk"},"Elastic Beanstalk"),(0,r.kt)("p",null,"\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac"},"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac"),(0,r.kt)("p",null,"\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","RDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-nginx-\uc124\uc815"},"Elastic Beanstalk nginx \uc124\uc815"),(0,r.kt)("p",null,"\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},".platform/nginx/conf.d/")," \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"jenkins"},"Jenkins"),(0,r.kt)("p",null,"\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","t4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},'test {\n maxHeapSize = "1024m"\n}\n')),(0,r.kt)("h3",{id:"jenkins-blue-ocean"},"Jenkins Blue Ocean"),(0,r.kt)("p",null,"Blue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",'\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 "Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. '),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html"},"Elastic Beanstalk, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/ec2/graviton/"},"EC2 AWS Graviton, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings"},"Default Memory Settings, AWS")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6c60e25f.71f33762.js b/assets/js/6c60e25f.71f33762.js new file mode 100644 index 000000000..49181b83b --- /dev/null +++ b/assets/js/6c60e25f.71f33762.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2756],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>k});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),o=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=o(e.components);return a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),m=o(n),k=r,d=m["".concat(s,".").concat(k)]||m[k]||u[k]||l;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var o=2;o{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var a=n(87462),r=(n(67294),n(3905));const l={title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:23,tags:["TecoChat","Retrospective"]},i=void 0,p={permalink:"/23",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",source:"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",description:"\ud504\ub860\ud2b8\uc5d4\ud2b8",date:"2023-05-01T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 1\uc77c",tags:[{label:"TecoChat",permalink:"/tags/teco-chat"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.67,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",slug:"23",tags:["TecoChat","Retrospective"]},prevItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"},nextItem:{title:"Jenkins\ub85c CI/CD \uc124\uc815",permalink:"/22"}},s={authorsImageUrls:[]},o=[{value:"\ud504\ub860\ud2b8\uc5d4\ud2b8",id:"\ud504\ub860\ud2b8\uc5d4\ud2b8",level:3},{value:"\ubc31\uc5d4\ub4dc",id:"\ubc31\uc5d4\ub4dc",level:3},{value:"Http Request Header",id:"http-request-header",level:3},{value:"Elastic Beanstalk",id:"elastic-beanstalk",level:3},{value:"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac",id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac",level:3},{value:"Elastic Beanstalk nginx \uc124\uc815",id:"elastic-beanstalk-nginx-\uc124\uc815",level:3},{value:"Jenkins",id:"jenkins",level:3},{value:"Jenkins Blue Ocean",id:"jenkins-blue-ocean",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:o};function u(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud504\ub860\ud2b8\uc5d4\ud2b8"},"\ud504\ub860\ud2b8\uc5d4\ud2b8"),(0,r.kt)("p",null,"\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\ubc31\uc5d4\ub4dc"},"\ubc31\uc5d4\ub4dc"),(0,r.kt)("p",null,"\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,r.kt)("h3",{id:"http-request-header"},"Http Request Header"),(0,r.kt)("p",null,"\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const encodedName = () => {\n const uriComponent = unescape(encodeURIComponent(name.value));\n return btoa(uriComponent);\n};\n")),(0,r.kt)("h3",{id:"elastic-beanstalk"},"Elastic Beanstalk"),(0,r.kt)("p",null,"\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-rds-\uc124\uc815-\ud6c4-\ubd84\ub9ac"},"Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac"),(0,r.kt)("p",null,"\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","RDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. "),(0,r.kt)("h3",{id:"elastic-beanstalk-nginx-\uc124\uc815"},"Elastic Beanstalk nginx \uc124\uc815"),(0,r.kt)("p",null,"\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},".platform/nginx/conf.d/")," \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"jenkins"},"Jenkins"),(0,r.kt)("p",null,"\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","t4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-groovy"},'test {\n maxHeapSize = "1024m"\n}\n')),(0,r.kt)("h3",{id:"jenkins-blue-ocean"},"Jenkins Blue Ocean"),(0,r.kt)("p",null,"Blue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",'\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 "Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. '),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html"},"Elastic Beanstalk, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/ec2/graviton/"},"EC2 AWS Graviton, AWS"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings"},"Default Memory Settings, AWS")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6cfe3a99.f51506e7.js b/assets/js/6cfe3a99.f51506e7.js new file mode 100644 index 000000000..a9f726a66 --- /dev/null +++ b/assets/js/6cfe3a99.f51506e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5319],{91227:e=>{e.exports=JSON.parse('{"permalink":"/tags/cloudwatch","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6dd1c948.5c7909ff.js b/assets/js/6dd1c948.5c7909ff.js deleted file mode 100644 index ffd9b705c..000000000 --- a/assets/js/6dd1c948.5c7909ff.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7064],{6376:e=>{e.exports=JSON.parse('{"permalink":"/page/34","page":34,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/33","nextPage":"/page/35","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6dd1c948.dce02465.js b/assets/js/6dd1c948.dce02465.js new file mode 100644 index 000000000..7ef8ad72f --- /dev/null +++ b/assets/js/6dd1c948.dce02465.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7064],{76376:e=>{e.exports=JSON.parse('{"permalink":"/page/34","page":34,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/33","nextPage":"/page/35","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/70a12cc4.2db653db.js b/assets/js/70a12cc4.2db653db.js new file mode 100644 index 000000000..255340e97 --- /dev/null +++ b/assets/js/70a12cc4.2db653db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5682],{17085:e=>{e.exports=JSON.parse('{"permalink":"/tags/static","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/70a12cc4.c3288285.js b/assets/js/70a12cc4.c3288285.js deleted file mode 100644 index 7dd73a409..000000000 --- a/assets/js/70a12cc4.c3288285.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5682],{9461:e=>{e.exports=JSON.parse('{"permalink":"/tags/static","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/72367227.68ed5e05.js b/assets/js/72367227.68ed5e05.js new file mode 100644 index 000000000..296c8b462 --- /dev/null +++ b/assets/js/72367227.68ed5e05.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[795],{3905:(t,e,a)=>{a.d(e,{Zo:()=>i,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function o(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),d=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},i=function(t){var e=d(t.components);return n.createElement(p.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,p=t.parentName,i=c(t,["components","mdxType","originalType","parentName"]),s=d(a),h=r,m=s["".concat(p,".").concat(h)]||s[h]||u[h]||l;return a?n.createElement(m,o(o({ref:e},i),{},{components:a})):n.createElement(m,o({ref:e},i))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,o=new Array(l);o[0]=s;var c={};for(var p in e)hasOwnProperty.call(e,p)&&(c[p]=e[p]);c.originalType=t,c.mdxType="string"==typeof t?t:r,o[1]=c;for(var d=2;d{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const l={title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",slug:41,tags:["cloudwatch","log","monitoring"]},o=void 0,c={permalink:"/41",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md",source:"@site/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md",title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",description:"CloudWatch",date:"2023-08-17T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 17\uc77c",tags:[{label:"cloudwatch",permalink:"/tags/cloudwatch"},{label:"log",permalink:"/tags/log"},{label:"monitoring",permalink:"/tags/monitoring"}],readingTime:5.185,hasTruncateMarker:!1,authors:[],frontMatter:{title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",slug:"41",tags:["cloudwatch","log","monitoring"]},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",permalink:"/40"}},p={authorsImageUrls:[]},d=[{value:"CloudWatch",id:"cloudwatch",level:2},{value:"CloudWatch Metrics",id:"cloudwatch-metrics",level:2},{value:"CloudWatch Agent \uc124\uce58",id:"cloudwatch-agent-\uc124\uce58",level:2},{value:"IAM \uc5ed\ud560 \uc124\uc815",id:"iam-\uc5ed\ud560-\uc124\uc815",level:3},{value:"\uc124\uce58",id:"\uc124\uce58",level:3},{value:"Wizard",id:"wizard",level:3},{value:"\uc124\uc815 \ud30c\uc77c \uc801\uc6a9",id:"\uc124\uc815-\ud30c\uc77c-\uc801\uc6a9",level:3},{value:"types.db: no such file or directory \uc5d0\ub7ec",id:"typesdb-no-such-file-or-directory-\uc5d0\ub7ec",level:3},{value:"\uc9c0\ud45c \ud655\uc778",id:"\uc9c0\ud45c-\ud655\uc778",level:3},{value:"\ub85c\uadf8",id:"\ub85c\uadf8",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],i={toc:d};function u(t){let{components:e,...l}=t;return(0,r.kt)("wrapper",(0,n.Z)({},i,l,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"cloudwatch"},"CloudWatch"),(0,r.kt)("p",null,"AWS \ub9ac\uc18c\uc2a4\uc640 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc9c0\ud45c\uc640 \ub85c\uadf8\uc5d0 \ub300\ud55c \ubaa8\ub2c8\ud130\ub9c1\uc744 \uc81c\uacf5\ud558\ub294 \uc11c\ube44\uc2a4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc9c0\ud45c\ub97c \uac10\uc2dc\ud558\uc5ec \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \uae30\ub2a5\ub3c4 \uc81c\uacf5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud504\ub9ac\ud2f0\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \ub300\uc2dc\ubcf4\ub4dc\ub2f9 3$/M \uc758 \ube44\uc6a9\uc774 \uccad\uad6c\ub418\uace0, \uc9c0\ud45c\ub098 \ub85c\uadf8\uc758 \uc591\uc5d0 \ub530\ub77c \ube44\uc6a9\uc774 \ucd94\uac00\uc801\uc73c\ub85c \uccad\uad6c\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc694\uae08 \uc815\ubcf4\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub294 ",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/cloudwatch/pricing/"},"\ub2e4\uc74c \ub9c1\ud06c"),"\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h2",{id:"cloudwatch-metrics"},"CloudWatch Metrics"),(0,r.kt)("p",null,"\uae30\ubcf8\uc801\uc73c\ub85c 5\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc218\uc9d1\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc138\ubd80 \ubaa8\ub2c8\ud130\ub9c1(Detailed Monitoring)\uc744 \ud65c\uc131\ud654\ud558\uba74 1\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\ub97c \uc218\uc9d1\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub300\uc2dc\ubcf4\ub4dc\uc5d0\uc11c InstanceId\ub85c \uac80\uc0c9\ud558\uc5ec \uc218\uc9d1\ub41c \uc9c0\ud45c\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch1.png",src:a(7138).Z,width:"3214",height:"1636"})),(0,r.kt)("p",null,"CPUUtilization, NetworkIn, NetworkOut\uacfc \uac19\uc740 \uae30\ubcf8\uc801\uc778 \uc9c0\ud45c\ub97c \uc81c\uacf5\ud558\uace0, \uba54\ubaa8\ub9ac, \ub514\uc2a4\ud06c \uacf5\uac04\uacfc \uac19\uc740 \uc9c0\ud45c\ub97c \ud655\uc778\ud558\ub824\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\ub97c \uc124\uc815\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("h2",{id:"cloudwatch-agent-\uc124\uce58"},"CloudWatch Agent \uc124\uce58"),(0,r.kt)("p",null,"CloudWatch Agent \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\uc640 \ub85c\uadf8\ub97c \uc218\uc9d1\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"iam-\uc5ed\ud560-\uc124\uc815"},"IAM \uc5ed\ud560 \uc124\uc815"),(0,r.kt)("p",null,"\uae30\ubcf8\uc801\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4\uac00 CloudWatchAgentServerPolicy\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","IAM \u2192 \uc5ed\ud560\uc5d0\uc11c \uc5ed\ud560 \uc0dd\uc131\uc744 \ud074\ub9ad\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch2.png",src:a(22427).Z,width:"2614",height:"1602"})),(0,r.kt)("p",null,"CloudWatchAgentServerPolicy \uad8c\ud55c \uc815\ucc45\uc744 \uc120\ud0dd\ud558\uace0, \uc801\ub2f9\ud55c \uc5ed\ud560 \uc774\ub984\uc744 \uc785\ub825\ud574\uc11c \uc5ed\ud560\uc744 \uc0dd\uc131\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch3.png",src:a(60912).Z,width:"2650",height:"1616"})),(0,r.kt)("p",null,"EC2 \uc778\uc2a4\ud134\uc2a4 \ubaa9\ub85d\uc73c\ub85c \ub4e4\uc5b4\uac00\uc11c, CloudWatch Agent\ub97c \uc124\uce58\ud560 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud074\ub9ad\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc5d0\uc11c \uc774\uc804\uc5d0 \uc0dd\uc131\ud55c \uc5ed\ud560\uc744 \uc9c0\uc815\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch4.png",src:a(80939).Z,width:"1764",height:"800"})),(0,r.kt)("h3",{id:"\uc124\uce58"},"\uc124\uce58"),(0,r.kt)("p",null,"\ud658\uacbd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("p",null,"OS: ubuntu 22.04",(0,r.kt)("br",{parentName:"p"}),"\n","\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small (ARM64) "),(0,r.kt)("p",null,"\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uce58\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb\nsudo dpkg -i -E ./amazon-cloudwatch-agent.deb\n")),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html"},"\uc0ac\uc6a9 \uc124\uba85\uc11c"),"\uc5d0 \uac01 \uc778\uc2a4\ud134\uc2a4 \uc720\ud615\ub9c8\ub2e4 \ub2e4\uc6b4\ub85c\ub4dc \ub9c1\ud06c\uac00 \uc790\uc138\ud558\uac8c \uc548\ub0b4\ub418\uc5b4 \uc788\ub2e4."),(0,r.kt)("h3",{id:"wizard"},"Wizard"),(0,r.kt)("p",null,"CloudWatch Wizard\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uc124\uc815 \ud30c\uc77c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8\ub97c \uc218\uc9d1\ud558\ub3c4\ub85d \uc124\uc815\ud558\ub294 \uacbd\uc6b0 Wizard \uc2e4\ud589 \uba85\ub839\uc5b4 \uc785\ub825 \uc804 log \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \ubcf5\uc0ac\ud574\ub450\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec Wizard\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard\n")),(0,r.kt)("p",null,"\uc124\uc815\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74 \uc124\uc815 \ud30c\uc77c\uc774 \uc5b4\ub5bb\uac8c \uad6c\uc131\ub420\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8\ub97c \ucd94\uac00\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \uc785\ub825\ucc3d\uc774 \ub098\uc624\uba74 \uc900\ube44\ud574\ub480\ub358 \ub85c\uadf8 \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \uc785\ub825\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch5.png",src:a(71028).Z,width:"2320",height:"1328"})),(0,r.kt)("p",null,"\uc911\uac04\uc5d0 SSM parameter store\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"Do you want to store the config in the SSM parameter store?\n1. yes\n2. no\n")),(0,r.kt)("p",null,"\ucd94\uac00\uc801\uc73c\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 2\ubc88\uc744 \uc120\ud0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Parameter Store \uad00\ub9ac\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc758 ",(0,r.kt)("a",{parentName:"p",href:"https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/"},"\ubb38\uc11c"),"\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac70 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\uc774 \uc644\ub8cc\ub418\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"/opt/aws/amazon-cloudwatch-agent/bin/config.json")," \uc5d0 \uc124\uc815\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc774 \uc800\uc7a5\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"\uc124\uc815-\ud30c\uc77c-\uc801\uc6a9"},"\uc124\uc815 \ud30c\uc77c \uc801\uc6a9"),(0,r.kt)("p",null,"\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uc815\ud30c\uc77c\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","file \ub4a4\uc5d0\ub294 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub300\ud55c \uc808\ub300\uacbd\ub85c(\uc544\ub798 \uba85\ub839\uc5b4 \uae30\uc900 \uae30\ubcf8 \uc0dd\uc131 \uc704\uce58)\ub97c \uc785\ub825\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json\n")),(0,r.kt)("h3",{id:"typesdb-no-such-file-or-directory-\uc5d0\ub7ec"},"types.db: no such file or directory \uc5d0\ub7ec"),(0,r.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 types.db \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory\n")),(0,r.kt)("p",null,"types.db \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo mkdir /usr/share/collectd\nsudo touch /usr/share/collectd/types.db\n")),(0,r.kt)("h3",{id:"\uc9c0\ud45c-\ud655\uc778"},"\uc9c0\ud45c \ud655\uc778"),(0,r.kt)("p",null,"CloudWatch Metrics\uc5d0 \uac00\ubcf4\uba74 CWAgent\ub77c\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\uac00 \ucd94\uac00\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815 \ud30c\uc77c\uc5d0 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \ucd94\uac00\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch6.png",src:a(15055).Z,width:"2638",height:"708"})),(0,r.kt)("h3",{id:"\ub85c\uadf8"},"\ub85c\uadf8"),(0,r.kt)("p",null,"CloudWatch \u2192 \ub85c\uadf8 \uadf8\ub8f9\uc73c\ub85c \uac00\uba74 Wizard\ub85c \ucd94\uac00\ud55c \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch7.png",src:a(30720).Z,width:"2792",height:"1652"})),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html"},"CloudWatch\ub780 \ubb34\uc5c7\uc785\ub2c8\uae4c?"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/cloudwatch/pricing/"},"Amazon CloudWatch \uc694\uae08"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html"},"Linux \uc778\uc2a4\ud134\uc2a4 \uc9c0\ud45c"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html"},"\uc11c\ubc84\uc5d0 CloudWatch \uc5d0\uc774\uc804\ud2b8 \uc124\uce58 \ubc0f \uc2e4\ud589"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/"},"CloudWatch Agent\ub97c Parameter Store\uc5d0\uc11c \uad00\ub9ac\ud574 \ubcf4\uae30")))}u.isMDXComponent=!0},7138:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch1-859296155df6c20d0846f1388022a86c.png"},22427:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch2-ca9c26868dec08ea7133e2774f49798a.png"},60912:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch3-da10422b87e1901286b6d3e85e2c01cc.png"},80939:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch4-1e7eddc7e8dd890ac18352e900df8e07.png"},71028:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch5-67d1bd59d4552f4fe481452eddc78a5e.png"},15055:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch6-06ead809f7510938baee41505bc72b97.png"},30720:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch7-a86dfc0db307ddf7d1660d2b9e419c96.png"}}]); \ No newline at end of file diff --git a/assets/js/7405ea58.e8338c65.js b/assets/js/7405ea58.e8338c65.js deleted file mode 100644 index b6be724cc..000000000 --- a/assets/js/7405ea58.e8338c65.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2345],{702:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/11","page":11,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/10","nextPage":"/tags/retrospective/page/12","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7405ea58.f6a4eb7a.js b/assets/js/7405ea58.f6a4eb7a.js new file mode 100644 index 000000000..83471ace5 --- /dev/null +++ b/assets/js/7405ea58.f6a4eb7a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2345],{40702:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/11","page":11,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/10","nextPage":"/tags/retrospective/page/12","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/741df4e1.88e7c4ed.js b/assets/js/741df4e1.88e7c4ed.js new file mode 100644 index 000000000..5bc800643 --- /dev/null +++ b/assets/js/741df4e1.88e7c4ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[280],{3905:(t,e,a)=>{a.d(e,{Zo:()=>o,kt:()=>k});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var u=n.createContext({}),m=function(t){var e=n.useContext(u),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},o=function(t){var e=m(t.components);return n.createElement(u.Provider,{value:e},t.children)},s={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},d=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,u=t.parentName,o=i(t,["components","mdxType","originalType","parentName"]),d=m(a),k=r,c=d["".concat(u,".").concat(k)]||d[k]||s[k]||l;return a?n.createElement(c,p(p({ref:e},o),{},{components:a})):n.createElement(c,p({ref:e},o))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,p=new Array(l);p[0]=d;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i.mdxType="string"==typeof t?t:r,p[1]=i;for(var m=2;m{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var n=a(87462),r=(a(67294),a(3905));const l={title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:15,tags:["Java","Class"]},p=void 0,i={permalink:"/15",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",source:"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",description:"\ud074\ub798\uc2a4 \ud30c\uc77c",date:"2023-04-03T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 3\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Class",permalink:"/tags/class"}],readingTime:5.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:"15",tags:["Java","Class"]},prevItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"},nextItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"}},u={authorsImageUrls:[]},m=[{value:"\ud074\ub798\uc2a4 \ud30c\uc77c",id:"\ud074\ub798\uc2a4-\ud30c\uc77c",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd",id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870",level:3},{value:"\ub9e4\uc9c1\ub118\ubc84",id:"\ub9e4\uc9c1\ub118\ubc84",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804",level:3},{value:"\uc0c1\uc218 \ud480",id:"\uc0c1\uc218-\ud480",level:3},{value:"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8",id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8",level:3},{value:"this_class",id:"this_class",level:3},{value:"super_class",id:"super_class",level:3},{value:"interface, field, method",id:"interface-field-method",level:3},{value:"attributes",id:"attributes",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],o={toc:m};function s(t){let{components:e,...a}=t;return(0,r.kt)("wrapper",(0,n.Z)({},o,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c"},"\ud074\ub798\uc2a4 \ud30c\uc77c"),(0,r.kt)("p",null,"\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?"),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd"},"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd"),(0,r.kt)("p",null,"8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. "),(0,r.kt)("p",null,"u1 \u2192 unsigned 1byte",(0,r.kt)("br",{parentName:"p"}),"\n","u2 \u2192 unsigned 2byte",(0,r.kt)("br",{parentName:"p"}),"\n","u4 \u2192 unsigned 4byte "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870"},"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"ClassFile {\n u4 magic;\n u2 minor_version;\n u2 major_version;\n u2 constant_pool_count;\n cp_info constant_pool[constant_pool_count-1];\n u2 access_flags;\n u2 this_class;\n u2 super_class;\n u2 interfaces_count;\n u2 interfaces[interfaces_count];\n u2 fields_count;\n field_info fields[fields_count];\n u2 methods_count;\n method_info methods[methods_count];\n u2 attributes_count;\n attribute_info attributes[attributes_count];\n}\n")),(0,r.kt)("h3",{id:"\ub9e4\uc9c1\ub118\ubc84"},"\ub9e4\uc9c1\ub118\ubc84"),(0,r.kt)("p",null,"\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D")),(0,r.kt)("p",null,"\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"UnsupportedClassVersionError")," \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"class\xa0file format major versions")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Java SE"),(0,r.kt)("th",{parentName:"tr",align:null},"Released"),(0,r.kt)("th",{parentName:"tr",align:null},"Major"),(0,r.kt)("th",{parentName:"tr",align:null},"Supported majors"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2014"),(0,r.kt)("td",{parentName:"tr",align:null},"52"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 52")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"9"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2017"),(0,r.kt)("td",{parentName:"tr",align:null},"53"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 53")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"54"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 54")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"11"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"55"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 55")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"12"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"56"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"13"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"57"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 57")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"14"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"58"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 58")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"15"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"59"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 59")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"60"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 60")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"17"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"61"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 61")))),(0,r.kt)("h3",{id:"\uc0c1\uc218-\ud480"},"\uc0c1\uc218 \ud480"),(0,r.kt)("p",null,"2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","JVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8"},"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_PUBLIC")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_INTERFACE")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_ABSTRACT"))),(0,r.kt)("p",null,"\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Class access and property modifiers")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Flag Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"),(0,r.kt)("th",{parentName:"tr",align:null},"Interpretation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_PUBLIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0001"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0public; may be accessed from outside its package.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_FINAL"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0010"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0final; no subclasses allowed.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SUPER"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0020"),(0,r.kt)("td",{parentName:"tr",align:null},"Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_INTERFACE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0200"),(0,r.kt)("td",{parentName:"tr",align:null},"Is an interface, not a class.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ABSTRACT"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0400"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0abstract; must not be instantiated.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SYNTHETIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x1000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared synthetic; not present in the source code.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ANNOTATION"),(0,r.kt)("td",{parentName:"tr",align:null},"0x2000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an annotation type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ENUM"),(0,r.kt)("td",{parentName:"tr",align:null},"0x4000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an\xa0enum\xa0type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_MODULE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x8000"),(0,r.kt)("td",{parentName:"tr",align:null},"Is a module, not a class or interface.")))),(0,r.kt)("h3",{id:"this_class"},"this_class"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 ",(0,r.kt)("inlineCode",{parentName:"p"},"CONSTANT_Class_infoclass")," \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"super_class"},"super_class"),(0,r.kt)("p",null,"\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"java.lang.Object"),"\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4."),(0,r.kt)("h3",{id:"interface-field-method"},"interface, field, method"),(0,r.kt)("p",null,"\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","interface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4."),(0,r.kt)("h3",{id:"attributes"},"attributes"),(0,r.kt)("p",null,"\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85",(0,r.kt)("br",{parentName:"p"}),"\n","\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234"),(0,r.kt)("p",null,"IntelliJ plugin - BinEd",(0,r.kt)("br",{parentName:"p"}),"\n","IntelliJ plugin - jclasslib Bytecode Viewer"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.fileformat.com/ko/programming/class/"},"Class file in Java, File Format"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html"},"java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html"},"java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/741df4e1.cacbfebd.js b/assets/js/741df4e1.cacbfebd.js deleted file mode 100644 index 3d532d8da..000000000 --- a/assets/js/741df4e1.cacbfebd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[280],{3905:(t,e,a)=>{a.d(e,{Zo:()=>o,kt:()=>k});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var u=n.createContext({}),m=function(t){var e=n.useContext(u),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},o=function(t){var e=m(t.components);return n.createElement(u.Provider,{value:e},t.children)},s={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},d=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,u=t.parentName,o=i(t,["components","mdxType","originalType","parentName"]),d=m(a),k=r,c=d["".concat(u,".").concat(k)]||d[k]||s[k]||l;return a?n.createElement(c,p(p({ref:e},o),{},{components:a})):n.createElement(c,p({ref:e},o))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,p=new Array(l);p[0]=d;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i.mdxType="string"==typeof t?t:r,p[1]=i;for(var m=2;m{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var n=a(7462),r=(a(7294),a(3905));const l={title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:15,tags:["Java","Class"]},p=void 0,i={permalink:"/15",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",source:"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",description:"\ud074\ub798\uc2a4 \ud30c\uc77c",date:"2023-04-03T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 3\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Class",permalink:"/tags/class"}],readingTime:5.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",slug:"15",tags:["Java","Class"]},prevItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"},nextItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"}},u={authorsImageUrls:[]},m=[{value:"\ud074\ub798\uc2a4 \ud30c\uc77c",id:"\ud074\ub798\uc2a4-\ud30c\uc77c",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd",id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870",level:3},{value:"\ub9e4\uc9c1\ub118\ubc84",id:"\ub9e4\uc9c1\ub118\ubc84",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804",level:3},{value:"\uc0c1\uc218 \ud480",id:"\uc0c1\uc218-\ud480",level:3},{value:"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8",id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8",level:3},{value:"this_class",id:"this_class",level:3},{value:"super_class",id:"super_class",level:3},{value:"interface, field, method",id:"interface-field-method",level:3},{value:"attributes",id:"attributes",level:3},{value:"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234",id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],o={toc:m};function s(t){let{components:e,...a}=t;return(0,r.kt)("wrapper",(0,n.Z)({},o,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c"},"\ud074\ub798\uc2a4 \ud30c\uc77c"),(0,r.kt)("p",null,"\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?"),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c\uc758-\ub370\uc774\ud130-\ud615\uc2dd"},"\ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd"),(0,r.kt)("p",null,"8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. "),(0,r.kt)("p",null,"u1 \u2192 unsigned 1byte",(0,r.kt)("br",{parentName:"p"}),"\n","u2 \u2192 unsigned 2byte",(0,r.kt)("br",{parentName:"p"}),"\n","u4 \u2192 unsigned 4byte "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\uad6c\uc870"},"\ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"ClassFile {\n u4 magic;\n u2 minor_version;\n u2 major_version;\n u2 constant_pool_count;\n cp_info constant_pool[constant_pool_count-1];\n u2 access_flags;\n u2 this_class;\n u2 super_class;\n u2 interfaces_count;\n u2 interfaces[interfaces_count];\n u2 fields_count;\n field_info fields[fields_count];\n u2 methods_count;\n method_info methods[methods_count];\n u2 attributes_count;\n attribute_info attributes[attributes_count];\n}\n")),(0,r.kt)("h3",{id:"\ub9e4\uc9c1\ub118\ubc84"},"\ub9e4\uc9c1\ub118\ubc84"),(0,r.kt)("p",null,"\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud3ec\ub9f7-\ubc84\uc804"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D")),(0,r.kt)("p",null,"\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"UnsupportedClassVersionError")," \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"class\xa0file format major versions")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Java SE"),(0,r.kt)("th",{parentName:"tr",align:null},"Released"),(0,r.kt)("th",{parentName:"tr",align:null},"Major"),(0,r.kt)("th",{parentName:"tr",align:null},"Supported majors"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2014"),(0,r.kt)("td",{parentName:"tr",align:null},"52"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 52")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"9"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2017"),(0,r.kt)("td",{parentName:"tr",align:null},"53"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 53")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"54"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 54")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"11"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2018"),(0,r.kt)("td",{parentName:"tr",align:null},"55"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 55")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"12"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"56"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 56")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"13"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2019"),(0,r.kt)("td",{parentName:"tr",align:null},"57"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 57")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"14"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"58"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 58")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"15"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2020"),(0,r.kt)("td",{parentName:"tr",align:null},"59"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 59")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"March 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"60"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 60")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"17"),(0,r.kt)("td",{parentName:"tr",align:null},"September 2021"),(0,r.kt)("td",{parentName:"tr",align:null},"61"),(0,r.kt)("td",{parentName:"tr",align:null},"45 .. 61")))),(0,r.kt)("h3",{id:"\uc0c1\uc218-\ud480"},"\uc0c1\uc218 \ud480"),(0,r.kt)("p",null,"2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","JVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uc561\uc138\uc2a4-\ud50c\ub798\uadf8"},"\uc561\uc138\uc2a4 \ud50c\ub798\uadf8"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_PUBLIC")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_INTERFACE")," xor ",(0,r.kt)("inlineCode",{parentName:"li"},"ACC_ABSTRACT"))),(0,r.kt)("p",null,"\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Class access and property modifiers")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Flag Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"),(0,r.kt)("th",{parentName:"tr",align:null},"Interpretation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_PUBLIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0001"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0public; may be accessed from outside its package.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_FINAL"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0010"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0final; no subclasses allowed.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SUPER"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0020"),(0,r.kt)("td",{parentName:"tr",align:null},"Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_INTERFACE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0200"),(0,r.kt)("td",{parentName:"tr",align:null},"Is an interface, not a class.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ABSTRACT"),(0,r.kt)("td",{parentName:"tr",align:null},"0x0400"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared\xa0abstract; must not be instantiated.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_SYNTHETIC"),(0,r.kt)("td",{parentName:"tr",align:null},"0x1000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared synthetic; not present in the source code.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ANNOTATION"),(0,r.kt)("td",{parentName:"tr",align:null},"0x2000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an annotation type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_ENUM"),(0,r.kt)("td",{parentName:"tr",align:null},"0x4000"),(0,r.kt)("td",{parentName:"tr",align:null},"Declared as an\xa0enum\xa0type.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ACC_MODULE"),(0,r.kt)("td",{parentName:"tr",align:null},"0x8000"),(0,r.kt)("td",{parentName:"tr",align:null},"Is a module, not a class or interface.")))),(0,r.kt)("h3",{id:"this_class"},"this_class"),(0,r.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 ",(0,r.kt)("inlineCode",{parentName:"p"},"CONSTANT_Class_infoclass")," \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"super_class"},"super_class"),(0,r.kt)("p",null,"\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"java.lang.Object"),"\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4."),(0,r.kt)("h3",{id:"interface-field-method"},"interface, field, method"),(0,r.kt)("p",null,"\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","interface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4."),(0,r.kt)("h3",{id:"attributes"},"attributes"),(0,r.kt)("p",null,"\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85",(0,r.kt)("br",{parentName:"p"}),"\n","\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud074\ub798\uc2a4-\ud30c\uc77c-\ud655\uc778\ud558\uba74\uc11c-\uc0ac\uc6a9\ud55c-\ud234"},"\ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234"),(0,r.kt)("p",null,"IntelliJ plugin - BinEd",(0,r.kt)("br",{parentName:"p"}),"\n","IntelliJ plugin - jclasslib Bytecode Viewer"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.fileformat.com/ko/programming/class/"},"Class file in Java, File Format"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html"},"java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html"},"java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75121fd5.27699af6.js b/assets/js/75121fd5.27699af6.js new file mode 100644 index 000000000..444cea225 --- /dev/null +++ b/assets/js/75121fd5.27699af6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5335],{30674:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/tags/image","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/75121fd5.e44110ee.js b/assets/js/75121fd5.e44110ee.js deleted file mode 100644 index b5ea51088..000000000 --- a/assets/js/75121fd5.e44110ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5335],{674:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/tags/image","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/754fb852.6fce7204.js b/assets/js/754fb852.6fce7204.js new file mode 100644 index 000000000..aef67ac64 --- /dev/null +++ b/assets/js/754fb852.6fce7204.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[988],{38242:e=>{e.exports=JSON.parse('{"permalink":"/page/32","page":32,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/31","nextPage":"/page/33","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/754fb852.a35a94a7.js b/assets/js/754fb852.a35a94a7.js deleted file mode 100644 index 8ae6f4df0..000000000 --- a/assets/js/754fb852.a35a94a7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[988],{8242:e=>{e.exports=JSON.parse('{"permalink":"/page/32","page":32,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/31","nextPage":"/page/33","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/76603d6f.186659cf.js b/assets/js/76603d6f.186659cf.js new file mode 100644 index 000000000..ebe4537d0 --- /dev/null +++ b/assets/js/76603d6f.186659cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4560],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var m=n.createContext({}),u=function(e){var t=n.useContext(m),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(m.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,m=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=u(r),s=a,b=c["".concat(m,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var m in t)hasOwnProperty.call(t,m)&&(o[m]=t[m]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{r.r(t),r.d(t,{assets:()=>m,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:13,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/13",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",description:"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",date:"2023-04-01T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 1\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.48,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:"13",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"},nextItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"}},m={authorsImageUrls:[]},u=[{value:"Keep",id:"keep",level:3},{value:"Problem",id:"problem",level:3},{value:"Try",id:"try",level:3},{value:"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],i={toc:u};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"keep"},"Keep"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30")," "),(0,a.kt)("p",null,"\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 "),(0,a.kt)("p",null,"\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30")," "),(0,a.kt)("p",null,"10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae00\uc4f0\uae30")," "),(0,a.kt)("p",null,"\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514")," "),(0,a.kt)("p",null,"\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub808\ubca8 \uc778\ud130\ubdf0")),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\ub450\uad04\uc2dd \ud45c\ud604"),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30"),(0,a.kt)("li",{parentName:"ul"},"\ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30")),(0,a.kt)("h3",{id:"problem"},"Problem"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871")," "),(0,a.kt)("p",null,"\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"try"},"Try"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?")," "),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)")," \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/76603d6f.95d19896.js b/assets/js/76603d6f.95d19896.js deleted file mode 100644 index 5c2446a00..000000000 --- a/assets/js/76603d6f.95d19896.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4560],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var m=n.createContext({}),u=function(e){var t=n.useContext(m),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(m.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,m=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=u(r),s=a,b=c["".concat(m,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var m in t)hasOwnProperty.call(t,m)&&(o[m]=t[m]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var u=2;u{r.r(t),r.d(t,{assets:()=>m,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:13,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/13",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",description:"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",date:"2023-04-01T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 1\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.48,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",slug:"13",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",permalink:"/14"},nextItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"}},m={authorsImageUrls:[]},u=[{value:"Keep",id:"keep",level:3},{value:"Problem",id:"problem",level:3},{value:"Try",id:"try",level:3},{value:"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],i={toc:u};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"keep"},"Keep"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30")," "),(0,a.kt)("p",null,"\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 "),(0,a.kt)("p",null,"\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30")," "),(0,a.kt)("p",null,"10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae00\uc4f0\uae30")," "),(0,a.kt)("p",null,"\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514")," "),(0,a.kt)("p",null,"\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub808\ubca8 \uc778\ud130\ubdf0")),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\ub450\uad04\uc2dd \ud45c\ud604"),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 "),(0,a.kt)("li",{parentName:"ul"},"\uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30"),(0,a.kt)("li",{parentName:"ul"},"\ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30"),(0,a.kt)("li",{parentName:"ul"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30")),(0,a.kt)("h3",{id:"problem"},"Problem"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871")," "),(0,a.kt)("p",null,"\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"try"},"Try"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?")," "),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)")," \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\uc220\uc801\uc778 \ubd80\ubd84")," "),(0,a.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-1\uc744-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7762a24e.1ffbe0b7.js b/assets/js/7762a24e.1ffbe0b7.js deleted file mode 100644 index 3f7a32ee3..000000000 --- a/assets/js/7762a24e.1ffbe0b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2753],{5095:e=>{e.exports=JSON.parse('{"permalink":"/page/4","page":4,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/3","nextPage":"/page/5","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7762a24e.8a98485a.js b/assets/js/7762a24e.8a98485a.js new file mode 100644 index 000000000..936c1daf4 --- /dev/null +++ b/assets/js/7762a24e.8a98485a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2753],{55095:e=>{e.exports=JSON.parse('{"permalink":"/page/4","page":4,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/3","nextPage":"/page/5","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7af1d52f.3a3f4216.js b/assets/js/7af1d52f.3a3f4216.js new file mode 100644 index 000000000..e5a4a2219 --- /dev/null +++ b/assets/js/7af1d52f.3a3f4216.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2334],{59565:e=>{e.exports=JSON.parse('{"permalink":"/page/6","page":6,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/5","nextPage":"/page/7","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7af1d52f.e3286093.js b/assets/js/7af1d52f.e3286093.js deleted file mode 100644 index 3a55ca37d..000000000 --- a/assets/js/7af1d52f.e3286093.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2334],{9565:e=>{e.exports=JSON.parse('{"permalink":"/page/6","page":6,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/5","nextPage":"/page/7","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7bbc420e.15f17251.js b/assets/js/7bbc420e.15f17251.js deleted file mode 100644 index 6a3a87424..000000000 --- a/assets/js/7bbc420e.15f17251.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4311],{1691:e=>{e.exports=JSON.parse('{"label":"Documentation","permalink":"/tags/documentation","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/7bbc420e.82f9788b.js b/assets/js/7bbc420e.82f9788b.js new file mode 100644 index 000000000..9aeed25f0 --- /dev/null +++ b/assets/js/7bbc420e.82f9788b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4311],{41691:e=>{e.exports=JSON.parse('{"label":"Documentation","permalink":"/tags/documentation","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/7c660760.8252ae94.js b/assets/js/7c660760.8252ae94.js deleted file mode 100644 index a1b7689c1..000000000 --- a/assets/js/7c660760.8252ae94.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2087],{1870:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/9","page":9,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/8","nextPage":"/tags/woowahan-techcourse/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7c660760.b4a54ec4.js b/assets/js/7c660760.b4a54ec4.js new file mode 100644 index 000000000..274fbc921 --- /dev/null +++ b/assets/js/7c660760.b4a54ec4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2087],{91870:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/9","page":9,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/8","nextPage":"/tags/woowahan-techcourse/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7e4c1ed7.2b32cc3e.js b/assets/js/7e4c1ed7.2b32cc3e.js new file mode 100644 index 000000000..5dc833223 --- /dev/null +++ b/assets/js/7e4c1ed7.2b32cc3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1653],{83297:e=>{e.exports=JSON.parse('{"label":"postmortem","permalink":"/docs/tags/postmortem","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","title":"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c","description":"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)","permalink":"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c"}]}')}}]); \ No newline at end of file diff --git a/assets/js/7e4c1ed7.d24583e9.js b/assets/js/7e4c1ed7.d24583e9.js deleted file mode 100644 index fbcda362f..000000000 --- a/assets/js/7e4c1ed7.d24583e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1653],{3297:e=>{e.exports=JSON.parse('{"label":"postmortem","permalink":"/docs/tags/postmortem","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","title":"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c","description":"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)","permalink":"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c"}]}')}}]); \ No newline at end of file diff --git a/assets/js/7e59392d.02e772b6.js b/assets/js/7e59392d.02e772b6.js new file mode 100644 index 000000000..b70483f8c --- /dev/null +++ b/assets/js/7e59392d.02e772b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7281],{33202:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/9","page":9,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/8","nextPage":"/tags/retrospective/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7e59392d.378558d6.js b/assets/js/7e59392d.378558d6.js deleted file mode 100644 index c85973e77..000000000 --- a/assets/js/7e59392d.378558d6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7281],{3202:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/9","page":9,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/8","nextPage":"/tags/retrospective/page/10","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7fbacf84.c4fc60f8.js b/assets/js/7fbacf84.c4fc60f8.js new file mode 100644 index 000000000..f1b7c78d4 --- /dev/null +++ b/assets/js/7fbacf84.c4fc60f8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5797],{58701:e=>{e.exports=JSON.parse('{"permalink":"/tags/spring","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/7fbacf84.e392db8f.js b/assets/js/7fbacf84.e392db8f.js deleted file mode 100644 index 979c69fae..000000000 --- a/assets/js/7fbacf84.e392db8f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5797],{8701:e=>{e.exports=JSON.parse('{"permalink":"/tags/spring","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/804ef369.023757eb.js b/assets/js/804ef369.023757eb.js new file mode 100644 index 000000000..d062f0b62 --- /dev/null +++ b/assets/js/804ef369.023757eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4044],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),u=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),g=u(n),m=r,d=g["".concat(o,".").concat(m)]||g[m]||p[m]||s;return n?a.createElement(d,l(l({ref:t},c),{},{components:n})):a.createElement(d,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,l=new Array(s);l[0]=g;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const s={title:"Docusaurus",slug:33,tags:["Documentation"]},l=void 0,i={permalink:"/33",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",source:"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",title:"Docusaurus",description:"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.",date:"2023-06-18T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 18\uc77c",tags:[{label:"Documentation",permalink:"/tags/documentation"}],readingTime:10.095,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Docusaurus",slug:"33",tags:["Documentation"]},prevItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"}},o={authorsImageUrls:[]},u=[{value:"\uc124\uce58",id:"\uc124\uce58",level:2},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:2},{value:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131",id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131",level:3},{value:"\uc124\uc815 \ud30c\uc77c \uc218\uc815",id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815",level:3},{value:"\ud1a0\ud070 \uc124\uc815",id:"\ud1a0\ud070-\uc124\uc815",level:3},{value:"\ube0c\ub79c\uce58 \uc0dd\uc131",id:"\ube0c\ub79c\uce58-\uc0dd\uc131",level:3},{value:"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131",id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131",level:3},{value:"\ub313\uae00 \uae30\ub2a5",id:"\ub313\uae00-\uae30\ub2a5",level:2},{value:"giscus \uc124\uc815",id:"giscus-\uc124\uc815",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815",level:3},{value:"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30",id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30",level:2},{value:"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778",id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778",level:3},{value:"\ud0a4 \uc0dd\uc131",id:"\ud0a4-\uc0dd\uc131",level:3},{value:".env \ud30c\uc77c \uc0dd\uc131",id:"env-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"config \ud30c\uc77c \uc0dd\uc131",id:"config-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1",id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815-1",level:3},{value:"\ubd80\uac00 \uc124\uc815",id:"\ubd80\uac00-\uc124\uc815",level:2},{value:"\ud654\uba74 \uc0c1\ub2e8 Github Icon",id:"\ud654\uba74-\uc0c1\ub2e8-github-icon",level:3},{value:"\ucf54\ub4dc\ube14\ub7ed",id:"\ucf54\ub4dc\ube14\ub7ed",level:3},{value:"mermaid",id:"mermaid",level:3},{value:"\uad6d\uc81c\ud654 \uc124\uc815",id:"\uad6d\uc81c\ud654-\uc124\uc815",level:3},{value:"\ube14\ub85c\uadf8 \uae00 author",id:"\ube14\ub85c\uadf8-\uae00-author",level:3}],c={toc:u};function p(e){let{components:t,...s}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. "),(0,r.kt)("h2",{id:"\uc124\uce58"},"\uc124\uce58"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/installation"},"\uacf5\uc2dd \ud648\ud398\uc774\uc9c0"),"\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn create docusaurus\n")),(0,r.kt)("h2",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/next/deployment#deploying-to-github-pages"},"\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c"),(0,r.kt)("br",{parentName:"p"}),"\n","netlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131"},"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131"),(0,r.kt)("p",null,"github pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/greeng00se/greeng00se.github.io"},"\uc608\uc2dc"),"\uc640 \uac19\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"username.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"organization.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815"},"\uc124\uc815 \ud30c\uc77c \uc218\uc815"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"module.exports = {\n // ...\n url: 'https://greeng00se.github.io',\n baseUrl: '/',\n projectName: 'greeng00se.github.io',\n organizationName: 'greeng00se',\n trailingSlash: false,\n // ...\n};\n")),(0,r.kt)("h3",{id:"\ud1a0\ud070-\uc124\uc815"},"\ud1a0\ud070 \uc124\uc815"),(0,r.kt)("p",null,"github action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 ","[repo, user, workflow]"," \uc744 \uc124\uc815\ud588\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"github",src:n(67707).Z,width:"1598",height:"1670"})),(0,r.kt)("h3",{id:"\ube0c\ub79c\uce58-\uc0dd\uc131"},"\ube0c\ub79c\uce58 \uc0dd\uc131"),(0,r.kt)("p",null,"github\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","repository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131"},"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131"),(0,r.kt)("p",null,"Docusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title=".github/workflows/deploy.yml"',title:'".github/workflows/deploy.yml"'},"name: blog\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n name: Deploy to GitHub Pages\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v3\n with:\n node-version: 18\n cache: yarn\n\n - name: Install dependencies\n run: yarn install --frozen-lockfile\n - name: Build website\n run: yarn build\n\n - name: Deploy to GitHub Pages\n uses: peaceiris/actions-gh-pages@v3\n with:\n github_token: ${{ secrets.DEPLOY_TOKEN }}\n publish_dir: ./build\n user_name: github-actions[bot]\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\n")),(0,r.kt)("h2",{id:"\ub313\uae00-\uae30\ub2a5"},"\ub313\uae00 \uae30\ub2a5"),(0,r.kt)("p",null,"giscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"giscus-\uc124\uc815"},"giscus \uc124\uc815"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://giscus.app/ko"},"giscus"),"\ub97c \ud655\uc778\ud558\uc790."),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/ko/docs/next/swizzling"},"swizzling"),"\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\n")),(0,r.kt)("p",null,"\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"/src/theme/BlogPostItem/index.js")," \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="/src/theme/BlogPostItem/index.js"',title:'"/src/theme/BlogPostItem/index.js"'},'import OriginalBlogPostItem from "@theme-original/BlogPostItem";\nimport React, { useEffect, useRef } from "react";\n// @ts-expect-error internal code\nimport { useColorMode } from "@docusaurus/theme-common";\nimport { useBlogPost } from "@docusaurus/theme-common/internal";\n\nconst giscusSelector = "iframe.giscus-frame";\n\nfunction BlogPostItem(props) {\n const { colorMode } = useColorMode();\n const { isBlogPostPage } = useBlogPost();\n const giscusTheme = colorMode === "dark" ? "dark" : "light";\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (!isBlogPostPage) return;\n\n const giscusEl = containerRef.current.querySelector(giscusSelector);\n\n const createGiscusEl = () => {\n const script = document.createElement("script");\n\n script.src = "https://giscus.app/client.js";\n script.setAttribute("data-repo", "teco-chat/teco-chat.github.io");\n script.setAttribute("data-repo-id", "R_kgDOJZ5j0Q");\n script.setAttribute("data-category", "Announcements");\n script.setAttribute("data-category-id", "DIC_kwDOJZ5j0c4CXS_Q");\n script.setAttribute("data-mapping", "pathname");\n script.setAttribute("data-strict", "0");\n script.setAttribute("data-reactions-enabled", "1");\n script.setAttribute("data-emit-metadata", "0");\n script.setAttribute("data-input-position", "bottom");\n script.setAttribute("data-theme", giscusTheme);\n script.setAttribute("data-lang", "ko");\n script.crossOrigin = "anonymous";\n script.async = true;\n \n containerRef.current.appendChild(script);\n };\n\n const postThemeMessage = () => {\n const message = {\n setConfig: {\n theme: giscusTheme,\n }\n };\n\n giscusEl.contentWindow.postMessage({ giscus: message }, "https://giscus.app");\n };\n\n giscusEl ? postThemeMessage() : createGiscusEl();\n }, [giscusTheme]);\n\n return (\n <>\n \n {isBlogPostPage &&
}\n \n );\n}\n\nexport default BlogPostItem;\n')),(0,r.kt)("h2",{id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30"},"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30"),(0,r.kt)("p",null,"\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. "),(0,r.kt)("p",null,"\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/"},"docsearch"),"\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","docsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/run-your-own/"},"\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\uc124\uc815 \ud30c\uc77c"))),(0,r.kt)("h3",{id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778"},"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778"),(0,r.kt)("p",null,"\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"algolia",src:n(26451).Z,width:"3194",height:"1520"})),(0,r.kt)("h3",{id:"\ud0a4-\uc0dd\uc131"},"\ud0a4 \uc0dd\uc131"),(0,r.kt)("p",null,"\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","addObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"key",src:n(99350).Z,width:"2496",height:"832"})),(0,r.kt)("h3",{id:"env-\ud30c\uc77c-\uc0dd\uc131"},".env \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title=".env"',title:'".env"'},"APPLICATION_ID=MVIU5UEMOM\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\n")),(0,r.kt)("h3",{id:"config-\ud30c\uc77c-\uc0dd\uc131"},"config \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\ub9c1\ud06c"),"\ub97c \ucc38\uace0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub610\ub294 Docusaurus\uc758 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json"},"\uc124\uc815 \ud30c\uc77c"),"\uc744 \ucc38\uace0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="config.json"',title:'"config.json"'},'{\n "index_name": "teco",\n "start_urls": [\n "https://teco-chat.github.io/"\n ],\n "sitemap_urls": [\n "https://teco-chat.github.io/sitemap.xml"\n ],\n "sitemap_alternate_links": true,\n "stop_urls": [\n "/tests"\n ],\n "selectors": {\n "lvl0": {\n "selector": "(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]",\n "type": "xpath",\n "global": true,\n "default_value": "Documentation"\n },\n "lvl1": "header h1",\n "lvl2": "article h2",\n "lvl3": "article h3",\n "lvl4": "article h4",\n "lvl5": "article h5, article td:first-child",\n "lvl6": "article h6",\n "text": "article p, article li, article td:last-child"\n },\n "strip_chars": " .,;:#",\n "custom_settings": {\n "separatorsToIndex": "_",\n "attributesForFaceting": [\n "language",\n "version",\n "type",\n "docusaurus_tag"\n ],\n "attributesToRetrieve": [\n "hierarchy",\n "content",\n "anchor",\n "url",\n "url_without_anchor",\n "type"\n ]\n },\n "conversation_id": [\n "833762294"\n ],\n "nb_hits": 46250\n}\n')),(0,r.kt)("h3",{id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1"},"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1"),(0,r.kt)("p",null,"docker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","jq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"brew install jq\n")),(0,r.kt)("p",null,"\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper\n')),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815-1"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,"\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n algolia: {\n appId: 'MVIU5UEMOM', // Application ID\n apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key\n indexName: 'teco', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\n contextualSearch: true,\n },\n })\n")),(0,r.kt)("h2",{id:"\ubd80\uac00-\uc124\uc815"},"\ubd80\uac00 \uc124\uc815"),(0,r.kt)("h3",{id:"\ud654\uba74-\uc0c1\ub2e8-github-icon"},"\ud654\uba74 \uc0c1\ub2e8 Github Icon"),(0,r.kt)("p",null,"\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-css",metastring:'title="/src/css/custom.css"',title:'"/src/css/custom.css"'},".header-github-link:hover {\n opacity: 0.6;\n}\n\n.header-github-link:before {\n content: '';\n width: 24px;\n height: 24px;\n display: flex;\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n\nhtml[data-theme='dark'] .header-github-link:before {\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n")),(0,r.kt)("p",null,"themeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"navbar: {\n title: 'HELLO',\n items: [\n {\n href: 'https://github.com/greeng00se',\n position: 'right',\n className: 'header-github-link',\n 'aria-label': 'GitHub repository',\n },\n ],\n},\n")),(0,r.kt)("h3",{id:"\ucf54\ub4dc\ube14\ub7ed"},"\ucf54\ub4dc\ube14\ub7ed"),(0,r.kt)("p",null,"java\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","prism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"prism: {\n theme: lightCodeTheme,\n darkTheme: darkCodeTheme,\n additionalLanguages: ['java', 'kotlin'],\n}\n")),(0,r.kt)("h3",{id:"mermaid"},"mermaid"),(0,r.kt)("p",null,"mermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"@docusaurus/theme-mermaid")," \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn add @docusaurus/theme-mermaid\n")),(0,r.kt)("p",null,"\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"const config = {\n ...\n markdown: {\n mermaid: true,\n },\n themes: [\n '@docusaurus/theme-mermaid'\n ],\n};\n")),(0,r.kt)("p",null,"themeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n mermaid: {\n theme: {\n light: 'neutral', \n dark: 'dark'\n },\n },\n }),\n")),(0,r.kt)("h3",{id:"\uad6d\uc81c\ud654-\uc124\uc815"},"\uad6d\uc81c\ud654 \uc124\uc815"),(0,r.kt)("p",null,"\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"Older Entries")," \ud615\ud0dc\uc758 \uc124\uba85\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"\ub2e4\uc74c \ud398\uc774\uc9c0")," \ub85c \ubcc0\uacbd\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},'i18n: {\n defaultLocale: "ko",\n locales: ["ko"],\n},\n')),(0,r.kt)("h3",{id:"\ube14\ub85c\uadf8-\uae00-author"},"\ube14\ub85c\uadf8 \uae00 author"),(0,r.kt)("p",null,"\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"author",src:n(32942).Z,width:"2362",height:"1076"})),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"authors.yml")," \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title="/blog/authors.yml"',title:'"/blog/authors.yml"'},"herb:\n name: \ud5c8\ube0c\n title: Backend\n url: https://github.com/greeng00se\n image_url: https://github.com/greeng00se.png\n\nmallang:\n name: \ub9d0\ub791\n title: Backend\n url: https://github.com/shin-mallang\n image_url: https://github.com/shin-mallang.png\n")),(0,r.kt)("p",null,"\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-mdx"},"---\nslug: 1\ntitle: Hello World\nauthors: [herb, mallang]\ntags: [hello, docusaurus]\n---\n\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\n")))}p.isMDXComponent=!0},26451:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/algolia-3dbac5c1606f7f0daed9cb27a429db50.png"},32942:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/author-1bd517bb7763257e2139e1063fd92492.png"},67707:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/github-d866f69755a1e17d4f17a262bd30d56d.png"},99350:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/key-2d0b59e69e9ca0b21c49b76159266e74.png"}}]); \ No newline at end of file diff --git a/assets/js/804ef369.dc46ee9d.js b/assets/js/804ef369.dc46ee9d.js deleted file mode 100644 index c5bcb3f16..000000000 --- a/assets/js/804ef369.dc46ee9d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4044],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),u=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),g=u(n),m=r,d=g["".concat(o,".").concat(m)]||g[m]||p[m]||s;return n?a.createElement(d,l(l({ref:t},c),{},{components:n})):a.createElement(d,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,l=new Array(s);l[0]=g;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const s={title:"Docusaurus",slug:33,tags:["Documentation"]},l=void 0,i={permalink:"/33",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",source:"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",title:"Docusaurus",description:"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.",date:"2023-06-18T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 18\uc77c",tags:[{label:"Documentation",permalink:"/tags/documentation"}],readingTime:10.095,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Docusaurus",slug:"33",tags:["Documentation"]},prevItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"}},o={authorsImageUrls:[]},u=[{value:"\uc124\uce58",id:"\uc124\uce58",level:2},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:2},{value:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131",id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131",level:3},{value:"\uc124\uc815 \ud30c\uc77c \uc218\uc815",id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815",level:3},{value:"\ud1a0\ud070 \uc124\uc815",id:"\ud1a0\ud070-\uc124\uc815",level:3},{value:"\ube0c\ub79c\uce58 \uc0dd\uc131",id:"\ube0c\ub79c\uce58-\uc0dd\uc131",level:3},{value:"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131",id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131",level:3},{value:"\ub313\uae00 \uae30\ub2a5",id:"\ub313\uae00-\uae30\ub2a5",level:2},{value:"giscus \uc124\uc815",id:"giscus-\uc124\uc815",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815",level:3},{value:"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30",id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30",level:2},{value:"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778",id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778",level:3},{value:"\ud0a4 \uc0dd\uc131",id:"\ud0a4-\uc0dd\uc131",level:3},{value:".env \ud30c\uc77c \uc0dd\uc131",id:"env-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"config \ud30c\uc77c \uc0dd\uc131",id:"config-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1",id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815-1",level:3},{value:"\ubd80\uac00 \uc124\uc815",id:"\ubd80\uac00-\uc124\uc815",level:2},{value:"\ud654\uba74 \uc0c1\ub2e8 Github Icon",id:"\ud654\uba74-\uc0c1\ub2e8-github-icon",level:3},{value:"\ucf54\ub4dc\ube14\ub7ed",id:"\ucf54\ub4dc\ube14\ub7ed",level:3},{value:"mermaid",id:"mermaid",level:3},{value:"\uad6d\uc81c\ud654 \uc124\uc815",id:"\uad6d\uc81c\ud654-\uc124\uc815",level:3},{value:"\ube14\ub85c\uadf8 \uae00 author",id:"\ube14\ub85c\uadf8-\uae00-author",level:3}],c={toc:u};function p(e){let{components:t,...s}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. "),(0,r.kt)("h2",{id:"\uc124\uce58"},"\uc124\uce58"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/installation"},"\uacf5\uc2dd \ud648\ud398\uc774\uc9c0"),"\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn create docusaurus\n")),(0,r.kt)("h2",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/next/deployment#deploying-to-github-pages"},"\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c"),(0,r.kt)("br",{parentName:"p"}),"\n","netlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131"},"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131"),(0,r.kt)("p",null,"github pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/greeng00se/greeng00se.github.io"},"\uc608\uc2dc"),"\uc640 \uac19\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"username.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"organization.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815"},"\uc124\uc815 \ud30c\uc77c \uc218\uc815"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"module.exports = {\n // ...\n url: 'https://greeng00se.github.io',\n baseUrl: '/',\n projectName: 'greeng00se.github.io',\n organizationName: 'greeng00se',\n trailingSlash: false,\n // ...\n};\n")),(0,r.kt)("h3",{id:"\ud1a0\ud070-\uc124\uc815"},"\ud1a0\ud070 \uc124\uc815"),(0,r.kt)("p",null,"github action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 ","[repo, user, workflow]"," \uc744 \uc124\uc815\ud588\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"github",src:n(7707).Z,width:"1598",height:"1670"})),(0,r.kt)("h3",{id:"\ube0c\ub79c\uce58-\uc0dd\uc131"},"\ube0c\ub79c\uce58 \uc0dd\uc131"),(0,r.kt)("p",null,"github\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","repository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131"},"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131"),(0,r.kt)("p",null,"Docusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title=".github/workflows/deploy.yml"',title:'".github/workflows/deploy.yml"'},"name: blog\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n name: Deploy to GitHub Pages\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v3\n with:\n node-version: 18\n cache: yarn\n\n - name: Install dependencies\n run: yarn install --frozen-lockfile\n - name: Build website\n run: yarn build\n\n - name: Deploy to GitHub Pages\n uses: peaceiris/actions-gh-pages@v3\n with:\n github_token: ${{ secrets.DEPLOY_TOKEN }}\n publish_dir: ./build\n user_name: github-actions[bot]\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\n")),(0,r.kt)("h2",{id:"\ub313\uae00-\uae30\ub2a5"},"\ub313\uae00 \uae30\ub2a5"),(0,r.kt)("p",null,"giscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"giscus-\uc124\uc815"},"giscus \uc124\uc815"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://giscus.app/ko"},"giscus"),"\ub97c \ud655\uc778\ud558\uc790."),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/ko/docs/next/swizzling"},"swizzling"),"\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\n")),(0,r.kt)("p",null,"\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"/src/theme/BlogPostItem/index.js")," \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="/src/theme/BlogPostItem/index.js"',title:'"/src/theme/BlogPostItem/index.js"'},'import OriginalBlogPostItem from "@theme-original/BlogPostItem";\nimport React, { useEffect, useRef } from "react";\n// @ts-expect-error internal code\nimport { useColorMode } from "@docusaurus/theme-common";\nimport { useBlogPost } from "@docusaurus/theme-common/internal";\n\nconst giscusSelector = "iframe.giscus-frame";\n\nfunction BlogPostItem(props) {\n const { colorMode } = useColorMode();\n const { isBlogPostPage } = useBlogPost();\n const giscusTheme = colorMode === "dark" ? "dark" : "light";\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (!isBlogPostPage) return;\n\n const giscusEl = containerRef.current.querySelector(giscusSelector);\n\n const createGiscusEl = () => {\n const script = document.createElement("script");\n\n script.src = "https://giscus.app/client.js";\n script.setAttribute("data-repo", "teco-chat/teco-chat.github.io");\n script.setAttribute("data-repo-id", "R_kgDOJZ5j0Q");\n script.setAttribute("data-category", "Announcements");\n script.setAttribute("data-category-id", "DIC_kwDOJZ5j0c4CXS_Q");\n script.setAttribute("data-mapping", "pathname");\n script.setAttribute("data-strict", "0");\n script.setAttribute("data-reactions-enabled", "1");\n script.setAttribute("data-emit-metadata", "0");\n script.setAttribute("data-input-position", "bottom");\n script.setAttribute("data-theme", giscusTheme);\n script.setAttribute("data-lang", "ko");\n script.crossOrigin = "anonymous";\n script.async = true;\n \n containerRef.current.appendChild(script);\n };\n\n const postThemeMessage = () => {\n const message = {\n setConfig: {\n theme: giscusTheme,\n }\n };\n\n giscusEl.contentWindow.postMessage({ giscus: message }, "https://giscus.app");\n };\n\n giscusEl ? postThemeMessage() : createGiscusEl();\n }, [giscusTheme]);\n\n return (\n <>\n \n {isBlogPostPage &&
}\n \n );\n}\n\nexport default BlogPostItem;\n')),(0,r.kt)("h2",{id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30"},"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30"),(0,r.kt)("p",null,"\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. "),(0,r.kt)("p",null,"\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/"},"docsearch"),"\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","docsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/run-your-own/"},"\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\uc124\uc815 \ud30c\uc77c"))),(0,r.kt)("h3",{id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778"},"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778"),(0,r.kt)("p",null,"\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"algolia",src:n(6451).Z,width:"3194",height:"1520"})),(0,r.kt)("h3",{id:"\ud0a4-\uc0dd\uc131"},"\ud0a4 \uc0dd\uc131"),(0,r.kt)("p",null,"\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","addObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"key",src:n(9350).Z,width:"2496",height:"832"})),(0,r.kt)("h3",{id:"env-\ud30c\uc77c-\uc0dd\uc131"},".env \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title=".env"',title:'".env"'},"APPLICATION_ID=MVIU5UEMOM\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\n")),(0,r.kt)("h3",{id:"config-\ud30c\uc77c-\uc0dd\uc131"},"config \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\ub9c1\ud06c"),"\ub97c \ucc38\uace0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub610\ub294 Docusaurus\uc758 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json"},"\uc124\uc815 \ud30c\uc77c"),"\uc744 \ucc38\uace0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="config.json"',title:'"config.json"'},'{\n "index_name": "teco",\n "start_urls": [\n "https://teco-chat.github.io/"\n ],\n "sitemap_urls": [\n "https://teco-chat.github.io/sitemap.xml"\n ],\n "sitemap_alternate_links": true,\n "stop_urls": [\n "/tests"\n ],\n "selectors": {\n "lvl0": {\n "selector": "(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]",\n "type": "xpath",\n "global": true,\n "default_value": "Documentation"\n },\n "lvl1": "header h1",\n "lvl2": "article h2",\n "lvl3": "article h3",\n "lvl4": "article h4",\n "lvl5": "article h5, article td:first-child",\n "lvl6": "article h6",\n "text": "article p, article li, article td:last-child"\n },\n "strip_chars": " .,;:#",\n "custom_settings": {\n "separatorsToIndex": "_",\n "attributesForFaceting": [\n "language",\n "version",\n "type",\n "docusaurus_tag"\n ],\n "attributesToRetrieve": [\n "hierarchy",\n "content",\n "anchor",\n "url",\n "url_without_anchor",\n "type"\n ]\n },\n "conversation_id": [\n "833762294"\n ],\n "nb_hits": 46250\n}\n')),(0,r.kt)("h3",{id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1"},"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1"),(0,r.kt)("p",null,"docker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","jq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"brew install jq\n")),(0,r.kt)("p",null,"\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper\n')),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815-1"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,"\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n algolia: {\n appId: 'MVIU5UEMOM', // Application ID\n apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key\n indexName: 'teco', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\n contextualSearch: true,\n },\n })\n")),(0,r.kt)("h2",{id:"\ubd80\uac00-\uc124\uc815"},"\ubd80\uac00 \uc124\uc815"),(0,r.kt)("h3",{id:"\ud654\uba74-\uc0c1\ub2e8-github-icon"},"\ud654\uba74 \uc0c1\ub2e8 Github Icon"),(0,r.kt)("p",null,"\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-css",metastring:'title="/src/css/custom.css"',title:'"/src/css/custom.css"'},".header-github-link:hover {\n opacity: 0.6;\n}\n\n.header-github-link:before {\n content: '';\n width: 24px;\n height: 24px;\n display: flex;\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n\nhtml[data-theme='dark'] .header-github-link:before {\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n")),(0,r.kt)("p",null,"themeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"navbar: {\n title: 'HELLO',\n items: [\n {\n href: 'https://github.com/greeng00se',\n position: 'right',\n className: 'header-github-link',\n 'aria-label': 'GitHub repository',\n },\n ],\n},\n")),(0,r.kt)("h3",{id:"\ucf54\ub4dc\ube14\ub7ed"},"\ucf54\ub4dc\ube14\ub7ed"),(0,r.kt)("p",null,"java\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","prism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"prism: {\n theme: lightCodeTheme,\n darkTheme: darkCodeTheme,\n additionalLanguages: ['java', 'kotlin'],\n}\n")),(0,r.kt)("h3",{id:"mermaid"},"mermaid"),(0,r.kt)("p",null,"mermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"@docusaurus/theme-mermaid")," \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn add @docusaurus/theme-mermaid\n")),(0,r.kt)("p",null,"\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"const config = {\n ...\n markdown: {\n mermaid: true,\n },\n themes: [\n '@docusaurus/theme-mermaid'\n ],\n};\n")),(0,r.kt)("p",null,"themeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n mermaid: {\n theme: {\n light: 'neutral', \n dark: 'dark'\n },\n },\n }),\n")),(0,r.kt)("h3",{id:"\uad6d\uc81c\ud654-\uc124\uc815"},"\uad6d\uc81c\ud654 \uc124\uc815"),(0,r.kt)("p",null,"\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"Older Entries")," \ud615\ud0dc\uc758 \uc124\uba85\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"\ub2e4\uc74c \ud398\uc774\uc9c0")," \ub85c \ubcc0\uacbd\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},'i18n: {\n defaultLocale: "ko",\n locales: ["ko"],\n},\n')),(0,r.kt)("h3",{id:"\ube14\ub85c\uadf8-\uae00-author"},"\ube14\ub85c\uadf8 \uae00 author"),(0,r.kt)("p",null,"\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"author",src:n(2942).Z,width:"2362",height:"1076"})),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"authors.yml")," \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title="/blog/authors.yml"',title:'"/blog/authors.yml"'},"herb:\n name: \ud5c8\ube0c\n title: Backend\n url: https://github.com/greeng00se\n image_url: https://github.com/greeng00se.png\n\nmallang:\n name: \ub9d0\ub791\n title: Backend\n url: https://github.com/shin-mallang\n image_url: https://github.com/shin-mallang.png\n")),(0,r.kt)("p",null,"\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-mdx"},"---\nslug: 1\ntitle: Hello World\nauthors: [herb, mallang]\ntags: [hello, docusaurus]\n---\n\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\n")))}p.isMDXComponent=!0},6451:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/algolia-3dbac5c1606f7f0daed9cb27a429db50.png"},2942:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/author-1bd517bb7763257e2139e1063fd92492.png"},7707:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/github-d866f69755a1e17d4f17a262bd30d56d.png"},9350:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/key-2d0b59e69e9ca0b21c49b76159266e74.png"}}]); \ No newline at end of file diff --git a/assets/js/80960b4b.451bf08a.js b/assets/js/80960b4b.451bf08a.js deleted file mode 100644 index b7c435f2b..000000000 --- a/assets/js/80960b4b.451bf08a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7599],{8386:e=>{e.exports=JSON.parse('{"permalink":"/page/21","page":21,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/20","nextPage":"/page/22","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/80960b4b.813f7ad2.js b/assets/js/80960b4b.813f7ad2.js new file mode 100644 index 000000000..c181a2864 --- /dev/null +++ b/assets/js/80960b4b.813f7ad2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7599],{28386:e=>{e.exports=JSON.parse('{"permalink":"/page/21","page":21,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/20","nextPage":"/page/22","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8126.0a7b9cc2.js b/assets/js/8126.0a7b9cc2.js deleted file mode 100644 index 442cf9820..000000000 --- a/assets/js/8126.0a7b9cc2.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 8126.0a7b9cc2.js.LICENSE.txt */ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8126],{7967:(t,e)=>{"use strict";e.N=void 0;var n=/^([^\w]*)(javascript|data|vbscript)/im,i=/&#(\w+)(^\w|;)?/g,r=/&(newline|tab);/gi,a=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,s=/^.+(:|:)/gim,o=[".","/"];e.N=function(t){var e,c=(e=t||"",e.replace(i,(function(t,e){return String.fromCharCode(e)}))).replace(r,"").replace(a,"").trim();if(!c)return"about:blank";if(function(t){return o.indexOf(t[0])>-1}(c))return c;var l=c.match(s);if(!l)return c;var h=l[0];return n.test(h)?"about:blank":c}},3905:(t,e,n)=>{"use strict";n.d(e,{Zo:()=>h,kt:()=>p});var i=n(7294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function s(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var c=i.createContext({}),l=function(t){var e=i.useContext(c),n=e;return t&&(n="function"==typeof t?t(e):s(s({},e),t)),n},h=function(t){var e=l(t.components);return i.createElement(c.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return i.createElement(i.Fragment,{},e)}},d=i.forwardRef((function(t,e){var n=t.components,r=t.mdxType,a=t.originalType,c=t.parentName,h=o(t,["components","mdxType","originalType","parentName"]),d=l(n),p=r,f=d["".concat(c,".").concat(p)]||d[p]||u[p]||a;return n?i.createElement(f,s(s({ref:e},h),{},{components:n})):i.createElement(f,s({ref:e},h))}));function p(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var a=n.length,s=new Array(a);s[0]=d;var o={};for(var c in e)hasOwnProperty.call(e,c)&&(o[c]=e[c]);o.originalType=t,o.mdxType="string"==typeof t?t:r,s[1]=o;for(var l=2;l{"use strict";n.d(e,{Z:()=>h});var i=n(7294),r=n(5999),a=n(5281),s=n(7462),o=n(6010);const c="iconEdit_Z9Sw";function l(t){let{className:e,...n}=t;return i.createElement("svg",(0,s.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(c,e),"aria-hidden":"true"},n),i.createElement("g",null,i.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function h(t){let{editUrl:e}=t;return i.createElement("a",{href:e,target:"_blank",rel:"noreferrer noopener",className:a.k.common.editThisPage},i.createElement(l,null),i.createElement(r.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},7955:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var i=n(7462),r=n(7294),a=n(6010),s=n(5999),o=n(6668),c=n(9960);const l="anchorWithStickyNavbar_LWe7",h="anchorWithHideOnScrollNavbar_WYt5";function u(t){let{as:e,id:n,...u}=t;const{navbar:{hideOnScroll:d}}=(0,o.L)();if("h1"===e||!n)return r.createElement(e,(0,i.Z)({},u,{id:void 0}));const p=(0,s.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return r.createElement(e,(0,i.Z)({},u,{className:(0,a.Z)("anchor",d?h:l,u.className),id:n}),u.children,r.createElement(c.Z,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p},"\u200b"))}},4155:(t,e,n)=>{"use strict";n.d(e,{Z:()=>IL});var i=n(7294),r=n(3905),a=n(7462),s=n(5742);var o=n(2389),l=n(6010),h=n(2949),u=n(6668);function d(){const{prism:t}=(0,u.L)(),{colorMode:e}=(0,h.I)(),n=t.theme,i=t.darkTheme||n;return"dark"===e?i:n}var p=n(5281),f=n(7594),g=n.n(f);const y=/title=(?["'])(?.*?)\1/,m=/\{(?<range>[\d,-]+)\}/,b={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function _(t,e){const n=t.map((t=>{const{start:n,end:i}=b[t];return`(?:${n}\\s*(${e.flatMap((t=>[t.line,t.block?.start,t.block?.end].filter(Boolean))).join("|")})\\s*${i})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function x(t,e){let n=t.replace(/\n$/,"");const{language:i,magicComments:r,metastring:a}=e;if(a&&m.test(a)){const t=a.match(m).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const e=r[0].className,i=g()(t).filter((t=>t>0)).map((t=>[t-1,[e]]));return{lineClassNames:Object.fromEntries(i),code:n}}if(void 0===i)return{lineClassNames:{},code:n};const s=function(t,e){switch(t){case"js":case"javascript":case"ts":case"typescript":return _(["js","jsBlock"],e);case"jsx":case"tsx":return _(["js","jsBlock","jsx"],e);case"html":return _(["js","jsBlock","html"],e);case"python":case"py":case"bash":return _(["bash"],e);case"markdown":case"md":return _(["html","jsx","bash"],e);default:return _(Object.keys(b),e)}}(i,r),o=n.split("\n"),c=Object.fromEntries(r.map((t=>[t.className,{start:0,range:""}]))),l=Object.fromEntries(r.filter((t=>t.line)).map((t=>{let{className:e,line:n}=t;return[n,e]}))),h=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.start,e]}))),u=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.end,e]})));for(let p=0;p<o.length;){const t=o[p].match(s);if(!t){p+=1;continue}const e=t.slice(1).find((t=>void 0!==t));l[e]?c[l[e]].range+=`${p},`:h[e]?c[h[e]].start=p:u[e]&&(c[u[e]].range+=`${c[u[e]].start}-${p-1},`),o.splice(p,1)}n=o.join("\n");const d={};return Object.entries(c).forEach((t=>{let[e,{range:n}]=t;g()(n).forEach((t=>{d[t]??=[],d[t].push(e)}))})),{lineClassNames:d,code:n}}const v="codeBlockContainer_Ckt0";function k(t){let{as:e,...n}=t;const r=function(t){const e={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(t.plain).forEach((t=>{let[i,r]=t;const a=e[i];a&&"string"==typeof r&&(n[a]=r)})),n}(d());return i.createElement(e,(0,a.Z)({},n,{style:r,className:(0,l.Z)(n.className,v,p.k.common.codeBlock)}))}const w={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function T(t){let{children:e,className:n}=t;return i.createElement(k,{as:"pre",tabIndex:0,className:(0,l.Z)(w.codeBlockStandalone,"thin-scrollbar",n)},i.createElement("code",{className:w.codeBlockLines},e))}var C=n(902);const E={attributes:!0,characterData:!0,childList:!0,subtree:!0};function S(t,e){const[n,r]=(0,i.useState)(),a=(0,i.useCallback)((()=>{r(t.current?.closest("[role=tabpanel][hidden]"))}),[t,r]);(0,i.useEffect)((()=>{a()}),[a]),function(t,e,n){void 0===n&&(n=E);const r=(0,C.zX)(e),a=(0,C.Ql)(n);(0,i.useEffect)((()=>{const e=new MutationObserver(r);return t&&e.observe(t,a),()=>e.disconnect()}),[t,r,a])}(n,(t=>{t.forEach((t=>{"attributes"===t.type&&"hidden"===t.attributeName&&(e(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const A={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var D={Prism:n(7410).Z,theme:A};function L(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function N(){return N=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},N.apply(this,arguments)}var O=/\r\n|\r|\n/,B=function(t){0===t.length?t.push({types:["plain"],content:"\n",empty:!0}):1===t.length&&""===t[0].content&&(t[0].content="\n",t[0].empty=!0)},M=function(t,e){var n=t.length;return n>0&&t[n-1]===e?t:t.concat(e)},I=function(t,e){var n=t.plain,i=Object.create(null),r=t.styles.reduce((function(t,n){var i=n.languages,r=n.style;return i&&!i.includes(e)||n.types.forEach((function(e){var n=N({},t[e],r);t[e]=n})),t}),i);return r.root=n,r.plain=N({},n,{backgroundColor:null}),r};function F(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&-1===e.indexOf(i)&&(n[i]=t[i]);return n}var R=function(t){function e(){for(var e=this,n=[],i=arguments.length;i--;)n[i]=arguments[i];t.apply(this,n),L(this,"getThemeDict",(function(t){if(void 0!==e.themeDict&&t.theme===e.prevTheme&&t.language===e.prevLanguage)return e.themeDict;e.prevTheme=t.theme,e.prevLanguage=t.language;var n=t.theme?I(t.theme,t.language):void 0;return e.themeDict=n})),L(this,"getLineProps",(function(t){var n=t.key,i=t.className,r=t.style,a=N({},F(t,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),s=e.getThemeDict(e.props);return void 0!==s&&(a.style=s.plain),void 0!==r&&(a.style=void 0!==a.style?N({},a.style,r):r),void 0!==n&&(a.key=n),i&&(a.className+=" "+i),a})),L(this,"getStyleForToken",(function(t){var n=t.types,i=t.empty,r=n.length,a=e.getThemeDict(e.props);if(void 0!==a){if(1===r&&"plain"===n[0])return i?{display:"inline-block"}:void 0;if(1===r&&!i)return a[n[0]];var s=i?{display:"inline-block"}:{},o=n.map((function(t){return a[t]}));return Object.assign.apply(Object,[s].concat(o))}})),L(this,"getTokenProps",(function(t){var n=t.key,i=t.className,r=t.style,a=t.token,s=N({},F(t,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:e.getStyleForToken(a),key:void 0});return void 0!==r&&(s.style=void 0!==s.style?N({},s.style,r):r),void 0!==n&&(s.key=n),i&&(s.className+=" "+i),s})),L(this,"tokenize",(function(t,e,n,i){var r={code:e,grammar:n,language:i,tokens:[]};t.hooks.run("before-tokenize",r);var a=r.tokens=t.tokenize(r.code,r.grammar,r.language);return t.hooks.run("after-tokenize",r),a}))}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.render=function(){var t=this.props,e=t.Prism,n=t.language,i=t.code,r=t.children,a=this.getThemeDict(this.props),s=e.languages[n],o=function(t){for(var e=[[]],n=[t],i=[0],r=[t.length],a=0,s=0,o=[],c=[o];s>-1;){for(;(a=i[s]++)<r[s];){var l=void 0,h=e[s],u=n[s][a];if("string"==typeof u?(h=s>0?h:["plain"],l=u):(h=M(h,u.type),u.alias&&(h=M(h,u.alias)),l=u.content),"string"==typeof l){var d=l.split(O),p=d.length;o.push({types:h,content:d[0]});for(var f=1;f<p;f++)B(o),c.push(o=[]),o.push({types:h,content:d[f]})}else s++,e.push(h),n.push(l),i.push(0),r.push(l.length)}s--,e.pop(),n.pop(),i.pop(),r.pop()}return B(o),c}(void 0!==s?this.tokenize(e,i,s,n):[i]);return r({tokens:o,className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},e}(i.Component);const $=R,P="codeLine_lJS_",j="codeLineNumber_Tfdd",Y="codeLineContent_feaV";function z(t){let{line:e,classNames:n,showLineNumbers:r,getLineProps:s,getTokenProps:o}=t;1===e.length&&"\n"===e[0].content&&(e[0].content="");const c=s({line:e,className:(0,l.Z)(n,r&&P)}),h=e.map(((t,e)=>i.createElement("span",(0,a.Z)({key:e},o({token:t,key:e})))));return i.createElement("span",c,r?i.createElement(i.Fragment,null,i.createElement("span",{className:j}),i.createElement("span",{className:Y},h)):h,i.createElement("br",null))}var U=n(5999);const W={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function H(t){let{code:e,className:n}=t;const[r,a]=(0,i.useState)(!1),s=(0,i.useRef)(void 0),o=(0,i.useCallback)((()=>{!function(t,e){let{target:n=document.body}=void 0===e?{}:e;const i=document.createElement("textarea"),r=document.activeElement;i.value=t,i.setAttribute("readonly",""),i.style.contain="strict",i.style.position="absolute",i.style.left="-9999px",i.style.fontSize="12pt";const a=document.getSelection();let s=!1;a.rangeCount>0&&(s=a.getRangeAt(0)),n.append(i),i.select(),i.selectionStart=0,i.selectionEnd=t.length;let o=!1;try{o=document.execCommand("copy")}catch{}i.remove(),s&&(a.removeAllRanges(),a.addRange(s)),r&&r.focus()}(e),a(!0),s.current=window.setTimeout((()=>{a(!1)}),1e3)}),[e]);return(0,i.useEffect)((()=>()=>window.clearTimeout(s.current)),[]),i.createElement("button",{type:"button","aria-label":r?(0,U.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,U.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,U.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,l.Z)("clean-btn",n,W.copyButton,r&&W.copyButtonCopied),onClick:o},i.createElement("span",{className:W.copyButtonIcons,"aria-hidden":"true"},i.createElement("svg",{className:W.copyButtonIcon,viewBox:"0 0 24 24"},i.createElement("path",{d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})),i.createElement("svg",{className:W.copyButtonSuccessIcon,viewBox:"0 0 24 24"},i.createElement("path",{d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))))}const q="wordWrapButtonIcon_Bwma",V="wordWrapButtonEnabled_EoeP";function G(t){let{className:e,onClick:n,isEnabled:r}=t;const a=(0,U.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return i.createElement("button",{type:"button",onClick:n,className:(0,l.Z)("clean-btn",e,r&&V),"aria-label":a,title:a},i.createElement("svg",{className:q,viewBox:"0 0 24 24","aria-hidden":"true"},i.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})))}function X(t){let{children:e,className:n="",metastring:r,title:s,showLineNumbers:o,language:c}=t;const{prism:{defaultLanguage:h,magicComments:p}}=(0,u.L)(),f=c??function(t){const e=t.split(" ").find((t=>t.startsWith("language-")));return e?.replace(/language-/,"")}(n)??h,g=d(),m=function(){const[t,e]=(0,i.useState)(!1),[n,r]=(0,i.useState)(!1),a=(0,i.useRef)(null),s=(0,i.useCallback)((()=>{const n=a.current.querySelector("code");t?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),e((t=>!t))}),[a,t]),o=(0,i.useCallback)((()=>{const{scrollWidth:t,clientWidth:e}=a.current,n=t>e||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return S(a,o),(0,i.useEffect)((()=>{o()}),[t,o]),(0,i.useEffect)((()=>(window.addEventListener("resize",o,{passive:!0}),()=>{window.removeEventListener("resize",o)})),[o]),{codeBlockRef:a,isEnabled:t,isCodeScrollable:n,toggle:s}}(),b=function(t){return t?.match(y)?.groups.title??""}(r)||s,{lineClassNames:_,code:v}=x(e,{metastring:r,language:f,magicComments:p}),T=o??function(t){return Boolean(t?.includes("showLineNumbers"))}(r);return i.createElement(k,{as:"div",className:(0,l.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&i.createElement("div",{className:w.codeBlockTitle},b),i.createElement("div",{className:w.codeBlockContent},i.createElement($,(0,a.Z)({},D,{theme:g,code:v,language:f??"text"}),(t=>{let{className:e,tokens:n,getLineProps:r,getTokenProps:a}=t;return i.createElement("pre",{tabIndex:0,ref:m.codeBlockRef,className:(0,l.Z)(e,w.codeBlock,"thin-scrollbar")},i.createElement("code",{className:(0,l.Z)(w.codeBlockLines,T&&w.codeBlockLinesWithNumbering)},n.map(((t,e)=>i.createElement(z,{key:e,line:t,getLineProps:r,getTokenProps:a,classNames:_[e],showLineNumbers:T})))))})),i.createElement("div",{className:w.buttonGroup},(m.isEnabled||m.isCodeScrollable)&&i.createElement(G,{className:w.codeButton,onClick:()=>m.toggle(),isEnabled:m.isEnabled}),i.createElement(H,{className:w.codeButton,code:v}))))}function Z(t){let{children:e,...n}=t;const r=(0,o.Z)(),s=function(t){return i.Children.toArray(t).some((t=>(0,i.isValidElement)(t)))?t:Array.isArray(t)?t.join(""):t}(e),c="string"==typeof s?X:T;return i.createElement(c,(0,a.Z)({key:String(r)},n),s)}var Q=n(9960);var K=n(6043);const J="details_lb9f",tt="isBrowser_bmU9",et="collapsibleContent_i85q";function nt(t){return!!t&&("SUMMARY"===t.tagName||nt(t.parentElement))}function it(t,e){return!!t&&(t===e||it(t.parentElement,e))}function rt(t){let{summary:e,children:n,...r}=t;const s=(0,o.Z)(),c=(0,i.useRef)(null),{collapsed:h,setCollapsed:u}=(0,K.u)({initialState:!r.open}),[d,p]=(0,i.useState)(r.open);return i.createElement("details",(0,a.Z)({},r,{ref:c,open:d,"data-collapsed":h,className:(0,l.Z)(J,s&&tt,r.className),onMouseDown:t=>{nt(t.target)&&t.detail>1&&t.preventDefault()},onClick:t=>{t.stopPropagation();const e=t.target;nt(e)&&it(e,c.current)&&(t.preventDefault(),h?(u(!1),p(!0)):u(!0))}}),e??i.createElement("summary",null,"Details"),i.createElement(K.z,{lazy:!1,collapsed:h,disableSSRStyle:!0,onCollapseTransitionEnd:t=>{u(t),p(!t)}},i.createElement("div",{className:et},n)))}const at="details_b_Ee";function st(t){let{...e}=t;return i.createElement(rt,(0,a.Z)({},e,{className:(0,l.Z)("alert alert--info",at,e.className)}))}var ot=n(7955);function ct(t){return i.createElement(ot.Z,t)}const lt="containsTaskList_mC6p";const ht="img_ev3q";const ut="admonition_LlT9",dt="admonitionHeading_tbUL",pt="admonitionIcon_kALy",ft="admonitionContent_S0QG";const gt={note:{infimaClassName:"secondary",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:i.createElement(U.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:i.createElement(U.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:i.createElement(U.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:i.createElement(U.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 16 16"},i.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:i.createElement(U.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},yt={secondary:"note",important:"info",success:"tip",warning:"danger"};function mt(t){const{mdxAdmonitionTitle:e,rest:n}=function(t){const e=i.Children.toArray(t),n=e.find((t=>i.isValidElement(t)&&"mdxAdmonitionTitle"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return{mdxAdmonitionTitle:n,rest:r}}(t.children);return{...t,title:t.title??e,children:n}}function bt(t){let{children:e,fallback:n}=t;return(0,o.Z)()?i.createElement(i.Fragment,null,e?.()):n??null}var _t=n(1941),xt=n(7967);function vt(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n<i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n<r||void 0===n&&r>=r)&&(n=r)}return n}function kt(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n>i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n>r||void 0===n&&r>=r)&&(n=r)}return n}function wt(t){return t}var Tt=1e-6;function Ct(t){return"translate("+t+",0)"}function Et(t){return"translate(0,"+t+")"}function St(t){return e=>+t(e)}function At(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function Dt(){return!this.__axis}function Lt(t,e){var n=[],i=null,r=null,a=6,s=6,o=3,c="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,l=1===t||4===t?-1:1,h=4===t||2===t?"x":"y",u=1===t||3===t?Ct:Et;function d(d){var p=null==i?e.ticks?e.ticks.apply(e,n):e.domain():i,f=null==r?e.tickFormat?e.tickFormat.apply(e,n):wt:r,g=Math.max(a,0)+o,y=e.range(),m=+y[0]+c,b=+y[y.length-1]+c,_=(e.bandwidth?At:St)(e.copy(),c),x=d.selection?d.selection():d,v=x.selectAll(".domain").data([null]),k=x.selectAll(".tick").data(p,e).order(),w=k.exit(),T=k.enter().append("g").attr("class","tick"),C=k.select("line"),E=k.select("text");v=v.merge(v.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),k=k.merge(T),C=C.merge(T.append("line").attr("stroke","currentColor").attr(h+"2",l*a)),E=E.merge(T.append("text").attr("fill","currentColor").attr(h,l*g).attr("dy",1===t?"0em":3===t?"0.71em":"0.32em")),d!==x&&(v=v.transition(d),k=k.transition(d),C=C.transition(d),E=E.transition(d),w=w.transition(d).attr("opacity",Tt).attr("transform",(function(t){return isFinite(t=_(t))?u(t+c):this.getAttribute("transform")})),T.attr("opacity",Tt).attr("transform",(function(t){var e=this.parentNode.__axis;return u((e&&isFinite(e=e(t))?e:_(t))+c)}))),w.remove(),v.attr("d",4===t||2===t?s?"M"+l*s+","+m+"H"+c+"V"+b+"H"+l*s:"M"+c+","+m+"V"+b:s?"M"+m+","+l*s+"V"+c+"H"+b+"V"+l*s:"M"+m+","+c+"H"+b),k.attr("opacity",1).attr("transform",(function(t){return u(_(t)+c)})),C.attr(h+"2",l*a),E.attr(h,l*g).text(f),x.filter(Dt).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===t?"start":4===t?"end":"middle"),x.each((function(){this.__axis=_}))}return d.scale=function(t){return arguments.length?(e=t,d):e},d.ticks=function(){return n=Array.from(arguments),d},d.tickArguments=function(t){return arguments.length?(n=null==t?[]:Array.from(t),d):n.slice()},d.tickValues=function(t){return arguments.length?(i=null==t?null:Array.from(t),d):i&&i.slice()},d.tickFormat=function(t){return arguments.length?(r=t,d):r},d.tickSize=function(t){return arguments.length?(a=s=+t,d):a},d.tickSizeInner=function(t){return arguments.length?(a=+t,d):a},d.tickSizeOuter=function(t){return arguments.length?(s=+t,d):s},d.tickPadding=function(t){return arguments.length?(o=+t,d):o},d.offset=function(t){return arguments.length?(c=+t,d):c},d}function Nt(){}function Ot(t){return null==t?Nt:function(){return this.querySelector(t)}}function Bt(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}function Mt(){return[]}function It(t){return null==t?Mt:function(){return this.querySelectorAll(t)}}function Ft(t){return function(){return this.matches(t)}}function Rt(t){return function(e){return e.matches(t)}}var $t=Array.prototype.find;function Pt(){return this.firstElementChild}var jt=Array.prototype.filter;function Yt(){return Array.from(this.children)}function zt(t){return new Array(t.length)}function Ut(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function Wt(t){return function(){return t}}function Ht(t,e,n,i,r,a){for(var s,o=0,c=e.length,l=a.length;o<l;++o)(s=e[o])?(s.__data__=a[o],i[o]=s):n[o]=new Ut(t,a[o]);for(;o<c;++o)(s=e[o])&&(r[o]=s)}function qt(t,e,n,i,r,a,s){var o,c,l,h=new Map,u=e.length,d=a.length,p=new Array(u);for(o=0;o<u;++o)(c=e[o])&&(p[o]=l=s.call(c,c.__data__,o,e)+"",h.has(l)?r[o]=c:h.set(l,c));for(o=0;o<d;++o)l=s.call(t,a[o],o,a)+"",(c=h.get(l))?(i[o]=c,c.__data__=a[o],h.delete(l)):n[o]=new Ut(t,a[o]);for(o=0;o<u;++o)(c=e[o])&&h.get(p[o])===c&&(r[o]=c)}function Vt(t){return t.__data__}function Gt(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function Xt(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}Ut.prototype={constructor:Ut,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var Zt="http://www.w3.org/1999/xhtml";const Qt={svg:"http://www.w3.org/2000/svg",xhtml:Zt,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Kt(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Qt.hasOwnProperty(e)?{space:Qt[e],local:t}:t}function Jt(t){return function(){this.removeAttribute(t)}}function te(t){return function(){this.removeAttributeNS(t.space,t.local)}}function ee(t,e){return function(){this.setAttribute(t,e)}}function ne(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function ie(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function re(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function ae(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function se(t){return function(){this.style.removeProperty(t)}}function oe(t,e,n){return function(){this.style.setProperty(t,e,n)}}function ce(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}function le(t,e){return t.style.getPropertyValue(e)||ae(t).getComputedStyle(t,null).getPropertyValue(e)}function he(t){return function(){delete this[t]}}function ue(t,e){return function(){this[t]=e}}function de(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function pe(t){return t.trim().split(/^|\s+/)}function fe(t){return t.classList||new ge(t)}function ge(t){this._node=t,this._names=pe(t.getAttribute("class")||"")}function ye(t,e){for(var n=fe(t),i=-1,r=e.length;++i<r;)n.add(e[i])}function me(t,e){for(var n=fe(t),i=-1,r=e.length;++i<r;)n.remove(e[i])}function be(t){return function(){ye(this,t)}}function _e(t){return function(){me(this,t)}}function xe(t,e){return function(){(e.apply(this,arguments)?ye:me)(this,t)}}function ve(){this.textContent=""}function ke(t){return function(){this.textContent=t}}function we(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function Te(){this.innerHTML=""}function Ce(t){return function(){this.innerHTML=t}}function Ee(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function Se(){this.nextSibling&&this.parentNode.appendChild(this)}function Ae(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function De(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===Zt&&e.documentElement.namespaceURI===Zt?e.createElement(t):e.createElementNS(n,t)}}function Le(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Ne(t){var e=Kt(t);return(e.local?Le:De)(e)}function Oe(){return null}function Be(){var t=this.parentNode;t&&t.removeChild(this)}function Me(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function Ie(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function Fe(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function Re(t){return function(){var e=this.__on;if(e){for(var n,i=0,r=-1,a=e.length;i<a;++i)n=e[i],t.type&&n.type!==t.type||n.name!==t.name?e[++r]=n:this.removeEventListener(n.type,n.listener,n.options);++r?e.length=r:delete this.__on}}}function $e(t,e,n){return function(){var i,r=this.__on,a=function(t){return function(e){t.call(this,e,this.__data__)}}(e);if(r)for(var s=0,o=r.length;s<o;++s)if((i=r[s]).type===t.type&&i.name===t.name)return this.removeEventListener(i.type,i.listener,i.options),this.addEventListener(i.type,i.listener=a,i.options=n),void(i.value=e);this.addEventListener(t.type,a,n),i={type:t.type,name:t.name,value:e,listener:a,options:n},r?r.push(i):this.__on=[i]}}function Pe(t,e,n){var i=ae(t),r=i.CustomEvent;"function"==typeof r?r=new r(e,n):(r=i.document.createEvent("Event"),n?(r.initEvent(e,n.bubbles,n.cancelable),r.detail=n.detail):r.initEvent(e,!1,!1)),t.dispatchEvent(r)}function je(t,e){return function(){return Pe(this,t,e)}}function Ye(t,e){return function(){return Pe(this,t,e.apply(this,arguments))}}ge.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var ze=[null];function Ue(t,e){this._groups=t,this._parents=e}function We(){return new Ue([[document.documentElement]],ze)}Ue.prototype=We.prototype={constructor:Ue,select:function(t){"function"!=typeof t&&(t=Ot(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s,o=e[r],c=o.length,l=i[r]=new Array(c),h=0;h<c;++h)(a=o[h])&&(s=t.call(a,a.__data__,h,o))&&("__data__"in a&&(s.__data__=a.__data__),l[h]=s);return new Ue(i,this._parents)},selectAll:function(t){t="function"==typeof t?function(t){return function(){return Bt(t.apply(this,arguments))}}(t):It(t);for(var e=this._groups,n=e.length,i=[],r=[],a=0;a<n;++a)for(var s,o=e[a],c=o.length,l=0;l<c;++l)(s=o[l])&&(i.push(t.call(s,s.__data__,l,o)),r.push(s));return new Ue(i,r)},selectChild:function(t){return this.select(null==t?Pt:function(t){return function(){return $t.call(this.children,t)}}("function"==typeof t?t:Rt(t)))},selectChildren:function(t){return this.selectAll(null==t?Yt:function(t){return function(){return jt.call(this.children,t)}}("function"==typeof t?t:Rt(t)))},filter:function(t){"function"!=typeof t&&(t=Ft(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new Ue(i,this._parents)},data:function(t,e){if(!arguments.length)return Array.from(this,Vt);var n=e?qt:Ht,i=this._parents,r=this._groups;"function"!=typeof t&&(t=Wt(t));for(var a=r.length,s=new Array(a),o=new Array(a),c=new Array(a),l=0;l<a;++l){var h=i[l],u=r[l],d=u.length,p=Gt(t.call(h,h&&h.__data__,l,i)),f=p.length,g=o[l]=new Array(f),y=s[l]=new Array(f),m=c[l]=new Array(d);n(h,u,g,y,m,p,e);for(var b,_,x=0,v=0;x<f;++x)if(b=g[x]){for(x>=v&&(v=x+1);!(_=y[v])&&++v<f;);b._next=_||null}}return(s=new Ue(s,i))._enter=o,s._exit=c,s},enter:function(){return new Ue(this._enter||this._groups.map(zt),this._parents)},exit:function(){return new Ue(this._exit||this._groups.map(zt),this._parents)},join:function(t,e,n){var i=this.enter(),r=this,a=this.exit();return"function"==typeof t?(i=t(i))&&(i=i.selection()):i=i.append(t+""),null!=e&&(r=e(r))&&(r=r.selection()),null==n?a.remove():n(a),i&&r?i.merge(r).order():r},merge:function(t){for(var e=t.selection?t.selection():t,n=this._groups,i=e._groups,r=n.length,a=i.length,s=Math.min(r,a),o=new Array(r),c=0;c<s;++c)for(var l,h=n[c],u=i[c],d=h.length,p=o[c]=new Array(d),f=0;f<d;++f)(l=h[f]||u[f])&&(p[f]=l);for(;c<r;++c)o[c]=n[c];return new Ue(o,this._parents)},selection:function(){return this},order:function(){for(var t=this._groups,e=-1,n=t.length;++e<n;)for(var i,r=t[e],a=r.length-1,s=r[a];--a>=0;)(i=r[a])&&(s&&4^i.compareDocumentPosition(s)&&s.parentNode.insertBefore(i,s),s=i);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=Xt);for(var n=this._groups,i=n.length,r=new Array(i),a=0;a<i;++a){for(var s,o=n[a],c=o.length,l=r[a]=new Array(c),h=0;h<c;++h)(s=o[h])&&(l[h]=s);l.sort(e)}return new Ue(r,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i=t[e],r=0,a=i.length;r<a;++r){var s=i[r];if(s)return s}return null},size:function(){let t=0;for(const e of this)++t;return t},empty:function(){return!this.node()},each:function(t){for(var e=this._groups,n=0,i=e.length;n<i;++n)for(var r,a=e[n],s=0,o=a.length;s<o;++s)(r=a[s])&&t.call(r,r.__data__,s,a);return this},attr:function(t,e){var n=Kt(t);if(arguments.length<2){var i=this.node();return n.local?i.getAttributeNS(n.space,n.local):i.getAttribute(n)}return this.each((null==e?n.local?te:Jt:"function"==typeof e?n.local?re:ie:n.local?ne:ee)(n,e))},style:function(t,e,n){return arguments.length>1?this.each((null==e?se:"function"==typeof e?ce:oe)(t,e,null==n?"":n)):le(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?he:"function"==typeof e?de:ue)(t,e)):this.node()[t]},classed:function(t,e){var n=pe(t+"");if(arguments.length<2){for(var i=fe(this.node()),r=-1,a=n.length;++r<a;)if(!i.contains(n[r]))return!1;return!0}return this.each(("function"==typeof e?xe:e?be:_e)(n,e))},text:function(t){return arguments.length?this.each(null==t?ve:("function"==typeof t?we:ke)(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?Te:("function"==typeof t?Ee:Ce)(t)):this.node().innerHTML},raise:function(){return this.each(Se)},lower:function(){return this.each(Ae)},append:function(t){var e="function"==typeof t?t:Ne(t);return this.select((function(){return this.appendChild(e.apply(this,arguments))}))},insert:function(t,e){var n="function"==typeof t?t:Ne(t),i=null==e?Oe:"function"==typeof e?e:Ot(e);return this.select((function(){return this.insertBefore(n.apply(this,arguments),i.apply(this,arguments)||null)}))},remove:function(){return this.each(Be)},clone:function(t){return this.select(t?Ie:Me)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,e,n){var i,r,a=Fe(t+""),s=a.length;if(!(arguments.length<2)){for(o=e?$e:Re,i=0;i<s;++i)this.each(o(a[i],e,n));return this}var o=this.node().__on;if(o)for(var c,l=0,h=o.length;l<h;++l)for(i=0,c=o[l];i<s;++i)if((r=a[i]).type===c.type&&r.name===c.name)return c.value},dispatch:function(t,e){return this.each(("function"==typeof e?Ye:je)(t,e))},[Symbol.iterator]:function*(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i,r=t[e],a=0,s=r.length;a<s;++a)(i=r[a])&&(yield i)}};const He=We;var qe={value:()=>{}};function Ve(){for(var t,e=0,n=arguments.length,i={};e<n;++e){if(!(t=arguments[e]+"")||t in i||/[\s.]/.test(t))throw new Error("illegal type: "+t);i[t]=[]}return new Ge(i)}function Ge(t){this._=t}function Xe(t,e){return t.trim().split(/^|\s+/).map((function(t){var n="",i=t.indexOf(".");if(i>=0&&(n=t.slice(i+1),t=t.slice(0,i)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function Ze(t,e){for(var n,i=0,r=t.length;i<r;++i)if((n=t[i]).name===e)return n.value}function Qe(t,e,n){for(var i=0,r=t.length;i<r;++i)if(t[i].name===e){t[i]=qe,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=n&&t.push({name:e,value:n}),t}Ge.prototype=Ve.prototype={constructor:Ge,on:function(t,e){var n,i=this._,r=Xe(t+"",i),a=-1,s=r.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++a<s;)if(n=(t=r[a]).type)i[n]=Qe(i[n],t.name,e);else if(null==e)for(n in i)i[n]=Qe(i[n],t.name,null);return this}for(;++a<s;)if((n=(t=r[a]).type)&&(n=Ze(i[n],t.name)))return n},copy:function(){var t={},e=this._;for(var n in e)t[n]=e[n].slice();return new Ge(t)},call:function(t,e){if((n=arguments.length-2)>0)for(var n,i,r=new Array(n),a=0;a<n;++a)r[a]=arguments[a+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(a=0,n=(i=this._[t]).length;a<n;++a)i[a].value.apply(e,r)},apply:function(t,e,n){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var i=this._[t],r=0,a=i.length;r<a;++r)i[r].value.apply(e,n)}};const Ke=Ve;var Je,tn,en=0,nn=0,rn=0,an=0,sn=0,on=0,cn="object"==typeof performance&&performance.now?performance:Date,ln="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function hn(){return sn||(ln(un),sn=cn.now()+on)}function un(){sn=0}function dn(){this._call=this._time=this._next=null}function pn(t,e,n){var i=new dn;return i.restart(t,e,n),i}function fn(){sn=(an=cn.now())+on,en=nn=0;try{!function(){hn(),++en;for(var t,e=Je;e;)(t=sn-e._time)>=0&&e._call.call(void 0,t),e=e._next;--en}()}finally{en=0,function(){var t,e,n=Je,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Je=e);tn=t,yn(i)}(),sn=0}}function gn(){var t=cn.now(),e=t-an;e>1e3&&(on-=e,an=t)}function yn(t){en||(nn&&(nn=clearTimeout(nn)),t-sn>24?(t<1/0&&(nn=setTimeout(fn,t-cn.now()-on)),rn&&(rn=clearInterval(rn))):(rn||(an=cn.now(),rn=setInterval(gn,1e3)),en=1,ln(fn)))}function mn(t,e,n){var i=new dn;return e=null==e?0:+e,i.restart((n=>{i.stop(),t(n+e)}),e,n),i}dn.prototype=pn.prototype={constructor:dn,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?hn():+n)+(null==e?0:+e),this._next||tn===this||(tn?tn._next=this:Je=this,tn=this),this._call=t,this._time=n,yn()},stop:function(){this._call&&(this._call=null,this._time=1/0,yn())}};var bn=Ke("start","end","cancel","interrupt"),_n=[];function xn(t,e,n,i,r,a){var s=t.__transition;if(s){if(n in s)return}else t.__transition={};!function(t,e,n){var i,r=t.__transition;function a(t){n.state=1,n.timer.restart(s,n.delay,n.time),n.delay<=t&&s(t-n.delay)}function s(a){var l,h,u,d;if(1!==n.state)return c();for(l in r)if((d=r[l]).name===n.name){if(3===d.state)return mn(s);4===d.state?(d.state=6,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete r[l]):+l<e&&(d.state=6,d.timer.stop(),d.on.call("cancel",t,t.__data__,d.index,d.group),delete r[l])}if(mn((function(){3===n.state&&(n.state=4,n.timer.restart(o,n.delay,n.time),o(a))})),n.state=2,n.on.call("start",t,t.__data__,n.index,n.group),2===n.state){for(n.state=3,i=new Array(u=n.tween.length),l=0,h=-1;l<u;++l)(d=n.tween[l].value.call(t,t.__data__,n.index,n.group))&&(i[++h]=d);i.length=h+1}}function o(e){for(var r=e<n.duration?n.ease.call(null,e/n.duration):(n.timer.restart(c),n.state=5,1),a=-1,s=i.length;++a<s;)i[a].call(t,r);5===n.state&&(n.on.call("end",t,t.__data__,n.index,n.group),c())}function c(){for(var i in n.state=6,n.timer.stop(),delete r[e],r)return;delete t.__transition}r[e]=n,n.timer=pn(a,0,n.time)}(t,n,{name:e,index:i,group:r,on:bn,tween:_n,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:0})}function vn(t,e){var n=wn(t,e);if(n.state>0)throw new Error("too late; already scheduled");return n}function kn(t,e){var n=wn(t,e);if(n.state>3)throw new Error("too late; already running");return n}function wn(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Tn(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var Cn,En=180/Math.PI,Sn={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function An(t,e,n,i,r,a){var s,o,c;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(c=t*n+e*i)&&(n-=t*c,i-=e*c),(o=Math.sqrt(n*n+i*i))&&(n/=o,i/=o,c/=o),t*i<e*n&&(t=-t,e=-e,c=-c,s=-s),{translateX:r,translateY:a,rotate:Math.atan2(e,t)*En,skewX:Math.atan(c)*En,scaleX:s,scaleY:o}}function Dn(t,e,n,i){function r(t){return t.length?t.pop()+" ":""}return function(a,s){var o=[],c=[];return a=t(a),s=t(s),function(t,i,r,a,s,o){if(t!==r||i!==a){var c=s.push("translate(",null,e,null,n);o.push({i:c-4,x:Tn(t,r)},{i:c-2,x:Tn(i,a)})}else(r||a)&&s.push("translate("+r+e+a+n)}(a.translateX,a.translateY,s.translateX,s.translateY,o,c),function(t,e,n,a){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(r(n)+"rotate(",null,i)-2,x:Tn(t,e)})):e&&n.push(r(n)+"rotate("+e+i)}(a.rotate,s.rotate,o,c),function(t,e,n,a){t!==e?a.push({i:n.push(r(n)+"skewX(",null,i)-2,x:Tn(t,e)}):e&&n.push(r(n)+"skewX("+e+i)}(a.skewX,s.skewX,o,c),function(t,e,n,i,a,s){if(t!==n||e!==i){var o=a.push(r(a)+"scale(",null,",",null,")");s.push({i:o-4,x:Tn(t,n)},{i:o-2,x:Tn(e,i)})}else 1===n&&1===i||a.push(r(a)+"scale("+n+","+i+")")}(a.scaleX,a.scaleY,s.scaleX,s.scaleY,o,c),a=s=null,function(t){for(var e,n=-1,i=c.length;++n<i;)o[(e=c[n]).i]=e.x(t);return o.join("")}}}var Ln=Dn((function(t){const e=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?Sn:An(e.a,e.b,e.c,e.d,e.e,e.f)}),"px, ","px)","deg)"),Nn=Dn((function(t){return null==t?Sn:(Cn||(Cn=document.createElementNS("http://www.w3.org/2000/svg","g")),Cn.setAttribute("transform",t),(t=Cn.transform.baseVal.consolidate())?An((t=t.matrix).a,t.b,t.c,t.d,t.e,t.f):Sn)}),", ",")",")");function On(t,e){var n,i;return function(){var r=kn(this,t),a=r.tween;if(a!==n)for(var s=0,o=(i=n=a).length;s<o;++s)if(i[s].name===e){(i=i.slice()).splice(s,1);break}r.tween=i}}function Bn(t,e,n){var i,r;if("function"!=typeof n)throw new Error;return function(){var a=kn(this,t),s=a.tween;if(s!==i){r=(i=s).slice();for(var o={name:e,value:n},c=0,l=r.length;c<l;++c)if(r[c].name===e){r[c]=o;break}c===l&&r.push(o)}a.tween=r}}function Mn(t,e,n){var i=t._id;return t.each((function(){var t=kn(this,i);(t.value||(t.value={}))[e]=n.apply(this,arguments)})),function(t){return wn(t,i).value[e]}}function In(t,e,n){t.prototype=e.prototype=n,n.constructor=t}function Fn(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n}function Rn(){}var $n=.7,Pn=1/$n,jn="\\s*([+-]?\\d+)\\s*",Yn="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",zn="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Un=/^#([0-9a-f]{3,8})$/,Wn=new RegExp(`^rgb\\(${jn},${jn},${jn}\\)$`),Hn=new RegExp(`^rgb\\(${zn},${zn},${zn}\\)$`),qn=new RegExp(`^rgba\\(${jn},${jn},${jn},${Yn}\\)$`),Vn=new RegExp(`^rgba\\(${zn},${zn},${zn},${Yn}\\)$`),Gn=new RegExp(`^hsl\\(${Yn},${zn},${zn}\\)$`),Xn=new RegExp(`^hsla\\(${Yn},${zn},${zn},${Yn}\\)$`),Zn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function Qn(){return this.rgb().formatHex()}function Kn(){return this.rgb().formatRgb()}function Jn(t){var e,n;return t=(t+"").trim().toLowerCase(),(e=Un.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?ti(e):3===n?new ri(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?ei(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?ei(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Wn.exec(t))?new ri(e[1],e[2],e[3],1):(e=Hn.exec(t))?new ri(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=qn.exec(t))?ei(e[1],e[2],e[3],e[4]):(e=Vn.exec(t))?ei(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Gn.exec(t))?hi(e[1],e[2]/100,e[3]/100,1):(e=Xn.exec(t))?hi(e[1],e[2]/100,e[3]/100,e[4]):Zn.hasOwnProperty(t)?ti(Zn[t]):"transparent"===t?new ri(NaN,NaN,NaN,0):null}function ti(t){return new ri(t>>16&255,t>>8&255,255&t,1)}function ei(t,e,n,i){return i<=0&&(t=e=n=NaN),new ri(t,e,n,i)}function ni(t){return t instanceof Rn||(t=Jn(t)),t?new ri((t=t.rgb()).r,t.g,t.b,t.opacity):new ri}function ii(t,e,n,i){return 1===arguments.length?ni(t):new ri(t,e,n,null==i?1:i)}function ri(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function ai(){return`#${li(this.r)}${li(this.g)}${li(this.b)}`}function si(){const t=oi(this.opacity);return`${1===t?"rgb(":"rgba("}${ci(this.r)}, ${ci(this.g)}, ${ci(this.b)}${1===t?")":`, ${t})`}`}function oi(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function ci(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function li(t){return((t=ci(t))<16?"0":"")+t.toString(16)}function hi(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new di(t,e,n,i)}function ui(t){if(t instanceof di)return new di(t.h,t.s,t.l,t.opacity);if(t instanceof Rn||(t=Jn(t)),!t)return new di;if(t instanceof di)return t;var e=(t=t.rgb()).r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),s=NaN,o=a-r,c=(a+r)/2;return o?(s=e===a?(n-i)/o+6*(n<i):n===a?(i-e)/o+2:(e-n)/o+4,o/=c<.5?a+r:2-a-r,s*=60):o=c>0&&c<1?0:s,new di(s,o,c,t.opacity)}function di(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function pi(t){return(t=(t||0)%360)<0?t+360:t}function fi(t){return Math.max(0,Math.min(1,t||0))}function gi(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function yi(t,e,n,i,r){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*n+(1+3*t+3*a-3*s)*i+s*r)/6}In(Rn,Jn,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Qn,formatHex:Qn,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return ui(this).formatHsl()},formatRgb:Kn,toString:Kn}),In(ri,ii,Fn(Rn,{brighter(t){return t=null==t?Pn:Math.pow(Pn,t),new ri(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?$n:Math.pow($n,t),new ri(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new ri(ci(this.r),ci(this.g),ci(this.b),oi(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:ai,formatHex:ai,formatHex8:function(){return`#${li(this.r)}${li(this.g)}${li(this.b)}${li(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:si,toString:si})),In(di,(function(t,e,n,i){return 1===arguments.length?ui(t):new di(t,e,n,null==i?1:i)}),Fn(Rn,{brighter(t){return t=null==t?Pn:Math.pow(Pn,t),new di(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?$n:Math.pow($n,t),new di(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new ri(gi(t>=240?t-240:t+120,r,i),gi(t,r,i),gi(t<120?t+240:t-120,r,i),this.opacity)},clamp(){return new di(pi(this.h),fi(this.s),fi(this.l),oi(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=oi(this.opacity);return`${1===t?"hsl(":"hsla("}${pi(this.h)}, ${100*fi(this.s)}%, ${100*fi(this.l)}%${1===t?")":`, ${t})`}`}}));const mi=t=>()=>t;function bi(t,e){return function(n){return t+n*e}}function _i(t){return 1==(t=+t)?xi:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}(e,n,t):mi(isNaN(e)?n:e)}}function xi(t,e){var n=e-t;return n?bi(t,n):mi(isNaN(t)?e:t)}const vi=function t(e){var n=_i(e);function i(t,e){var i=n((t=ii(t)).r,(e=ii(e)).r),r=n(t.g,e.g),a=n(t.b,e.b),s=xi(t.opacity,e.opacity);return function(e){return t.r=i(e),t.g=r(e),t.b=a(e),t.opacity=s(e),t+""}}return i.gamma=t,i}(1);function ki(t){return function(e){var n,i,r=e.length,a=new Array(r),s=new Array(r),o=new Array(r);for(n=0;n<r;++n)i=ii(e[n]),a[n]=i.r||0,s[n]=i.g||0,o[n]=i.b||0;return a=t(a),s=t(s),o=t(o),i.opacity=1,function(t){return i.r=a(t),i.g=s(t),i.b=o(t),i+""}}}ki((function(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),r=t[i],a=t[i+1],s=i>0?t[i-1]:2*r-a,o=i<e-1?t[i+2]:2*a-r;return yi((n-i/e)*e,s,r,a,o)}})),ki((function(t){var e=t.length;return function(n){var i=Math.floor(((n%=1)<0?++n:n)*e),r=t[(i+e-1)%e],a=t[i%e],s=t[(i+1)%e],o=t[(i+2)%e];return yi((n-i/e)*e,r,a,s,o)}}));var wi=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Ti=new RegExp(wi.source,"g");function Ci(t,e){var n,i,r,a=wi.lastIndex=Ti.lastIndex=0,s=-1,o=[],c=[];for(t+="",e+="";(n=wi.exec(t))&&(i=Ti.exec(e));)(r=i.index)>a&&(r=e.slice(a,r),o[s]?o[s]+=r:o[++s]=r),(n=n[0])===(i=i[0])?o[s]?o[s]+=i:o[++s]=i:(o[++s]=null,c.push({i:s,x:Tn(n,i)})),a=Ti.lastIndex;return a<e.length&&(r=e.slice(a),o[s]?o[s]+=r:o[++s]=r),o.length<2?c[0]?function(t){return function(e){return t(e)+""}}(c[0].x):function(t){return function(){return t}}(e):(e=c.length,function(t){for(var n,i=0;i<e;++i)o[(n=c[i]).i]=n.x(t);return o.join("")})}function Ei(t,e){var n;return("number"==typeof e?Tn:e instanceof Jn?vi:(n=Jn(e))?(e=n,vi):Ci)(t,e)}function Si(t){return function(){this.removeAttribute(t)}}function Ai(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Di(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttribute(t);return s===a?null:s===i?r:r=e(i=s,n)}}function Li(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttributeNS(t.space,t.local);return s===a?null:s===i?r:r=e(i=s,n)}}function Ni(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttribute(t))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttribute(t)}}function Oi(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttributeNS(t.space,t.local))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttributeNS(t.space,t.local)}}function Bi(t,e){return function(n){this.setAttribute(t,e.call(this,n))}}function Mi(t,e){return function(n){this.setAttributeNS(t.space,t.local,e.call(this,n))}}function Ii(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&Mi(t,r)),n}return r._value=e,r}function Fi(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&Bi(t,r)),n}return r._value=e,r}function Ri(t,e){return function(){vn(this,t).delay=+e.apply(this,arguments)}}function $i(t,e){return e=+e,function(){vn(this,t).delay=e}}function Pi(t,e){return function(){kn(this,t).duration=+e.apply(this,arguments)}}function ji(t,e){return e=+e,function(){kn(this,t).duration=e}}function Yi(t,e){if("function"!=typeof e)throw new Error;return function(){kn(this,t).ease=e}}function zi(t,e,n){var i,r,a=function(t){return(t+"").trim().split(/^|\s+/).every((function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?vn:kn;return function(){var s=a(this,t),o=s.on;o!==i&&(r=(i=o).copy()).on(e,n),s.on=r}}var Ui=He.prototype.constructor;function Wi(t){return function(){this.style.removeProperty(t)}}function Hi(t,e,n){return function(i){this.style.setProperty(t,e.call(this,i),n)}}function qi(t,e,n){var i,r;function a(){var a=e.apply(this,arguments);return a!==r&&(i=(r=a)&&Hi(t,a,n)),i}return a._value=e,a}function Vi(t){return function(e){this.textContent=t.call(this,e)}}function Gi(t){var e,n;function i(){var i=t.apply(this,arguments);return i!==n&&(e=(n=i)&&Vi(i)),e}return i._value=t,i}var Xi=0;function Zi(t,e,n,i){this._groups=t,this._parents=e,this._name=n,this._id=i}function Qi(){return++Xi}var Ki=He.prototype;Zi.prototype=function(t){return He().transition(t)}.prototype={constructor:Zi,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=Ot(t));for(var i=this._groups,r=i.length,a=new Array(r),s=0;s<r;++s)for(var o,c,l=i[s],h=l.length,u=a[s]=new Array(h),d=0;d<h;++d)(o=l[d])&&(c=t.call(o,o.__data__,d,l))&&("__data__"in o&&(c.__data__=o.__data__),u[d]=c,xn(u[d],e,n,d,u,wn(o,n)));return new Zi(a,this._parents,e,n)},selectAll:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=It(t));for(var i=this._groups,r=i.length,a=[],s=[],o=0;o<r;++o)for(var c,l=i[o],h=l.length,u=0;u<h;++u)if(c=l[u]){for(var d,p=t.call(c,c.__data__,u,l),f=wn(c,n),g=0,y=p.length;g<y;++g)(d=p[g])&&xn(d,e,n,g,p,f);a.push(p),s.push(c)}return new Zi(a,s,e,n)},selectChild:Ki.selectChild,selectChildren:Ki.selectChildren,filter:function(t){"function"!=typeof t&&(t=Ft(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new Zi(i,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,n=t._groups,i=e.length,r=n.length,a=Math.min(i,r),s=new Array(i),o=0;o<a;++o)for(var c,l=e[o],h=n[o],u=l.length,d=s[o]=new Array(u),p=0;p<u;++p)(c=l[p]||h[p])&&(d[p]=c);for(;o<i;++o)s[o]=e[o];return new Zi(s,this._parents,this._name,this._id)},selection:function(){return new Ui(this._groups,this._parents)},transition:function(){for(var t=this._name,e=this._id,n=Qi(),i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)if(s=o[l]){var h=wn(s,e);xn(s,t,n,l,o,{time:h.time+h.delay+h.duration,delay:0,duration:h.duration,ease:h.ease})}return new Zi(i,this._parents,t,n)},call:Ki.call,nodes:Ki.nodes,node:Ki.node,size:Ki.size,empty:Ki.empty,each:Ki.each,on:function(t,e){var n=this._id;return arguments.length<2?wn(this.node(),n).on.on(t):this.each(zi(n,t,e))},attr:function(t,e){var n=Kt(t),i="transform"===n?Nn:Ei;return this.attrTween(t,"function"==typeof e?(n.local?Oi:Ni)(n,i,Mn(this,"attr."+t,e)):null==e?(n.local?Ai:Si)(n):(n.local?Li:Di)(n,i,e))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var i=Kt(t);return this.tween(n,(i.local?Ii:Fi)(i,e))},style:function(t,e,n){var i="transform"==(t+="")?Ln:Ei;return null==e?this.styleTween(t,function(t,e){var n,i,r;return function(){var a=le(this,t),s=(this.style.removeProperty(t),le(this,t));return a===s?null:a===n&&s===i?r:r=e(n=a,i=s)}}(t,i)).on("end.style."+t,Wi(t)):"function"==typeof e?this.styleTween(t,function(t,e,n){var i,r,a;return function(){var s=le(this,t),o=n(this),c=o+"";return null==o&&(this.style.removeProperty(t),c=o=le(this,t)),s===c?null:s===i&&c===r?a:(r=c,a=e(i=s,o))}}(t,i,Mn(this,"style."+t,e))).each(function(t,e){var n,i,r,a,s="style."+e,o="end."+s;return function(){var c=kn(this,t),l=c.on,h=null==c.value[s]?a||(a=Wi(e)):void 0;l===n&&r===h||(i=(n=l).copy()).on(o,r=h),c.on=i}}(this._id,t)):this.styleTween(t,function(t,e,n){var i,r,a=n+"";return function(){var s=le(this,t);return s===a?null:s===i?r:r=e(i=s,n)}}(t,i,e),n).on("end.style."+t,null)},styleTween:function(t,e,n){var i="style."+(t+="");if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;return this.tween(i,qi(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(Mn(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,Gi(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var i,r=wn(this.node(),n).tween,a=0,s=r.length;a<s;++a)if((i=r[a]).name===t)return i.value;return null}return this.each((null==e?On:Bn)(n,t,e))},delay:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?Ri:$i)(e,t)):wn(this.node(),e).delay},duration:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?Pi:ji)(e,t)):wn(this.node(),e).duration},ease:function(t){var e=this._id;return arguments.length?this.each(Yi(e,t)):wn(this.node(),e).ease},easeVarying:function(t){if("function"!=typeof t)throw new Error;return this.each(function(t,e){return function(){var n=e.apply(this,arguments);if("function"!=typeof n)throw new Error;kn(this,t).ease=n}}(this._id,t))},end:function(){var t,e,n=this,i=n._id,r=n.size();return new Promise((function(a,s){var o={value:s},c={value:function(){0==--r&&a()}};n.each((function(){var n=kn(this,i),r=n.on;r!==t&&((e=(t=r).copy())._.cancel.push(o),e._.interrupt.push(o),e._.end.push(c)),n.on=e})),0===r&&a()}))},[Symbol.iterator]:Ki[Symbol.iterator]};var Ji={time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}};function tr(t,e){for(var n;!(n=t.__transition)||!(n=n[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return n}He.prototype.interrupt=function(t){return this.each((function(){!function(t,e){var n,i,r,a=t.__transition,s=!0;if(a){for(r in e=null==e?null:e+"",a)(n=a[r]).name===e?(i=n.state>2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(i?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[r]):s=!1;s&&delete t.__transition}}(this,t)}))},He.prototype.transition=function(t){var e,n;t instanceof Zi?(e=t._id,t=t._name):(e=Qi(),(n=Ji).time=hn(),t=null==t?null:t+"");for(var i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)(s=o[l])&&xn(s,t,e,l,o,n||tr(s,e));return new Zi(i,this._parents,t,e)};const{abs:er,max:nr,min:ir}=Math;function rr(t){return[+t[0],+t[1]]}function ar(t){return[rr(t[0]),rr(t[1])]}["w","e"].map(sr),["n","s"].map(sr),["n","w","e","s","nw","ne","sw","se"].map(sr);function sr(t){return{type:t}}function or(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function cr(t){return(e,n)=>function(t,e){return fetch(t,e).then(or)}(e,n).then((e=>(new DOMParser).parseFromString(e,t)))}cr("application/xml");cr("text/html"),cr("image/svg+xml");const lr=Math.PI/180,hr=180/Math.PI,ur=.96422,dr=.82521,pr=4/29,fr=6/29,gr=3*fr*fr;function yr(t){if(t instanceof mr)return new mr(t.l,t.a,t.b,t.opacity);if(t instanceof Tr)return Cr(t);t instanceof ri||(t=ni(t));var e,n,i=vr(t.r),r=vr(t.g),a=vr(t.b),s=br((.2225045*i+.7168786*r+.0606169*a)/1);return i===r&&r===a?e=n=s:(e=br((.4360747*i+.3850649*r+.1430804*a)/ur),n=br((.0139322*i+.0971045*r+.7141733*a)/dr)),new mr(116*s-16,500*(e-s),200*(s-n),t.opacity)}function mr(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function br(t){return t>.008856451679035631?Math.pow(t,1/3):t/gr+pr}function _r(t){return t>fr?t*t*t:gr*(t-pr)}function xr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function vr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function kr(t){if(t instanceof Tr)return new Tr(t.h,t.c,t.l,t.opacity);if(t instanceof mr||(t=yr(t)),0===t.a&&0===t.b)return new Tr(NaN,0<t.l&&t.l<100?0:NaN,t.l,t.opacity);var e=Math.atan2(t.b,t.a)*hr;return new Tr(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function wr(t,e,n,i){return 1===arguments.length?kr(t):new Tr(t,e,n,null==i?1:i)}function Tr(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}function Cr(t){if(isNaN(t.h))return new mr(t.l,0,0,t.opacity);var e=t.h*lr;return new mr(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}function Er(t){return function(e,n){var i=t((e=wr(e)).h,(n=wr(n)).h),r=xi(e.c,n.c),a=xi(e.l,n.l),s=xi(e.opacity,n.opacity);return function(t){return e.h=i(t),e.c=r(t),e.l=a(t),e.opacity=s(t),e+""}}}In(mr,(function(t,e,n,i){return 1===arguments.length?yr(t):new mr(t,e,n,null==i?1:i)}),Fn(Rn,{brighter(t){return new mr(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker(t){return new mr(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return new ri(xr(3.1338561*(e=ur*_r(e))-1.6168667*(t=1*_r(t))-.4906146*(n=dr*_r(n))),xr(-.9787684*e+1.9161415*t+.033454*n),xr(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}})),In(Tr,wr,Fn(Rn,{brighter(t){return new Tr(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker(t){return new Tr(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb(){return Cr(this).rgb()}}));const Sr=Er((function(t,e){var n=e-t;return n?bi(t,n>180||n<-180?n-360*Math.round(n/360):n):mi(isNaN(t)?e:t)}));Er(xi);const Ar=Math.sqrt(50),Dr=Math.sqrt(10),Lr=Math.sqrt(2);function Nr(t,e,n){const i=(e-t)/Math.max(0,n),r=Math.floor(Math.log10(i)),a=i/Math.pow(10,r),s=a>=Ar?10:a>=Dr?5:a>=Lr?2:1;let o,c,l;return r<0?(l=Math.pow(10,-r)/s,o=Math.round(t*l),c=Math.round(e*l),o/l<t&&++o,c/l>e&&--c,l=-l):(l=Math.pow(10,r)*s,o=Math.round(t/l),c=Math.round(e/l),o*l<t&&++o,c*l>e&&--c),c<o&&.5<=n&&n<2?Nr(t,e,2*n):[o,c,l]}function Or(t,e,n){return Nr(t=+t,e=+e,n=+n)[2]}function Br(t,e,n){n=+n;const i=(e=+e)<(t=+t),r=i?Or(e,t,n):Or(t,e,n);return(i?-1:1)*(r<0?1/-r:r)}function Mr(t,e){return null==t||null==e?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function Ir(t,e){return null==t||null==e?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function Fr(t){let e,n,i;function r(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<0?r=e+1:a=e}while(r<a)}return r}return 2!==t.length?(e=Mr,n=(e,n)=>Mr(t(e),n),i=(e,n)=>t(e)-n):(e=t===Mr||t===Ir?t:Rr,n=t,i=t),{left:r,center:function(t,e,n=0,a=t.length){const s=r(t,e,n,a-1);return s>n&&i(t[s-1],e)>-i(t[s],e)?s-1:s},right:function(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<=0?r=e+1:a=e}while(r<a)}return r}}}function Rr(){return 0}const $r=Fr(Mr),Pr=$r.right,jr=($r.left,Fr((function(t){return null===t?NaN:+t})).center,Pr);function Yr(t,e){var n,i=e?e.length:0,r=t?Math.min(i,t.length):0,a=new Array(r),s=new Array(i);for(n=0;n<r;++n)a[n]=Hr(t[n],e[n]);for(;n<i;++n)s[n]=e[n];return function(t){for(n=0;n<r;++n)s[n]=a[n](t);return s}}function zr(t,e){var n=new Date;return t=+t,e=+e,function(i){return n.setTime(t*(1-i)+e*i),n}}function Ur(t,e){var n,i={},r={};for(n in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)n in t?i[n]=Hr(t[n],e[n]):r[n]=e[n];return function(t){for(n in i)r[n]=i[n](t);return r}}function Wr(t,e){e||(e=[]);var n,i=t?Math.min(e.length,t.length):0,r=e.slice();return function(a){for(n=0;n<i;++n)r[n]=t[n]*(1-a)+e[n]*a;return r}}function Hr(t,e){var n,i,r=typeof e;return null==e||"boolean"===r?mi(e):("number"===r?Tn:"string"===r?(n=Jn(e))?(e=n,vi):Ci:e instanceof Jn?vi:e instanceof Date?zr:(i=e,!ArrayBuffer.isView(i)||i instanceof DataView?Array.isArray(e)?Yr:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?Ur:Tn:Wr))(t,e)}function qr(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}}function Vr(t){return+t}var Gr=[0,1];function Xr(t){return t}function Zr(t,e){return(e-=t=+t)?function(n){return(n-t)/e}:(n=isNaN(e)?NaN:.5,function(){return n});var n}function Qr(t,e,n){var i=t[0],r=t[1],a=e[0],s=e[1];return r<i?(i=Zr(r,i),a=n(s,a)):(i=Zr(i,r),a=n(a,s)),function(t){return a(i(t))}}function Kr(t,e,n){var i=Math.min(t.length,e.length)-1,r=new Array(i),a=new Array(i),s=-1;for(t[i]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++s<i;)r[s]=Zr(t[s],t[s+1]),a[s]=n(e[s],e[s+1]);return function(e){var n=jr(t,e,1,i)-1;return a[n](r[n](e))}}function Jr(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function ta(){var t,e,n,i,r,a,s=Gr,o=Gr,c=Hr,l=Xr;function h(){var t,e,n,c=Math.min(s.length,o.length);return l!==Xr&&(t=s[0],e=s[c-1],t>e&&(n=t,t=e,e=n),l=function(n){return Math.max(t,Math.min(e,n))}),i=c>2?Kr:Qr,r=a=null,u}function u(e){return null==e||isNaN(e=+e)?n:(r||(r=i(s.map(t),o,c)))(t(l(e)))}return u.invert=function(n){return l(e((a||(a=i(o,s.map(t),Tn)))(n)))},u.domain=function(t){return arguments.length?(s=Array.from(t,Vr),h()):s.slice()},u.range=function(t){return arguments.length?(o=Array.from(t),h()):o.slice()},u.rangeRound=function(t){return o=Array.from(t),c=qr,h()},u.clamp=function(t){return arguments.length?(l=!!t||Xr,h()):l!==Xr},u.interpolate=function(t){return arguments.length?(c=t,h()):c},u.unknown=function(t){return arguments.length?(n=t,u):n},function(n,i){return t=n,e=i,h()}}function ea(){return ta()(Xr,Xr)}function na(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}var ia,ra=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function aa(t){if(!(e=ra.exec(t)))throw new Error("invalid format: "+t);var e;return new sa({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function sa(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function oa(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}function ca(t){return(t=oa(Math.abs(t)))?t[1]:NaN}function la(t,e){var n=oa(t,e);if(!n)return t+"";var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")}aa.prototype=sa.prototype,sa.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const ha={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>la(100*t,e),r:la,s:function(t,e){var n=oa(t,e);if(!n)return t+"";var i=n[0],r=n[1],a=r-(ia=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,s=i.length;return a===s?i:a>s?i+new Array(a-s+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+oa(t,Math.max(0,e+a-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function ua(t){return t}var da,pa,fa,ga=Array.prototype.map,ya=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"];function ma(t){var e,n,i=void 0===t.grouping||void 0===t.thousands?ua:(e=ga.call(t.grouping,Number),n=t.thousands+"",function(t,i){for(var r=t.length,a=[],s=0,o=e[0],c=0;r>0&&o>0&&(c+o+1>i&&(o=Math.max(1,i-c)),a.push(t.substring(r-=o,r+o)),!((c+=o+1)>i));)o=e[s=(s+1)%e.length];return a.reverse().join(n)}),r=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",o=void 0===t.numerals?ua:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(ga.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",l=void 0===t.minus?"\u2212":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function u(t){var e=(t=aa(t)).fill,n=t.align,u=t.sign,d=t.symbol,p=t.zero,f=t.width,g=t.comma,y=t.precision,m=t.trim,b=t.type;"n"===b?(g=!0,b="g"):ha[b]||(void 0===y&&(y=12),m=!0,b="g"),(p||"0"===e&&"="===n)&&(p=!0,e="0",n="=");var _="$"===d?r:"#"===d&&/[boxX]/.test(b)?"0"+b.toLowerCase():"",x="$"===d?a:/[%p]/.test(b)?c:"",v=ha[b],k=/[defgprs%]/.test(b);function w(t){var r,a,c,d=_,w=x;if("c"===b)w=v(t)+w,t="";else{var T=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:v(Math.abs(t),y),m&&(t=function(t){t:for(var e,n=t.length,i=1,r=-1;i<n;++i)switch(t[i]){case".":r=e=i;break;case"0":0===r&&(r=i),e=i;break;default:if(!+t[i])break t;r>0&&(r=0)}return r>0?t.slice(0,r)+t.slice(e+1):t}(t)),T&&0==+t&&"+"!==u&&(T=!1),d=(T?"("===u?u:l:"-"===u||"("===u?"":u)+d,w=("s"===b?ya[8+ia/3]:"")+w+(T&&"("===u?")":""),k)for(r=-1,a=t.length;++r<a;)if(48>(c=t.charCodeAt(r))||c>57){w=(46===c?s+t.slice(r+1):t.slice(r))+w,t=t.slice(0,r);break}}g&&!p&&(t=i(t,1/0));var C=d.length+t.length+w.length,E=C<f?new Array(f-C+1).join(e):"";switch(g&&p&&(t=i(E+t,E.length?f-w.length:1/0),E=""),n){case"<":t=d+t+w+E;break;case"=":t=d+E+t+w;break;case"^":t=E.slice(0,C=E.length>>1)+d+t+w+E.slice(C);break;default:t=E+d+t+w}return o(t)}return y=void 0===y?6:/[gprs]/.test(b)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),w.toString=function(){return t+""},w}return{format:u,formatPrefix:function(t,e){var n=u(((t=aa(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(ca(e)/3))),r=Math.pow(10,-i),a=ya[8+i/3];return function(t){return n(r*t)+a}}}}function ba(t,e,n,i){var r,a=Br(t,e,n);switch((i=aa(null==i?",f":i)).type){case"s":var s=Math.max(Math.abs(t),Math.abs(e));return null!=i.precision||isNaN(r=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(ca(e)/3)))-ca(Math.abs(t)))}(a,s))||(i.precision=r),fa(i,s);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(r=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ca(e)-ca(t))+1}(a,Math.max(Math.abs(t),Math.abs(e))))||(i.precision=r-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(r=function(t){return Math.max(0,-ca(Math.abs(t)))}(a))||(i.precision=r-2*("%"===i.type))}return pa(i)}function _a(t){var e=t.domain;return t.ticks=function(t){var n=e();return function(t,e,n){if(!((n=+n)>0))return[];if((t=+t)==(e=+e))return[t];const i=e<t,[r,a,s]=i?Nr(e,t,n):Nr(t,e,n);if(!(a>=r))return[];const o=a-r+1,c=new Array(o);if(i)if(s<0)for(let l=0;l<o;++l)c[l]=(a-l)/-s;else for(let l=0;l<o;++l)c[l]=(a-l)*s;else if(s<0)for(let l=0;l<o;++l)c[l]=(r+l)/-s;else for(let l=0;l<o;++l)c[l]=(r+l)*s;return c}(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var i=e();return ba(i[0],i[i.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var i,r,a=e(),s=0,o=a.length-1,c=a[s],l=a[o],h=10;for(l<c&&(r=c,c=l,l=r,r=s,s=o,o=r);h-- >0;){if((r=Or(c,l,n))===i)return a[s]=c,a[o]=l,e(a);if(r>0)c=Math.floor(c/r)*r,l=Math.ceil(l/r)*r;else{if(!(r<0))break;c=Math.ceil(c*r)/r,l=Math.floor(l*r)/r}i=r}return t},t}function xa(){var t=ea();return t.copy=function(){return Jr(t,xa())},na.apply(t,arguments),_a(t)}da=ma({thousands:",",grouping:[3],currency:["$",""]}),pa=da.format,fa=da.formatPrefix;class va extends Map{constructor(t,e=Ea){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[n,i]of t)this.set(n,i)}get(t){return super.get(wa(this,t))}has(t){return super.has(wa(this,t))}set(t,e){return super.set(Ta(this,t),e)}delete(t){return super.delete(Ca(this,t))}}class ka extends Set{constructor(t,e=Ea){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const n of t)this.add(n)}has(t){return super.has(wa(this,t))}add(t){return super.add(Ta(this,t))}delete(t){return super.delete(Ca(this,t))}}function wa({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):n}function Ta({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):(t.set(i,n),n)}function Ca({_intern:t,_key:e},n){const i=e(n);return t.has(i)&&(n=t.get(i),t.delete(i)),n}function Ea(t){return null!==t&&"object"==typeof t?t.valueOf():t}const Sa=Symbol("implicit");function Aa(){var t=new va,e=[],n=[],i=Sa;function r(r){let a=t.get(r);if(void 0===a){if(i!==Sa)return i;t.set(r,a=e.push(r)-1)}return n[a%n.length]}return r.domain=function(n){if(!arguments.length)return e.slice();e=[],t=new va;for(const i of n)t.has(i)||t.set(i,e.push(i)-1);return r},r.range=function(t){return arguments.length?(n=Array.from(t),r):n.slice()},r.unknown=function(t){return arguments.length?(i=t,r):i},r.copy=function(){return Aa(e,n).unknown(i)},na.apply(r,arguments),r}const Da=1e3,La=6e4,Na=36e5,Oa=864e5,Ba=6048e5,Ma=2592e6,Ia=31536e6,Fa=new Date,Ra=new Date;function $a(t,e,n,i){function r(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return r.floor=e=>(t(e=new Date(+e)),e),r.ceil=n=>(t(n=new Date(n-1)),e(n,1),t(n),n),r.round=t=>{const e=r(t),n=r.ceil(t);return t-e<n-t?e:n},r.offset=(t,n)=>(e(t=new Date(+t),null==n?1:Math.floor(n)),t),r.range=(n,i,a)=>{const s=[];if(n=r.ceil(n),a=null==a?1:Math.floor(a),!(n<i&&a>0))return s;let o;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o<n&&n<i);return s},r.filter=n=>$a((e=>{if(e>=e)for(;t(e),!n(e);)e.setTime(e-1)}),((t,i)=>{if(t>=t)if(i<0)for(;++i<=0;)for(;e(t,-1),!n(t););else for(;--i>=0;)for(;e(t,1),!n(t););})),n&&(r.count=(e,i)=>(Fa.setTime(+e),Ra.setTime(+i),t(Fa),t(Ra),Math.floor(n(Fa,Ra))),r.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?r.filter(i?e=>i(e)%t==0:e=>r.count(0,e)%t==0):r:null)),r}const Pa=$a((()=>{}),((t,e)=>{t.setTime(+t+e)}),((t,e)=>e-t));Pa.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?$a((e=>{e.setTime(Math.floor(e/t)*t)}),((e,n)=>{e.setTime(+e+n*t)}),((e,n)=>(n-e)/t)):Pa:null);Pa.range;const ja=$a((t=>{t.setTime(t-t.getMilliseconds())}),((t,e)=>{t.setTime(+t+e*Da)}),((t,e)=>(e-t)/Da),(t=>t.getUTCSeconds())),Ya=(ja.range,$a((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Da)}),((t,e)=>{t.setTime(+t+e*La)}),((t,e)=>(e-t)/La),(t=>t.getMinutes()))),za=(Ya.range,$a((t=>{t.setUTCSeconds(0,0)}),((t,e)=>{t.setTime(+t+e*La)}),((t,e)=>(e-t)/La),(t=>t.getUTCMinutes()))),Ua=(za.range,$a((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Da-t.getMinutes()*La)}),((t,e)=>{t.setTime(+t+e*Na)}),((t,e)=>(e-t)/Na),(t=>t.getHours()))),Wa=(Ua.range,$a((t=>{t.setUTCMinutes(0,0,0)}),((t,e)=>{t.setTime(+t+e*Na)}),((t,e)=>(e-t)/Na),(t=>t.getUTCHours()))),Ha=(Wa.range,$a((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*La)/Oa),(t=>t.getDate()-1))),qa=(Ha.range,$a((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/Oa),(t=>t.getUTCDate()-1))),Va=(qa.range,$a((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/Oa),(t=>Math.floor(t/Oa))));Va.range;function Ga(t){return $a((e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),((t,e)=>{t.setDate(t.getDate()+7*e)}),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*La)/Ba))}const Xa=Ga(0),Za=Ga(1),Qa=Ga(2),Ka=Ga(3),Ja=Ga(4),ts=Ga(5),es=Ga(6);Xa.range,Za.range,Qa.range,Ka.range,Ja.range,ts.range,es.range;function ns(t){return $a((e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)}),((t,e)=>(e-t)/Ba))}const is=ns(0),rs=ns(1),as=ns(2),ss=ns(3),os=ns(4),cs=ns(5),ls=ns(6),hs=(is.range,rs.range,as.range,ss.range,os.range,cs.range,ls.range,$a((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,e)=>{t.setMonth(t.getMonth()+e)}),((t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())),(t=>t.getMonth()))),us=(hs.range,$a((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)}),((t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth()))),ds=(us.range,$a((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,e)=>{t.setFullYear(t.getFullYear()+e)}),((t,e)=>e.getFullYear()-t.getFullYear()),(t=>t.getFullYear())));ds.every=t=>isFinite(t=Math.floor(t))&&t>0?$a((e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,n)=>{e.setFullYear(e.getFullYear()+n*t)})):null;ds.range;const ps=$a((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)}),((t,e)=>e.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));ps.every=t=>isFinite(t=Math.floor(t))&&t>0?$a((e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null;ps.range;function fs(t,e,n,i,r,a){const s=[[ja,1,Da],[ja,5,5e3],[ja,15,15e3],[ja,30,3e4],[a,1,La],[a,5,3e5],[a,15,9e5],[a,30,18e5],[r,1,Na],[r,3,108e5],[r,6,216e5],[r,12,432e5],[i,1,Oa],[i,2,1728e5],[n,1,Ba],[e,1,Ma],[e,3,7776e6],[t,1,Ia]];function o(e,n,i){const r=Math.abs(n-e)/i,a=Fr((([,,t])=>t)).right(s,r);if(a===s.length)return t.every(Br(e/Ia,n/Ia,i));if(0===a)return Pa.every(Math.max(Br(e,n,i),1));const[o,c]=s[r/s[a-1][2]<s[a][2]/r?a-1:a];return o.every(c)}return[function(t,e,n){const i=e<t;i&&([t,e]=[e,t]);const r=n&&"function"==typeof n.range?n:o(t,e,n),a=r?r.range(t,+e+1):[];return i?a.reverse():a},o]}const[gs,ys]=fs(ps,us,is,Va,Wa,za),[ms,bs]=fs(ds,hs,Xa,Ha,Ua,Ya);function _s(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function xs(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function vs(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}var ks,ws,Ts={"-":"",_:" ",0:"0"},Cs=/^\s*\d+/,Es=/^%/,Ss=/[\\^$*+?|[\]().{}]/g;function As(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",a=r.length;return i+(a<n?new Array(n-a+1).join(e)+r:r)}function Ds(t){return t.replace(Ss,"\\$&")}function Ls(t){return new RegExp("^(?:"+t.map(Ds).join("|")+")","i")}function Ns(t){return new Map(t.map(((t,e)=>[t.toLowerCase(),e])))}function Os(t,e,n){var i=Cs.exec(e.slice(n,n+1));return i?(t.w=+i[0],n+i[0].length):-1}function Bs(t,e,n){var i=Cs.exec(e.slice(n,n+1));return i?(t.u=+i[0],n+i[0].length):-1}function Ms(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.U=+i[0],n+i[0].length):-1}function Is(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.V=+i[0],n+i[0].length):-1}function Fs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.W=+i[0],n+i[0].length):-1}function Rs(t,e,n){var i=Cs.exec(e.slice(n,n+4));return i?(t.y=+i[0],n+i[0].length):-1}function $s(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.y=+i[0]+(+i[0]>68?1900:2e3),n+i[0].length):-1}function Ps(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function js(t,e,n){var i=Cs.exec(e.slice(n,n+1));return i?(t.q=3*i[0]-3,n+i[0].length):-1}function Ys(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function zs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function Us(t,e,n){var i=Cs.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function Ws(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function Hs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function qs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function Vs(t,e,n){var i=Cs.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function Gs(t,e,n){var i=Cs.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function Xs(t,e,n){var i=Es.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function Zs(t,e,n){var i=Cs.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function Qs(t,e,n){var i=Cs.exec(e.slice(n));return i?(t.s=+i[0],n+i[0].length):-1}function Ks(t,e){return As(t.getDate(),e,2)}function Js(t,e){return As(t.getHours(),e,2)}function to(t,e){return As(t.getHours()%12||12,e,2)}function eo(t,e){return As(1+Ha.count(ds(t),t),e,3)}function no(t,e){return As(t.getMilliseconds(),e,3)}function io(t,e){return no(t,e)+"000"}function ro(t,e){return As(t.getMonth()+1,e,2)}function ao(t,e){return As(t.getMinutes(),e,2)}function so(t,e){return As(t.getSeconds(),e,2)}function oo(t){var e=t.getDay();return 0===e?7:e}function co(t,e){return As(Xa.count(ds(t)-1,t),e,2)}function lo(t){var e=t.getDay();return e>=4||0===e?Ja(t):Ja.ceil(t)}function ho(t,e){return t=lo(t),As(Ja.count(ds(t),t)+(4===ds(t).getDay()),e,2)}function uo(t){return t.getDay()}function po(t,e){return As(Za.count(ds(t)-1,t),e,2)}function fo(t,e){return As(t.getFullYear()%100,e,2)}function go(t,e){return As((t=lo(t)).getFullYear()%100,e,2)}function yo(t,e){return As(t.getFullYear()%1e4,e,4)}function mo(t,e){var n=t.getDay();return As((t=n>=4||0===n?Ja(t):Ja.ceil(t)).getFullYear()%1e4,e,4)}function bo(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+As(e/60|0,"0",2)+As(e%60,"0",2)}function _o(t,e){return As(t.getUTCDate(),e,2)}function xo(t,e){return As(t.getUTCHours(),e,2)}function vo(t,e){return As(t.getUTCHours()%12||12,e,2)}function ko(t,e){return As(1+qa.count(ps(t),t),e,3)}function wo(t,e){return As(t.getUTCMilliseconds(),e,3)}function To(t,e){return wo(t,e)+"000"}function Co(t,e){return As(t.getUTCMonth()+1,e,2)}function Eo(t,e){return As(t.getUTCMinutes(),e,2)}function So(t,e){return As(t.getUTCSeconds(),e,2)}function Ao(t){var e=t.getUTCDay();return 0===e?7:e}function Do(t,e){return As(is.count(ps(t)-1,t),e,2)}function Lo(t){var e=t.getUTCDay();return e>=4||0===e?os(t):os.ceil(t)}function No(t,e){return t=Lo(t),As(os.count(ps(t),t)+(4===ps(t).getUTCDay()),e,2)}function Oo(t){return t.getUTCDay()}function Bo(t,e){return As(rs.count(ps(t)-1,t),e,2)}function Mo(t,e){return As(t.getUTCFullYear()%100,e,2)}function Io(t,e){return As((t=Lo(t)).getUTCFullYear()%100,e,2)}function Fo(t,e){return As(t.getUTCFullYear()%1e4,e,4)}function Ro(t,e){var n=t.getUTCDay();return As((t=n>=4||0===n?os(t):os.ceil(t)).getUTCFullYear()%1e4,e,4)}function $o(){return"+0000"}function Po(){return"%"}function jo(t){return+t}function Yo(t){return Math.floor(+t/1e3)}function zo(t){return new Date(t)}function Uo(t){return t instanceof Date?+t:+new Date(+t)}function Wo(t,e,n,i,r,a,s,o,c,l){var h=ea(),u=h.invert,d=h.domain,p=l(".%L"),f=l(":%S"),g=l("%I:%M"),y=l("%I %p"),m=l("%a %d"),b=l("%b %d"),_=l("%B"),x=l("%Y");function v(t){return(c(t)<t?p:o(t)<t?f:s(t)<t?g:a(t)<t?y:i(t)<t?r(t)<t?m:b:n(t)<t?_:x)(t)}return h.invert=function(t){return new Date(u(t))},h.domain=function(t){return arguments.length?d(Array.from(t,Uo)):d().map(zo)},h.ticks=function(e){var n=d();return t(n[0],n[n.length-1],null==e?10:e)},h.tickFormat=function(t,e){return null==e?v:l(e)},h.nice=function(t){var n=d();return t&&"function"==typeof t.range||(t=e(n[0],n[n.length-1],null==t?10:t)),t?d(function(t,e){var n,i=0,r=(t=t.slice()).length-1,a=t[i],s=t[r];return s<a&&(n=i,i=r,r=n,n=a,a=s,s=n),t[i]=e.floor(a),t[r]=e.ceil(s),t}(n,t)):h},h.copy=function(){return Jr(h,Wo(t,e,n,i,r,a,s,o,c,l))},h}function Ho(t){return"string"==typeof t?new Ue([[document.querySelector(t)]],[document.documentElement]):new Ue([[t]],ze)}function qo(t){return"string"==typeof t?new Ue([document.querySelectorAll(t)],[document.documentElement]):new Ue([Bt(t)],ze)}function Vo(t){return function(){return t}}!function(t){ks=function(t){var e=t.dateTime,n=t.date,i=t.time,r=t.periods,a=t.days,s=t.shortDays,o=t.months,c=t.shortMonths,l=Ls(r),h=Ns(r),u=Ls(a),d=Ns(a),p=Ls(s),f=Ns(s),g=Ls(o),y=Ns(o),m=Ls(c),b=Ns(c),_={a:function(t){return s[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return o[t.getMonth()]},c:null,d:Ks,e:Ks,f:io,g:go,G:mo,H:Js,I:to,j:eo,L:no,m:ro,M:ao,p:function(t){return r[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:jo,s:Yo,S:so,u:oo,U:co,V:ho,w:uo,W:po,x:null,X:null,y:fo,Y:yo,Z:bo,"%":Po},x={a:function(t){return s[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return o[t.getUTCMonth()]},c:null,d:_o,e:_o,f:To,g:Io,G:Ro,H:xo,I:vo,j:ko,L:wo,m:Co,M:Eo,p:function(t){return r[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:jo,s:Yo,S:So,u:Ao,U:Do,V:No,w:Oo,W:Bo,x:null,X:null,y:Mo,Y:Fo,Z:$o,"%":Po},v={a:function(t,e,n){var i=p.exec(e.slice(n));return i?(t.w=f.get(i[0].toLowerCase()),n+i[0].length):-1},A:function(t,e,n){var i=u.exec(e.slice(n));return i?(t.w=d.get(i[0].toLowerCase()),n+i[0].length):-1},b:function(t,e,n){var i=m.exec(e.slice(n));return i?(t.m=b.get(i[0].toLowerCase()),n+i[0].length):-1},B:function(t,e,n){var i=g.exec(e.slice(n));return i?(t.m=y.get(i[0].toLowerCase()),n+i[0].length):-1},c:function(t,n,i){return T(t,e,n,i)},d:zs,e:zs,f:Gs,g:$s,G:Rs,H:Ws,I:Ws,j:Us,L:Vs,m:Ys,M:Hs,p:function(t,e,n){var i=l.exec(e.slice(n));return i?(t.p=h.get(i[0].toLowerCase()),n+i[0].length):-1},q:js,Q:Zs,s:Qs,S:qs,u:Bs,U:Ms,V:Is,w:Os,W:Fs,x:function(t,e,i){return T(t,n,e,i)},X:function(t,e,n){return T(t,i,e,n)},y:$s,Y:Rs,Z:Ps,"%":Xs};function k(t,e){return function(n){var i,r,a,s=[],o=-1,c=0,l=t.length;for(n instanceof Date||(n=new Date(+n));++o<l;)37===t.charCodeAt(o)&&(s.push(t.slice(c,o)),null!=(r=Ts[i=t.charAt(++o)])?i=t.charAt(++o):r="e"===i?" ":"0",(a=e[i])&&(i=a(n,r)),s.push(i),c=o+1);return s.push(t.slice(c,o)),s.join("")}}function w(t,e){return function(n){var i,r,a=vs(1900,void 0,1);if(T(a,t,n+="",0)!=n.length)return null;if("Q"in a)return new Date(a.Q);if("s"in a)return new Date(1e3*a.s+("L"in a?a.L:0));if(e&&!("Z"in a)&&(a.Z=0),"p"in a&&(a.H=a.H%12+12*a.p),void 0===a.m&&(a.m="q"in a?a.q:0),"V"in a){if(a.V<1||a.V>53)return null;"w"in a||(a.w=1),"Z"in a?(r=(i=xs(vs(a.y,0,1))).getUTCDay(),i=r>4||0===r?rs.ceil(i):rs(i),i=qa.offset(i,7*(a.V-1)),a.y=i.getUTCFullYear(),a.m=i.getUTCMonth(),a.d=i.getUTCDate()+(a.w+6)%7):(r=(i=_s(vs(a.y,0,1))).getDay(),i=r>4||0===r?Za.ceil(i):Za(i),i=Ha.offset(i,7*(a.V-1)),a.y=i.getFullYear(),a.m=i.getMonth(),a.d=i.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),r="Z"in a?xs(vs(a.y,0,1)).getUTCDay():_s(vs(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(r+5)%7:a.w+7*a.U-(r+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,xs(a)):_s(a)}}function T(t,e,n,i){for(var r,a,s=0,o=e.length,c=n.length;s<o;){if(i>=c)return-1;if(37===(r=e.charCodeAt(s++))){if(r=e.charAt(s++),!(a=v[r in Ts?e.charAt(s++):r])||(i=a(t,n,i))<0)return-1}else if(r!=n.charCodeAt(i++))return-1}return i}return _.x=k(n,_),_.X=k(i,_),_.c=k(e,_),x.x=k(n,x),x.X=k(i,x),x.c=k(e,x),{format:function(t){var e=k(t+="",_);return e.toString=function(){return t},e},parse:function(t){var e=w(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=k(t+="",x);return e.toString=function(){return t},e},utcParse:function(t){var e=w(t+="",!0);return e.toString=function(){return t},e}}}(t),ws=ks.format,ks.parse,ks.utcFormat,ks.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});const Go=Math.abs,Xo=Math.atan2,Zo=Math.cos,Qo=Math.max,Ko=Math.min,Jo=Math.sin,tc=Math.sqrt,ec=1e-12,nc=Math.PI,ic=nc/2,rc=2*nc;function ac(t){return t>1?0:t<-1?nc:Math.acos(t)}function sc(t){return t>=1?ic:t<=-1?-ic:Math.asin(t)}const oc=Math.PI,cc=2*oc,lc=1e-6,hc=cc-lc;function uc(t){this._+=t[0];for(let e=1,n=t.length;e<n;++e)this._+=arguments[e]+t[e]}class dc{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==t?uc:function(t){let e=Math.floor(t);if(!(e>=0))throw new Error(`invalid digits: ${t}`);if(e>15)return uc;const n=10**e;return function(t){this._+=t[0];for(let e=1,i=t.length;e<i;++e)this._+=Math.round(arguments[e]*n)/n+t[e]}}(t)}moveTo(t,e){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,e){this._append`L${this._x1=+t},${this._y1=+e}`}quadraticCurveTo(t,e,n,i){this._append`Q${+t},${+e},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(t,e,n,i,r,a){this._append`C${+t},${+e},${+n},${+i},${this._x1=+r},${this._y1=+a}`}arcTo(t,e,n,i,r){if(t=+t,e=+e,n=+n,i=+i,(r=+r)<0)throw new Error(`negative radius: ${r}`);let a=this._x1,s=this._y1,o=n-t,c=i-e,l=a-t,h=s-e,u=l*l+h*h;if(null===this._x1)this._append`M${this._x1=t},${this._y1=e}`;else if(u>lc)if(Math.abs(h*o-c*l)>lc&&r){let d=n-a,p=i-s,f=o*o+c*c,g=d*d+p*p,y=Math.sqrt(f),m=Math.sqrt(u),b=r*Math.tan((oc-Math.acos((f+u-g)/(2*y*m)))/2),_=b/m,x=b/y;Math.abs(_-1)>lc&&this._append`L${t+_*l},${e+_*h}`,this._append`A${r},${r},0,0,${+(h*d>l*p)},${this._x1=t+x*o},${this._y1=e+x*c}`}else this._append`L${this._x1=t},${this._y1=e}`;else;}arc(t,e,n,i,r,a){if(t=+t,e=+e,a=!!a,(n=+n)<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(i),o=n*Math.sin(i),c=t+s,l=e+o,h=1^a,u=a?i-r:r-i;null===this._x1?this._append`M${c},${l}`:(Math.abs(this._x1-c)>lc||Math.abs(this._y1-l)>lc)&&this._append`L${c},${l}`,n&&(u<0&&(u=u%cc+cc),u>hc?this._append`A${n},${n},0,1,${h},${t-s},${e-o}A${n},${n},0,1,${h},${this._x1=c},${this._y1=l}`:u>lc&&this._append`A${n},${n},0,${+(u>=oc)},${h},${this._x1=t+n*Math.cos(r)},${this._y1=e+n*Math.sin(r)}`)}rect(t,e,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function pc(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(null==n)e=null;else{const t=Math.floor(n);if(!(t>=0))throw new RangeError(`invalid digits: ${n}`);e=t}return t},()=>new dc(e)}function fc(t){return t.innerRadius}function gc(t){return t.outerRadius}function yc(t){return t.startAngle}function mc(t){return t.endAngle}function bc(t){return t&&t.padAngle}function _c(t,e,n,i,r,a,s,o){var c=n-t,l=i-e,h=s-r,u=o-a,d=u*c-h*l;if(!(d*d<ec))return[t+(d=(h*(e-a)-u*(t-r))/d)*c,e+d*l]}function xc(t,e,n,i,r,a,s){var o=t-n,c=e-i,l=(s?a:-a)/tc(o*o+c*c),h=l*c,u=-l*o,d=t+h,p=e+u,f=n+h,g=i+u,y=(d+f)/2,m=(p+g)/2,b=f-d,_=g-p,x=b*b+_*_,v=r-a,k=d*g-f*p,w=(_<0?-1:1)*tc(Qo(0,v*v*x-k*k)),T=(k*_-b*w)/x,C=(-k*b-_*w)/x,E=(k*_+b*w)/x,S=(-k*b+_*w)/x,A=T-y,D=C-m,L=E-y,N=S-m;return A*A+D*D>L*L+N*N&&(T=E,C=S),{cx:T,cy:C,x01:-h,y01:-u,x11:T*(r/v-1),y11:C*(r/v-1)}}function vc(){var t=fc,e=gc,n=Vo(0),i=null,r=yc,a=mc,s=bc,o=null,c=pc(l);function l(){var l,h,u=+t.apply(this,arguments),d=+e.apply(this,arguments),p=r.apply(this,arguments)-ic,f=a.apply(this,arguments)-ic,g=Go(f-p),y=f>p;if(o||(o=l=c()),d<u&&(h=d,d=u,u=h),d>ec)if(g>rc-ec)o.moveTo(d*Zo(p),d*Jo(p)),o.arc(0,0,d,p,f,!y),u>ec&&(o.moveTo(u*Zo(f),u*Jo(f)),o.arc(0,0,u,f,p,y));else{var m,b,_=p,x=f,v=p,k=f,w=g,T=g,C=s.apply(this,arguments)/2,E=C>ec&&(i?+i.apply(this,arguments):tc(u*u+d*d)),S=Ko(Go(d-u)/2,+n.apply(this,arguments)),A=S,D=S;if(E>ec){var L=sc(E/u*Jo(C)),N=sc(E/d*Jo(C));(w-=2*L)>ec?(v+=L*=y?1:-1,k-=L):(w=0,v=k=(p+f)/2),(T-=2*N)>ec?(_+=N*=y?1:-1,x-=N):(T=0,_=x=(p+f)/2)}var O=d*Zo(_),B=d*Jo(_),M=u*Zo(k),I=u*Jo(k);if(S>ec){var F,R=d*Zo(x),$=d*Jo(x),P=u*Zo(v),j=u*Jo(v);if(g<nc)if(F=_c(O,B,P,j,R,$,M,I)){var Y=O-F[0],z=B-F[1],U=R-F[0],W=$-F[1],H=1/Jo(ac((Y*U+z*W)/(tc(Y*Y+z*z)*tc(U*U+W*W)))/2),q=tc(F[0]*F[0]+F[1]*F[1]);A=Ko(S,(u-q)/(H-1)),D=Ko(S,(d-q)/(H+1))}else A=D=0}T>ec?D>ec?(m=xc(P,j,O,B,d,D,y),b=xc(R,$,M,I,d,D,y),o.moveTo(m.cx+m.x01,m.cy+m.y01),D<S?o.arc(m.cx,m.cy,D,Xo(m.y01,m.x01),Xo(b.y01,b.x01),!y):(o.arc(m.cx,m.cy,D,Xo(m.y01,m.x01),Xo(m.y11,m.x11),!y),o.arc(0,0,d,Xo(m.cy+m.y11,m.cx+m.x11),Xo(b.cy+b.y11,b.cx+b.x11),!y),o.arc(b.cx,b.cy,D,Xo(b.y11,b.x11),Xo(b.y01,b.x01),!y))):(o.moveTo(O,B),o.arc(0,0,d,_,x,!y)):o.moveTo(O,B),u>ec&&w>ec?A>ec?(m=xc(M,I,R,$,u,-A,y),b=xc(O,B,P,j,u,-A,y),o.lineTo(m.cx+m.x01,m.cy+m.y01),A<S?o.arc(m.cx,m.cy,A,Xo(m.y01,m.x01),Xo(b.y01,b.x01),!y):(o.arc(m.cx,m.cy,A,Xo(m.y01,m.x01),Xo(m.y11,m.x11),!y),o.arc(0,0,u,Xo(m.cy+m.y11,m.cx+m.x11),Xo(b.cy+b.y11,b.cx+b.x11),y),o.arc(b.cx,b.cy,A,Xo(b.y11,b.x11),Xo(b.y01,b.x01),!y))):o.arc(0,0,u,k,v,y):o.lineTo(M,I)}else o.moveTo(0,0);if(o.closePath(),l)return o=null,l+""||null}return l.centroid=function(){var n=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,i=(+r.apply(this,arguments)+ +a.apply(this,arguments))/2-nc/2;return[Zo(i)*n,Jo(i)*n]},l.innerRadius=function(e){return arguments.length?(t="function"==typeof e?e:Vo(+e),l):t},l.outerRadius=function(t){return arguments.length?(e="function"==typeof t?t:Vo(+t),l):e},l.cornerRadius=function(t){return arguments.length?(n="function"==typeof t?t:Vo(+t),l):n},l.padRadius=function(t){return arguments.length?(i=null==t?null:"function"==typeof t?t:Vo(+t),l):i},l.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Vo(+t),l):r},l.endAngle=function(t){return arguments.length?(a="function"==typeof t?t:Vo(+t),l):a},l.padAngle=function(t){return arguments.length?(s="function"==typeof t?t:Vo(+t),l):s},l.context=function(t){return arguments.length?(o=null==t?null:t,l):o},l}Array.prototype.slice;function kc(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function wc(t){this._context=t}function Tc(t){return new wc(t)}function Cc(t){return t[0]}function Ec(t){return t[1]}function Sc(t,e){var n=Vo(!0),i=null,r=Tc,a=null,s=pc(o);function o(o){var c,l,h,u=(o=kc(o)).length,d=!1;for(null==i&&(a=r(h=s())),c=0;c<=u;++c)!(c<u&&n(l=o[c],c,o))===d&&((d=!d)?a.lineStart():a.lineEnd()),d&&a.point(+t(l,c,o),+e(l,c,o));if(h)return a=null,h+""||null}return t="function"==typeof t?t:void 0===t?Cc:Vo(t),e="function"==typeof e?e:void 0===e?Ec:Vo(e),o.x=function(e){return arguments.length?(t="function"==typeof e?e:Vo(+e),o):t},o.y=function(t){return arguments.length?(e="function"==typeof t?t:Vo(+t),o):e},o.defined=function(t){return arguments.length?(n="function"==typeof t?t:Vo(!!t),o):n},o.curve=function(t){return arguments.length?(r=t,null!=i&&(a=r(i)),o):r},o.context=function(t){return arguments.length?(null==t?i=a=null:a=r(i=t),o):i},o}function Ac(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function Dc(t){return t}function Lc(){}function Nc(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function Oc(t){this._context=t}function Bc(t){return new Oc(t)}function Mc(t){this._context=t}function Ic(t){this._context=t}function Fc(t){this._context=t}function Rc(t){return t<0?-1:1}function $c(t,e,n){var i=t._x1-t._x0,r=e-t._x1,a=(t._y1-t._y0)/(i||r<0&&-0),s=(n-t._y1)/(r||i<0&&-0),o=(a*r+s*i)/(i+r);return(Rc(a)+Rc(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(o))||0}function Pc(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function jc(t,e,n){var i=t._x0,r=t._y0,a=t._x1,s=t._y1,o=(a-i)/3;t._context.bezierCurveTo(i+o,r+o*e,a-o,s-o*n,a,s)}function Yc(t){this._context=t}function zc(t){this._context=new Uc(t)}function Uc(t){this._context=t}function Wc(t){this._context=t}function Hc(t){var e,n,i=t.length-1,r=new Array(i),a=new Array(i),s=new Array(i);for(r[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e<i-1;++e)r[e]=1,a[e]=4,s[e]=4*t[e]+2*t[e+1];for(r[i-1]=2,a[i-1]=7,s[i-1]=8*t[i-1]+t[i],e=1;e<i;++e)n=r[e]/a[e-1],a[e]-=n,s[e]-=n*s[e-1];for(r[i-1]=s[i-1]/a[i-1],e=i-2;e>=0;--e)r[e]=(s[e]-r[e+1])/a[e];for(a[i-1]=(t[i]+r[i-1])/2,e=0;e<i-1;++e)a[e]=2*t[e+1]-r[e+1];return[r,a]}function qc(t,e){this._context=t,this._t=e}function Vc(t,e,n){this.k=t,this.x=e,this.y=n}wc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}},Oc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Nc(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Nc(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Mc.prototype={areaStart:Lc,areaEnd:Lc,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Nc(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Ic.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:Nc(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Fc.prototype={areaStart:Lc,areaEnd:Lc,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}},Yc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:jc(this,this._t0,Pc(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(e=+e,(t=+t)!==this._x1||e!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,jc(this,Pc(this,n=$c(this,t,e)),n);break;default:jc(this,this._t0,n=$c(this,t,e))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}},(zc.prototype=Object.create(Yc.prototype)).point=function(t,e){Yc.prototype.point.call(this,e,t)},Uc.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,i,r,a){this._context.bezierCurveTo(e,t,i,n,a,r)}},Wc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),2===n)this._context.lineTo(t[1],e[1]);else for(var i=Hc(t),r=Hc(e),a=0,s=1;s<n;++a,++s)this._context.bezierCurveTo(i[0][a],r[0][a],i[1][a],r[1][a],t[s],e[s]);(this._line||0!==this._line&&1===n)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(t,e){this._x.push(+t),this._y.push(+e)}},qc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&2===this._point&&this._context.lineTo(this._x,this._y),(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}},Vc.prototype={constructor:Vc,scale:function(t){return 1===t?this:new Vc(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new Vc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};new Vc(1,0,0);Vc.prototype;var Gc=n(7856);const Xc={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:t=>t>=255?255:t<0?0:t,g:t=>t>=255?255:t<0?0:t,b:t=>t>=255?255:t<0?0:t,h:t=>t%360,s:t=>t>=100?100:t<0?0:t,l:t=>t>=100?100:t<0?0:t,a:t=>t>=1?1:t<0?0:t},toLinear:t=>{const e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:(t,e,n)=>(n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t),hsl2rgb:({h:t,s:e,l:n},i)=>{if(!e)return 2.55*n;t/=360,e/=100;const r=(n/=100)<.5?n*(1+e):n+e-n*e,a=2*n-r;switch(i){case"r":return 255*Xc.hue2rgb(a,r,t+1/3);case"g":return 255*Xc.hue2rgb(a,r,t);case"b":return 255*Xc.hue2rgb(a,r,t-1/3)}},rgb2hsl:({r:t,g:e,b:n},i)=>{t/=255,e/=255,n/=255;const r=Math.max(t,e,n),a=Math.min(t,e,n),s=(r+a)/2;if("l"===i)return 100*s;if(r===a)return 0;const o=r-a;if("s"===i)return 100*(s>.5?o/(2-r-a):o/(r+a));switch(r){case t:return 60*((e-n)/o+(e<n?6:0));case e:return 60*((n-t)/o+2);case n:return 60*((t-e)/o+4);default:return-1}}},Zc={clamp:(t,e,n)=>e>n?Math.min(e,Math.max(n,t)):Math.min(n,Math.max(e,t)),round:t=>Math.round(1e10*t)/1e10},Qc={dec2hex:t=>{const e=Math.round(t).toString(16);return e.length>1?e:`0${e}`}},Kc={channel:Xc,lang:Zc,unit:Qc},Jc={};for(let c=0;c<=255;c++)Jc[c]=Kc.unit.dec2hex(c);const tl=0,el=1,nl=2;const il=class{constructor(){this.type=tl}get(){return this.type}set(t){if(this.type&&this.type!==t)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=t}reset(){this.type=tl}is(t){return this.type===t}};const rl=class{constructor(t,e){this.color=e,this.changed=!1,this.data=t,this.type=new il}set(t,e){return this.color=e,this.changed=!1,this.data=t,this.type.type=tl,this}_ensureHSL(){const t=this.data,{h:e,s:n,l:i}=t;void 0===e&&(t.h=Kc.channel.rgb2hsl(t,"h")),void 0===n&&(t.s=Kc.channel.rgb2hsl(t,"s")),void 0===i&&(t.l=Kc.channel.rgb2hsl(t,"l"))}_ensureRGB(){const t=this.data,{r:e,g:n,b:i}=t;void 0===e&&(t.r=Kc.channel.hsl2rgb(t,"r")),void 0===n&&(t.g=Kc.channel.hsl2rgb(t,"g")),void 0===i&&(t.b=Kc.channel.hsl2rgb(t,"b"))}get r(){const t=this.data,e=t.r;return this.type.is(nl)||void 0===e?(this._ensureHSL(),Kc.channel.hsl2rgb(t,"r")):e}get g(){const t=this.data,e=t.g;return this.type.is(nl)||void 0===e?(this._ensureHSL(),Kc.channel.hsl2rgb(t,"g")):e}get b(){const t=this.data,e=t.b;return this.type.is(nl)||void 0===e?(this._ensureHSL(),Kc.channel.hsl2rgb(t,"b")):e}get h(){const t=this.data,e=t.h;return this.type.is(el)||void 0===e?(this._ensureRGB(),Kc.channel.rgb2hsl(t,"h")):e}get s(){const t=this.data,e=t.s;return this.type.is(el)||void 0===e?(this._ensureRGB(),Kc.channel.rgb2hsl(t,"s")):e}get l(){const t=this.data,e=t.l;return this.type.is(el)||void 0===e?(this._ensureRGB(),Kc.channel.rgb2hsl(t,"l")):e}get a(){return this.data.a}set r(t){this.type.set(el),this.changed=!0,this.data.r=t}set g(t){this.type.set(el),this.changed=!0,this.data.g=t}set b(t){this.type.set(el),this.changed=!0,this.data.b=t}set h(t){this.type.set(nl),this.changed=!0,this.data.h=t}set s(t){this.type.set(nl),this.changed=!0,this.data.s=t}set l(t){this.type.set(nl),this.changed=!0,this.data.l=t}set a(t){this.changed=!0,this.data.a=t}},al=new rl({r:0,g:0,b:0,a:0},"transparent"),sl={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:t=>{if(35!==t.charCodeAt(0))return;const e=t.match(sl.re);if(!e)return;const n=e[1],i=parseInt(n,16),r=n.length,a=r%4==0,s=r>4,o=s?1:17,c=s?8:4,l=a?0:-1,h=s?255:15;return al.set({r:(i>>c*(l+3)&h)*o,g:(i>>c*(l+2)&h)*o,b:(i>>c*(l+1)&h)*o,a:a?(i&h)*o/255:1},t)},stringify:t=>{const{r:e,g:n,b:i,a:r}=t;return r<1?`#${Jc[Math.round(e)]}${Jc[Math.round(n)]}${Jc[Math.round(i)]}${Jc[Math.round(255*r)]}`:`#${Jc[Math.round(e)]}${Jc[Math.round(n)]}${Jc[Math.round(i)]}`}},ol=sl,cl={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:t=>{const e=t.match(cl.hueRe);if(e){const[,t,n]=e;switch(n){case"grad":return Kc.channel.clamp.h(.9*parseFloat(t));case"rad":return Kc.channel.clamp.h(180*parseFloat(t)/Math.PI);case"turn":return Kc.channel.clamp.h(360*parseFloat(t))}}return Kc.channel.clamp.h(parseFloat(t))},parse:t=>{const e=t.charCodeAt(0);if(104!==e&&72!==e)return;const n=t.match(cl.re);if(!n)return;const[,i,r,a,s,o]=n;return al.set({h:cl._hue2deg(i),s:Kc.channel.clamp.s(parseFloat(r)),l:Kc.channel.clamp.l(parseFloat(a)),a:s?Kc.channel.clamp.a(o?parseFloat(s)/100:parseFloat(s)):1},t)},stringify:t=>{const{h:e,s:n,l:i,a:r}=t;return r<1?`hsla(${Kc.lang.round(e)}, ${Kc.lang.round(n)}%, ${Kc.lang.round(i)}%, ${r})`:`hsl(${Kc.lang.round(e)}, ${Kc.lang.round(n)}%, ${Kc.lang.round(i)}%)`}},ll=cl,hl={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:t=>{t=t.toLowerCase();const e=hl.colors[t];if(e)return ol.parse(e)},stringify:t=>{const e=ol.stringify(t);for(const n in hl.colors)if(hl.colors[n]===e)return n}},ul=hl,dl={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:t=>{const e=t.charCodeAt(0);if(114!==e&&82!==e)return;const n=t.match(dl.re);if(!n)return;const[,i,r,a,s,o,c,l,h]=n;return al.set({r:Kc.channel.clamp.r(r?2.55*parseFloat(i):parseFloat(i)),g:Kc.channel.clamp.g(s?2.55*parseFloat(a):parseFloat(a)),b:Kc.channel.clamp.b(c?2.55*parseFloat(o):parseFloat(o)),a:l?Kc.channel.clamp.a(h?parseFloat(l)/100:parseFloat(l)):1},t)},stringify:t=>{const{r:e,g:n,b:i,a:r}=t;return r<1?`rgba(${Kc.lang.round(e)}, ${Kc.lang.round(n)}, ${Kc.lang.round(i)}, ${Kc.lang.round(r)})`:`rgb(${Kc.lang.round(e)}, ${Kc.lang.round(n)}, ${Kc.lang.round(i)})`}},pl=dl,fl={format:{keyword:ul,hex:ol,rgb:pl,rgba:pl,hsl:ll,hsla:ll},parse:t=>{if("string"!=typeof t)return t;const e=ol.parse(t)||pl.parse(t)||ll.parse(t)||ul.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},stringify:t=>!t.changed&&t.color?t.color:t.type.is(nl)||void 0===t.data.r?ll.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?pl.stringify(t):ol.stringify(t)},gl=fl,yl=(t,e)=>{const n=gl.parse(t);for(const i in e)n[i]=Kc.channel.clamp[i](e[i]);return gl.stringify(n)},ml=(t,e)=>{const n=gl.parse(t),i={};for(const r in e)e[r]&&(i[r]=n[r]+e[r]);return yl(t,i)},bl=(t,e,n=0,i=1)=>{if("number"!=typeof t)return yl(t,{a:e});const r=al.set({r:Kc.channel.clamp.r(t),g:Kc.channel.clamp.g(e),b:Kc.channel.clamp.b(n),a:Kc.channel.clamp.a(i)});return gl.stringify(r)},_l=(t,e,n=50)=>{const{r:i,g:r,b:a,a:s}=gl.parse(t),{r:o,g:c,b:l,a:h}=gl.parse(e),u=n/100,d=2*u-1,p=s-h,f=((d*p==-1?d:(d+p)/(1+d*p))+1)/2,g=1-f;return bl(i*f+o*g,r*f+c*g,a*f+l*g,s*u+h*(1-u))},xl=(t,e=100)=>{const n=gl.parse(t);return n.r=255-n.r,n.g=255-n.g,n.b=255-n.b,_l(n,t,e)},vl=(t,e,n)=>{const i=gl.parse(t),r=i[e],a=Kc.channel.clamp[e](r+n);return r!==a&&(i[e]=a),gl.stringify(i)},kl=(t,e)=>vl(t,"l",-e),wl=(t,e)=>vl(t,"l",e);const Tl="object"==typeof global&&global&&global.Object===Object&&global;var Cl="object"==typeof self&&self&&self.Object===Object&&self;const El=Tl||Cl||Function("return this")();const Sl=El.Symbol;var Al=Object.prototype,Dl=Al.hasOwnProperty,Ll=Al.toString,Nl=Sl?Sl.toStringTag:void 0;const Ol=function(t){var e=Dl.call(t,Nl),n=t[Nl];try{t[Nl]=void 0;var i=!0}catch(a){}var r=Ll.call(t);return i&&(e?t[Nl]=n:delete t[Nl]),r};var Bl=Object.prototype.toString;const Ml=function(t){return Bl.call(t)};var Il=Sl?Sl.toStringTag:void 0;const Fl=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":Il&&Il in Object(t)?Ol(t):Ml(t)};const Rl=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)};const $l=function(t){if(!Rl(t))return!1;var e=Fl(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e};const Pl=El["__core-js_shared__"];var jl,Yl=(jl=/[^.]+$/.exec(Pl&&Pl.keys&&Pl.keys.IE_PROTO||""))?"Symbol(src)_1."+jl:"";const zl=function(t){return!!Yl&&Yl in t};var Ul=Function.prototype.toString;const Wl=function(t){if(null!=t){try{return Ul.call(t)}catch(e){}try{return t+""}catch(e){}}return""};var Hl=/^\[object .+?Constructor\]$/,ql=Function.prototype,Vl=Object.prototype,Gl=ql.toString,Xl=Vl.hasOwnProperty,Zl=RegExp("^"+Gl.call(Xl).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const Ql=function(t){return!(!Rl(t)||zl(t))&&($l(t)?Zl:Hl).test(Wl(t))};const Kl=function(t,e){return null==t?void 0:t[e]};const Jl=function(t,e){var n=Kl(t,e);return Ql(n)?n:void 0};const th=Jl(Object,"create");const eh=function(){this.__data__=th?th(null):{},this.size=0};const nh=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e};var ih=Object.prototype.hasOwnProperty;const rh=function(t){var e=this.__data__;if(th){var n=e[t];return"__lodash_hash_undefined__"===n?void 0:n}return ih.call(e,t)?e[t]:void 0};var ah=Object.prototype.hasOwnProperty;const sh=function(t){var e=this.__data__;return th?void 0!==e[t]:ah.call(e,t)};const oh=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=th&&void 0===e?"__lodash_hash_undefined__":e,this};function ch(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}ch.prototype.clear=eh,ch.prototype.delete=nh,ch.prototype.get=rh,ch.prototype.has=sh,ch.prototype.set=oh;const lh=ch;const hh=function(){this.__data__=[],this.size=0};const uh=function(t,e){return t===e||t!=t&&e!=e};const dh=function(t,e){for(var n=t.length;n--;)if(uh(t[n][0],e))return n;return-1};var ph=Array.prototype.splice;const fh=function(t){var e=this.__data__,n=dh(e,t);return!(n<0)&&(n==e.length-1?e.pop():ph.call(e,n,1),--this.size,!0)};const gh=function(t){var e=this.__data__,n=dh(e,t);return n<0?void 0:e[n][1]};const yh=function(t){return dh(this.__data__,t)>-1};const mh=function(t,e){var n=this.__data__,i=dh(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this};function bh(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}bh.prototype.clear=hh,bh.prototype.delete=fh,bh.prototype.get=gh,bh.prototype.has=yh,bh.prototype.set=mh;const _h=bh;const xh=Jl(El,"Map");const vh=function(){this.size=0,this.__data__={hash:new lh,map:new(xh||_h),string:new lh}};const kh=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t};const wh=function(t,e){var n=t.__data__;return kh(e)?n["string"==typeof e?"string":"hash"]:n.map};const Th=function(t){var e=wh(this,t).delete(t);return this.size-=e?1:0,e};const Ch=function(t){return wh(this,t).get(t)};const Eh=function(t){return wh(this,t).has(t)};const Sh=function(t,e){var n=wh(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this};function Ah(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}Ah.prototype.clear=vh,Ah.prototype.delete=Th,Ah.prototype.get=Ch,Ah.prototype.has=Eh,Ah.prototype.set=Sh;const Dh=Ah;function Lh(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var i=arguments,r=e?e.apply(this,i):i[0],a=n.cache;if(a.has(r))return a.get(r);var s=t.apply(this,i);return n.cache=a.set(r,s)||a,s};return n.cache=new(Lh.Cache||Dh),n}Lh.Cache=Dh;const Nh=Lh;var Oh="comm",Bh="rule",Mh="decl",Ih=Math.abs,Fh=String.fromCharCode;Object.assign;function Rh(t){return t.trim()}function $h(t,e,n){return t.replace(e,n)}function Ph(t,e){return t.indexOf(e)}function jh(t,e){return 0|t.charCodeAt(e)}function Yh(t,e,n){return t.slice(e,n)}function zh(t){return t.length}function Uh(t){return t.length}function Wh(t,e){return e.push(t),t}function Hh(t,e){for(var n="",i=Uh(t),r=0;r<i;r++)n+=e(t[r],r,t,e)||"";return n}function qh(t,e,n,i){switch(t.type){case"@import":case Mh:return t.return=t.return||t.value;case Oh:return"";case"@keyframes":return t.return=t.value+"{"+Hh(t.children,i)+"}";case Bh:t.value=t.props.join(",")}return zh(n=Hh(t.children,i))?t.return=t.value+"{"+n+"}":""}var Vh=1,Gh=1,Xh=0,Zh=0,Qh=0,Kh="";function Jh(t,e,n,i,r,a,s){return{value:t,root:e,parent:n,type:i,props:r,children:a,line:Vh,column:Gh,length:s,return:""}}function tu(){return Qh=Zh>0?jh(Kh,--Zh):0,Gh--,10===Qh&&(Gh=1,Vh--),Qh}function eu(){return Qh=Zh<Xh?jh(Kh,Zh++):0,Gh++,10===Qh&&(Gh=1,Vh++),Qh}function nu(){return jh(Kh,Zh)}function iu(){return Zh}function ru(t,e){return Yh(Kh,t,e)}function au(t){switch(t){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function su(t){return Vh=Gh=1,Xh=zh(Kh=t),Zh=0,[]}function ou(t){return Kh="",t}function cu(t){return Rh(ru(Zh-1,uu(91===t?t+2:40===t?t+1:t)))}function lu(t){for(;(Qh=nu())&&Qh<33;)eu();return au(t)>2||au(Qh)>3?"":" "}function hu(t,e){for(;--e&&eu()&&!(Qh<48||Qh>102||Qh>57&&Qh<65||Qh>70&&Qh<97););return ru(t,iu()+(e<6&&32==nu()&&32==eu()))}function uu(t){for(;eu();)switch(Qh){case t:return Zh;case 34:case 39:34!==t&&39!==t&&uu(Qh);break;case 40:41===t&&uu(t);break;case 92:eu()}return Zh}function du(t,e){for(;eu()&&t+Qh!==57&&(t+Qh!==84||47!==nu()););return"/*"+ru(e,Zh-1)+"*"+Fh(47===t?t:eu())}function pu(t){for(;!au(nu());)eu();return ru(t,Zh)}function fu(t){return ou(gu("",null,null,null,[""],t=su(t),0,[0],t))}function gu(t,e,n,i,r,a,s,o,c){for(var l=0,h=0,u=s,d=0,p=0,f=0,g=1,y=1,m=1,b=0,_="",x=r,v=a,k=i,w=_;y;)switch(f=b,b=eu()){case 40:if(108!=f&&58==jh(w,u-1)){-1!=Ph(w+=$h(cu(b),"&","&\f"),"&\f")&&(m=-1);break}case 34:case 39:case 91:w+=cu(b);break;case 9:case 10:case 13:case 32:w+=lu(f);break;case 92:w+=hu(iu()-1,7);continue;case 47:switch(nu()){case 42:case 47:Wh(mu(du(eu(),iu()),e,n),c);break;default:w+="/"}break;case 123*g:o[l++]=zh(w)*m;case 125*g:case 59:case 0:switch(b){case 0:case 125:y=0;case 59+h:p>0&&zh(w)-u&&Wh(p>32?bu(w+";",i,n,u-1):bu($h(w," ","")+";",i,n,u-2),c);break;case 59:w+=";";default:if(Wh(k=yu(w,e,n,l,h,r,o,_,x=[],v=[],u),a),123===b)if(0===h)gu(w,e,k,k,x,a,u,o,v);else switch(99===d&&110===jh(w,3)?100:d){case 100:case 109:case 115:gu(t,k,k,i&&Wh(yu(t,k,k,0,0,r,o,_,r,x=[],u),v),r,v,u,o,i?x:v);break;default:gu(w,k,k,k,[""],v,0,o,v)}}l=h=p=0,g=m=1,_=w="",u=s;break;case 58:u=1+zh(w),p=f;default:if(g<1)if(123==b)--g;else if(125==b&&0==g++&&125==tu())continue;switch(w+=Fh(b),b*g){case 38:m=h>0?1:(w+="\f",-1);break;case 44:o[l++]=(zh(w)-1)*m,m=1;break;case 64:45===nu()&&(w+=cu(eu())),d=nu(),h=u=zh(_=w+=pu(iu())),b++;break;case 45:45===f&&2==zh(w)&&(g=0)}}return a}function yu(t,e,n,i,r,a,s,o,c,l,h){for(var u=r-1,d=0===r?a:[""],p=Uh(d),f=0,g=0,y=0;f<i;++f)for(var m=0,b=Yh(t,u+1,u=Ih(g=s[f])),_=t;m<p;++m)(_=Rh(g>0?d[m]+" "+b:$h(b,/&\f/g,d[m])))&&(c[y++]=_);return Jh(t,e,n,0===r?Bh:o,c,l,h)}function mu(t,e,n){return Jh(t,e,n,Oh,Fh(Qh),Yh(t,2,-2),0)}function bu(t,e,n,i){return Jh(t,e,n,Mh,Yh(t,0,i),Yh(t,i+1,-1),i)}const _u=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i&&!1!==e(t[n],n,t););return t};const xu=function(t){return function(e,n,i){for(var r=-1,a=Object(e),s=i(e),o=s.length;o--;){var c=s[t?o:++r];if(!1===n(a[c],c,a))break}return e}};const vu=xu();const ku=function(t,e){for(var n=-1,i=Array(t);++n<t;)i[n]=e(n);return i};const wu=function(t){return null!=t&&"object"==typeof t};const Tu=function(t){return wu(t)&&"[object Arguments]"==Fl(t)};var Cu=Object.prototype,Eu=Cu.hasOwnProperty,Su=Cu.propertyIsEnumerable,Au=Tu(function(){return arguments}())?Tu:function(t){return wu(t)&&Eu.call(t,"callee")&&!Su.call(t,"callee")};const Du=Au;const Lu=Array.isArray;const Nu=function(){return!1};var Ou="object"==typeof exports&&exports&&!exports.nodeType&&exports,Bu=Ou&&"object"==typeof module&&module&&!module.nodeType&&module,Mu=Bu&&Bu.exports===Ou?El.Buffer:void 0;const Iu=(Mu?Mu.isBuffer:void 0)||Nu;var Fu=/^(?:0|[1-9]\d*)$/;const Ru=function(t,e){var n=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==n||"symbol"!=n&&Fu.test(t))&&t>-1&&t%1==0&&t<e};const $u=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991};var Pu={};Pu["[object Float32Array]"]=Pu["[object Float64Array]"]=Pu["[object Int8Array]"]=Pu["[object Int16Array]"]=Pu["[object Int32Array]"]=Pu["[object Uint8Array]"]=Pu["[object Uint8ClampedArray]"]=Pu["[object Uint16Array]"]=Pu["[object Uint32Array]"]=!0,Pu["[object Arguments]"]=Pu["[object Array]"]=Pu["[object ArrayBuffer]"]=Pu["[object Boolean]"]=Pu["[object DataView]"]=Pu["[object Date]"]=Pu["[object Error]"]=Pu["[object Function]"]=Pu["[object Map]"]=Pu["[object Number]"]=Pu["[object Object]"]=Pu["[object RegExp]"]=Pu["[object Set]"]=Pu["[object String]"]=Pu["[object WeakMap]"]=!1;const ju=function(t){return wu(t)&&$u(t.length)&&!!Pu[Fl(t)]};const Yu=function(t){return function(e){return t(e)}};var zu="object"==typeof exports&&exports&&!exports.nodeType&&exports,Uu=zu&&"object"==typeof module&&module&&!module.nodeType&&module,Wu=Uu&&Uu.exports===zu&&Tl.process,Hu=function(){try{var t=Uu&&Uu.require&&Uu.require("util").types;return t||Wu&&Wu.binding&&Wu.binding("util")}catch(e){}}();const qu=Hu;var Vu=qu&&qu.isTypedArray;const Gu=Vu?Yu(Vu):ju;var Xu=Object.prototype.hasOwnProperty;const Zu=function(t,e){var n=Lu(t),i=!n&&Du(t),r=!n&&!i&&Iu(t),a=!n&&!i&&!r&&Gu(t),s=n||i||r||a,o=s?ku(t.length,String):[],c=o.length;for(var l in t)!e&&!Xu.call(t,l)||s&&("length"==l||r&&("offset"==l||"parent"==l)||a&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||Ru(l,c))||o.push(l);return o};var Qu=Object.prototype;const Ku=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||Qu)};const Ju=function(t,e){return function(n){return t(e(n))}};const td=Ju(Object.keys,Object);var ed=Object.prototype.hasOwnProperty;const nd=function(t){if(!Ku(t))return td(t);var e=[];for(var n in Object(t))ed.call(t,n)&&"constructor"!=n&&e.push(n);return e};const id=function(t){return null!=t&&$u(t.length)&&!$l(t)};const rd=function(t){return id(t)?Zu(t):nd(t)};const ad=function(t,e){return t&&vu(t,e,rd)};const sd=function(t,e){return function(n,i){if(null==n)return n;if(!id(n))return t(n,i);for(var r=n.length,a=e?r:-1,s=Object(n);(e?a--:++a<r)&&!1!==i(s[a],a,s););return n}}(ad);const od=function(t){return t};const cd=function(t){return"function"==typeof t?t:od};const ld=function(t,e){return(Lu(t)?_u:sd)(t,cd(e))};const hd=function(t,e){for(var n=-1,i=null==t?0:t.length,r=Array(i);++n<i;)r[n]=e(t[n],n,t);return r};const ud=function(t){return"symbol"==typeof t||wu(t)&&"[object Symbol]"==Fl(t)};var dd=Sl?Sl.prototype:void 0,pd=dd?dd.toString:void 0;const fd=function t(e){if("string"==typeof e)return e;if(Lu(e))return hd(e,t)+"";if(ud(e))return pd?pd.call(e):"";var n=e+"";return"0"==n&&1/e==-Infinity?"-0":n};const gd=function(t){return null==t?"":fd(t)};var yd=0;const md=function(t){var e=++yd;return gd(t)+e};var bd=Object.prototype.hasOwnProperty;const _d=function(t,e){return null!=t&&bd.call(t,e)};var xd=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,vd=/^\w*$/;const kd=function(t,e){if(Lu(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!ud(t))||(vd.test(t)||!xd.test(t)||null!=e&&t in Object(e))};var wd=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Td=/\\(\\)?/g,Cd=function(t){var e=Nh(t,(function(t){return 500===n.size&&n.clear(),t})),n=e.cache;return e}((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(wd,(function(t,n,i,r){e.push(i?r.replace(Td,"$1"):n||t)})),e}));const Ed=Cd;const Sd=function(t,e){return Lu(t)?t:kd(t,e)?[t]:Ed(gd(t))};const Ad=function(t){if("string"==typeof t||ud(t))return t;var e=t+"";return"0"==e&&1/t==-Infinity?"-0":e};const Dd=function(t,e,n){for(var i=-1,r=(e=Sd(e,t)).length,a=!1;++i<r;){var s=Ad(e[i]);if(!(a=null!=t&&n(t,s)))break;t=t[s]}return a||++i!=r?a:!!(r=null==t?0:t.length)&&$u(r)&&Ru(s,r)&&(Lu(t)||Du(t))};const Ld=function(t,e){return null!=t&&Dd(t,e,_d)};const Nd=function(t){return function(){return t}};const Od=function(t,e){for(var n=-1,i=e.length,r=t.length;++n<i;)t[r+n]=e[n];return t};var Bd=Sl?Sl.isConcatSpreadable:void 0;const Md=function(t){return Lu(t)||Du(t)||!!(Bd&&t&&t[Bd])};const Id=function t(e,n,i,r,a){var s=-1,o=e.length;for(i||(i=Md),a||(a=[]);++s<o;){var c=e[s];n>0&&i(c)?n>1?t(c,n-1,i,r,a):Od(a,c):r||(a[a.length]=c)}return a};const Fd=function(t){return(null==t?0:t.length)?Id(t,1):[]};const Rd=function(){this.__data__=new _h,this.size=0};const $d=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n};const Pd=function(t){return this.__data__.get(t)};const jd=function(t){return this.__data__.has(t)};const Yd=function(t,e){var n=this.__data__;if(n instanceof _h){var i=n.__data__;if(!xh||i.length<199)return i.push([t,e]),this.size=++n.size,this;n=this.__data__=new Dh(i)}return n.set(t,e),this.size=n.size,this};function zd(t){var e=this.__data__=new _h(t);this.size=e.size}zd.prototype.clear=Rd,zd.prototype.delete=$d,zd.prototype.get=Pd,zd.prototype.has=jd,zd.prototype.set=Yd;const Ud=zd;const Wd=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const Hd=function(t){return this.__data__.has(t)};function qd(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new Dh;++e<n;)this.add(t[e])}qd.prototype.add=qd.prototype.push=Wd,qd.prototype.has=Hd;const Vd=qd;const Gd=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i;)if(e(t[n],n,t))return!0;return!1};const Xd=function(t,e){return t.has(e)};const Zd=function(t,e,n,i,r,a){var s=1&n,o=t.length,c=e.length;if(o!=c&&!(s&&c>o))return!1;var l=a.get(t),h=a.get(e);if(l&&h)return l==e&&h==t;var u=-1,d=!0,p=2&n?new Vd:void 0;for(a.set(t,e),a.set(e,t);++u<o;){var f=t[u],g=e[u];if(i)var y=s?i(g,f,u,e,t,a):i(f,g,u,t,e,a);if(void 0!==y){if(y)continue;d=!1;break}if(p){if(!Gd(e,(function(t,e){if(!Xd(p,e)&&(f===t||r(f,t,n,i,a)))return p.push(e)}))){d=!1;break}}else if(f!==g&&!r(f,g,n,i,a)){d=!1;break}}return a.delete(t),a.delete(e),d};const Qd=El.Uint8Array;const Kd=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,i){n[++e]=[i,t]})),n};const Jd=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n};var tp=Sl?Sl.prototype:void 0,ep=tp?tp.valueOf:void 0;const np=function(t,e,n,i,r,a,s){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!a(new Qd(t),new Qd(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return uh(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var o=Kd;case"[object Set]":var c=1&i;if(o||(o=Jd),t.size!=e.size&&!c)return!1;var l=s.get(t);if(l)return l==e;i|=2,s.set(t,e);var h=Zd(o(t),o(e),i,r,a,s);return s.delete(t),h;case"[object Symbol]":if(ep)return ep.call(t)==ep.call(e)}return!1};const ip=function(t,e,n){var i=e(t);return Lu(t)?i:Od(i,n(t))};const rp=function(t,e){for(var n=-1,i=null==t?0:t.length,r=0,a=[];++n<i;){var s=t[n];e(s,n,t)&&(a[r++]=s)}return a};const ap=function(){return[]};var sp=Object.prototype.propertyIsEnumerable,op=Object.getOwnPropertySymbols,cp=op?function(t){return null==t?[]:(t=Object(t),rp(op(t),(function(e){return sp.call(t,e)})))}:ap;const lp=cp;const hp=function(t){return ip(t,rd,lp)};var up=Object.prototype.hasOwnProperty;const dp=function(t,e,n,i,r,a){var s=1&n,o=hp(t),c=o.length;if(c!=hp(e).length&&!s)return!1;for(var l=c;l--;){var h=o[l];if(!(s?h in e:up.call(e,h)))return!1}var u=a.get(t),d=a.get(e);if(u&&d)return u==e&&d==t;var p=!0;a.set(t,e),a.set(e,t);for(var f=s;++l<c;){var g=t[h=o[l]],y=e[h];if(i)var m=s?i(y,g,h,e,t,a):i(g,y,h,t,e,a);if(!(void 0===m?g===y||r(g,y,n,i,a):m)){p=!1;break}f||(f="constructor"==h)}if(p&&!f){var b=t.constructor,_=e.constructor;b==_||!("constructor"in t)||!("constructor"in e)||"function"==typeof b&&b instanceof b&&"function"==typeof _&&_ instanceof _||(p=!1)}return a.delete(t),a.delete(e),p};const pp=Jl(El,"DataView");const fp=Jl(El,"Promise");const gp=Jl(El,"Set");const yp=Jl(El,"WeakMap");var mp="[object Map]",bp="[object Promise]",_p="[object Set]",xp="[object WeakMap]",vp="[object DataView]",kp=Wl(pp),wp=Wl(xh),Tp=Wl(fp),Cp=Wl(gp),Ep=Wl(yp),Sp=Fl;(pp&&Sp(new pp(new ArrayBuffer(1)))!=vp||xh&&Sp(new xh)!=mp||fp&&Sp(fp.resolve())!=bp||gp&&Sp(new gp)!=_p||yp&&Sp(new yp)!=xp)&&(Sp=function(t){var e=Fl(t),n="[object Object]"==e?t.constructor:void 0,i=n?Wl(n):"";if(i)switch(i){case kp:return vp;case wp:return mp;case Tp:return bp;case Cp:return _p;case Ep:return xp}return e});const Ap=Sp;var Dp="[object Arguments]",Lp="[object Array]",Np="[object Object]",Op=Object.prototype.hasOwnProperty;const Bp=function(t,e,n,i,r,a){var s=Lu(t),o=Lu(e),c=s?Lp:Ap(t),l=o?Lp:Ap(e),h=(c=c==Dp?Np:c)==Np,u=(l=l==Dp?Np:l)==Np,d=c==l;if(d&&Iu(t)){if(!Iu(e))return!1;s=!0,h=!1}if(d&&!h)return a||(a=new Ud),s||Gu(t)?Zd(t,e,n,i,r,a):np(t,e,c,n,i,r,a);if(!(1&n)){var p=h&&Op.call(t,"__wrapped__"),f=u&&Op.call(e,"__wrapped__");if(p||f){var g=p?t.value():t,y=f?e.value():e;return a||(a=new Ud),r(g,y,n,i,a)}}return!!d&&(a||(a=new Ud),dp(t,e,n,i,r,a))};const Mp=function t(e,n,i,r,a){return e===n||(null==e||null==n||!wu(e)&&!wu(n)?e!=e&&n!=n:Bp(e,n,i,r,t,a))};const Ip=function(t,e,n,i){var r=n.length,a=r,s=!i;if(null==t)return!a;for(t=Object(t);r--;){var o=n[r];if(s&&o[2]?o[1]!==t[o[0]]:!(o[0]in t))return!1}for(;++r<a;){var c=(o=n[r])[0],l=t[c],h=o[1];if(s&&o[2]){if(void 0===l&&!(c in t))return!1}else{var u=new Ud;if(i)var d=i(l,h,c,t,e,u);if(!(void 0===d?Mp(h,l,3,i,u):d))return!1}}return!0};const Fp=function(t){return t==t&&!Rl(t)};const Rp=function(t){for(var e=rd(t),n=e.length;n--;){var i=e[n],r=t[i];e[n]=[i,r,Fp(r)]}return e};const $p=function(t,e){return function(n){return null!=n&&(n[t]===e&&(void 0!==e||t in Object(n)))}};const Pp=function(t){var e=Rp(t);return 1==e.length&&e[0][2]?$p(e[0][0],e[0][1]):function(n){return n===t||Ip(n,t,e)}};const jp=function(t,e){for(var n=0,i=(e=Sd(e,t)).length;null!=t&&n<i;)t=t[Ad(e[n++])];return n&&n==i?t:void 0};const Yp=function(t,e,n){var i=null==t?void 0:jp(t,e);return void 0===i?n:i};const zp=function(t,e){return null!=t&&e in Object(t)};const Up=function(t,e){return null!=t&&Dd(t,e,zp)};const Wp=function(t,e){return kd(t)&&Fp(e)?$p(Ad(t),e):function(n){var i=Yp(n,t);return void 0===i&&i===e?Up(n,t):Mp(e,i,3)}};const Hp=function(t){return function(e){return null==e?void 0:e[t]}};const qp=function(t){return function(e){return jp(e,t)}};const Vp=function(t){return kd(t)?Hp(Ad(t)):qp(t)};const Gp=function(t){return"function"==typeof t?t:null==t?od:"object"==typeof t?Lu(t)?Wp(t[0],t[1]):Pp(t):Vp(t)};const Xp=function(t,e){var n=-1,i=id(t)?Array(t.length):[];return sd(t,(function(t,r,a){i[++n]=e(t,r,a)})),i};const Zp=function(t,e){return(Lu(t)?hd:Xp)(t,Gp(e,3))};var Qp=Math.ceil,Kp=Math.max;const Jp=function(t,e,n,i){for(var r=-1,a=Kp(Qp((e-t)/(n||1)),0),s=Array(a);a--;)s[i?a:++r]=t,t+=n;return s};const tf=function(t,e,n){if(!Rl(n))return!1;var i=typeof e;return!!("number"==i?id(n)&&Ru(e,n.length):"string"==i&&e in n)&&uh(n[e],t)};var ef=/\s/;const nf=function(t){for(var e=t.length;e--&&ef.test(t.charAt(e)););return e};var rf=/^\s+/;const af=function(t){return t?t.slice(0,nf(t)+1).replace(rf,""):t};var sf=/^[-+]0x[0-9a-f]+$/i,of=/^0b[01]+$/i,cf=/^0o[0-7]+$/i,lf=parseInt;const hf=function(t){if("number"==typeof t)return t;if(ud(t))return NaN;if(Rl(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Rl(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=af(t);var n=of.test(t);return n||cf.test(t)?lf(t.slice(2),n?2:8):sf.test(t)?NaN:+t};var uf=1/0;const df=function(t){return t?(t=hf(t))===uf||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0};const pf=function(t){return function(e,n,i){return i&&"number"!=typeof i&&tf(e,n,i)&&(n=i=void 0),e=df(e),void 0===n?(n=e,e=0):n=df(n),i=void 0===i?e<n?1:-1:df(i),Jp(e,n,i,t)}};const ff=pf();const gf=function(t,e){var n=[];return sd(t,(function(t,i,r){e(t,i,r)&&n.push(t)})),n};const yf=function(t,e){return(Lu(t)?rp:gf)(t,Gp(e,3))};var mf=Object.prototype.hasOwnProperty;const bf=function(t){if(null==t)return!0;if(id(t)&&(Lu(t)||"string"==typeof t||"function"==typeof t.splice||Iu(t)||Gu(t)||Du(t)))return!t.length;var e=Ap(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(Ku(t))return!nd(t).length;for(var n in t)if(mf.call(t,n))return!1;return!0};const _f=function(t){return void 0===t};const xf=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)};var vf=Math.max;const kf=function(t,e,n){return e=vf(void 0===e?t.length-1:e,0),function(){for(var i=arguments,r=-1,a=vf(i.length-e,0),s=Array(a);++r<a;)s[r]=i[e+r];r=-1;for(var o=Array(e+1);++r<e;)o[r]=i[r];return o[e]=n(s),xf(t,this,o)}};const wf=function(){try{var t=Jl(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();var Tf=wf?function(t,e){return wf(t,"toString",{configurable:!0,enumerable:!1,value:Nd(e),writable:!0})}:od;const Cf=Tf;var Ef=Date.now;const Sf=function(t){var e=0,n=0;return function(){var i=Ef(),r=16-(i-n);if(n=i,r>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(Cf);const Af=function(t,e){return Sf(kf(t,e,od),t+"")};const Df=function(t,e,n,i){for(var r=t.length,a=n+(i?1:-1);i?a--:++a<r;)if(e(t[a],a,t))return a;return-1};const Lf=function(t){return t!=t};const Nf=function(t,e,n){for(var i=n-1,r=t.length;++i<r;)if(t[i]===e)return i;return-1};const Of=function(t,e,n){return e==e?Nf(t,e,n):Df(t,Lf,n)};const Bf=function(t,e){return!!(null==t?0:t.length)&&Of(t,e,0)>-1};const Mf=function(t,e,n){for(var i=-1,r=null==t?0:t.length;++i<r;)if(n(e,t[i]))return!0;return!1};const If=function(){};var Ff=gp&&1/Jd(new gp([,-0]))[1]==1/0?function(t){return new gp(t)}:If;const Rf=Ff;const $f=function(t,e,n){var i=-1,r=Bf,a=t.length,s=!0,o=[],c=o;if(n)s=!1,r=Mf;else if(a>=200){var l=e?null:Rf(t);if(l)return Jd(l);s=!1,r=Xd,c=new Vd}else c=e?[]:o;t:for(;++i<a;){var h=t[i],u=e?e(h):h;if(h=n||0!==h?h:0,s&&u==u){for(var d=c.length;d--;)if(c[d]===u)continue t;e&&c.push(u),o.push(h)}else r(c,u,n)||(c!==o&&c.push(u),o.push(h))}return o};const Pf=function(t){return wu(t)&&id(t)};const jf=Af((function(t){return $f(Id(t,1,Pf,!0))}));const Yf=function(t,e){return hd(e,(function(e){return t[e]}))};const zf=function(t){return null==t?[]:Yf(t,rd(t))};const Uf=function(t,e,n,i){var r=-1,a=null==t?0:t.length;for(i&&a&&(n=t[++r]);++r<a;)n=e(n,t[r],r,t);return n};const Wf=function(t,e,n,i,r){return r(t,(function(t,r,a){n=i?(i=!1,t):e(n,t,r,a)})),n};const Hf=function(t,e,n){var i=Lu(t)?Uf:Wf,r=arguments.length<3;return i(t,Gp(e,4),n,r,sd)};var qf="\0";class Vf{constructor(t={}){this._isDirected=!Ld(t,"directed")||t.directed,this._isMultigraph=!!Ld(t,"multigraph")&&t.multigraph,this._isCompound=!!Ld(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=Nd(void 0),this._defaultEdgeLabelFn=Nd(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(t){return this._label=t,this}graph(){return this._label}setDefaultNodeLabel(t){return $l(t)||(t=Nd(t)),this._defaultNodeLabelFn=t,this}nodeCount(){return this._nodeCount}nodes(){return rd(this._nodes)}sources(){var t=this;return yf(this.nodes(),(function(e){return bf(t._in[e])}))}sinks(){var t=this;return yf(this.nodes(),(function(e){return bf(t._out[e])}))}setNodes(t,e){var n=arguments,i=this;return ld(t,(function(t){n.length>1?i.setNode(t,e):i.setNode(t)})),this}setNode(t,e){return Ld(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]=qf,this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)}node(t){return this._nodes[t]}hasNode(t){return Ld(this._nodes,t)}removeNode(t){var e=this;if(Ld(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],ld(this.children(t),(function(t){e.setParent(t)})),delete this._children[t]),ld(rd(this._in[t]),n),delete this._in[t],delete this._preds[t],ld(rd(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this}setParent(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(_f(e))e=qf;else{for(var n=e+="";!_f(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this}_removeFromParentsChildList(t){delete this._children[this._parent[t]][t]}parent(t){if(this._isCompound){var e=this._parent[t];if(e!==qf)return e}}children(t){if(_f(t)&&(t=qf),this._isCompound){var e=this._children[t];if(e)return rd(e)}else{if(t===qf)return this.nodes();if(this.hasNode(t))return[]}}predecessors(t){var e=this._preds[t];if(e)return rd(e)}successors(t){var e=this._sucs[t];if(e)return rd(e)}neighbors(t){var e=this.predecessors(t);if(e)return jf(e,this.successors(t))}isLeaf(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length}filterNodes(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var n=this;ld(this._nodes,(function(n,i){t(i)&&e.setNode(i,n)})),ld(this._edgeObjs,(function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,n.edge(t))}));var i={};function r(t){var a=n.parent(t);return void 0===a||e.hasNode(a)?(i[t]=a,a):a in i?i[a]:r(a)}return this._isCompound&&ld(e.nodes(),(function(t){e.setParent(t,r(t))})),e}setDefaultEdgeLabel(t){return $l(t)||(t=Nd(t)),this._defaultEdgeLabelFn=t,this}edgeCount(){return this._edgeCount}edges(){return zf(this._edgeObjs)}setPath(t,e){var n=this,i=arguments;return Hf(t,(function(t,r){return i.length>1?n.setEdge(t,r,e):n.setEdge(t,r),r})),this}setEdge(){var t,e,n,i,r=!1,a=arguments[0];"object"==typeof a&&null!==a&&"v"in a?(t=a.v,e=a.w,n=a.name,2===arguments.length&&(i=arguments[1],r=!0)):(t=a,e=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],r=!0)),t=""+t,e=""+e,_f(n)||(n=""+n);var s=Zf(this._isDirected,t,e,n);if(Ld(this._edgeLabels,s))return r&&(this._edgeLabels[s]=i),this;if(!_f(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[s]=r?i:this._defaultEdgeLabelFn(t,e,n);var o=function(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}var o={v:r,w:a};i&&(o.name=i);return o}(this._isDirected,t,e,n);return t=o.v,e=o.w,Object.freeze(o),this._edgeObjs[s]=o,Gf(this._preds[e],t),Gf(this._sucs[t],e),this._in[e][s]=o,this._out[t][s]=o,this._edgeCount++,this}edge(t,e,n){var i=1===arguments.length?Qf(this._isDirected,arguments[0]):Zf(this._isDirected,t,e,n);return this._edgeLabels[i]}hasEdge(t,e,n){var i=1===arguments.length?Qf(this._isDirected,arguments[0]):Zf(this._isDirected,t,e,n);return Ld(this._edgeLabels,i)}removeEdge(t,e,n){var i=1===arguments.length?Qf(this._isDirected,arguments[0]):Zf(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],Xf(this._preds[e],t),Xf(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this}inEdges(t,e){var n=this._in[t];if(n){var i=zf(n);return e?yf(i,(function(t){return t.v===e})):i}}outEdges(t,e){var n=this._out[t];if(n){var i=zf(n);return e?yf(i,(function(t){return t.w===e})):i}}nodeEdges(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}}function Gf(t,e){t[e]?t[e]++:t[e]=1}function Xf(t,e){--t[e]||delete t[e]}function Zf(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}return r+"\x01"+a+"\x01"+(_f(i)?"\0":i)}function Qf(t,e){return Zf(t,e.v,e.w,e.name)}Vf.prototype._nodeCount=0,Vf.prototype._edgeCount=0;class Kf{constructor(){var t={};t._next=t._prev=t,this._sentinel=t}dequeue(){var t=this._sentinel,e=t._prev;if(e!==t)return Jf(e),e}enqueue(t){var e=this._sentinel;t._prev&&t._next&&Jf(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e}toString(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,tg)),n=n._prev;return"["+t.join(", ")+"]"}}function Jf(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function tg(t,e){if("_next"!==t&&"_prev"!==t)return e}var eg=Nd(1);function ng(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new Vf,i=0,r=0;ld(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),ld(t.edges(),(function(t){var a=n.edge(t.v,t.w)||0,s=e(t),o=a+s;n.setEdge(t.v,t.w,o),r=Math.max(r,n.node(t.v).out+=s),i=Math.max(i,n.node(t.w).in+=s)}));var a=ff(r+i+3).map((function(){return new Kf})),s=i+1;return ld(n.nodes(),(function(t){rg(a,s,n.node(t))})),{graph:n,buckets:a,zeroIdx:s}}(t,e||eg),i=function(t,e,n){var i,r=[],a=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)ig(t,e,n,i);for(;i=a.dequeue();)ig(t,e,n,i);if(t.nodeCount())for(var o=e.length-2;o>0;--o)if(i=e[o].dequeue()){r=r.concat(ig(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return Fd(Zp(i,(function(e){return t.outEdges(e.v,e.w)})),!0)}function ig(t,e,n,i,r){var a=r?[]:void 0;return ld(t.inEdges(i.v),(function(i){var s=t.edge(i),o=t.node(i.v);r&&a.push({v:i.v,w:i.w}),o.out-=s,rg(e,n,o)})),ld(t.outEdges(i.v),(function(i){var r=t.edge(i),a=i.w,s=t.node(a);s.in-=r,rg(e,n,s)})),t.removeNode(i.v),a}function rg(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}function ag(t){var e="greedy"===t.graph().acyclicer?ng(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},i={};function r(a){Ld(i,a)||(i[a]=!0,n[a]=!0,ld(t.outEdges(a),(function(t){Ld(n,t.w)?e.push(t):r(t.w)})),delete n[a])}return ld(t.nodes(),r),e}(t);ld(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,md("rev"))}))}const sg=function(t,e,n){"__proto__"==e&&wf?wf(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n};const og=function(t,e,n){(void 0!==n&&!uh(t[e],n)||void 0===n&&!(e in t))&&sg(t,e,n)};var cg="object"==typeof exports&&exports&&!exports.nodeType&&exports,lg=cg&&"object"==typeof module&&module&&!module.nodeType&&module,hg=lg&&lg.exports===cg?El.Buffer:void 0,ug=hg?hg.allocUnsafe:void 0;const dg=function(t,e){if(e)return t.slice();var n=t.length,i=ug?ug(n):new t.constructor(n);return t.copy(i),i};const pg=function(t){var e=new t.constructor(t.byteLength);return new Qd(e).set(new Qd(t)),e};const fg=function(t,e){var n=e?pg(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)};const gg=function(t,e){var n=-1,i=t.length;for(e||(e=Array(i));++n<i;)e[n]=t[n];return e};var yg=Object.create,mg=function(){function t(){}return function(e){if(!Rl(e))return{};if(yg)return yg(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();const bg=mg;const _g=Ju(Object.getPrototypeOf,Object);const xg=function(t){return"function"!=typeof t.constructor||Ku(t)?{}:bg(_g(t))};var vg=Function.prototype,kg=Object.prototype,wg=vg.toString,Tg=kg.hasOwnProperty,Cg=wg.call(Object);const Eg=function(t){if(!wu(t)||"[object Object]"!=Fl(t))return!1;var e=_g(t);if(null===e)return!0;var n=Tg.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&wg.call(n)==Cg};const Sg=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};var Ag=Object.prototype.hasOwnProperty;const Dg=function(t,e,n){var i=t[e];Ag.call(t,e)&&uh(i,n)&&(void 0!==n||e in t)||sg(t,e,n)};const Lg=function(t,e,n,i){var r=!n;n||(n={});for(var a=-1,s=e.length;++a<s;){var o=e[a],c=i?i(n[o],t[o],o,n,t):void 0;void 0===c&&(c=t[o]),r?sg(n,o,c):Dg(n,o,c)}return n};const Ng=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e};var Og=Object.prototype.hasOwnProperty;const Bg=function(t){if(!Rl(t))return Ng(t);var e=Ku(t),n=[];for(var i in t)("constructor"!=i||!e&&Og.call(t,i))&&n.push(i);return n};const Mg=function(t){return id(t)?Zu(t,!0):Bg(t)};const Ig=function(t){return Lg(t,Mg(t))};const Fg=function(t,e,n,i,r,a,s){var o=Sg(t,n),c=Sg(e,n),l=s.get(c);if(l)og(t,n,l);else{var h=a?a(o,c,n+"",t,e,s):void 0,u=void 0===h;if(u){var d=Lu(c),p=!d&&Iu(c),f=!d&&!p&&Gu(c);h=c,d||p||f?Lu(o)?h=o:Pf(o)?h=gg(o):p?(u=!1,h=dg(c,!0)):f?(u=!1,h=fg(c,!0)):h=[]:Eg(c)||Du(c)?(h=o,Du(o)?h=Ig(o):Rl(o)&&!$l(o)||(h=xg(c))):u=!1}u&&(s.set(c,h),r(h,c,i,a,s),s.delete(c)),og(t,n,h)}};const Rg=function t(e,n,i,r,a){e!==n&&vu(n,(function(s,o){if(a||(a=new Ud),Rl(s))Fg(e,n,o,i,t,r,a);else{var c=r?r(Sg(e,o),s,o+"",e,n,a):void 0;void 0===c&&(c=s),og(e,o,c)}}),Mg)};const $g=function(t){return Af((function(e,n){var i=-1,r=n.length,a=r>1?n[r-1]:void 0,s=r>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(r--,a):void 0,s&&tf(n[0],n[1],s)&&(a=r<3?void 0:a,r=1),e=Object(e);++i<r;){var o=n[i];o&&t(e,o,i,a)}return e}))};var Pg=$g((function(t,e,n){Rg(t,e,n)}));const jg=Pg;const Yg=function(t,e,n,i){if(!Rl(t))return t;for(var r=-1,a=(e=Sd(e,t)).length,s=a-1,o=t;null!=o&&++r<a;){var c=Ad(e[r]),l=n;if("__proto__"===c||"constructor"===c||"prototype"===c)return t;if(r!=s){var h=o[c];void 0===(l=i?i(h,c,o):void 0)&&(l=Rl(h)?h:Ru(e[r+1])?[]:{})}Dg(o,c,l),o=o[c]}return t};const zg=function(t,e,n){for(var i=-1,r=e.length,a={};++i<r;){var s=e[i],o=jp(t,s);n(o,s)&&Yg(a,Sd(s,t),o)}return a};const Ug=function(t,e){return zg(t,e,(function(e,n){return Up(t,n)}))};var Wg=function(t){return Sf(kf(t,void 0,Fd),t+"")}((function(t,e){return null==t?{}:Ug(t,e)}));const Hg=Wg;var qg=Object.prototype,Vg=qg.hasOwnProperty,Gg=Af((function(t,e){t=Object(t);var n=-1,i=e.length,r=i>2?e[2]:void 0;for(r&&tf(e[0],e[1],r)&&(i=1);++n<i;)for(var a=e[n],s=Mg(a),o=-1,c=s.length;++o<c;){var l=s[o],h=t[l];(void 0===h||uh(h,qg[l])&&!Vg.call(t,l))&&(t[l]=a[l])}return t}));const Xg=Gg;const Zg=function(t,e,n){for(var i=-1,r=t.length;++i<r;){var a=t[i],s=e(a);if(null!=s&&(void 0===o?s==s&&!ud(s):n(s,o)))var o=s,c=a}return c};const Qg=function(t,e){return t>e};const Kg=function(t){return t&&t.length?Zg(t,od,Qg):void 0};const Jg=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0};const ty=function(t,e){var n={};return e=Gp(e,3),ad(t,(function(t,i,r){sg(n,i,e(t,i,r))})),n};const ey=function(t,e){return t<e};const ny=function(t){return t&&t.length?Zg(t,od,ey):void 0};const iy=function(){return El.Date.now()};function ry(t,e,n,i){var r;do{r=md(i)}while(t.hasNode(r));return n.dummy=e,t.setNode(r,n),r}function ay(t){var e=new Vf({multigraph:t.isMultigraph()}).setGraph(t.graph());return ld(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),ld(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e}function sy(t,e){var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;if(!s&&!o)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=l*s/o,i=l):(s<0&&(c=-c),n=c,i=c*o/s),{x:r+n,y:a+i}}function oy(t){var e=Zp(ff(ly(t)+1),(function(){return[]}));return ld(t.nodes(),(function(n){var i=t.node(n),r=i.rank;_f(r)||(e[r][i.order]=n)})),e}function cy(t,e,n,i){var r={width:0,height:0};return arguments.length>=4&&(r.rank=n,r.order=i),ry(t,"border",r,e)}function ly(t){return Kg(Zp(t.nodes(),(function(e){var n=t.node(e).rank;if(!_f(n))return n})))}function hy(t,e){var n=iy();try{return e()}finally{console.log(t+" time: "+(iy()-n)+"ms")}}function uy(t,e){return e()}function dy(t,e,n,i,r,a){var s={width:0,height:0,rank:a,borderType:e},o=r[e][a-1],c=ry(t,"border",s,n);r[e][a]=c,t.setParent(c,i),o&&t.setEdge(o,c,{weight:1})}function py(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){ld(t.nodes(),(function(e){yy(t.node(e))})),ld(t.edges(),(function(e){var n=t.edge(e);ld(n.points,yy),Ld(n,"y")&&yy(n)}))}(t),"lr"!==e&&"rl"!==e||(!function(t){ld(t.nodes(),(function(e){my(t.node(e))})),ld(t.edges(),(function(e){var n=t.edge(e);ld(n.points,my),Ld(n,"x")&&my(n)}))}(t),fy(t))}function fy(t){ld(t.nodes(),(function(e){gy(t.node(e))})),ld(t.edges(),(function(e){gy(t.edge(e))}))}function gy(t){var e=t.width;t.width=t.height,t.height=e}function yy(t){t.y=-t.y}function my(t){var e=t.x;t.x=t.y,t.y=e}function by(t){var e=ry(t,"root",{},"_root"),n=function(t){var e={};function n(i,r){var a=t.children(i);a&&a.length&&ld(a,(function(t){n(t,r+1)})),e[i]=r}return ld(t.children(),(function(t){n(t,1)})),e}(t),i=Kg(zf(n))-1,r=2*i+1;t.graph().nestingRoot=e,ld(t.edges(),(function(e){t.edge(e).minlen*=r}));var a=function(t){return Hf(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;ld(t.children(),(function(s){_y(t,e,r,a,i,n,s)})),t.graph().nodeRankFactor=r}function _y(t,e,n,i,r,a,s){var o=t.children(s);if(o.length){var c=cy(t,"_bt"),l=cy(t,"_bb"),h=t.node(s);t.setParent(c,s),h.borderTop=c,t.setParent(l,s),h.borderBottom=l,ld(o,(function(o){_y(t,e,n,i,r,a,o);var h=t.node(o),u=h.borderTop?h.borderTop:o,d=h.borderBottom?h.borderBottom:o,p=h.borderTop?i:2*i,f=u!==d?1:r-a[s]+1;t.setEdge(c,u,{weight:p,minlen:f,nestingEdge:!0}),t.setEdge(d,l,{weight:p,minlen:f,nestingEdge:!0})})),t.parent(s)||t.setEdge(e,c,{weight:0,minlen:r+a[s]})}else s!==e&&t.setEdge(e,s,{weight:0,minlen:n})}const xy=function(t,e){return t&&Lg(e,rd(e),t)};const vy=function(t,e){return t&&Lg(e,Mg(e),t)};const ky=function(t,e){return Lg(t,lp(t),e)};var wy=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)Od(e,lp(t)),t=_g(t);return e}:ap;const Ty=wy;const Cy=function(t,e){return Lg(t,Ty(t),e)};const Ey=function(t){return ip(t,Mg,Ty)};var Sy=Object.prototype.hasOwnProperty;const Ay=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&Sy.call(t,"index")&&(n.index=t.index,n.input=t.input),n};const Dy=function(t,e){var n=e?pg(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)};var Ly=/\w*$/;const Ny=function(t){var e=new t.constructor(t.source,Ly.exec(t));return e.lastIndex=t.lastIndex,e};var Oy=Sl?Sl.prototype:void 0,By=Oy?Oy.valueOf:void 0;const My=function(t){return By?Object(By.call(t)):{}};const Iy=function(t,e,n){var i=t.constructor;switch(e){case"[object ArrayBuffer]":return pg(t);case"[object Boolean]":case"[object Date]":return new i(+t);case"[object DataView]":return Dy(t,n);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return fg(t,n);case"[object Map]":case"[object Set]":return new i;case"[object Number]":case"[object String]":return new i(t);case"[object RegExp]":return Ny(t);case"[object Symbol]":return My(t)}};const Fy=function(t){return wu(t)&&"[object Map]"==Ap(t)};var Ry=qu&&qu.isMap;const $y=Ry?Yu(Ry):Fy;const Py=function(t){return wu(t)&&"[object Set]"==Ap(t)};var jy=qu&&qu.isSet;const Yy=jy?Yu(jy):Py;var zy="[object Arguments]",Uy="[object Function]",Wy="[object Object]",Hy={};Hy[zy]=Hy["[object Array]"]=Hy["[object ArrayBuffer]"]=Hy["[object DataView]"]=Hy["[object Boolean]"]=Hy["[object Date]"]=Hy["[object Float32Array]"]=Hy["[object Float64Array]"]=Hy["[object Int8Array]"]=Hy["[object Int16Array]"]=Hy["[object Int32Array]"]=Hy["[object Map]"]=Hy["[object Number]"]=Hy["[object Object]"]=Hy["[object RegExp]"]=Hy["[object Set]"]=Hy["[object String]"]=Hy["[object Symbol]"]=Hy["[object Uint8Array]"]=Hy["[object Uint8ClampedArray]"]=Hy["[object Uint16Array]"]=Hy["[object Uint32Array]"]=!0,Hy["[object Error]"]=Hy[Uy]=Hy["[object WeakMap]"]=!1;const qy=function t(e,n,i,r,a,s){var o,c=1&n,l=2&n,h=4&n;if(i&&(o=a?i(e,r,a,s):i(e)),void 0!==o)return o;if(!Rl(e))return e;var u=Lu(e);if(u){if(o=Ay(e),!c)return gg(e,o)}else{var d=Ap(e),p=d==Uy||"[object GeneratorFunction]"==d;if(Iu(e))return dg(e,c);if(d==Wy||d==zy||p&&!a){if(o=l||p?{}:xg(e),!c)return l?Cy(e,vy(o,e)):ky(e,xy(o,e))}else{if(!Hy[d])return a?e:{};o=Iy(e,d,c)}}s||(s=new Ud);var f=s.get(e);if(f)return f;s.set(e,o),Yy(e)?e.forEach((function(r){o.add(t(r,n,i,r,e,s))})):$y(e)&&e.forEach((function(r,a){o.set(a,t(r,n,i,a,e,s))}));var g=u?void 0:(h?l?Ey:hp:l?Mg:rd)(e);return _u(g||e,(function(r,a){g&&(r=e[a=r]),Dg(o,a,t(r,n,i,a,e,s))})),o};const Vy=function(t){return qy(t,5)};function Gy(t,e,n){var i=function(t){var e;for(;t.hasNode(e=md("_root")););return e}(t),r=new Vf({compound:!0}).setGraph({root:i}).setDefaultNodeLabel((function(e){return t.node(e)}));return ld(t.nodes(),(function(a){var s=t.node(a),o=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(r.setNode(a),r.setParent(a,o||i),ld(t[n](a),(function(e){var n=e.v===a?e.w:e.v,i=r.edge(n,a),s=_f(i)?0:i.weight;r.setEdge(n,a,{weight:t.edge(e).weight+s})})),Ld(s,"minRank")&&r.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))})),r}const Xy=function(t,e,n){for(var i=-1,r=t.length,a=e.length,s={};++i<r;){var o=i<a?e[i]:void 0;n(s,t[i],o)}return s};const Zy=function(t,e){return Xy(t||[],e||[],Dg)};const Qy=function(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t};const Ky=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,r=t==t,a=ud(t),s=void 0!==e,o=null===e,c=e==e,l=ud(e);if(!o&&!l&&!a&&t>e||a&&s&&c&&!o&&!l||i&&s&&c||!n&&c||!r)return 1;if(!i&&!a&&!l&&t<e||l&&n&&r&&!i&&!a||o&&n&&r||!s&&r||!c)return-1}return 0};const Jy=function(t,e,n){for(var i=-1,r=t.criteria,a=e.criteria,s=r.length,o=n.length;++i<s;){var c=Ky(r[i],a[i]);if(c)return i>=o?c:c*("desc"==n[i]?-1:1)}return t.index-e.index};const tm=function(t,e,n){e=e.length?hd(e,(function(t){return Lu(t)?function(e){return jp(e,1===t.length?t[0]:t)}:t})):[od];var i=-1;e=hd(e,Yu(Gp));var r=Xp(t,(function(t,n,r){return{criteria:hd(e,(function(e){return e(t)})),index:++i,value:t}}));return Qy(r,(function(t,e){return Jy(t,e,n)}))};const em=Af((function(t,e){if(null==t)return[];var n=e.length;return n>1&&tf(t,e[0],e[1])?e=[]:n>2&&tf(e[0],e[1],e[2])&&(e=[e[0]]),tm(t,Id(e,1),[])}));function nm(t,e){for(var n=0,i=1;i<e.length;++i)n+=im(t,e[i-1],e[i]);return n}function im(t,e,n){for(var i=Zy(n,Zp(n,(function(t,e){return e}))),r=Fd(Zp(e,(function(e){return em(Zp(t.outEdges(e),(function(e){return{pos:i[e.w],weight:t.edge(e).weight}})),"pos")})),!0),a=1;a<n.length;)a<<=1;var s=2*a-1;a-=1;var o=Zp(new Array(s),(function(){return 0})),c=0;return ld(r.forEach((function(t){var e=t.pos+a;o[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=o[e+1]),o[e=e-1>>1]+=t.weight;c+=t.weight*n}))),c}function rm(t,e){var n={};return ld(t,(function(t,e){var i=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};_f(t.barycenter)||(i.barycenter=t.barycenter,i.weight=t.weight)})),ld(e.edges(),(function(t){var e=n[t.v],i=n[t.w];_f(e)||_f(i)||(i.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(_f(e.barycenter)||_f(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function i(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var r=t.pop();e.push(r),ld(r.in.reverse(),n(r)),ld(r.out,i(r))}return Zp(yf(e,(function(t){return!t.merged})),(function(t){return Hg(t,["vs","i","barycenter","weight"])}))}(yf(n,(function(t){return!t.indegree})))}function am(t,e){var n,i=function(t,e){var n={lhs:[],rhs:[]};return ld(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n}(t,(function(t){return Ld(t,"barycenter")})),r=i.lhs,a=em(i.rhs,(function(t){return-t.i})),s=[],o=0,c=0,l=0;r.sort((n=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:n?e.i-t.i:t.i-e.i})),l=sm(s,a,l),ld(r,(function(t){l+=t.vs.length,s.push(t.vs),o+=t.barycenter*t.weight,c+=t.weight,l=sm(s,a,l)}));var h={vs:Fd(s,!0)};return c&&(h.barycenter=o/c,h.weight=c),h}function sm(t,e,n){for(var i;e.length&&(i=Jg(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}function om(t,e,n,i){var r=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,o=a?a.borderRight:void 0,c={};s&&(r=yf(r,(function(t){return t!==s&&t!==o})));var l=function(t,e){return Zp(e,(function(e){var n=t.inEdges(e);if(n.length){var i=Hf(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:i.sum/i.weight,weight:i.weight}}return{v:e}}))}(t,r);ld(l,(function(e){if(t.children(e.v).length){var r=om(t,e.v,n,i);c[e.v]=r,Ld(r,"barycenter")&&(s=r,_f((a=e).barycenter)?(a.barycenter=s.barycenter,a.weight=s.weight):(a.barycenter=(a.barycenter*a.weight+s.barycenter*s.weight)/(a.weight+s.weight),a.weight+=s.weight))}var a,s}));var h=rm(l,n);!function(t,e){ld(t,(function(t){t.vs=Fd(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(h,c);var u=am(h,i);if(s&&(u.vs=Fd([s,u.vs,o],!0),t.predecessors(s).length)){var d=t.node(t.predecessors(s)[0]),p=t.node(t.predecessors(o)[0]);Ld(u,"barycenter")||(u.barycenter=0,u.weight=0),u.barycenter=(u.barycenter*u.weight+d.order+p.order)/(u.weight+2),u.weight+=2}return u}function cm(t){var e=ly(t),n=lm(t,ff(1,e+1),"inEdges"),i=lm(t,ff(e-1,-1,-1),"outEdges"),r=function(t){var e={},n=yf(t.nodes(),(function(e){return!t.children(e).length})),i=Kg(Zp(n,(function(e){return t.node(e).rank}))),r=Zp(ff(i+1),(function(){return[]})),a=em(n,(function(e){return t.node(e).rank}));return ld(a,(function n(i){if(!Ld(e,i)){e[i]=!0;var a=t.node(i);r[a.rank].push(i),ld(t.successors(i),n)}})),r}(t);um(t,r);for(var a,s=Number.POSITIVE_INFINITY,o=0,c=0;c<4;++o,++c){hm(o%2?n:i,o%4>=2);var l=nm(t,r=oy(t));l<s&&(c=0,a=Vy(r),s=l)}um(t,a)}function lm(t,e,n){return Zp(e,(function(e){return Gy(t,e,n)}))}function hm(t,e){var n=new Vf;ld(t,(function(t){var i=t.graph().root,r=om(t,i,n,e);ld(r.vs,(function(e,n){t.node(e).order=n})),function(t,e,n){var i,r={};ld(n,(function(n){for(var a,s,o=t.parent(n);o;){if((a=t.parent(o))?(s=r[a],r[a]=o):(s=i,i=o),s&&s!==o)return void e.setEdge(s,o);o=a}}))}(t,n,r.vs)}))}function um(t,e){ld(e,(function(e){ld(e,(function(e,n){t.node(e).order=n}))}))}function dm(t){var e=function(t){var e={},n=0;function i(r){var a=n;ld(t.children(r),i),e[r]={low:a,lim:n++}}return ld(t.children(),i),e}(t);ld(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,a=function(t,e,n,i){var r,a,s=[],o=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));a=r,r=i;for(;(r=t.parent(r))!==a;)o.push(r);return{path:s.concat(o.reverse()),lca:a}}(t,e,r.v,r.w),s=a.path,o=a.lca,c=0,l=s[c],h=!0;n!==r.w;){if(i=t.node(n),h){for(;(l=s[c])!==o&&t.node(l).maxRank<i.rank;)c++;l===o&&(h=!1)}if(!h){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}const pm=function(t){return function(e,n,i){var r=Object(e);if(!id(e)){var a=Gp(n,3);e=rd(e),n=function(t){return a(r[t],t,r)}}var s=t(e,n,i);return s>-1?r[a?e[s]:s]:void 0}};const fm=function(t){var e=df(t),n=e%1;return e==e?n?e-n:e:0};var gm=Math.max;const ym=function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var r=null==n?0:fm(n);return r<0&&(r=gm(i+r,0)),Df(t,Gp(e,3),r)};const mm=pm(ym);const bm=function(t,e){return t&&t.length?Zg(t,Gp(e,2),ey):void 0};const _m=function(t,e){return null==t?t:vu(t,cd(e),Mg)};function xm(t,e){var n={};return Hf(e,(function(e,i){var r=0,a=0,s=e.length,o=Jg(i);return ld(i,(function(e,c){var l=function(t,e){if(t.node(e).dummy)return mm(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),h=l?t.node(l).order:s;(l||e===o)&&(ld(i.slice(a,c+1),(function(e){ld(t.predecessors(e),(function(i){var a=t.node(i),s=a.order;!(s<r||h<s)||a.dummy&&t.node(e).dummy||vm(n,i,e)}))})),a=c+1,r=h)})),i})),n}function vm(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function km(t,e,n){if(e>n){var i=e;e=n,n=i}return Ld(t[e],n)}function wm(t,e,n,i,r){var a={},s=function(t,e,n,i){var r=new Vf,a=t.graph(),s=function(t,e,n){return function(i,r,a){var s,o=i.node(r),c=i.node(a),l=0;if(l+=o.width/2,Ld(o,"labelpos"))switch(o.labelpos.toLowerCase()){case"l":s=-o.width/2;break;case"r":s=o.width/2}if(s&&(l+=n?s:-s),s=0,l+=(o.dummy?e:t)/2,l+=(c.dummy?e:t)/2,l+=c.width/2,Ld(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":s=c.width/2;break;case"r":s=-c.width/2}return s&&(l+=n?s:-s),s=0,l}}(a.nodesep,a.edgesep,i);return ld(e,(function(e){var i;ld(e,(function(e){var a=n[e];if(r.setNode(a),i){var o=n[i],c=r.edge(o,a);r.setEdge(o,a,Math.max(s(t,e,i),c||0))}i=e}))})),r}(t,e,n,r),o=r?"borderLeft":"borderRight";function c(t,e){for(var n=s.nodes(),i=n.pop(),r={};i;)r[i]?t(i):(r[i]=!0,n.push(i),n=n.concat(e(i))),i=n.pop()}return c((function(t){a[t]=s.inEdges(t).reduce((function(t,e){return Math.max(t,a[e.v]+s.edge(e))}),0)}),s.predecessors.bind(s)),c((function(e){var n=s.outEdges(e).reduce((function(t,e){return Math.min(t,a[e.w]-s.edge(e))}),Number.POSITIVE_INFINITY),i=t.node(e);n!==Number.POSITIVE_INFINITY&&i.borderType!==o&&(a[e]=Math.max(a[e],n))}),s.successors.bind(s)),ld(i,(function(t){a[t]=a[n[t]]})),a}function Tm(t){var e,n=oy(t),i=jg(xm(t,n),function(t,e){var n={};function i(e,i,r,a,s){var o;ld(ff(i,r),(function(i){o=e[i],t.node(o).dummy&&ld(t.predecessors(o),(function(e){var i=t.node(e);i.dummy&&(i.order<a||i.order>s)&&vm(n,e,o)}))}))}return Hf(e,(function(e,n){var r,a=-1,s=0;return ld(n,(function(o,c){if("border"===t.node(o).dummy){var l=t.predecessors(o);l.length&&(r=t.node(l[0]).order,i(n,s,c,a,r),s=c,a=r)}i(n,s,n.length,r,e.length)})),n})),n}(t,n)),r={};ld(["u","d"],(function(a){e="u"===a?n:zf(n).reverse(),ld(["l","r"],(function(n){"r"===n&&(e=Zp(e,(function(t){return zf(t).reverse()})));var s=("u"===a?t.predecessors:t.successors).bind(t),o=function(t,e,n,i){var r={},a={},s={};return ld(e,(function(t){ld(t,(function(t,e){r[t]=t,a[t]=t,s[t]=e}))})),ld(e,(function(t){var e=-1;ld(t,(function(t){var o=i(t);if(o.length){o=em(o,(function(t){return s[t]}));for(var c=(o.length-1)/2,l=Math.floor(c),h=Math.ceil(c);l<=h;++l){var u=o[l];a[t]===t&&e<s[u]&&!km(n,t,u)&&(a[u]=t,a[t]=r[t]=r[u],e=s[u])}}}))})),{root:r,align:a}}(0,e,i,s),c=wm(t,e,o.root,o.align,"r"===n);"r"===n&&(c=ty(c,(function(t){return-t}))),r[a+n]=c}))}));var a=function(t,e){return bm(zf(e),(function(e){var n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;return _m(e,(function(e,r){var a=function(t,e){return t.node(e).width}(t,r)/2;n=Math.max(e+a,n),i=Math.min(e-a,i)})),n-i}))}(t,r);return function(t,e){var n=zf(e),i=ny(n),r=Kg(n);ld(["u","d"],(function(n){ld(["l","r"],(function(a){var s,o=n+a,c=t[o];if(c!==e){var l=zf(c);(s="l"===a?i-ny(l):r-Kg(l))&&(t[o]=ty(c,(function(t){return t+s})))}}))}))}(r,a),function(t,e){return ty(t.ul,(function(n,i){if(e)return t[e.toLowerCase()][i];var r=em(Zp(t,i));return(r[1]+r[2])/2}))}(r,t.graph().align)}function Cm(t){(function(t){var e=oy(t),n=t.graph().ranksep,i=0;ld(e,(function(e){var r=Kg(Zp(e,(function(e){return t.node(e).height})));ld(e,(function(e){t.node(e).y=i+r/2})),i+=r+n}))})(t=ay(t)),ld(Tm(t),(function(e,n){t.node(n).x=e}))}function Em(t,e){var n=e&&e.debugTiming?hy:uy;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new Vf({multigraph:!0,compound:!0}),n=Fm(t.graph());return e.setGraph(jg({},Am,Im(n,Sm),Hg(n,Dm))),ld(t.nodes(),(function(n){var i=Fm(t.node(n));e.setNode(n,Xg(Im(i,Lm),Nm)),e.setParent(n,t.parent(n))})),ld(t.edges(),(function(n){var i=Fm(t.edge(n));e.setEdge(n,jg({},Bm,Im(i,Om),Hg(i,Mm)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,ld(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){ld(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){ag(t)})),e(" nestingGraph.run",(function(){by(t)})),e(" rank",(function(){!function(t){switch(t.graph().ranker){case"network-simplex":default:db(t);break;case"tight-tree":!function(t){Rm(t),Pm(t)}(t);break;case"longest-path":ub(t)}}(ay(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};ry(t,"edge-proxy",r,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){!function(t){var e=ny(Zp(t.nodes(),(function(e){return t.node(e).rank}))),n=[];ld(t.nodes(),(function(i){var r=t.node(i).rank-e;n[r]||(n[r]=[]),n[r].push(i)}));var i=0,r=t.graph().nodeRankFactor;ld(n,(function(e,n){_f(e)&&n%r!=0?--i:i&&ld(e,(function(e){t.node(e).rank+=i}))}))}(t)})),e(" nestingGraph.cleanup",(function(){!function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,ld(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}(t)})),e(" normalizeRanks",(function(){!function(t){var e=ny(Zp(t.nodes(),(function(e){return t.node(e).rank})));ld(t.nodes(),(function(n){var i=t.node(n);Ld(i,"rank")&&(i.rank-=e)}))}(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;ld(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=Kg(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){ld(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){!function(t){t.graph().dummyChains=[],ld(t.edges(),(function(e){!function(t,e){var n,i,r,a=e.v,s=t.node(a).rank,o=e.w,c=t.node(o).rank,l=e.name,h=t.edge(e),u=h.labelRank;if(c===s+1)return;for(t.removeEdge(e),r=0,++s;s<c;++r,++s)h.points=[],n=ry(t,"edge",i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:s},"_d"),s===u&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(a,n,{weight:h.weight},l),0===r&&t.graph().dummyChains.push(n),a=n;t.setEdge(a,o,{weight:h.weight},l)}(t,e)}))}(t)})),e(" parentDummyChains",(function(){dm(t)})),e(" addBorderSegments",(function(){!function(t){ld(t.children(),(function e(n){var i=t.children(n),r=t.node(n);if(i.length&&ld(i,e),Ld(r,"minRank")){r.borderLeft=[],r.borderRight=[];for(var a=r.minRank,s=r.maxRank+1;a<s;++a)dy(t,"borderLeft","_bl",n,r,a),dy(t,"borderRight","_br",n,r,a)}}))}(t)})),e(" order",(function(){cm(t)})),e(" insertSelfEdges",(function(){!function(t){var e=oy(t);ld(e,(function(e){var n=0;ld(e,(function(e,i){var r=t.node(e);r.order=i+n,ld(r.selfEdges,(function(e){ry(t,"selfedge",{width:e.label.width,height:e.label.height,rank:r.rank,order:i+ ++n,e:e.e,label:e.label},"_se")})),delete r.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){!function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||fy(t)}(t)})),e(" position",(function(){Cm(t)})),e(" positionSelfEdges",(function(){!function(t){ld(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,a=i.y,s=n.x-r,o=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:a-o},{x:r+5*s/6,y:a-o},{x:r+s,y:a},{x:r+5*s/6,y:a+o},{x:r+2*s/3,y:a+o}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){ld(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),r=t.node(n.borderBottom),a=t.node(Jg(n.borderLeft)),s=t.node(Jg(n.borderRight));n.width=Math.abs(s.x-a.x),n.height=Math.abs(r.y-i.y),n.x=a.x+n.width/2,n.y=i.y+n.height/2}})),ld(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){!function(t){ld(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);if(Ld(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){py(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,i=Number.POSITIVE_INFINITY,r=0,a=t.graph(),s=a.marginx||0,o=a.marginy||0;function c(t){var a=t.x,s=t.y,o=t.width,c=t.height;e=Math.min(e,a-o/2),n=Math.max(n,a+o/2),i=Math.min(i,s-c/2),r=Math.max(r,s+c/2)}ld(t.nodes(),(function(e){c(t.node(e))})),ld(t.edges(),(function(e){var n=t.edge(e);Ld(n,"x")&&c(n)})),e-=s,i-=o,ld(t.nodes(),(function(n){var r=t.node(n);r.x-=e,r.y-=i})),ld(t.edges(),(function(n){var r=t.edge(n);ld(r.points,(function(t){t.x-=e,t.y-=i})),Ld(r,"x")&&(r.x-=e),Ld(r,"y")&&(r.y-=i)})),a.width=n-e+s,a.height=r-i+o}(t)})),e(" assignNodeIntersects",(function(){!function(t){ld(t.edges(),(function(e){var n,i,r=t.edge(e),a=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=a),r.points.unshift(sy(a,n)),r.points.push(sy(s,i))}))}(t)})),e(" reversePoints",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){ld(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),ld(t.edges(),(function(n){var i=t.edge(n),r=e.edge(n);i.points=r.points,Ld(r,"x")&&(i.x=r.x,i.y=r.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))}var Sm=["nodesep","edgesep","ranksep","marginx","marginy"],Am={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},Dm=["acyclicer","ranker","rankdir","align"],Lm=["width","height"],Nm={width:0,height:0},Om=["minlen","weight","width","height","labeloffset"],Bm={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},Mm=["labelpos"];function Im(t,e){return ty(Hg(t,e),Number)}function Fm(t){var e={};return ld(t,(function(t,n){e[n.toLowerCase()]=t})),e}function Rm(t){var e={};ld(t.sources(),(function n(i){var r=t.node(i);if(Ld(e,i))return r.rank;e[i]=!0;var a=ny(Zp(t.outEdges(i),(function(e){return n(e.w)-t.edge(e).minlen})));return a!==Number.POSITIVE_INFINITY&&null!=a||(a=0),r.rank=a}))}function $m(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}function Pm(t){var e,n,i=new Vf({directed:!1}),r=t.nodes()[0],a=t.nodeCount();for(i.setNode(r,{});jm(i,t)<a;)e=Ym(i,t),n=i.hasNode(e.v)?$m(t,e):-$m(t,e),zm(i,t,n);return i}function jm(t,e){return ld(t.nodes(),(function n(i){ld(e.nodeEdges(i),(function(r){var a=r.v,s=i===a?r.w:a;t.hasNode(s)||$m(e,r)||(t.setNode(s,{}),t.setEdge(i,s,{}),n(s))}))})),t.nodeCount()}function Ym(t,e){return bm(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return $m(e,n)}))}function zm(t,e,n){ld(t.nodes(),(function(t){e.node(t).rank+=n}))}Nd(1);Nd(1);Hp("length");RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var Um="[\\ud800-\\udfff]",Wm="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Hm="\\ud83c[\\udffb-\\udfff]",qm="[^\\ud800-\\udfff]",Vm="(?:\\ud83c[\\udde6-\\uddff]){2}",Gm="[\\ud800-\\udbff][\\udc00-\\udfff]",Xm="(?:"+Wm+"|"+Hm+")"+"?",Zm="[\\ufe0e\\ufe0f]?",Qm=Zm+Xm+("(?:\\u200d(?:"+[qm,Vm,Gm].join("|")+")"+Zm+Xm+")*"),Km="(?:"+[qm+Wm+"?",Wm,Vm,Gm,Um].join("|")+")";RegExp(Hm+"(?="+Hm+")|"+Km+Qm,"g");function Jm(){}function tb(t,e,n){Lu(e)||(e=[e]);var i=(t.isDirected()?t.successors:t.neighbors).bind(t),r=[],a={};return ld(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);eb(t,e,"post"===n,a,i,r)})),r}function eb(t,e,n,i,r,a){Ld(i,e)||(i[e]=!0,n||a.push(e),ld(r(e),(function(e){eb(t,e,n,i,r,a)})),n&&a.push(e))}function nb(t){t=function(t){var e=(new Vf).setGraph(t.graph());return ld(t.nodes(),(function(n){e.setNode(n,t.node(n))})),ld(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e}(t),Rm(t);var e,n=Pm(t);for(ab(n),ib(n,t);e=ob(n);)lb(n,t,e,cb(n,t,e))}function ib(t,e){var n=function(t,e){return tb(t,e,"post")}(t,t.nodes());n=n.slice(0,n.length-1),ld(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=rb(t,e,n)}(t,e,n)}))}function rb(t,e,n){var i=t.node(n).parent,r=!0,a=e.edge(n,i),s=0;return a||(r=!1,a=e.edge(i,n)),s=a.weight,ld(e.nodeEdges(n),(function(a){var o,c,l=a.v===n,h=l?a.w:a.v;if(h!==i){var u=l===r,d=e.edge(a).weight;if(s+=u?d:-d,o=n,c=h,t.hasEdge(o,c)){var p=t.edge(n,h).cutvalue;s+=u?-p:p}}})),s}function ab(t,e){arguments.length<2&&(e=t.nodes()[0]),sb(t,{},1,e)}function sb(t,e,n,i,r){var a=n,s=t.node(i);return e[i]=!0,ld(t.neighbors(i),(function(r){Ld(e,r)||(n=sb(t,e,n,r,i))})),s.low=a,s.lim=n++,r?s.parent=r:delete s.parent,n}function ob(t){return mm(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function cb(t,e,n){var i=n.v,r=n.w;e.hasEdge(i,r)||(i=n.w,r=n.v);var a=t.node(i),s=t.node(r),o=a,c=!1;a.lim>s.lim&&(o=s,c=!0);var l=yf(e.edges(),(function(e){return c===hb(t,t.node(e.v),o)&&c!==hb(t,t.node(e.w),o)}));return bm(l,(function(t){return $m(e,t)}))}function lb(t,e,n,i){var r=n.v,a=n.w;t.removeEdge(r,a),t.setEdge(i.v,i.w,{}),ab(t),ib(t,e),function(t,e){var n=mm(t.nodes(),(function(t){return!e.node(t).parent})),i=function(t,e){return tb(t,e,"pre")}(t,n);i=i.slice(1),ld(i,(function(n){var i=t.node(n).parent,r=e.edge(n,i),a=!1;r||(r=e.edge(i,n),a=!0),e.node(n).rank=e.node(i).rank+(a?r.minlen:-r.minlen)}))}(t,e)}function hb(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}Jm.prototype=new Error,nb.initLowLimValues=ab,nb.initCutValues=ib,nb.calcCutValue=rb,nb.leaveEdge=ob,nb.enterEdge=cb,nb.exchangeEdges=lb;var ub=Rm;function db(t){nb(t)}const pb=function(t){return qy(t,4)};function fb(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:gb(t),edges:yb(t)};return _f(t.graph())||(e.value=pb(t.graph())),e}function gb(t){return Zp(t.nodes(),(function(e){var n=t.node(e),i=t.parent(e),r={v:e};return _f(n)||(r.value=n),_f(i)||(r.parent=i),r}))}function yb(t){return Zp(t.edges(),(function(e){var n=t.edge(e),i={v:e.v,w:e.w};return _f(e.name)||(i.name=e.name),_f(n)||(i.value=n),i}))}const mb={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let bb;const _b=new Uint8Array(16);function xb(){if(!bb&&(bb="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!bb))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return bb(_b)}const vb=[];for(let c=0;c<256;++c)vb.push((c+256).toString(16).slice(1));function kb(t,e=0){return(vb[t[e+0]]+vb[t[e+1]]+vb[t[e+2]]+vb[t[e+3]]+"-"+vb[t[e+4]]+vb[t[e+5]]+"-"+vb[t[e+6]]+vb[t[e+7]]+"-"+vb[t[e+8]]+vb[t[e+9]]+"-"+vb[t[e+10]]+vb[t[e+11]]+vb[t[e+12]]+vb[t[e+13]]+vb[t[e+14]]+vb[t[e+15]]).toLowerCase()}const wb=function(t,e,n){if(mb.randomUUID&&!e&&!t)return mb.randomUUID();const i=(t=t||{}).random||(t.rng||xb)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,e){n=n||0;for(let t=0;t<16;++t)e[n+t]=i[t];return e}return kb(i)};function Tb(t,e){e&&t.attr("style",e)}function Cb(t,e){var n=t.append("foreignObject").attr("width","100000"),i=n.append("xhtml:div");i.attr("xmlns","http://www.w3.org/1999/xhtml");var r=e.label;switch(typeof r){case"function":i.insert(r);break;case"object":i.insert((function(){return r}));break;default:i.html(r)}Tb(i,e.labelStyle),i.style("display","inline-block"),i.style("white-space","nowrap");var a=i.node().getBoundingClientRect();return n.attr("width",a.width).attr("height",a.height),n}var Eb=Object.defineProperty,Sb=(t,e,n)=>(((t,e,n)=>{e in t?Eb(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n})(t,"symbol"!=typeof e?e+"":e,n),n);const Ab={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},Db={trace:(...t)=>{},debug:(...t)=>{},info:(...t)=>{},warn:(...t)=>{},error:(...t)=>{},fatal:(...t)=>{}},Lb=function(t="fatal"){let e=Ab.fatal;"string"==typeof t?(t=t.toLowerCase())in Ab&&(e=Ab[t]):"number"==typeof t&&(e=t),Db.trace=()=>{},Db.debug=()=>{},Db.info=()=>{},Db.warn=()=>{},Db.error=()=>{},Db.fatal=()=>{},e<=Ab.fatal&&(Db.fatal=console.error?console.error.bind(console,Nb("FATAL"),"color: orange"):console.log.bind(console,"\x1b[35m",Nb("FATAL"))),e<=Ab.error&&(Db.error=console.error?console.error.bind(console,Nb("ERROR"),"color: orange"):console.log.bind(console,"\x1b[31m",Nb("ERROR"))),e<=Ab.warn&&(Db.warn=console.warn?console.warn.bind(console,Nb("WARN"),"color: orange"):console.log.bind(console,"\x1b[33m",Nb("WARN"))),e<=Ab.info&&(Db.info=console.info?console.info.bind(console,Nb("INFO"),"color: lightblue"):console.log.bind(console,"\x1b[34m",Nb("INFO"))),e<=Ab.debug&&(Db.debug=console.debug?console.debug.bind(console,Nb("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Nb("DEBUG"))),e<=Ab.trace&&(Db.trace=console.debug?console.debug.bind(console,Nb("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Nb("TRACE")))},Nb=t=>`%c${_t().format("ss.SSS")} : ${t} : `,Ob=t=>Gc.sanitize(t),Bb=(t,e)=>{var n;if(!1!==(null==(n=e.flowchart)?void 0:n.htmlLabels)){const n=e.securityLevel;"antiscript"===n||"strict"===n?t=Ob(t):"loose"!==n&&(t=(t=(t=Rb(t)).replace(/</g,"<").replace(/>/g,">")).replace(/=/g,"="),t=Fb(t))}return t},Mb=(t,e)=>t?t=e.dompurifyConfig?Gc.sanitize(Bb(t,e),e.dompurifyConfig).toString():Gc.sanitize(Bb(t,e),{FORBID_TAGS:["style"]}).toString():t,Ib=/<br\s*\/?>/gi,Fb=t=>t.replace(/#br#/g,"<br/>"),Rb=t=>t.replace(Ib,"#br#"),$b=t=>!1!==t&&!["false","null","0"].includes(String(t).trim().toLowerCase()),Pb=function(t){let e=t;return t.includes("~")?(e=e.replace(/~([^~].*)/,"<$1"),e=e.replace(/~([^~]*)$/,">$1"),Pb(e)):e},jb={getRows:t=>{if(!t)return[""];return Rb(t).replace(/\\n/g,"#br#").split("#br#")},sanitizeText:Mb,sanitizeTextOrArray:(t,e)=>"string"==typeof t?Mb(t,e):t.flat().map((t=>Mb(t,e))),hasBreaks:t=>Ib.test(t),splitBreaks:t=>t.split(Ib),lineBreakRegex:Ib,removeScript:Ob,getUrl:t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=e.replaceAll(/\(/g,"\\("),e=e.replaceAll(/\)/g,"\\)")),e},evaluate:$b},Yb=(t,e)=>ml(t,e?{s:-40,l:10}:{s:-40,l:-10}),zb="#ffffff",Ub="#f2f2f2";class Wb{constructor(){this.background="#f4f4f4",this.darkMode=!1,this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||ml(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||ml(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Yb(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Yb(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||xl(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||xl(this.tertiaryColor),this.lineColor=this.lineColor||xl(this.background),this.textColor=this.textColor||this.primaryTextColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?kl(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||"grey",this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||kl(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||xl(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||wl(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330}),this.darkMode)for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],75);else for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||xl(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this.darkMode?this["cScalePeer"+t]=this["cScalePeer"+t]||wl(this["cScale"+t],10):this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||this.labelTextColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;this.classText=this.classText||this.textColor,this.fillType0=this.fillType0||this.primaryColor,this.fillType1=this.fillType1||this.secondaryColor,this.fillType2=this.fillType2||ml(this.primaryColor,{h:64}),this.fillType3=this.fillType3||ml(this.secondaryColor,{h:64}),this.fillType4=this.fillType4||ml(this.primaryColor,{h:-64}),this.fillType5=this.fillType5||ml(this.secondaryColor,{h:-64}),this.fillType6=this.fillType6||ml(this.primaryColor,{h:128}),this.fillType7=this.fillType7||ml(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||ml(this.primaryColor,{l:-10}),this.pie5=this.pie5||ml(this.secondaryColor,{l:-10}),this.pie6=this.pie6||ml(this.tertiaryColor,{l:-10}),this.pie7=this.pie7||ml(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||ml(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||ml(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||ml(this.primaryColor,{h:60,l:-20}),this.pie11=this.pie11||ml(this.primaryColor,{h:-60,l:-20}),this.pie12=this.pie12||ml(this.primaryColor,{h:120,l:-10}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?kl(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||ml(this.primaryColor,{h:-30}),this.git4=this.git4||ml(this.primaryColor,{h:-60}),this.git5=this.git5||ml(this.primaryColor,{h:-90}),this.git6=this.git6||ml(this.primaryColor,{h:60}),this.git7=this.git7||ml(this.primaryColor,{h:120}),this.darkMode?(this.git0=wl(this.git0,25),this.git1=wl(this.git1,25),this.git2=wl(this.git2,25),this.git3=wl(this.git3,25),this.git4=wl(this.git4,25),this.git5=wl(this.git5,25),this.git6=wl(this.git6,25),this.git7=wl(this.git7,25)):(this.git0=kl(this.git0,25),this.git1=kl(this.git1,25),this.git2=kl(this.git2,25),this.git3=kl(this.git3,25),this.git4=kl(this.git4,25),this.git5=kl(this.git5,25),this.git6=kl(this.git6,25),this.git7=kl(this.git7,25)),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.branchLabelColor=this.branchLabelColor||(this.darkMode?"black":this.labelTextColor),this.gitBranchLabel0=this.gitBranchLabel0||this.branchLabelColor,this.gitBranchLabel1=this.gitBranchLabel1||this.branchLabelColor,this.gitBranchLabel2=this.gitBranchLabel2||this.branchLabelColor,this.gitBranchLabel3=this.gitBranchLabel3||this.branchLabelColor,this.gitBranchLabel4=this.gitBranchLabel4||this.branchLabelColor,this.gitBranchLabel5=this.gitBranchLabel5||this.branchLabelColor,this.gitBranchLabel6=this.gitBranchLabel6||this.branchLabelColor,this.gitBranchLabel7=this.gitBranchLabel7||this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class Hb{constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=wl(this.primaryColor,16),this.tertiaryColor=ml(this.primaryColor,{h:-160}),this.primaryBorderColor=xl(this.background),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.tertiaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=wl(xl("#323D47"),10),this.lineColor="calculated",this.border1="#81B1DB",this.border2=bl(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=kl("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.taskBorderColor=bl(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=bl(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=wl(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=wl(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.mainContrastColor,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=wl(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||xl(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScalePeer"+t]=this["cScalePeer"+t]||wl(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.classText=this.primaryTextColor,this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?kl(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=wl(this.secondaryColor,20),this.git1=wl(this.pie2||this.secondaryColor,20),this.git2=wl(this.pie3||this.tertiaryColor,20),this.git3=wl(this.pie4||ml(this.primaryColor,{h:-30}),20),this.git4=wl(this.pie5||ml(this.primaryColor,{h:-60}),20),this.git5=wl(this.pie6||ml(this.primaryColor,{h:-90}),10),this.git6=wl(this.pie7||ml(this.primaryColor,{h:60}),10),this.git7=wl(this.pie8||ml(this.primaryColor,{h:120}),20),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||wl(this.background,12),this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||wl(this.background,2)}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class qb{constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=ml(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=ml(this.primaryColor,{h:-160}),this.primaryBorderColor=Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.tertiaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#e8e8e8",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=bl(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||kl(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||kl(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||ml(this["cScale"+t],{h:180});if(this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor,"calculated"!==this.labelTextColor){this.cScaleLabel0=this.cScaleLabel0||xl(this.labelTextColor),this.cScaleLabel3=this.cScaleLabel3||xl(this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.labelTextColor}this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.textColor,this.edgeLabelBackground=this.labelBackground,this.actorBorder=wl(this.border1,23),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.signalColor=this.textColor,this.signalTextColor=this.textColor,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||ml(this.tertiaryColor,{l:-40}),this.pie4=this.pie4||ml(this.primaryColor,{l:-10}),this.pie5=this.pie5||ml(this.secondaryColor,{l:-30}),this.pie6=this.pie6||ml(this.tertiaryColor,{l:-20}),this.pie7=this.pie7||ml(this.primaryColor,{h:60,l:-20}),this.pie8=this.pie8||ml(this.primaryColor,{h:-60,l:-40}),this.pie9=this.pie9||ml(this.primaryColor,{h:120,l:-40}),this.pie10=this.pie10||ml(this.primaryColor,{h:60,l:-40}),this.pie11=this.pie11||ml(this.primaryColor,{h:-90,l:-40}),this.pie12=this.pie12||ml(this.primaryColor,{h:120,l:-30}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.labelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||ml(this.primaryColor,{h:-30}),this.git4=this.git4||ml(this.primaryColor,{h:-60}),this.git5=this.git5||ml(this.primaryColor,{h:-90}),this.git6=this.git6||ml(this.primaryColor,{h:60}),this.git7=this.git7||ml(this.primaryColor,{h:120}),this.darkMode?(this.git0=wl(this.git0,25),this.git1=wl(this.git1,25),this.git2=wl(this.git2,25),this.git3=wl(this.git3,25),this.git4=wl(this.git4,25),this.git5=wl(this.git5,25),this.git6=wl(this.git6,25),this.git7=wl(this.git7,25)):(this.git0=kl(this.git0,25),this.git1=kl(this.git1,25),this.git2=kl(this.git2,25),this.git3=kl(this.git3,25),this.git4=kl(this.git4,25),this.git5=kl(this.git5,25),this.git6=kl(this.git6,25),this.git7=kl(this.git7,25)),this.gitInv0=this.gitInv0||kl(xl(this.git0),25),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.gitBranchLabel0=this.gitBranchLabel0||xl(this.labelTextColor),this.gitBranchLabel1=this.gitBranchLabel1||this.labelTextColor,this.gitBranchLabel2=this.gitBranchLabel2||this.labelTextColor,this.gitBranchLabel3=this.gitBranchLabel3||xl(this.labelTextColor),this.gitBranchLabel4=this.gitBranchLabel4||this.labelTextColor,this.gitBranchLabel5=this.gitBranchLabel5||this.labelTextColor,this.gitBranchLabel6=this.gitBranchLabel6||this.labelTextColor,this.gitBranchLabel7=this.gitBranchLabel7||this.labelTextColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class Vb{constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=wl("#cde498",10),this.primaryBorderColor=Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.primaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||kl(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||kl(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||ml(this["cScale"+t],{h:180});this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.actorBorder=kl(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskBorderColor=this.border1,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||ml(this.primaryColor,{l:-30}),this.pie5=this.pie5||ml(this.secondaryColor,{l:-30}),this.pie6=this.pie6||ml(this.tertiaryColor,{h:40,l:-40}),this.pie7=this.pie7||ml(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||ml(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||ml(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||ml(this.primaryColor,{h:60,l:-50}),this.pie11=this.pie11||ml(this.primaryColor,{h:-60,l:-50}),this.pie12=this.pie12||ml(this.primaryColor,{h:120,l:-50}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||ml(this.primaryColor,{h:-30}),this.git4=this.git4||ml(this.primaryColor,{h:-60}),this.git5=this.git5||ml(this.primaryColor,{h:-90}),this.git6=this.git6||ml(this.primaryColor,{h:60}),this.git7=this.git7||ml(this.primaryColor,{h:120}),this.darkMode?(this.git0=wl(this.git0,25),this.git1=wl(this.git1,25),this.git2=wl(this.git2,25),this.git3=wl(this.git3,25),this.git4=wl(this.git4,25),this.git5=wl(this.git5,25),this.git6=wl(this.git6,25),this.git7=wl(this.git7,25)):(this.git0=kl(this.git0,25),this.git1=kl(this.git1,25),this.git2=kl(this.git2,25),this.git3=kl(this.git3,25),this.git4=kl(this.git4,25),this.git5=kl(this.git5,25),this.git6=kl(this.git6,25),this.git7=kl(this.git7,25)),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class Gb{constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=wl(this.contrast,55),this.background="#ffffff",this.tertiaryColor=ml(this.primaryColor,{h:-160}),this.primaryBorderColor=Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.tertiaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=wl(this.contrast,55),this.border2=this.contrast,this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||xl(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this.darkMode?this["cScalePeer"+t]=this["cScalePeer"+t]||wl(this["cScale"+t],10):this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor),this.cScaleLabel0=this.cScaleLabel0||this.cScale1,this.cScaleLabel2=this.cScaleLabel2||this.cScale1;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.text,this.actorBorder=wl(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.lineColor,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.sectionBkgColor=wl(this.contrast,30),this.sectionBkgColor2=wl(this.contrast,30),this.taskBorderColor=kl(this.contrast,10),this.taskBkgColor=this.contrast,this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor=this.text,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.gridColor=wl(this.border1,30),this.doneTaskBkgColor=this.done,this.doneTaskBorderColor=this.lineColor,this.critBkgColor=this.critical,this.critBorderColor=kl(this.critBkgColor,10),this.todayLineColor=this.critBkgColor,this.transitionColor=this.transitionColor||"#000",this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f4f4f4",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.stateBorder=this.stateBorder||"#000",this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#222",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pie12=this.pie0,this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=kl(this.pie1,25)||this.primaryColor,this.git1=this.pie2||this.secondaryColor,this.git2=this.pie3||this.tertiaryColor,this.git3=this.pie4||ml(this.primaryColor,{h:-30}),this.git4=this.pie5||ml(this.primaryColor,{h:-60}),this.git5=this.pie6||ml(this.primaryColor,{h:-90}),this.git6=this.pie7||ml(this.primaryColor,{h:60}),this.git7=this.pie8||ml(this.primaryColor,{h:120}),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.branchLabelColor=this.branchLabelColor||this.labelTextColor,this.gitBranchLabel0=this.branchLabelColor,this.gitBranchLabel1="white",this.gitBranchLabel2=this.branchLabelColor,this.gitBranchLabel3="white",this.gitBranchLabel4=this.branchLabelColor,this.gitBranchLabel5=this.branchLabelColor,this.gitBranchLabel6=this.branchLabelColor,this.gitBranchLabel7=this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}const Xb={base:{getThemeVariables:t=>{const e=new Wb;return e.calculate(t),e}},dark:{getThemeVariables:t=>{const e=new Hb;return e.calculate(t),e}},default:{getThemeVariables:t=>{const e=new qb;return e.calculate(t),e}},forest:{getThemeVariables:t=>{const e=new Vb;return e.calculate(t),e}},neutral:{getThemeVariables:t=>{const e=new Gb;return e.calculate(t),e}}},Zb={theme:"default",themeVariables:Xb.default.getThemeVariables(),themeCSS:void 0,maxTextSize:5e4,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize"],deterministicIds:!1,deterministicIDSeed:void 0,flowchart:{titleTopMargin:25,diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},sequence:{hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20,messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},noteFont:function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},actorFont:function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}}},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",tickInterval:void 0,useMaxWidth:!0,topAxis:!1,useWidth:void 0},journey:{diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},class:{titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},state:{titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},er:{titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,stroke:"gray",fill:"honeydew",fontSize:12,useMaxWidth:!0},pie:{useWidth:void 0,useMaxWidth:!0},requirement:{useWidth:void 0,useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},gitGraph:{titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0},c4:{useWidth:void 0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,useMaxWidth:!0,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,personFont:function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},external_personFont:function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},systemFont:function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},external_systemFont:function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},system_dbFont:function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},external_system_dbFont:function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},system_queueFont:function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},external_system_queueFont:function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},containerFont:function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},external_containerFont:function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},container_dbFont:function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},external_container_dbFont:function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},container_queueFont:function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},external_container_queueFont:function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},componentFont:function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},external_componentFont:function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},component_dbFont:function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},external_component_dbFont:function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},component_queueFont:function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},external_component_queueFont:function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},boundaryFont:function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},fontSize:16};Zb.class&&(Zb.class.arrowMarkerAbsolute=Zb.arrowMarkerAbsolute),Zb.gitGraph&&(Zb.gitGraph.arrowMarkerAbsolute=Zb.arrowMarkerAbsolute);const Qb=(t,e="")=>Object.keys(t).reduce(((n,i)=>Array.isArray(t[i])?n:"object"==typeof t[i]&&null!==t[i]?[...n,e+i,...Qb(t[i],"")]:[...n,e+i]),[]),Kb=Qb(Zb,""),Jb=Zb;function t_(t){return null==t}var e_=function(t,e){var n,i="";for(n=0;n<e;n+=1)i+=t;return i},n_=function(t){return 0===t&&Number.NEGATIVE_INFINITY===1/t},i_={isNothing:t_,isObject:function(t){return"object"==typeof t&&null!==t},toArray:function(t){return Array.isArray(t)?t:t_(t)?[]:[t]},repeat:e_,isNegativeZero:n_,extend:function(t,e){var n,i,r,a;if(e)for(n=0,i=(a=Object.keys(e)).length;n<i;n+=1)t[r=a[n]]=e[r];return t}};function r_(t,e){var n="",i=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(n+='in "'+t.mark.name+'" '),n+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(n+="\n\n"+t.mark.snippet),i+" "+n):i}function a_(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=r_(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}a_.prototype=Object.create(Error.prototype),a_.prototype.constructor=a_,a_.prototype.toString=function(t){return this.name+": "+r_(this,t)};var s_=a_;function o_(t,e,n,i,r){var a="",s="",o=Math.floor(r/2)-1;return i-e>o&&(e=i-o+(a=" ... ").length),n-i>o&&(n=i+o-(s=" ...").length),{str:a+t.slice(e,n).replace(/\t/g,"\u2192")+s,pos:i-e+a.length}}function c_(t,e){return i_.repeat(" ",e-t.length)+t}var l_=function(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),"number"!=typeof e.indent&&(e.indent=1),"number"!=typeof e.linesBefore&&(e.linesBefore=3),"number"!=typeof e.linesAfter&&(e.linesAfter=2);for(var n,i=/\r?\n|\r|\0/g,r=[0],a=[],s=-1;n=i.exec(t.buffer);)a.push(n.index),r.push(n.index+n[0].length),t.position<=n.index&&s<0&&(s=r.length-2);s<0&&(s=r.length-1);var o,c,l="",h=Math.min(t.line+e.linesAfter,a.length).toString().length,u=e.maxLength-(e.indent+h+3);for(o=1;o<=e.linesBefore&&!(s-o<0);o++)c=o_(t.buffer,r[s-o],a[s-o],t.position-(r[s]-r[s-o]),u),l=i_.repeat(" ",e.indent)+c_((t.line-o+1).toString(),h)+" | "+c.str+"\n"+l;for(c=o_(t.buffer,r[s],a[s],t.position,u),l+=i_.repeat(" ",e.indent)+c_((t.line+1).toString(),h)+" | "+c.str+"\n",l+=i_.repeat("-",e.indent+h+3+c.pos)+"^\n",o=1;o<=e.linesAfter&&!(s+o>=a.length);o++)c=o_(t.buffer,r[s+o],a[s+o],t.position-(r[s]-r[s+o]),u),l+=i_.repeat(" ",e.indent)+c_((t.line+o+1).toString(),h)+" | "+c.str+"\n";return l.replace(/\n$/,"")},h_=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],u_=["scalar","sequence","mapping"];var d_=function(t,e){var n,i;if(e=e||{},Object.keys(e).forEach((function(e){if(-1===h_.indexOf(e))throw new s_('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')})),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=(n=e.styleAliases||null,i={},null!==n&&Object.keys(n).forEach((function(t){n[t].forEach((function(e){i[String(e)]=t}))})),i),-1===u_.indexOf(this.kind))throw new s_('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')};function p_(t,e){var n=[];return t[e].forEach((function(t){var e=n.length;n.forEach((function(n,i){n.tag===t.tag&&n.kind===t.kind&&n.multi===t.multi&&(e=i)})),n[e]=t})),n}function f_(t){return this.extend(t)}f_.prototype.extend=function(t){var e=[],n=[];if(t instanceof d_)n.push(t);else if(Array.isArray(t))n=n.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new s_("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(n=n.concat(t.explicit))}e.forEach((function(t){if(!(t instanceof d_))throw new s_("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(t.loadKind&&"scalar"!==t.loadKind)throw new s_("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(t.multi)throw new s_("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(t){if(!(t instanceof d_))throw new s_("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var i=Object.create(f_.prototype);return i.implicit=(this.implicit||[]).concat(e),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=p_(i,"implicit"),i.compiledExplicit=p_(i,"explicit"),i.compiledTypeMap=function(){var t,e,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(t){t.multi?(n.multi[t.kind].push(t),n.multi.fallback.push(t)):n[t.kind][t.tag]=n.fallback[t.tag]=t}for(t=0,e=arguments.length;t<e;t+=1)arguments[t].forEach(i);return n}(i.compiledImplicit,i.compiledExplicit),i};var g_=f_,y_=new d_("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return null!==t?t:""}}),m_=new d_("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return null!==t?t:[]}}),b_=new d_("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return null!==t?t:{}}}),__=new g_({explicit:[y_,m_,b_]});var x_=new d_("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(t){if(null===t)return!0;var e=t.length;return 1===e&&"~"===t||4===e&&("null"===t||"Null"===t||"NULL"===t)},construct:function(){return null},predicate:function(t){return null===t},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});var v_=new d_("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e=t.length;return 4===e&&("true"===t||"True"===t||"TRUE"===t)||5===e&&("false"===t||"False"===t||"FALSE"===t)},construct:function(t){return"true"===t||"True"===t||"TRUE"===t},predicate:function(t){return"[object Boolean]"===Object.prototype.toString.call(t)},represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"});function k_(t){return 48<=t&&t<=55}function w_(t){return 48<=t&&t<=57}var T_=new d_("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=t.length,r=0,a=!1;if(!i)return!1;if("-"!==(e=t[r])&&"+"!==e||(e=t[++r]),"0"===e){if(r+1===i)return!0;if("b"===(e=t[++r])){for(r++;r<i;r++)if("_"!==(e=t[r])){if("0"!==e&&"1"!==e)return!1;a=!0}return a&&"_"!==e}if("x"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!(48<=(n=t.charCodeAt(r))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;a=!0}return a&&"_"!==e}if("o"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!k_(t.charCodeAt(r)))return!1;a=!0}return a&&"_"!==e}}if("_"===e)return!1;for(;r<i;r++)if("_"!==(e=t[r])){if(!w_(t.charCodeAt(r)))return!1;a=!0}return!(!a||"_"===e)},construct:function(t){var e,n=t,i=1;if(-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),"-"!==(e=n[0])&&"+"!==e||("-"===e&&(i=-1),e=(n=n.slice(1))[0]),"0"===n)return 0;if("0"===e){if("b"===n[1])return i*parseInt(n.slice(2),2);if("x"===n[1])return i*parseInt(n.slice(2),16);if("o"===n[1])return i*parseInt(n.slice(2),8)}return i*parseInt(n,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&t%1==0&&!i_.isNegativeZero(t)},represent:{binary:function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),C_=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var E_=/^[-+]?[0-9]+e/;var S_=new d_("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(t){return null!==t&&!(!C_.test(t)||"_"===t[t.length-1])},construct:function(t){var e,n;return n="-"===(e=t.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),".inf"===e?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:n*parseFloat(e,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&(t%1!=0||i_.isNegativeZero(t))},represent:function(t,e){var n;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(i_.isNegativeZero(t))return"-0.0";return n=t.toString(10),E_.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"}),A_=__.extend({implicit:[x_,v_,T_,S_]}),D_=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),L_=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var N_=new d_("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(t){return null!==t&&(null!==D_.exec(t)||null!==L_.exec(t))},construct:function(t){var e,n,i,r,a,s,o,c,l=0,h=null;if(null===(e=D_.exec(t))&&(e=L_.exec(t)),null===e)throw new Error("Date resolve error");if(n=+e[1],i=+e[2]-1,r=+e[3],!e[4])return new Date(Date.UTC(n,i,r));if(a=+e[4],s=+e[5],o=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(h=6e4*(60*+e[10]+ +(e[11]||0)),"-"===e[9]&&(h=-h)),c=new Date(Date.UTC(n,i,r,a,s,o,l)),h&&c.setTime(c.getTime()-h),c},instanceOf:Date,represent:function(t){return t.toISOString()}});var O_=new d_("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(t){return"<<"===t||null===t}}),B_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var M_=new d_("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=0,r=t.length,a=B_;for(n=0;n<r;n++)if(!((e=a.indexOf(t.charAt(n)))>64)){if(e<0)return!1;i+=6}return i%8==0},construct:function(t){var e,n,i=t.replace(/[\r\n=]/g,""),r=i.length,a=B_,s=0,o=[];for(e=0;e<r;e++)e%4==0&&e&&(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)),s=s<<6|a.indexOf(i.charAt(e));return 0===(n=r%4*6)?(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)):18===n?(o.push(s>>10&255),o.push(s>>2&255)):12===n&&o.push(s>>4&255),new Uint8Array(o)},predicate:function(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)},represent:function(t){var e,n,i="",r=0,a=t.length,s=B_;for(e=0;e<a;e++)e%3==0&&e&&(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]),r=(r<<8)+t[e];return 0===(n=a%3)?(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]):2===n?(i+=s[r>>10&63],i+=s[r>>4&63],i+=s[r<<2&63],i+=s[64]):1===n&&(i+=s[r>>2&63],i+=s[r<<4&63],i+=s[64],i+=s[64]),i}}),I_=Object.prototype.hasOwnProperty,F_=Object.prototype.toString;var R_=new d_("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=[],o=t;for(e=0,n=o.length;e<n;e+=1){if(i=o[e],a=!1,"[object Object]"!==F_.call(i))return!1;for(r in i)if(I_.call(i,r)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==s.indexOf(r))return!1;s.push(r)}return!0},construct:function(t){return null!==t?t:[]}}),$_=Object.prototype.toString;var P_=new d_("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1){if(i=s[e],"[object Object]"!==$_.call(i))return!1;if(1!==(r=Object.keys(i)).length)return!1;a[e]=[r[0],i[r[0]]]}return!0},construct:function(t){if(null===t)return[];var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1)i=s[e],r=Object.keys(i),a[e]=[r[0],i[r[0]]];return a}}),j_=Object.prototype.hasOwnProperty;var Y_=new d_("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(t){if(null===t)return!0;var e,n=t;for(e in n)if(j_.call(n,e)&&null!==n[e])return!1;return!0},construct:function(t){return null!==t?t:{}}}),z_=A_.extend({implicit:[N_,O_],explicit:[M_,R_,P_,Y_]}),U_=Object.prototype.hasOwnProperty,W_=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,H_=/[\x85\u2028\u2029]/,q_=/[,\[\]\{\}]/,V_=/^(?:!|!!|![a-z\-]+!)$/i,G_=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function X_(t){return Object.prototype.toString.call(t)}function Z_(t){return 10===t||13===t}function Q_(t){return 9===t||32===t}function K_(t){return 9===t||32===t||10===t||13===t}function J_(t){return 44===t||91===t||93===t||123===t||125===t}function tx(t){var e;return 48<=t&&t<=57?t-48:97<=(e=32|t)&&e<=102?e-97+10:-1}function ex(t){return 48===t?"\0":97===t?"\x07":98===t?"\b":116===t||9===t?"\t":110===t?"\n":118===t?"\v":102===t?"\f":114===t?"\r":101===t?"\x1b":32===t?" ":34===t?'"':47===t?"/":92===t?"\\":78===t?"\x85":95===t?"\xa0":76===t?"\u2028":80===t?"\u2029":""}function nx(t){return t<=65535?String.fromCharCode(t):String.fromCharCode(55296+(t-65536>>10),56320+(t-65536&1023))}for(var ix=new Array(256),rx=new Array(256),ax=0;ax<256;ax++)ix[ax]=ex(ax)?1:0,rx[ax]=ex(ax);function sx(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||z_,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ox(t,e){var n={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return n.snippet=l_(n),new s_(e,n)}function cx(t,e){throw ox(t,e)}function lx(t,e){t.onWarning&&t.onWarning.call(null,ox(t,e))}var hx={YAML:function(t,e,n){var i,r,a;null!==t.version&&cx(t,"duplication of %YAML directive"),1!==n.length&&cx(t,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&cx(t,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),a=parseInt(i[2],10),1!==r&&cx(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=a<2,1!==a&&2!==a&&lx(t,"unsupported YAML version of the document")},TAG:function(t,e,n){var i,r;2!==n.length&&cx(t,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],V_.test(i)||cx(t,"ill-formed tag handle (first argument) of the TAG directive"),U_.call(t.tagMap,i)&&cx(t,'there is a previously declared suffix for "'+i+'" tag handle'),G_.test(r)||cx(t,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(a){cx(t,"tag prefix is malformed: "+r)}t.tagMap[i]=r}};function ux(t,e,n,i){var r,a,s,o;if(e<n){if(o=t.input.slice(e,n),i)for(r=0,a=o.length;r<a;r+=1)9===(s=o.charCodeAt(r))||32<=s&&s<=1114111||cx(t,"expected valid JSON character");else W_.test(o)&&cx(t,"the stream contains non-printable characters");t.result+=o}}function dx(t,e,n,i){var r,a,s,o;for(i_.isObject(n)||cx(t,"cannot merge mappings; the provided source object is unacceptable"),s=0,o=(r=Object.keys(n)).length;s<o;s+=1)a=r[s],U_.call(e,a)||(e[a]=n[a],i[a]=!0)}function px(t,e,n,i,r,a,s,o,c){var l,h;if(Array.isArray(r))for(l=0,h=(r=Array.prototype.slice.call(r)).length;l<h;l+=1)Array.isArray(r[l])&&cx(t,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===X_(r[l])&&(r[l]="[object Object]");if("object"==typeof r&&"[object Object]"===X_(r)&&(r="[object Object]"),r=String(r),null===e&&(e={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(a))for(l=0,h=a.length;l<h;l+=1)dx(t,e,a[l],n);else dx(t,e,a,n);else t.json||U_.call(n,r)||!U_.call(e,r)||(t.line=s||t.line,t.lineStart=o||t.lineStart,t.position=c||t.position,cx(t,"duplicated mapping key")),"__proto__"===r?Object.defineProperty(e,r,{configurable:!0,enumerable:!0,writable:!0,value:a}):e[r]=a,delete n[r];return e}function fx(t){var e;10===(e=t.input.charCodeAt(t.position))?t.position++:13===e?(t.position++,10===t.input.charCodeAt(t.position)&&t.position++):cx(t,"a line break is expected"),t.line+=1,t.lineStart=t.position,t.firstTabInLine=-1}function gx(t,e,n){for(var i=0,r=t.input.charCodeAt(t.position);0!==r;){for(;Q_(r);)9===r&&-1===t.firstTabInLine&&(t.firstTabInLine=t.position),r=t.input.charCodeAt(++t.position);if(e&&35===r)do{r=t.input.charCodeAt(++t.position)}while(10!==r&&13!==r&&0!==r);if(!Z_(r))break;for(fx(t),r=t.input.charCodeAt(t.position),i++,t.lineIndent=0;32===r;)t.lineIndent++,r=t.input.charCodeAt(++t.position)}return-1!==n&&0!==i&&t.lineIndent<n&&lx(t,"deficient indentation"),i}function yx(t){var e,n=t.position;return!(45!==(e=t.input.charCodeAt(n))&&46!==e||e!==t.input.charCodeAt(n+1)||e!==t.input.charCodeAt(n+2)||(n+=3,0!==(e=t.input.charCodeAt(n))&&!K_(e)))}function mx(t,e){1===e?t.result+=" ":e>1&&(t.result+=i_.repeat("\n",e-1))}function bx(t,e){var n,i,r=t.tag,a=t.anchor,s=[],o=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=s),i=t.input.charCodeAt(t.position);0!==i&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,cx(t,"tab characters must not be used in indentation")),45===i)&&K_(t.input.charCodeAt(t.position+1));)if(o=!0,t.position++,gx(t,!0,-1)&&t.lineIndent<=e)s.push(null),i=t.input.charCodeAt(t.position);else if(n=t.line,vx(t,e,3,!1,!0),s.push(t.result),gx(t,!0,-1),i=t.input.charCodeAt(t.position),(t.line===n||t.lineIndent>e)&&0!==i)cx(t,"bad indentation of a sequence entry");else if(t.lineIndent<e)break;return!!o&&(t.tag=r,t.anchor=a,t.kind="sequence",t.result=s,!0)}function _x(t){var e,n,i,r,a=!1,s=!1;if(33!==(r=t.input.charCodeAt(t.position)))return!1;if(null!==t.tag&&cx(t,"duplication of a tag property"),60===(r=t.input.charCodeAt(++t.position))?(a=!0,r=t.input.charCodeAt(++t.position)):33===r?(s=!0,n="!!",r=t.input.charCodeAt(++t.position)):n="!",e=t.position,a){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&62!==r);t.position<t.length?(i=t.input.slice(e,t.position),r=t.input.charCodeAt(++t.position)):cx(t,"unexpected end of the stream within a verbatim tag")}else{for(;0!==r&&!K_(r);)33===r&&(s?cx(t,"tag suffix cannot contain exclamation marks"):(n=t.input.slice(e-1,t.position+1),V_.test(n)||cx(t,"named tag handle cannot contain such characters"),s=!0,e=t.position+1)),r=t.input.charCodeAt(++t.position);i=t.input.slice(e,t.position),q_.test(i)&&cx(t,"tag suffix cannot contain flow indicator characters")}i&&!G_.test(i)&&cx(t,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch(o){cx(t,"tag name is malformed: "+i)}return a?t.tag=i:U_.call(t.tagMap,n)?t.tag=t.tagMap[n]+i:"!"===n?t.tag="!"+i:"!!"===n?t.tag="tag:yaml.org,2002:"+i:cx(t,'undeclared tag handle "'+n+'"'),!0}function xx(t){var e,n;if(38!==(n=t.input.charCodeAt(t.position)))return!1;for(null!==t.anchor&&cx(t,"duplication of an anchor property"),n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!K_(n)&&!J_(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&cx(t,"name of an anchor node must contain at least one character"),t.anchor=t.input.slice(e,t.position),!0}function vx(t,e,n,i,r){var a,s,o,c,l,h,u,d,p,f=1,g=!1,y=!1;if(null!==t.listener&&t.listener("open",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,a=s=o=4===n||3===n,i&&gx(t,!0,-1)&&(g=!0,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)),1===f)for(;_x(t)||xx(t);)gx(t,!0,-1)?(g=!0,o=a,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)):o=!1;if(o&&(o=g||r),1!==f&&4!==n||(d=1===n||2===n?e:e+1,p=t.position-t.lineStart,1===f?o&&(bx(t,p)||function(t,e,n){var i,r,a,s,o,c,l,h=t.tag,u=t.anchor,d={},p=Object.create(null),f=null,g=null,y=null,m=!1,b=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=d),l=t.input.charCodeAt(t.position);0!==l;){if(m||-1===t.firstTabInLine||(t.position=t.firstTabInLine,cx(t,"tab characters must not be used in indentation")),i=t.input.charCodeAt(t.position+1),a=t.line,63!==l&&58!==l||!K_(i)){if(s=t.line,o=t.lineStart,c=t.position,!vx(t,n,2,!1,!0))break;if(t.line===a){for(l=t.input.charCodeAt(t.position);Q_(l);)l=t.input.charCodeAt(++t.position);if(58===l)K_(l=t.input.charCodeAt(++t.position))||cx(t,"a whitespace character is expected after the key-value separator within a block mapping"),m&&(px(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!1,r=!1,f=t.tag,g=t.result;else{if(!b)return t.tag=h,t.anchor=u,!0;cx(t,"can not read an implicit mapping pair; a colon is missed")}}else{if(!b)return t.tag=h,t.anchor=u,!0;cx(t,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===l?(m&&(px(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!0,r=!0):m?(m=!1,r=!0):cx(t,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),t.position+=1,l=i;if((t.line===a||t.lineIndent>e)&&(m&&(s=t.line,o=t.lineStart,c=t.position),vx(t,e,4,!0,r)&&(m?g=t.result:y=t.result),m||(px(t,d,p,f,g,y,s,o,c),f=g=y=null),gx(t,!0,-1),l=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&0!==l)cx(t,"bad indentation of a mapping entry");else if(t.lineIndent<e)break}return m&&px(t,d,p,f,g,null,s,o,c),b&&(t.tag=h,t.anchor=u,t.kind="mapping",t.result=d),b}(t,p,d))||function(t,e){var n,i,r,a,s,o,c,l,h,u,d,p,f=!0,g=t.tag,y=t.anchor,m=Object.create(null);if(91===(p=t.input.charCodeAt(t.position)))s=93,l=!1,a=[];else{if(123!==p)return!1;s=125,l=!0,a={}}for(null!==t.anchor&&(t.anchorMap[t.anchor]=a),p=t.input.charCodeAt(++t.position);0!==p;){if(gx(t,!0,e),(p=t.input.charCodeAt(t.position))===s)return t.position++,t.tag=g,t.anchor=y,t.kind=l?"mapping":"sequence",t.result=a,!0;f?44===p&&cx(t,"expected the node content, but found ','"):cx(t,"missed comma between flow collection entries"),d=null,o=c=!1,63===p&&K_(t.input.charCodeAt(t.position+1))&&(o=c=!0,t.position++,gx(t,!0,e)),n=t.line,i=t.lineStart,r=t.position,vx(t,e,1,!1,!0),u=t.tag,h=t.result,gx(t,!0,e),p=t.input.charCodeAt(t.position),!c&&t.line!==n||58!==p||(o=!0,p=t.input.charCodeAt(++t.position),gx(t,!0,e),vx(t,e,1,!1,!0),d=t.result),l?px(t,a,m,u,h,d,n,i,r):o?a.push(px(t,null,m,u,h,d,n,i,r)):a.push(h),gx(t,!0,e),44===(p=t.input.charCodeAt(t.position))?(f=!0,p=t.input.charCodeAt(++t.position)):f=!1}cx(t,"unexpected end of the stream within a flow collection")}(t,d)?y=!0:(s&&function(t,e){var n,i,r,a,s,o=1,c=!1,l=!1,h=e,u=0,d=!1;if(124===(a=t.input.charCodeAt(t.position)))i=!1;else{if(62!==a)return!1;i=!0}for(t.kind="scalar",t.result="";0!==a;)if(43===(a=t.input.charCodeAt(++t.position))||45===a)1===o?o=43===a?3:2:cx(t,"repeat of a chomping mode identifier");else{if(!((r=48<=(s=a)&&s<=57?s-48:-1)>=0))break;0===r?cx(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?cx(t,"repeat of an indentation width identifier"):(h=e+r-1,l=!0)}if(Q_(a)){do{a=t.input.charCodeAt(++t.position)}while(Q_(a));if(35===a)do{a=t.input.charCodeAt(++t.position)}while(!Z_(a)&&0!==a)}for(;0!==a;){for(fx(t),t.lineIndent=0,a=t.input.charCodeAt(t.position);(!l||t.lineIndent<h)&&32===a;)t.lineIndent++,a=t.input.charCodeAt(++t.position);if(!l&&t.lineIndent>h&&(h=t.lineIndent),Z_(a))u++;else{if(t.lineIndent<h){3===o?t.result+=i_.repeat("\n",c?1+u:u):1===o&&c&&(t.result+="\n");break}for(i?Q_(a)?(d=!0,t.result+=i_.repeat("\n",c?1+u:u)):d?(d=!1,t.result+=i_.repeat("\n",u+1)):0===u?c&&(t.result+=" "):t.result+=i_.repeat("\n",u):t.result+=i_.repeat("\n",c?1+u:u),c=!0,l=!0,u=0,n=t.position;!Z_(a)&&0!==a;)a=t.input.charCodeAt(++t.position);ux(t,n,t.position,!1)}}return!0}(t,d)||function(t,e){var n,i,r;if(39!==(n=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,i=r=t.position;0!==(n=t.input.charCodeAt(t.position));)if(39===n){if(ux(t,i,t.position,!0),39!==(n=t.input.charCodeAt(++t.position)))return!0;i=t.position,t.position++,r=t.position}else Z_(n)?(ux(t,i,r,!0),mx(t,gx(t,!1,e)),i=r=t.position):t.position===t.lineStart&&yx(t)?cx(t,"unexpected end of the document within a single quoted scalar"):(t.position++,r=t.position);cx(t,"unexpected end of the stream within a single quoted scalar")}(t,d)||function(t,e){var n,i,r,a,s,o,c;if(34!==(o=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;0!==(o=t.input.charCodeAt(t.position));){if(34===o)return ux(t,n,t.position,!0),t.position++,!0;if(92===o){if(ux(t,n,t.position,!0),Z_(o=t.input.charCodeAt(++t.position)))gx(t,!1,e);else if(o<256&&ix[o])t.result+=rx[o],t.position++;else if((s=120===(c=o)?2:117===c?4:85===c?8:0)>0){for(r=s,a=0;r>0;r--)(s=tx(o=t.input.charCodeAt(++t.position)))>=0?a=(a<<4)+s:cx(t,"expected hexadecimal character");t.result+=nx(a),t.position++}else cx(t,"unknown escape sequence");n=i=t.position}else Z_(o)?(ux(t,n,i,!0),mx(t,gx(t,!1,e)),n=i=t.position):t.position===t.lineStart&&yx(t)?cx(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}cx(t,"unexpected end of the stream within a double quoted scalar")}(t,d)?y=!0:!function(t){var e,n,i;if(42!==(i=t.input.charCodeAt(t.position)))return!1;for(i=t.input.charCodeAt(++t.position),e=t.position;0!==i&&!K_(i)&&!J_(i);)i=t.input.charCodeAt(++t.position);return t.position===e&&cx(t,"name of an alias node must contain at least one character"),n=t.input.slice(e,t.position),U_.call(t.anchorMap,n)||cx(t,'unidentified alias "'+n+'"'),t.result=t.anchorMap[n],gx(t,!0,-1),!0}(t)?function(t,e,n){var i,r,a,s,o,c,l,h,u=t.kind,d=t.result;if(K_(h=t.input.charCodeAt(t.position))||J_(h)||35===h||38===h||42===h||33===h||124===h||62===h||39===h||34===h||37===h||64===h||96===h)return!1;if((63===h||45===h)&&(K_(i=t.input.charCodeAt(t.position+1))||n&&J_(i)))return!1;for(t.kind="scalar",t.result="",r=a=t.position,s=!1;0!==h;){if(58===h){if(K_(i=t.input.charCodeAt(t.position+1))||n&&J_(i))break}else if(35===h){if(K_(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&yx(t)||n&&J_(h))break;if(Z_(h)){if(o=t.line,c=t.lineStart,l=t.lineIndent,gx(t,!1,-1),t.lineIndent>=e){s=!0,h=t.input.charCodeAt(t.position);continue}t.position=a,t.line=o,t.lineStart=c,t.lineIndent=l;break}}s&&(ux(t,r,a,!1),mx(t,t.line-o),r=a=t.position,s=!1),Q_(h)||(a=t.position+1),h=t.input.charCodeAt(++t.position)}return ux(t,r,a,!1),!!t.result||(t.kind=u,t.result=d,!1)}(t,d,1===n)&&(y=!0,null===t.tag&&(t.tag="?")):(y=!0,null===t.tag&&null===t.anchor||cx(t,"alias node should not have any properties")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===f&&(y=o&&bx(t,p))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if("?"===t.tag){for(null!==t.result&&"scalar"!==t.kind&&cx(t,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+t.kind+'"'),c=0,l=t.implicitTypes.length;c<l;c+=1)if((u=t.implicitTypes[c]).resolve(t.result)){t.result=u.construct(t.result),t.tag=u.tag,null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);break}}else if("!"!==t.tag){if(U_.call(t.typeMap[t.kind||"fallback"],t.tag))u=t.typeMap[t.kind||"fallback"][t.tag];else for(u=null,c=0,l=(h=t.typeMap.multi[t.kind||"fallback"]).length;c<l;c+=1)if(t.tag.slice(0,h[c].tag.length)===h[c].tag){u=h[c];break}u||cx(t,"unknown tag !<"+t.tag+">"),null!==t.result&&u.kind!==t.kind&&cx(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+u.kind+'", not "'+t.kind+'"'),u.resolve(t.result,t.tag)?(t.result=u.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):cx(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return null!==t.listener&&t.listener("close",t),null!==t.tag||null!==t.anchor||y}function kx(t){var e,n,i,r,a=t.position,s=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(r=t.input.charCodeAt(t.position))&&(gx(t,!0,-1),r=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==r));){for(s=!0,r=t.input.charCodeAt(++t.position),e=t.position;0!==r&&!K_(r);)r=t.input.charCodeAt(++t.position);for(i=[],(n=t.input.slice(e,t.position)).length<1&&cx(t,"directive name must not be less than one character in length");0!==r;){for(;Q_(r);)r=t.input.charCodeAt(++t.position);if(35===r){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&!Z_(r));break}if(Z_(r))break;for(e=t.position;0!==r&&!K_(r);)r=t.input.charCodeAt(++t.position);i.push(t.input.slice(e,t.position))}0!==r&&fx(t),U_.call(hx,n)?hx[n](t,n,i):lx(t,'unknown document directive "'+n+'"')}gx(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,gx(t,!0,-1)):s&&cx(t,"directives end mark is expected"),vx(t,t.lineIndent-1,4,!1,!0),gx(t,!0,-1),t.checkLineBreaks&&H_.test(t.input.slice(a,t.position))&&lx(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&yx(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,gx(t,!0,-1)):t.position<t.length-1&&cx(t,"end of the stream or a document separator is expected")}function wx(t,e){e=e||{},0!==(t=String(t)).length&&(10!==t.charCodeAt(t.length-1)&&13!==t.charCodeAt(t.length-1)&&(t+="\n"),65279===t.charCodeAt(0)&&(t=t.slice(1)));var n=new sx(t,e),i=t.indexOf("\0");for(-1!==i&&(n.position=i,cx(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)kx(n);return n.documents}var Tx=__,Cx={loadAll:function(t,e,n){null!==e&&"object"==typeof e&&void 0===n&&(n=e,e=null);var i=wx(t,n);if("function"!=typeof e)return i;for(var r=0,a=i.length;r<a;r+=1)e(i[r])},load:function(t,e){var n=wx(t,e);if(0!==n.length){if(1===n.length)return n[0];throw new s_("expected a single document in the stream, but found more")}}}.load;const Ex=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s;const Sx=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Ax=/\s*%%.*\n/gm,Dx={},Lx=function(t,e){t=t.replace(Ex,"").replace(Sx,"").replace(Ax,"\n");for(const[n,{detector:i}]of Object.entries(Dx)){if(i(t,e))return n}throw new Error(`No diagram type detected for text: ${t}`)},Nx=(t,e,n)=>{if(Dx[t])throw new Error(`Detector with key ${t} already exists`);Dx[t]={detector:e,loader:n},Db.debug(`Detector with key ${t} added${n?" with loader":""}`)},Ox=function(t,e,n){const{depth:i,clobber:r}=Object.assign({depth:2,clobber:!1},n);return Array.isArray(e)&&!Array.isArray(t)?(e.forEach((e=>Ox(t,e,n))),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach((e=>{t.includes(e)||t.push(e)})),t):void 0===t||i<=0?null!=t&&"object"==typeof t&&"object"==typeof e?Object.assign(t,e):e:(void 0!==e&&"object"==typeof t&&"object"==typeof e&&Object.keys(e).forEach((n=>{"object"!=typeof e[n]||void 0!==t[n]&&"object"!=typeof t[n]?(r||"object"!=typeof t[n]&&"object"!=typeof e[n])&&(t[n]=e[n]):(void 0===t[n]&&(t[n]=Array.isArray(e[n])?[]:{}),t[n]=Ox(t[n],e[n],{depth:i-1,clobber:r}))})),t)},Bx=Ox,Mx={curveBasis:Bc,curveBasisClosed:function(t){return new Mc(t)},curveBasisOpen:function(t){return new Ic(t)},curveLinear:Tc,curveLinearClosed:function(t){return new Fc(t)},curveMonotoneX:function(t){return new Yc(t)},curveMonotoneY:function(t){return new zc(t)},curveNatural:function(t){return new Wc(t)},curveStep:function(t){return new qc(t,.5)},curveStepAfter:function(t){return new qc(t,1)},curveStepBefore:function(t){return new qc(t,0)}},Ix=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Fx=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Rx=function(t,e=null){try{const n=new RegExp(`[%]{2}(?![{]${Fx.source})(?=[}][%]{2}).*\n`,"ig");let i;t=t.trim().replace(n,"").replace(/'/gm,'"'),Db.debug(`Detecting diagram directive${null!==e?" type:"+e:""} based on the text:${t}`);const r=[];for(;null!==(i=Ix.exec(t));)if(i.index===Ix.lastIndex&&Ix.lastIndex++,i&&!e||e&&i[1]&&i[1].match(e)||e&&i[2]&&i[2].match(e)){const t=i[1]?i[1]:i[2],e=i[3]?i[3].trim():i[4]?JSON.parse(i[4].trim()):null;r.push({type:t,args:e})}return 0===r.length&&r.push({type:t,args:null}),1===r.length?r[0]:r}catch(n){return Db.error(`ERROR: ${n.message} - Unable to parse directive\n ${null!==e?" type:"+e:""} based on the text:${t}`),{type:null,args:null}}};function $x(t,e){if(!t)return e;const n=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return Mx[n]||e}function Px(t,e){return t&&e?Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)):0}function jx(t){let e="",n="";for(const i of t)void 0!==i&&(i.startsWith("color:")||i.startsWith("text-align:")?n=n+i+";":e=e+i+";");return{style:e,labelStyle:n}}let Yx=0;const zx=()=>(Yx++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Yx);const Ux=t=>function(t){let e="";const n="0123456789abcdef",i=n.length;for(let r=0;r<t;r++)e+=n.charAt(Math.floor(Math.random()*i));return e}(t.length),Wx=function(t,e){const n=e.text.replace(jb.lineBreakRegex," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",e.fontSize),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),void 0!==e.class&&i.attr("class",e.class);const r=i.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.attr("fill",e.fill),r.text(n),i},Hx=Nh(((t,e,n)=>{if(!t)return t;if(n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"<br/>"},n),jb.lineBreakRegex.test(t))return t;const i=t.split(" "),r=[];let a="";return i.forEach(((t,s)=>{const o=Gx(`${t} `,n),c=Gx(a,n);if(o>e){const{hyphenatedStrings:i,remainingWord:s}=qx(t,e,"-",n);r.push(a,...i),a=s}else c+o>=e?(r.push(a),a=t):a=[a,t].filter(Boolean).join(" ");s+1===i.length&&r.push(a)})),r.filter((t=>""!==t)).join(n.joinWith)}),((t,e,n)=>`${t}${e}${n.fontSize}${n.fontWeight}${n.fontFamily}${n.joinWith}`)),qx=Nh(((t,e,n="-",i)=>{i=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},i);const r=[...t],a=[];let s="";return r.forEach(((t,o)=>{const c=`${s}${t}`;if(Gx(c,i)>=e){const t=o+1,e=r.length===t,i=`${c}${n}`;a.push(e?c:i),s=""}else s=c})),{hyphenatedStrings:a,remainingWord:s}}),((t,e,n="-",i)=>`${t}${e}${n}${i.fontSize}${i.fontWeight}${i.fontFamily}`));function Vx(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:15},e),Xx(t,e).height}function Gx(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e),Xx(t,e).width}const Xx=Nh(((t,e)=>{e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e);const{fontSize:n,fontFamily:i,fontWeight:r}=e;if(!t)return{width:0,height:0};const a=["sans-serif",i],s=t.split(jb.lineBreakRegex),o=[],c=Ho("body");if(!c.remove)return{width:0,height:0,lineHeight:0};const l=c.append("svg");for(const h of a){let t=0;const e={width:0,height:0,lineHeight:0};for(const i of s){const a={x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0};a.text=i;const s=Wx(l,a).style("font-size",n).style("font-weight",r).style("font-family",h),o=(s._groups||s)[0][0].getBBox();e.width=Math.round(Math.max(e.width,o.width)),t=Math.round(o.height),e.height+=t,e.lineHeight=Math.round(Math.max(e.lineHeight,t))}o.push(e)}l.remove();return o[isNaN(o[1].height)||isNaN(o[1].width)||isNaN(o[1].lineHeight)||o[0].height>o[1].height&&o[0].width>o[1].width&&o[0].lineHeight>o[1].lineHeight?0:1]}),((t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`));let Zx;const Qx=t=>{if(Db.debug("directiveSanitizer called with",t),"object"==typeof t&&(t.length?t.forEach((t=>Qx(t))):Object.keys(t).forEach((e=>{Db.debug("Checking key",e),e.startsWith("__")&&(Db.debug("sanitize deleting __ option",e),delete t[e]),e.includes("proto")&&(Db.debug("sanitize deleting proto option",e),delete t[e]),e.includes("constr")&&(Db.debug("sanitize deleting constr option",e),delete t[e]),e.includes("themeCSS")&&(Db.debug("sanitizing themeCss option"),t[e]=Kx(t[e])),e.includes("fontFamily")&&(Db.debug("sanitizing fontFamily option"),t[e]=Kx(t[e])),e.includes("altFontFamily")&&(Db.debug("sanitizing altFontFamily option"),t[e]=Kx(t[e])),Kb.includes(e)?"object"==typeof t[e]&&(Db.debug("sanitize deleting object",e),Qx(t[e])):(Db.debug("sanitize deleting option",e),delete t[e])}))),t.themeVariables){const e=Object.keys(t.themeVariables);for(const n of e){const e=t.themeVariables[n];e&&e.match&&!e.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[n]="")}}Db.debug("After sanitization",t)},Kx=t=>{let e=0,n=0;for(const i of t){if(e<n)return"{ /* ERROR: Unbalanced CSS */ }";"{"===i?e++:"}"===i&&n++}return e!==n?"{ /* ERROR: Unbalanced CSS */ }":t};function Jx(t){return"str"in t}const tv={assignWithDepth:Bx,wrapLabel:Hx,calculateTextHeight:Vx,calculateTextWidth:Gx,calculateTextDimensions:Xx,detectInit:function(t,e){const n=Rx(t,/(?:init\b)|(?:initialize\b)/);let i={};if(Array.isArray(n)){const t=n.map((t=>t.args));Qx(t),i=Bx(i,[...t])}else i=n.args;if(i){let n=Lx(t,e);["config"].forEach((t=>{void 0!==i[t]&&("flowchart-v2"===n&&(n="flowchart"),i[n]=i[t],delete i[t])}))}return i},detectDirective:Rx,isSubstringInArray:function(t,e){for(const[n,i]of e.entries())if(i.match(t))return n;return-1},interpolateToCurve:$x,calcLabelPosition:function(t){return 1===t.length?t[0]:function(t){let e,n=0;t.forEach((t=>{n+=Px(t,e),e=t}));let i,r=n/2;return e=void 0,t.forEach((t=>{if(e&&!i){const n=Px(t,e);if(n<r)r-=n;else{const a=r/n;a<=0&&(i=e),a>=1&&(i={x:t.x,y:t.y}),a>0&&a<1&&(i={x:(1-a)*e.x+a*t.x,y:(1-a)*e.y+a*t.y})}}e=t})),i}(t)},calcCardinalityPosition:(t,e,n)=>{let i;Db.info(`our points ${JSON.stringify(e)}`),e[0]!==n&&(e=e.reverse());let r,a=25;i=void 0,e.forEach((t=>{if(i&&!r){const e=Px(t,i);if(e<a)a-=e;else{const n=a/e;n<=0&&(r=i),n>=1&&(r={x:t.x,y:t.y}),n>0&&n<1&&(r={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const s=t?10:5,o=Math.atan2(e[0].y-r.y,e[0].x-r.x),c={x:0,y:0};return c.x=Math.sin(o)*s+(e[0].x+r.x)/2,c.y=-Math.cos(o)*s+(e[0].y+r.y)/2,c},calcTerminalLabelPosition:function(t,e,n){let i,r=JSON.parse(JSON.stringify(n));Db.info("our points",r),"start_left"!==e&&"start_right"!==e&&(r=r.reverse()),r.forEach((t=>{i=t}));let a,s=25+t;i=void 0,r.forEach((t=>{if(i&&!a){const e=Px(t,i);if(e<s)s-=e;else{const n=s/e;n<=0&&(a=i),n>=1&&(a={x:t.x,y:t.y}),n>0&&n<1&&(a={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const o=10+.5*t,c=Math.atan2(r[0].y-a.y,r[0].x-a.x),l={x:0,y:0};return l.x=Math.sin(c)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2,"start_left"===e&&(l.x=Math.sin(c+Math.PI)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c+Math.PI)*o+(r[0].y+a.y)/2),"end_right"===e&&(l.x=Math.sin(c-Math.PI)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c-Math.PI)*o+(r[0].y+a.y)/2-5),"end_left"===e&&(l.x=Math.sin(c)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2-5),l},formatUrl:function(t,e){const n=t.trim();if(n)return"loose"!==e.securityLevel?(0,xt.N)(n):n},getStylesFromArray:jx,generateId:zx,random:Ux,runFunc:(t,...e)=>{const n=t.split("."),i=n.length-1,r=n[i];let a=window;for(let s=0;s<i;s++)if(a=a[n[s]],!a)return;a[r](...e)},entityDecode:function(t){return Zx=Zx||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),Zx.innerHTML=t,unescape(Zx.textContent)},initIdGenerator:class{constructor(t,e){this.deterministic=t,this.seed=e,this.count=e?e.length:0}next(){return this.deterministic?this.count++:Date.now()}},directiveSanitizer:Qx,sanitizeCss:Kx,insertTitle:(t,e,n,i)=>{if(!i)return;const r=t.node().getBBox();t.append("text").text(i).attr("x",r.x+r.width/2).attr("y",-n).attr("class",e)}},ev="9.3.0",nv=Object.freeze(Jb);let iv,rv=Bx({},nv),av=[],sv=Bx({},nv);const ov=(t,e)=>{let n=Bx({},t),i={};for(const r of e)uv(r),i=Bx(i,r);if(n=Bx(n,i),i.theme&&i.theme in Xb){const t=Bx({},iv),e=Bx(t.themeVariables||{},i.themeVariables);n.theme&&n.theme in Xb&&(n.themeVariables=Xb[n.theme].getThemeVariables(e))}return sv=n,yv(sv),sv},cv=()=>Bx({},rv),lv=t=>(yv(t),Bx(sv,t),hv()),hv=()=>Bx({},sv),uv=t=>{var e;["secure",...null!=(e=rv.secure)?e:[]].forEach((e=>{void 0!==t[e]&&(Db.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])})),Object.keys(t).forEach((e=>{0===e.indexOf("__")&&delete t[e]})),Object.keys(t).forEach((e=>{"string"==typeof t[e]&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],"object"==typeof t[e]&&uv(t[e])}))},dv=t=>{t.fontFamily&&(t.themeVariables&&t.themeVariables.fontFamily||(t.themeVariables={fontFamily:t.fontFamily})),av.push(t),ov(rv,av)},pv=(t=rv)=>{av=[],ov(t,av)};var fv=(t=>(t.LAZY_LOAD_DEPRECATED="The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.",t))(fv||{});const gv={},yv=t=>{var e;t&&((t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&(gv[e="LAZY_LOAD_DEPRECATED"]||(Db.warn(fv[e]),gv[e]=!0)))},mv=function(t,e,n,i){const r=function(t,e,n){let i=new Map;return n?(i.set("width","100%"),i.set("style",`max-width: ${e}px;`)):(i.set("height",t),i.set("width",e)),i}(e,n,i);!function(t,e){for(let n of e)t.attr(n[0],n[1])}(t,r)},bv=function(t,e,n,i){const r=e.node().getBBox(),a=r.width,s=r.height;Db.info(`SVG bounds: ${a}x${s}`,r);let o=0,c=0;Db.info(`Graph bounds: ${o}x${c}`,t),o=a+2*n,c=s+2*n,Db.info(`Calculated bounds: ${o}x${c}`),mv(e,c,o,i);const l=`${r.x-n} ${r.y-n} ${r.width+2*n} ${r.height+2*n}`;e.attr("viewBox",l)},_v=t=>`g.classGroup text {\n fill: ${t.nodeBorder};\n fill: ${t.classText};\n stroke: none;\n font-family: ${t.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.nodeLabel, .edgeLabel {\n color: ${t.classText};\n}\n.edgeLabel .label rect {\n fill: ${t.mainBkg};\n}\n.label text {\n fill: ${t.classText};\n}\n.edgeLabel .label span {\n background: ${t.mainBkg};\n}\n\n.classTitle {\n font-weight: bolder;\n}\n.node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${t.nodeBorder};\n stroke: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${t.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${t.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.dashed-line{\n stroke-dasharray: 3;\n}\n\n.dotted-line{\n stroke-dasharray: 1 2;\n}\n\n#compositionStart, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopStart, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopEnd, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n.edgeTerminals {\n font-size: 11px;\n}\n\n.classTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,xv=t=>`\n .entityBox {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxOdd {\n fill: ${t.attributeBackgroundColorOdd};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxEven {\n fill: ${t.attributeBackgroundColorEven};\n stroke: ${t.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${t.tertiaryColor};\n opacity: 0.7;\n background-color: ${t.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .relationshipLine {\n stroke: ${t.lineColor};\n }\n\n .entityTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n } \n`,vv=()=>"",kv=t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n .cluster-label text {\n fill: ${t.titleColor};\n }\n .cluster-label span {\n color: ${t.titleColor};\n }\n\n .label text,span {\n fill: ${t.nodeTextColor||t.textColor};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n\n .cluster rect {\n fill: ${t.clusterBkg};\n stroke: ${t.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n .cluster span {\n color: ${t.titleColor};\n }\n /* .cluster div {\n color: ${t.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n`,wv=t=>`\n .mermaid-main-font {\n font-family: "trebuchet ms", verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n .exclude-range {\n fill: ${t.excludeBkgColor};\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${t.sectionBkgColor};\n }\n\n .section2 {\n fill: ${t.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${t.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n // text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${t.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n text {\n font-family: ${t.fontFamily};\n fill: ${t.textColor};\n }\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${t.todayLineColor};\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n // .taskText:not([font-size]) {\n // font-size: ${t.ganttFontSize};\n // }\n\n .taskTextOutsideRight {\n fill: ${t.taskTextDarkColor};\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n .taskTextOutsideLeft {\n fill: ${t.taskTextDarkColor};\n text-anchor: end;\n // font-size: ${t.ganttFontSize};\n }\n\n /* Special case clickable */\n .task.clickable {\n cursor: pointer;\n }\n .taskText.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ${t.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${t.taskBkgColor};\n stroke: ${t.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${t.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${t.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${t.activeTaskBkgColor};\n stroke: ${t.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${t.doneTaskBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor} ;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n`,Tv=()=>"",Cv=t=>`\n .pieCircle{\n stroke: ${t.pieStrokeColor};\n stroke-width : ${t.pieStrokeWidth};\n opacity : ${t.pieOpacity};\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${t.pieTitleTextSize};\n fill: ${t.pieTitleTextColor};\n font-family: ${t.fontFamily};\n }\n .slice {\n font-family: ${t.fontFamily};\n fill: ${t.pieSectionTextColor};\n font-size:${t.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${t.pieLegendTextColor};\n font-family: ${t.fontFamily};\n font-size: ${t.pieLegendTextSize};\n }\n`,Ev=t=>`\n\n marker {\n fill: ${t.relationColor};\n stroke: ${t.relationColor};\n }\n\n marker.cross {\n stroke: ${t.lineColor};\n }\n\n svg {\n font-family: ${t.fontFamily};\n font-size: ${t.fontSize};\n }\n\n .reqBox {\n fill: ${t.requirementBackground};\n fill-opacity: 100%;\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n \n .reqTitle, .reqLabel{\n fill: ${t.requirementTextColor};\n }\n .reqLabelBox {\n fill: ${t.relationLabelBackground};\n fill-opacity: 100%;\n }\n\n .req-title-line {\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n .relationshipLine {\n stroke: ${t.relationColor};\n stroke-width: 1;\n }\n .relationshipLabel {\n fill: ${t.relationLabelColor};\n }\n\n`,Sv=t=>`.actor {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${t.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${t.actorLineColor};\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${t.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${t.signalColor};\n }\n\n #arrowhead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .sequenceNumber {\n fill: ${t.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${t.signalColor};\n }\n\n #crosshead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .messageText {\n fill: ${t.signalTextColor};\n stroke: none;\n }\n\n .labelBox {\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${t.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${t.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${t.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation1 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation2 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .actorPopupMenu {\n position: absolute;\n }\n\n .actorPopupMenuPanel {\n position: absolute;\n fill: ${t.actorBkg};\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));\n}\n .actor-man line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n .actor-man circle, line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n stroke-width: 2px;\n }\n`,Av=t=>`\ndefs #statediagram-barbEnd {\n fill: ${t.transitionColor};\n stroke: ${t.transitionColor};\n }\ng.stateGroup text {\n fill: ${t.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${t.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${t.stateLabelColor};\n}\n\ng.stateGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${t.transitionColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${t.background};\n border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px\n}\n\n.state-note {\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n\n text {\n fill: ${t.noteTextColor};\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${t.labelBackgroundColor};\n opacity: 0.5;\n}\n.edgeLabel .label text {\n fill: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${t.stateLabelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node .fork-join {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node circle.state-end {\n fill: ${t.innerEndBackground};\n stroke: ${t.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${t.compositeBackground||t.background};\n // stroke: ${t.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${t.stateBkg||t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n.node polygon {\n fill: ${t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};;\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${t.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${t.compositeTitleBackground};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${t.stateLabelColor};\n}\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state .divider {\n stroke: ${t.stateBorder||t.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${t.compositeBackground||t.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.statediagram-cluster .inner {\n rx:0;\n ry:0;\n}\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${t.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${t.noteTextColor};\n}\n.statediagram .edgeLabel {\n color: red; // ${t.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${t.lineColor};\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.statediagramTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,Dv=t=>`.label {\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n color: ${t.textColor};\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ${t.textColor}\n }\n\n .legend {\n fill: ${t.textColor};\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ${t.textColor}\n }\n\n .face {\n ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"};\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ${t.fillType0?`fill: ${t.fillType0}`:""};\n }\n .task-type-1, .section-type-1 {\n ${t.fillType0?`fill: ${t.fillType1}`:""};\n }\n .task-type-2, .section-type-2 {\n ${t.fillType0?`fill: ${t.fillType2}`:""};\n }\n .task-type-3, .section-type-3 {\n ${t.fillType0?`fill: ${t.fillType3}`:""};\n }\n .task-type-4, .section-type-4 {\n ${t.fillType0?`fill: ${t.fillType4}`:""};\n }\n .task-type-5, .section-type-5 {\n ${t.fillType0?`fill: ${t.fillType5}`:""};\n }\n .task-type-6, .section-type-6 {\n ${t.fillType0?`fill: ${t.fillType6}`:""};\n }\n .task-type-7, .section-type-7 {\n ${t.fillType0?`fill: ${t.fillType7}`:""};\n }\n\n .actor-0 {\n ${t.actor0?`fill: ${t.actor0}`:""};\n }\n .actor-1 {\n ${t.actor1?`fill: ${t.actor1}`:""};\n }\n .actor-2 {\n ${t.actor2?`fill: ${t.actor2}`:""};\n }\n .actor-3 {\n ${t.actor3?`fill: ${t.actor3}`:""};\n }\n .actor-4 {\n ${t.actor4?`fill: ${t.actor4}`:""};\n }\n .actor-5 {\n ${t.actor5?`fill: ${t.actor5}`:""};\n }\n`,Lv=t=>`.person {\n stroke: ${t.personBorder};\n fill: ${t.personBkg};\n }\n`,Nv={flowchart:kv,"flowchart-v2":kv,sequence:Sv,gantt:wv,classDiagram:_v,"classDiagram-v2":_v,class:_v,stateDiagram:Av,state:Av,info:Tv,pie:Cv,er:xv,error:vv,journey:Dv,requirement:Ev,c4:Lv},Ov=(t,e,n)=>{let i="";return t in Nv&&Nv[t]?i=Nv[t](n):Db.warn(`No theme found for ${t}`),` & {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n fill: ${n.textColor}\n }\n\n /* Classes common for multiple diagrams */\n\n & .error-icon {\n fill: ${n.errorBkgColor};\n }\n & .error-text {\n fill: ${n.errorTextColor};\n stroke: ${n.errorTextColor};\n }\n\n & .edge-thickness-normal {\n stroke-width: 2px;\n }\n & .edge-thickness-thick {\n stroke-width: 3.5px\n }\n & .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n\n & .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n & .marker {\n fill: ${n.lineColor};\n stroke: ${n.lineColor};\n }\n & .marker.cross {\n stroke: ${n.lineColor};\n }\n\n & svg {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n }\n\n ${i}\n\n ${e}\n`},Bv=Db,Mv=Lb,Iv=hv,Fv=t=>Mb(t,Iv()),Rv=bv,$v={},Pv=(t,e,n)=>{if($v[t])throw new Error(`Diagram ${t} already registered.`);var i,r;$v[t]=e,n&&Nx(t,n),i=t,r=e.styles,Nv[i]=r,e.injectUtils&&e.injectUtils(Bv,Mv,Iv,Fv,Rv)},jv=t=>{if(t in $v)return $v[t];throw new Error(`Diagram ${t} not found.`)};var Yv=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,7],r=[1,5],a=[1,9],s=[1,6],o=[2,6],c=[1,16],l=[6,8,14,20,22,24,25,27,29,32,37,40,50,55],h=[8,14,20,22,24,25,27,29,32,37,40],u=[8,13,14,20,22,24,25,27,29,32,37,40],d=[1,26],p=[6,8,14,50,55],f=[8,14,55],g=[1,53],y=[1,52],m=[8,14,30,33,35,38,55],b=[1,67],_=[1,68],x=[1,69],v=[8,14,33,35,42,55],k={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,GG:6,document:7,EOF:8,":":9,DIR:10,options:11,body:12,OPT:13,NL:14,line:15,statement:16,commitStatement:17,mergeStatement:18,cherryPickStatement:19,acc_title:20,acc_title_value:21,acc_descr:22,acc_descr_value:23,acc_descr_multiline_value:24,section:25,branchStatement:26,CHECKOUT:27,ref:28,BRANCH:29,ORDER:30,NUM:31,CHERRY_PICK:32,COMMIT_ID:33,STR:34,COMMIT_TAG:35,EMPTYSTR:36,MERGE:37,COMMIT_TYPE:38,commitType:39,COMMIT:40,commit_arg:41,COMMIT_MSG:42,NORMAL:43,REVERSE:44,HIGHLIGHT:45,openDirective:46,typeDirective:47,closeDirective:48,argDirective:49,open_directive:50,type_directive:51,arg_directive:52,close_directive:53,ID:54,";":55,$accept:0,$end:1},terminals_:{2:"error",6:"GG",8:"EOF",9:":",10:"DIR",13:"OPT",14:"NL",20:"acc_title",21:"acc_title_value",22:"acc_descr",23:"acc_descr_value",24:"acc_descr_multiline_value",25:"section",27:"CHECKOUT",29:"BRANCH",30:"ORDER",31:"NUM",32:"CHERRY_PICK",33:"COMMIT_ID",34:"STR",35:"COMMIT_TAG",36:"EMPTYSTR",37:"MERGE",38:"COMMIT_TYPE",40:"COMMIT",42:"COMMIT_MSG",43:"NORMAL",44:"REVERSE",45:"HIGHLIGHT",50:"open_directive",51:"type_directive",52:"arg_directive",53:"close_directive",54:"ID",55:";"},productions_:[0,[3,2],[3,2],[3,3],[3,4],[3,5],[7,0],[7,2],[11,2],[11,1],[12,0],[12,2],[15,2],[15,1],[16,1],[16,1],[16,1],[16,2],[16,2],[16,1],[16,1],[16,1],[16,2],[26,2],[26,4],[19,3],[19,5],[19,5],[19,5],[19,5],[18,2],[18,4],[18,4],[18,4],[18,6],[18,6],[18,6],[18,6],[18,6],[18,6],[18,8],[18,8],[18,8],[18,8],[18,8],[18,8],[17,2],[17,3],[17,3],[17,5],[17,5],[17,3],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,3],[17,5],[17,5],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[41,0],[41,1],[39,1],[39,1],[39,1],[5,3],[5,5],[46,1],[47,1],[49,1],[48,1],[28,1],[28,1],[4,1],[4,1],[4,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 3:return a[o];case 4:return a[o-1];case 5:return i.setDirection(a[o-3]),a[o-1];case 7:i.setOptions(a[o-1]),this.$=a[o];break;case 8:a[o-1]+=a[o],this.$=a[o-1];break;case 10:this.$=[];break;case 11:a[o-1].push(a[o]),this.$=a[o-1];break;case 12:this.$=a[o-1];break;case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 20:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 22:i.checkout(a[o]);break;case 23:i.branch(a[o]);break;case 24:i.branch(a[o-2],a[o]);break;case 25:i.cherryPick(a[o],"",void 0);break;case 26:i.cherryPick(a[o-2],"",a[o]);break;case 27:case 29:i.cherryPick(a[o-2],"","");break;case 28:i.cherryPick(a[o],"",a[o-2]);break;case 30:i.merge(a[o],"","","");break;case 31:i.merge(a[o-2],a[o],"","");break;case 32:i.merge(a[o-2],"",a[o],"");break;case 33:i.merge(a[o-2],"","",a[o]);break;case 34:i.merge(a[o-4],a[o],"",a[o-2]);break;case 35:i.merge(a[o-4],"",a[o],a[o-2]);break;case 36:i.merge(a[o-4],"",a[o-2],a[o]);break;case 37:i.merge(a[o-4],a[o-2],a[o],"");break;case 38:i.merge(a[o-4],a[o-2],"",a[o]);break;case 39:i.merge(a[o-4],a[o],a[o-2],"");break;case 40:i.merge(a[o-6],a[o-4],a[o-2],a[o]);break;case 41:i.merge(a[o-6],a[o],a[o-4],a[o-2]);break;case 42:i.merge(a[o-6],a[o-4],a[o],a[o-2]);break;case 43:i.merge(a[o-6],a[o-2],a[o-4],a[o]);break;case 44:i.merge(a[o-6],a[o],a[o-2],a[o-4]);break;case 45:i.merge(a[o-6],a[o-2],a[o],a[o-4]);break;case 46:i.commit(a[o]);break;case 47:i.commit("","",i.commitType.NORMAL,a[o]);break;case 48:i.commit("","",a[o],"");break;case 49:i.commit("","",a[o],a[o-2]);break;case 50:i.commit("","",a[o-2],a[o]);break;case 51:i.commit("",a[o],i.commitType.NORMAL,"");break;case 52:i.commit("",a[o-2],i.commitType.NORMAL,a[o]);break;case 53:i.commit("",a[o],i.commitType.NORMAL,a[o-2]);break;case 54:i.commit("",a[o-2],a[o],"");break;case 55:i.commit("",a[o],a[o-2],"");break;case 56:i.commit("",a[o-4],a[o-2],a[o]);break;case 57:i.commit("",a[o-4],a[o],a[o-2]);break;case 58:i.commit("",a[o-2],a[o-4],a[o]);break;case 59:i.commit("",a[o],a[o-4],a[o-2]);break;case 60:i.commit("",a[o],a[o-2],a[o-4]);break;case 61:i.commit("",a[o-2],a[o],a[o-4]);break;case 62:i.commit(a[o],"",i.commitType.NORMAL,"");break;case 63:i.commit(a[o],"",i.commitType.NORMAL,a[o-2]);break;case 64:i.commit(a[o-2],"",i.commitType.NORMAL,a[o]);break;case 65:i.commit(a[o-2],"",a[o],"");break;case 66:i.commit(a[o],"",a[o-2],"");break;case 67:i.commit(a[o],a[o-2],i.commitType.NORMAL,"");break;case 68:i.commit(a[o-2],a[o],i.commitType.NORMAL,"");break;case 69:i.commit(a[o-4],"",a[o-2],a[o]);break;case 70:i.commit(a[o-4],"",a[o],a[o-2]);break;case 71:i.commit(a[o-2],"",a[o-4],a[o]);break;case 72:i.commit(a[o],"",a[o-4],a[o-2]);break;case 73:i.commit(a[o],"",a[o-2],a[o-4]);break;case 74:i.commit(a[o-2],"",a[o],a[o-4]);break;case 75:i.commit(a[o-4],a[o],a[o-2],"");break;case 76:i.commit(a[o-4],a[o-2],a[o],"");break;case 77:i.commit(a[o-2],a[o],a[o-4],"");break;case 78:i.commit(a[o],a[o-2],a[o-4],"");break;case 79:i.commit(a[o],a[o-4],a[o-2],"");break;case 80:i.commit(a[o-2],a[o-4],a[o],"");break;case 81:i.commit(a[o-4],a[o],i.commitType.NORMAL,a[o-2]);break;case 82:i.commit(a[o-4],a[o-2],i.commitType.NORMAL,a[o]);break;case 83:i.commit(a[o-2],a[o],i.commitType.NORMAL,a[o-4]);break;case 84:i.commit(a[o],a[o-2],i.commitType.NORMAL,a[o-4]);break;case 85:i.commit(a[o],a[o-4],i.commitType.NORMAL,a[o-2]);break;case 86:i.commit(a[o-2],a[o-4],i.commitType.NORMAL,a[o]);break;case 87:i.commit(a[o-6],a[o-4],a[o-2],a[o]);break;case 88:i.commit(a[o-6],a[o-4],a[o],a[o-2]);break;case 89:i.commit(a[o-6],a[o-2],a[o-4],a[o]);break;case 90:i.commit(a[o-6],a[o],a[o-4],a[o-2]);break;case 91:i.commit(a[o-6],a[o-2],a[o],a[o-4]);break;case 92:i.commit(a[o-6],a[o],a[o-2],a[o-4]);break;case 93:i.commit(a[o-4],a[o-6],a[o-2],a[o]);break;case 94:i.commit(a[o-4],a[o-6],a[o],a[o-2]);break;case 95:i.commit(a[o-2],a[o-6],a[o-4],a[o]);break;case 96:i.commit(a[o],a[o-6],a[o-4],a[o-2]);break;case 97:i.commit(a[o-2],a[o-6],a[o],a[o-4]);break;case 98:i.commit(a[o],a[o-6],a[o-2],a[o-4]);break;case 99:i.commit(a[o],a[o-4],a[o-2],a[o-6]);break;case 100:i.commit(a[o-2],a[o-4],a[o],a[o-6]);break;case 101:i.commit(a[o],a[o-2],a[o-4],a[o-6]);break;case 102:i.commit(a[o-2],a[o],a[o-4],a[o-6]);break;case 103:i.commit(a[o-4],a[o-2],a[o],a[o-6]);break;case 104:i.commit(a[o-4],a[o],a[o-2],a[o-6]);break;case 105:i.commit(a[o-2],a[o-4],a[o-6],a[o]);break;case 106:i.commit(a[o],a[o-4],a[o-6],a[o-2]);break;case 107:i.commit(a[o-2],a[o],a[o-6],a[o-4]);break;case 108:i.commit(a[o],a[o-2],a[o-6],a[o-4]);break;case 109:i.commit(a[o-4],a[o-2],a[o-6],a[o]);break;case 110:i.commit(a[o-4],a[o],a[o-6],a[o-2]);break;case 111:this.$="";break;case 112:this.$=a[o];break;case 113:this.$=i.commitType.NORMAL;break;case 114:this.$=i.commitType.REVERSE;break;case 115:this.$=i.commitType.HIGHLIGHT;break;case 118:i.parseDirective("%%{","open_directive");break;case 119:i.parseDirective(a[o],"type_directive");break;case 120:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 121:i.parseDirective("}%%","close_directive","gitGraph")}},table:[{3:1,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{1:[3]},{3:10,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{3:11,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{7:12,8:o,9:[1,13],10:[1,14],11:15,14:c},e(l,[2,124]),e(l,[2,125]),e(l,[2,126]),{47:17,51:[1,18]},{51:[2,118]},{1:[2,1]},{1:[2,2]},{8:[1,19]},{7:20,8:o,11:15,14:c},{9:[1,21]},e(h,[2,10],{12:22,13:[1,23]}),e(u,[2,9]),{9:[1,25],48:24,53:d},e([9,53],[2,119]),{1:[2,3]},{8:[1,27]},{7:28,8:o,11:15,14:c},{8:[2,7],14:[1,31],15:29,16:30,17:32,18:33,19:34,20:[1,35],22:[1,36],24:[1,37],25:[1,38],26:39,27:[1,40],29:[1,44],32:[1,43],37:[1,42],40:[1,41]},e(u,[2,8]),e(p,[2,116]),{49:45,52:[1,46]},e(p,[2,121]),{1:[2,4]},{8:[1,47]},e(h,[2,11]),{4:48,8:i,14:r,55:s},e(h,[2,13]),e(f,[2,14]),e(f,[2,15]),e(f,[2,16]),{21:[1,49]},{23:[1,50]},e(f,[2,19]),e(f,[2,20]),e(f,[2,21]),{28:51,34:g,54:y},e(f,[2,111],{41:54,33:[1,57],34:[1,59],35:[1,55],38:[1,56],42:[1,58]}),{28:60,34:g,54:y},{33:[1,61],35:[1,62]},{28:63,34:g,54:y},{48:64,53:d},{53:[2,120]},{1:[2,5]},e(h,[2,12]),e(f,[2,17]),e(f,[2,18]),e(f,[2,22]),e(m,[2,122]),e(m,[2,123]),e(f,[2,46]),{34:[1,65]},{39:66,43:b,44:_,45:x},{34:[1,70]},{34:[1,71]},e(f,[2,112]),e(f,[2,30],{33:[1,72],35:[1,74],38:[1,73]}),{34:[1,75]},{34:[1,76],36:[1,77]},e(f,[2,23],{30:[1,78]}),e(p,[2,117]),e(f,[2,47],{33:[1,80],38:[1,79],42:[1,81]}),e(f,[2,48],{33:[1,83],35:[1,82],42:[1,84]}),e(v,[2,113]),e(v,[2,114]),e(v,[2,115]),e(f,[2,51],{35:[1,85],38:[1,86],42:[1,87]}),e(f,[2,62],{33:[1,90],35:[1,88],38:[1,89]}),{34:[1,91]},{39:92,43:b,44:_,45:x},{34:[1,93]},e(f,[2,25],{35:[1,94]}),{33:[1,95]},{33:[1,96]},{31:[1,97]},{39:98,43:b,44:_,45:x},{34:[1,99]},{34:[1,100]},{34:[1,101]},{34:[1,102]},{34:[1,103]},{34:[1,104]},{39:105,43:b,44:_,45:x},{34:[1,106]},{34:[1,107]},{39:108,43:b,44:_,45:x},{34:[1,109]},e(f,[2,31],{35:[1,111],38:[1,110]}),e(f,[2,32],{33:[1,113],35:[1,112]}),e(f,[2,33],{33:[1,114],38:[1,115]}),{34:[1,116],36:[1,117]},{34:[1,118]},{34:[1,119]},e(f,[2,24]),e(f,[2,49],{33:[1,120],42:[1,121]}),e(f,[2,53],{38:[1,122],42:[1,123]}),e(f,[2,63],{33:[1,125],38:[1,124]}),e(f,[2,50],{33:[1,126],42:[1,127]}),e(f,[2,55],{35:[1,128],42:[1,129]}),e(f,[2,66],{33:[1,131],35:[1,130]}),e(f,[2,52],{38:[1,132],42:[1,133]}),e(f,[2,54],{35:[1,134],42:[1,135]}),e(f,[2,67],{35:[1,137],38:[1,136]}),e(f,[2,64],{33:[1,139],38:[1,138]}),e(f,[2,65],{33:[1,141],35:[1,140]}),e(f,[2,68],{35:[1,143],38:[1,142]}),{39:144,43:b,44:_,45:x},{34:[1,145]},{34:[1,146]},{34:[1,147]},{34:[1,148]},{39:149,43:b,44:_,45:x},e(f,[2,26]),e(f,[2,27]),e(f,[2,28]),e(f,[2,29]),{34:[1,150]},{34:[1,151]},{39:152,43:b,44:_,45:x},{34:[1,153]},{39:154,43:b,44:_,45:x},{34:[1,155]},{34:[1,156]},{34:[1,157]},{34:[1,158]},{34:[1,159]},{34:[1,160]},{34:[1,161]},{39:162,43:b,44:_,45:x},{34:[1,163]},{34:[1,164]},{34:[1,165]},{39:166,43:b,44:_,45:x},{34:[1,167]},{39:168,43:b,44:_,45:x},{34:[1,169]},{34:[1,170]},{34:[1,171]},{39:172,43:b,44:_,45:x},{34:[1,173]},e(f,[2,37],{35:[1,174]}),e(f,[2,38],{38:[1,175]}),e(f,[2,36],{33:[1,176]}),e(f,[2,39],{35:[1,177]}),e(f,[2,34],{38:[1,178]}),e(f,[2,35],{33:[1,179]}),e(f,[2,60],{42:[1,180]}),e(f,[2,73],{33:[1,181]}),e(f,[2,61],{42:[1,182]}),e(f,[2,84],{38:[1,183]}),e(f,[2,74],{33:[1,184]}),e(f,[2,83],{38:[1,185]}),e(f,[2,59],{42:[1,186]}),e(f,[2,72],{33:[1,187]}),e(f,[2,58],{42:[1,188]}),e(f,[2,78],{35:[1,189]}),e(f,[2,71],{33:[1,190]}),e(f,[2,77],{35:[1,191]}),e(f,[2,57],{42:[1,192]}),e(f,[2,85],{38:[1,193]}),e(f,[2,56],{42:[1,194]}),e(f,[2,79],{35:[1,195]}),e(f,[2,80],{35:[1,196]}),e(f,[2,86],{38:[1,197]}),e(f,[2,70],{33:[1,198]}),e(f,[2,81],{38:[1,199]}),e(f,[2,69],{33:[1,200]}),e(f,[2,75],{35:[1,201]}),e(f,[2,76],{35:[1,202]}),e(f,[2,82],{38:[1,203]}),{34:[1,204]},{39:205,43:b,44:_,45:x},{34:[1,206]},{34:[1,207]},{39:208,43:b,44:_,45:x},{34:[1,209]},{34:[1,210]},{34:[1,211]},{34:[1,212]},{39:213,43:b,44:_,45:x},{34:[1,214]},{39:215,43:b,44:_,45:x},{34:[1,216]},{34:[1,217]},{34:[1,218]},{34:[1,219]},{34:[1,220]},{34:[1,221]},{34:[1,222]},{39:223,43:b,44:_,45:x},{34:[1,224]},{34:[1,225]},{34:[1,226]},{39:227,43:b,44:_,45:x},{34:[1,228]},{39:229,43:b,44:_,45:x},{34:[1,230]},{34:[1,231]},{34:[1,232]},{39:233,43:b,44:_,45:x},e(f,[2,40]),e(f,[2,42]),e(f,[2,41]),e(f,[2,43]),e(f,[2,45]),e(f,[2,44]),e(f,[2,101]),e(f,[2,102]),e(f,[2,99]),e(f,[2,100]),e(f,[2,104]),e(f,[2,103]),e(f,[2,108]),e(f,[2,107]),e(f,[2,106]),e(f,[2,105]),e(f,[2,110]),e(f,[2,109]),e(f,[2,98]),e(f,[2,97]),e(f,[2,96]),e(f,[2,95]),e(f,[2,93]),e(f,[2,94]),e(f,[2,92]),e(f,[2,91]),e(f,[2,90]),e(f,[2,89]),e(f,[2,87]),e(f,[2,88])],defaultActions:{9:[2,118],10:[2,1],11:[2,2],19:[2,3],27:[2,4],46:[2,120],47:[2,5]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),50;case 1:return this.begin("type_directive"),51;case 2:return this.popState(),this.begin("arg_directive"),9;case 3:return this.popState(),this.popState(),53;case 4:return 52;case 5:return this.begin("acc_title"),20;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),22;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 34:case 38:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:return 14;case 13:case 14:break;case 15:return 6;case 16:return 40;case 17:return 33;case 18:return 38;case 19:return 42;case 20:return 43;case 21:return 44;case 22:return 45;case 23:return 35;case 24:return 29;case 25:return 30;case 26:return 37;case 27:return 32;case 28:return 27;case 29:case 30:return 10;case 31:return 9;case 32:return"CARET";case 33:this.begin("options");break;case 35:return 13;case 36:return 36;case 37:this.begin("string");break;case 39:return 34;case 40:return 31;case 41:return 54;case 42:return 8}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit(?=\s|$))/i,/^(?:id:)/i,/^(?:type:)/i,/^(?:msg:)/i,/^(?:NORMAL\b)/i,/^(?:REVERSE\b)/i,/^(?:HIGHLIGHT\b)/i,/^(?:tag:)/i,/^(?:branch(?=\s|$))/i,/^(?:order:)/i,/^(?:merge(?=\s|$))/i,/^(?:cherry-pick(?=\s|$))/i,/^(?:checkout(?=\s|$))/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:[ \r\n\t]+end\b)/i,/^(?:[\s\S]+(?=[ \r\n\t]+end))/i,/^(?:["]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[0-9]+(?=\s|$))/i,/^(?:\w([-\./\w]*[-\w])?)/i,/^(?:$)/i,/^(?:\s+)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},options:{rules:[34,35],inclusive:!1},string:{rules:[38,39],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,36,37,40,41,42,43],inclusive:!0}}},t);function T(){this.yy={}}return k.lexer=w,T.prototype=k,k.Parser=T,new T}();Yv.parser=Yv;const zv=Yv,Uv=t=>null!==t.match(/^\s*gitGraph/);let Wv="",Hv="",qv="";const Vv=t=>Mb(t,hv()),Gv=function(){Wv="",qv="",Hv=""},Xv=function(t){Wv=Vv(t).replace(/^\s+/g,"")},Zv=function(){return Wv||Hv},Qv=function(t){qv=Vv(t).replace(/\n\s+/g,"\n")},Kv=function(){return qv},Jv=function(t){Hv=Vv(t)},tk=function(){return Hv};let ek=hv().gitGraph.mainBranchName,nk=hv().gitGraph.mainBranchOrder,ik={},rk=null,ak={};ak[ek]={name:ek,order:nk};let sk={};sk[ek]=rk;let ok=ek,ck="LR",lk=0;function hk(){return Ux({length:7})}let uk={};const dk=function(t){if(t=jb.sanitizeText(t,hv()),void 0===sk[t]){let e=new Error('Trying to checkout branch which is not yet created. (Help try using "branch '+t+'")');throw e.hash={text:"checkout "+t,token:"checkout "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"branch '+t+'"']},e}{ok=t;const e=sk[ok];rk=ik[e]}};function pk(t,e,n){const i=t.indexOf(e);-1===i?t.push(n):t.splice(i,1,n)}function fk(t){const e=t.reduce(((t,e)=>t.seq>e.seq?t:e),t[0]);let n="";t.forEach((function(t){n+=t===e?"\t*":"\t|"}));const i=[n,e.id,e.seq];for(let r in sk)sk[r]===e.id&&i.push(r);if(Db.debug(i.join(" ")),e.parents&&2==e.parents.length){const n=ik[e.parents[0]];pk(t,e,n),t.push(ik[e.parents[1]])}else{if(0==e.parents.length)return;{const n=ik[e.parents];pk(t,e,n)}}fk(t=function(t,e){const n=Object.create(null);return t.reduce(((t,i)=>{const r=e(i);return n[r]||(n[r]=!0,t.push(i)),t}),[])}(t,(t=>t.id)))}const gk=function(){const t=Object.keys(ik).map((function(t){return ik[t]}));return t.forEach((function(t){Db.debug(t.id)})),t.sort(((t,e)=>t.seq-e.seq)),t},yk={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},mk={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().gitGraph,setDirection:function(t){ck=t},setOptions:function(t){Db.debug("options str",t),t=(t=t&&t.trim())||"{}";try{uk=JSON.parse(t)}catch(e){Db.error("error while parsing gitGraph options",e.message)}},getOptions:function(){return uk},commit:function(t,e,n,i){Db.debug("Entering commit:",t,e,n,i),e=jb.sanitizeText(e,hv()),t=jb.sanitizeText(t,hv()),i=jb.sanitizeText(i,hv());const r={id:e||lk+"-"+hk(),message:t,seq:lk++,type:n||yk.NORMAL,tag:i||"",parents:null==rk?[]:[rk.id],branch:ok};rk=r,ik[r.id]=r,sk[ok]=r.id,Db.debug("in pushCommit "+r.id)},branch:function(t,e){if(t=jb.sanitizeText(t,hv()),void 0!==sk[t]){let e=new Error('Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout '+t+'")');throw e.hash={text:"branch "+t,token:"branch "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"checkout '+t+'"']},e}sk[t]=null!=rk?rk.id:null,ak[t]={name:t,order:e?parseInt(e,10):null},dk(t),Db.debug("in createBranch")},merge:function(t,e,n,i){t=jb.sanitizeText(t,hv()),e=jb.sanitizeText(e,hv());const r=ik[sk[ok]],a=ik[sk[t]];if(ok===t){let e=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(void 0===r||!r){let e=new Error('Incorrect usage of "merge". Current branch ('+ok+")has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["commit"]},e}if(void 0===sk[t]){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") does not exist");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch "+t]},e}if(void 0===a||!a){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"commit"']},e}if(r===a){let e=new Error('Incorrect usage of "merge". Both branches have same head');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(e&&void 0!==ik[e]){let r=new Error('Incorrect usage of "merge". Commit with id:'+e+" already exists, use different custom Id");throw r.hash={text:"merge "+t+e+n+i,token:"merge "+t+e+n+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["merge "+t+" "+e+"_UNIQUE "+n+" "+i]},r}const s={id:e||lk+"-"+hk(),message:"merged branch "+t+" into "+ok,seq:lk++,parents:[null==rk?null:rk.id,sk[t]],branch:ok,type:yk.MERGE,customType:n,customId:!!e,tag:i||""};rk=s,ik[s.id]=s,sk[ok]=s.id,Db.debug(sk),Db.debug("in mergeBranch")},cherryPick:function(t,e,n){if(Db.debug("Entering cherryPick:",t,e,n),t=jb.sanitizeText(t,hv()),e=jb.sanitizeText(e,hv()),n=jb.sanitizeText(n,hv()),!t||void 0===ik[t]){let n=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}let i=ik[t],r=i.branch;if(i.type===yk.MERGE){let n=new Error('Incorrect usage of "cherryPick". Source commit should not be a merge commit');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}if(!e||void 0===ik[e]){if(r===ok){let n=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const a=ik[sk[ok]];if(void 0===a||!a){let n=new Error('Incorrect usage of "cherry-pick". Current branch ('+ok+")has no commits");throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const s={id:lk+"-"+hk(),message:"cherry-picked "+i+" into "+ok,seq:lk++,parents:[null==rk?null:rk.id,i.id],branch:ok,type:yk.CHERRY_PICK,tag:null!=n?n:"cherry-pick:"+i.id};rk=s,ik[s.id]=s,sk[ok]=s.id,Db.debug(sk),Db.debug("in cherryPick")}},checkout:dk,prettyPrint:function(){Db.debug(ik);fk([gk()[0]])},clear:function(){ik={},rk=null;let t=hv().gitGraph.mainBranchName,e=hv().gitGraph.mainBranchOrder;sk={},sk[t]=null,ak={},ak[t]={name:t,order:e},ok=t,lk=0,Gv()},getBranchesAsObjArray:function(){const t=Object.values(ak).map(((t,e)=>null!==t.order?t:{...t,order:parseFloat(`0.${e}`,10)})).sort(((t,e)=>t.order-e.order)).map((({name:t})=>({name:t})));return t},getBranches:function(){return sk},getCommits:function(){return ik},getCommitsArray:gk,getCurrentBranch:function(){return ok},getDirection:function(){return ck},getHead:function(){return rk},setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,setDiagramTitle:Jv,getDiagramTitle:tk,commitType:yk};let bk={};const _k=0,xk=1,vk=2,kk=3,wk=4;let Tk={},Ck={},Ek=[],Sk=0;const Ak=(t,e,n)=>{const i=Iv().gitGraph,r=t.append("g").attr("class","commit-bullets"),a=t.append("g").attr("class","commit-labels");let s=0;Object.keys(e).sort(((t,n)=>e[t].seq-e[n].seq)).forEach((t=>{const o=e[t],c=Tk[o.branch].pos,l=s+10;if(n){let t,e=void 0!==o.customType&&""!==o.customType?o.customType:o.type;switch(e){case _k:t="commit-normal";break;case xk:t="commit-reverse";break;case vk:t="commit-highlight";break;case kk:t="commit-merge";break;case wk:t="commit-cherry-pick";break;default:t="commit-normal"}if(e===vk){const e=r.append("rect");e.attr("x",l-10),e.attr("y",c-10),e.attr("height",20),e.attr("width",20),e.attr("class",`commit ${o.id} commit-highlight${Tk[o.branch].index%8} ${t}-outer`),r.append("rect").attr("x",l-6).attr("y",c-6).attr("height",12).attr("width",12).attr("class",`commit ${o.id} commit${Tk[o.branch].index%8} ${t}-inner`)}else if(e===wk)r.append("circle").attr("cx",l).attr("cy",c).attr("r",10).attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l-3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l+3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l+3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l-3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`);else{const n=r.append("circle");if(n.attr("cx",l),n.attr("cy",c),n.attr("r",o.type===kk?9:10),n.attr("class",`commit ${o.id} commit${Tk[o.branch].index%8}`),e===kk){const e=r.append("circle");e.attr("cx",l),e.attr("cy",c),e.attr("r",6),e.attr("class",`commit ${t} ${o.id} commit${Tk[o.branch].index%8}`)}if(e===xk){r.append("path").attr("d",`M ${l-5},${c-5}L${l+5},${c+5}M${l-5},${c+5}L${l+5},${c-5}`).attr("class",`commit ${t} ${o.id} commit${Tk[o.branch].index%8}`)}}}if(Ck[o.id]={x:s+10,y:c},n){const t=4,e=2;if(o.type!==wk&&(o.customId&&o.type===kk||o.type!==kk)&&i.showCommitLabel){const t=a.append("g"),n=t.insert("rect").attr("class","commit-label-bkg"),r=t.append("text").attr("x",s).attr("y",c+25).attr("class","commit-label").text(o.id);let l=r.node().getBBox();if(n.attr("x",s+10-l.width/2-e).attr("y",c+13.5).attr("width",l.width+2*e).attr("height",l.height+2*e),r.attr("x",s+10-l.width/2),i.rotateCommitLabel){let e=-7.5-(l.width+10)/25*9.5,n=10+l.width/25*8.5;t.attr("transform","translate("+e+", "+n+") rotate("+"-45, "+s+", "+c+")")}}if(o.tag){const n=a.insert("polygon"),i=a.append("circle"),r=a.append("text").attr("y",c-16).attr("class","tag-label").text(o.tag);let l=r.node().getBBox();r.attr("x",s+10-l.width/2);const h=l.height/2,u=c-19.2;n.attr("class","tag-label-bkg").attr("points",`\n ${s-l.width/2-t/2},${u+e}\n ${s-l.width/2-t/2},${u-e}\n ${s+10-l.width/2-t},${u-h-e}\n ${s+10+l.width/2+t},${u-h-e}\n ${s+10+l.width/2+t},${u+h+e}\n ${s+10-l.width/2-t},${u+h+e}`),i.attr("cx",s-l.width/2+t/2).attr("cy",u).attr("r",1.5).attr("class","tag-hole")}}s+=50,s>Sk&&(Sk=s)}))},Dk=(t,e,n=0)=>{const i=t+Math.abs(t-e)/2;if(n>5)return i;if(Ek.every((t=>Math.abs(t-i)>=10)))return Ek.push(i),i;const r=Math.abs(t-e);return Dk(t,e-r/5,n+1)},Lk=(t,e,n,i)=>{const r=Ck[e.id],a=Ck[n.id],s=((t,e,n)=>Object.keys(n).filter((i=>n[i].branch===e.branch&&n[i].seq>t.seq&&n[i].seq<e.seq)).length>0)(e,n,i);let o,c="",l="",h=0,u=0,d=Tk[n.branch].index;if(s){c="A 10 10, 0, 0, 0,",l="A 10 10, 0, 0, 1,",h=10,u=10,d=Tk[n.branch].index;const t=r.y<a.y?Dk(r.y,a.y):Dk(a.y,r.y);o=r.y<a.y?`M ${r.x} ${r.y} L ${r.x} ${t-h} ${c} ${r.x+u} ${t} L ${a.x-h} ${t} ${l} ${a.x} ${t+u} L ${a.x} ${a.y}`:`M ${r.x} ${r.y} L ${r.x} ${t+h} ${l} ${r.x+u} ${t} L ${a.x-h} ${t} ${c} ${a.x} ${t-u} L ${a.x} ${a.y}`}else r.y<a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Tk[n.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`),r.y>a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Tk[e.branch].index,o=`M ${r.x} ${r.y} L ${a.x-h} ${r.y} ${c} ${a.x} ${r.y-u} L ${a.x} ${a.y}`),r.y===a.y&&(d=Tk[e.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`);t.append("path").attr("d",o).attr("class","arrow arrow"+d%8)},Nk=(t,e)=>{const n=Iv().gitGraph,i=t.append("g");e.forEach(((t,e)=>{const r=e%8,a=Tk[t.name].pos,s=i.append("line");s.attr("x1",0),s.attr("y1",a),s.attr("x2",Sk),s.attr("y2",a),s.attr("class","branch branch"+r),Ek.push(a);const o=(t=>{const e=document.createElementNS("http://www.w3.org/2000/svg","text");let n=[];n="string"==typeof t?t.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(t)?t:[];for(const i of n){const t=document.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","0"),t.setAttribute("class","row"),t.textContent=i.trim(),e.appendChild(t)}return e})(t.name),c=i.insert("rect"),l=i.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+r);l.node().appendChild(o);let h=o.getBBox();c.attr("class","branchLabelBkg label"+r).attr("rx",4).attr("ry",4).attr("x",-h.width-4-(!0===n.rotateCommitLabel?30:0)).attr("y",-h.height/2+8).attr("width",h.width+18).attr("height",h.height+4),l.attr("transform","translate("+(-h.width-14-(!0===n.rotateCommitLabel?30:0))+", "+(a-h.height/2-1)+")"),c.attr("transform","translate(-19, "+(a-h.height/2)+")")}))},Ok={draw:function(t,e,n,i){var r;Tk={},Ck={},bk={},Sk=0,Ek=[];const a=Iv(),s=a.gitGraph;Db.debug("in gitgraph renderer",t+"\n","id:",e,n),bk=i.db.getCommits();const o=i.db.getBranchesAsObjArray();let c=0;o.forEach(((t,e)=>{Tk[t.name]={pos:c,index:e},c+=50+(s.rotateCommitLabel?40:0)}));const l=Ho(`[id="${e}"]`);Ak(l,bk,!1),s.showBranches&&Nk(l,o),((t,e)=>{const n=t.append("g").attr("class","commit-arrows");Object.keys(e).forEach((t=>{const i=e[t];i.parents&&i.parents.length>0&&i.parents.forEach((t=>{Lk(n,e[t],i,e)}))}))})(l,bk),Ak(l,bk,!0),tv.insertTitle(l,"gitTitleText",s.titleTopMargin,i.db.getDiagramTitle()),Rv(void 0,l,s.diagramPadding,null!=(r=s.useMaxWidth)?r:a.useMaxWidth)}},Bk=t=>`\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n ${[0,1,2,3,4,5,6,7].map((e=>`\n .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; }\n .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; }\n .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; }\n .label${e} { fill: ${t["git"+e]}; }\n .arrow${e} { stroke: ${t["git"+e]}; }\n `)).join("\n")}\n\n .branch {\n stroke-width: 1;\n stroke: ${t.lineColor};\n stroke-dasharray: 2;\n }\n .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};}\n .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; }\n .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};}\n .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; }\n .tag-hole { fill: ${t.textColor}; }\n\n .commit-merge {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n .commit-reverse {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n stroke-width: 3;\n }\n .commit-highlight-outer {\n }\n .commit-highlight-inner {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n\n .arrow { stroke-width: 8; stroke-linecap: round; fill: none}\n .gitTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n }\n`;var Mk=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,6],i=[1,7],r=[1,8],a=[1,9],s=[1,16],o=[1,11],l=[1,12],h=[1,13],u=[1,14],d=[1,15],p=[1,27],f=[1,33],g=[1,34],y=[1,35],m=[1,36],b=[1,37],_=[1,72],x=[1,73],v=[1,74],k=[1,75],w=[1,76],T=[1,77],C=[1,78],E=[1,38],S=[1,39],A=[1,40],D=[1,41],L=[1,42],N=[1,43],O=[1,44],B=[1,45],M=[1,46],I=[1,47],F=[1,48],R=[1,49],$=[1,50],P=[1,51],j=[1,52],Y=[1,53],z=[1,54],U=[1,55],W=[1,56],H=[1,57],q=[1,59],V=[1,60],G=[1,61],X=[1,62],Z=[1,63],Q=[1,64],K=[1,65],J=[1,66],tt=[1,67],et=[1,68],nt=[1,69],it=[24,52],rt=[24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],at=[15,24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],st=[1,94],ot=[1,95],ct=[1,96],lt=[1,97],ht=[15,24,52],ut=[7,8,9,10,18,22,25,26,27,28],dt=[15,24,43,52],pt=[15,24,43,52,86,87,89,90],ft=[15,43],gt=[44,46,47,48,49,50,51,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],yt={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,directive:6,direction_tb:7,direction_bt:8,direction_rl:9,direction_lr:10,graphConfig:11,openDirective:12,typeDirective:13,closeDirective:14,NEWLINE:15,":":16,argDirective:17,open_directive:18,type_directive:19,arg_directive:20,close_directive:21,C4_CONTEXT:22,statements:23,EOF:24,C4_CONTAINER:25,C4_COMPONENT:26,C4_DYNAMIC:27,C4_DEPLOYMENT:28,otherStatements:29,diagramStatements:30,otherStatement:31,title:32,accDescription:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,boundaryStatement:39,boundaryStartStatement:40,boundaryStopStatement:41,boundaryStart:42,LBRACE:43,ENTERPRISE_BOUNDARY:44,attributes:45,SYSTEM_BOUNDARY:46,BOUNDARY:47,CONTAINER_BOUNDARY:48,NODE:49,NODE_L:50,NODE_R:51,RBRACE:52,diagramStatement:53,PERSON:54,PERSON_EXT:55,SYSTEM:56,SYSTEM_DB:57,SYSTEM_QUEUE:58,SYSTEM_EXT:59,SYSTEM_EXT_DB:60,SYSTEM_EXT_QUEUE:61,CONTAINER:62,CONTAINER_DB:63,CONTAINER_QUEUE:64,CONTAINER_EXT:65,CONTAINER_EXT_DB:66,CONTAINER_EXT_QUEUE:67,COMPONENT:68,COMPONENT_DB:69,COMPONENT_QUEUE:70,COMPONENT_EXT:71,COMPONENT_EXT_DB:72,COMPONENT_EXT_QUEUE:73,REL:74,BIREL:75,REL_U:76,REL_D:77,REL_L:78,REL_R:79,REL_B:80,REL_INDEX:81,UPDATE_EL_STYLE:82,UPDATE_REL_STYLE:83,UPDATE_LAYOUT_CONFIG:84,attribute:85,STR:86,STR_KEY:87,STR_VALUE:88,ATTRIBUTE:89,ATTRIBUTE_EMPTY:90,$accept:0,$end:1},terminals_:{2:"error",7:"direction_tb",8:"direction_bt",9:"direction_rl",10:"direction_lr",15:"NEWLINE",16:":",18:"open_directive",19:"type_directive",20:"arg_directive",21:"close_directive",22:"C4_CONTEXT",24:"EOF",25:"C4_CONTAINER",26:"C4_COMPONENT",27:"C4_DYNAMIC",28:"C4_DEPLOYMENT",32:"title",33:"accDescription",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",43:"LBRACE",44:"ENTERPRISE_BOUNDARY",46:"SYSTEM_BOUNDARY",47:"BOUNDARY",48:"CONTAINER_BOUNDARY",49:"NODE",50:"NODE_L",51:"NODE_R",52:"RBRACE",54:"PERSON",55:"PERSON_EXT",56:"SYSTEM",57:"SYSTEM_DB",58:"SYSTEM_QUEUE",59:"SYSTEM_EXT",60:"SYSTEM_EXT_DB",61:"SYSTEM_EXT_QUEUE",62:"CONTAINER",63:"CONTAINER_DB",64:"CONTAINER_QUEUE",65:"CONTAINER_EXT",66:"CONTAINER_EXT_DB",67:"CONTAINER_EXT_QUEUE",68:"COMPONENT",69:"COMPONENT_DB",70:"COMPONENT_QUEUE",71:"COMPONENT_EXT",72:"COMPONENT_EXT_DB",73:"COMPONENT_EXT_QUEUE",74:"REL",75:"BIREL",76:"REL_U",77:"REL_D",78:"REL_L",79:"REL_R",80:"REL_B",81:"REL_INDEX",82:"UPDATE_EL_STYLE",83:"UPDATE_REL_STYLE",84:"UPDATE_LAYOUT_CONFIG",86:"STR",87:"STR_KEY",88:"STR_VALUE",89:"ATTRIBUTE",90:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[3,2],[5,1],[5,1],[5,1],[5,1],[4,1],[6,4],[6,6],[12,1],[13,1],[17,1],[14,1],[11,4],[11,4],[11,4],[11,4],[11,4],[23,1],[23,1],[23,2],[29,1],[29,2],[29,3],[31,1],[31,1],[31,2],[31,2],[31,1],[39,3],[40,3],[40,3],[40,4],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[41,1],[30,1],[30,2],[30,3],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,1],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[45,1],[45,2],[85,1],[85,2],[85,1],[85,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setDirection("TB");break;case 5:i.setDirection("BT");break;case 6:i.setDirection("RL");break;case 7:i.setDirection("LR");break;case 11:i.parseDirective("%%{","open_directive");break;case 12:break;case 13:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 14:i.parseDirective("}%%","close_directive","c4Context");break;case 15:case 16:case 17:case 18:case 19:i.setC4Type(a[o-3]);break;case 26:i.setTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 27:i.setAccDescription(a[o].substring(15)),this.$=a[o].substring(15);break;case 28:this.$=a[o].trim(),i.setTitle(this.$);break;case 29:case 30:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 35:case 36:a[o].splice(2,0,"ENTERPRISE"),i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 37:i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 38:a[o].splice(2,0,"CONTAINER"),i.addContainerBoundary(...a[o]),this.$=a[o];break;case 39:i.addDeploymentNode("node",...a[o]),this.$=a[o];break;case 40:i.addDeploymentNode("nodeL",...a[o]),this.$=a[o];break;case 41:i.addDeploymentNode("nodeR",...a[o]),this.$=a[o];break;case 42:i.popBoundaryParseStack();break;case 46:i.addPersonOrSystem("person",...a[o]),this.$=a[o];break;case 47:i.addPersonOrSystem("external_person",...a[o]),this.$=a[o];break;case 48:i.addPersonOrSystem("system",...a[o]),this.$=a[o];break;case 49:i.addPersonOrSystem("system_db",...a[o]),this.$=a[o];break;case 50:i.addPersonOrSystem("system_queue",...a[o]),this.$=a[o];break;case 51:i.addPersonOrSystem("external_system",...a[o]),this.$=a[o];break;case 52:i.addPersonOrSystem("external_system_db",...a[o]),this.$=a[o];break;case 53:i.addPersonOrSystem("external_system_queue",...a[o]),this.$=a[o];break;case 54:i.addContainer("container",...a[o]),this.$=a[o];break;case 55:i.addContainer("container_db",...a[o]),this.$=a[o];break;case 56:i.addContainer("container_queue",...a[o]),this.$=a[o];break;case 57:i.addContainer("external_container",...a[o]),this.$=a[o];break;case 58:i.addContainer("external_container_db",...a[o]),this.$=a[o];break;case 59:i.addContainer("external_container_queue",...a[o]),this.$=a[o];break;case 60:i.addComponent("component",...a[o]),this.$=a[o];break;case 61:i.addComponent("component_db",...a[o]),this.$=a[o];break;case 62:i.addComponent("component_queue",...a[o]),this.$=a[o];break;case 63:i.addComponent("external_component",...a[o]),this.$=a[o];break;case 64:i.addComponent("external_component_db",...a[o]),this.$=a[o];break;case 65:i.addComponent("external_component_queue",...a[o]),this.$=a[o];break;case 67:i.addRel("rel",...a[o]),this.$=a[o];break;case 68:i.addRel("birel",...a[o]),this.$=a[o];break;case 69:i.addRel("rel_u",...a[o]),this.$=a[o];break;case 70:i.addRel("rel_d",...a[o]),this.$=a[o];break;case 71:i.addRel("rel_l",...a[o]),this.$=a[o];break;case 72:i.addRel("rel_r",...a[o]),this.$=a[o];break;case 73:i.addRel("rel_b",...a[o]),this.$=a[o];break;case 74:a[o].splice(0,1),i.addRel("rel",...a[o]),this.$=a[o];break;case 75:i.updateElStyle("update_el_style",...a[o]),this.$=a[o];break;case 76:i.updateRelStyle("update_rel_style",...a[o]),this.$=a[o];break;case 77:i.updateLayoutConfig("update_layout_config",...a[o]),this.$=a[o];break;case 78:this.$=[a[o]];break;case 79:a[o].unshift(a[o-1]),this.$=a[o];break;case 80:case 82:this.$=a[o].trim();break;case 81:let t={};t[a[o-1].trim()]=a[o].trim(),this.$=t;break;case 83:this.$=""}},table:[{3:1,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[3]},{1:[2,1]},{1:[2,2]},{3:17,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[2,8]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{1:[2,7]},{13:18,19:[1,19]},{15:[1,20]},{15:[1,21]},{15:[1,22]},{15:[1,23]},{15:[1,24]},{19:[2,11]},{1:[2,3]},{14:25,16:[1,26],21:p},e([16,21],[2,12]),{23:28,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:79,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:80,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:81,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:82,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,83]},{17:84,20:[1,85]},{15:[2,14]},{24:[1,86]},e(it,[2,20],{53:32,39:58,40:70,42:71,30:87,44:_,46:x,47:v,48:k,49:w,50:T,51:C,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(it,[2,21]),e(rt,[2,23],{15:[1,88]}),e(it,[2,43],{15:[1,89]}),e(at,[2,26]),e(at,[2,27]),{35:[1,90]},{37:[1,91]},e(at,[2,30]),{45:92,85:93,86:st,87:ot,89:ct,90:lt},{45:98,85:93,86:st,87:ot,89:ct,90:lt},{45:99,85:93,86:st,87:ot,89:ct,90:lt},{45:100,85:93,86:st,87:ot,89:ct,90:lt},{45:101,85:93,86:st,87:ot,89:ct,90:lt},{45:102,85:93,86:st,87:ot,89:ct,90:lt},{45:103,85:93,86:st,87:ot,89:ct,90:lt},{45:104,85:93,86:st,87:ot,89:ct,90:lt},{45:105,85:93,86:st,87:ot,89:ct,90:lt},{45:106,85:93,86:st,87:ot,89:ct,90:lt},{45:107,85:93,86:st,87:ot,89:ct,90:lt},{45:108,85:93,86:st,87:ot,89:ct,90:lt},{45:109,85:93,86:st,87:ot,89:ct,90:lt},{45:110,85:93,86:st,87:ot,89:ct,90:lt},{45:111,85:93,86:st,87:ot,89:ct,90:lt},{45:112,85:93,86:st,87:ot,89:ct,90:lt},{45:113,85:93,86:st,87:ot,89:ct,90:lt},{45:114,85:93,86:st,87:ot,89:ct,90:lt},{45:115,85:93,86:st,87:ot,89:ct,90:lt},{45:116,85:93,86:st,87:ot,89:ct,90:lt},e(ht,[2,66]),{45:117,85:93,86:st,87:ot,89:ct,90:lt},{45:118,85:93,86:st,87:ot,89:ct,90:lt},{45:119,85:93,86:st,87:ot,89:ct,90:lt},{45:120,85:93,86:st,87:ot,89:ct,90:lt},{45:121,85:93,86:st,87:ot,89:ct,90:lt},{45:122,85:93,86:st,87:ot,89:ct,90:lt},{45:123,85:93,86:st,87:ot,89:ct,90:lt},{45:124,85:93,86:st,87:ot,89:ct,90:lt},{45:125,85:93,86:st,87:ot,89:ct,90:lt},{45:126,85:93,86:st,87:ot,89:ct,90:lt},{45:127,85:93,86:st,87:ot,89:ct,90:lt},{30:128,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,130],43:[1,129]},{45:131,85:93,86:st,87:ot,89:ct,90:lt},{45:132,85:93,86:st,87:ot,89:ct,90:lt},{45:133,85:93,86:st,87:ot,89:ct,90:lt},{45:134,85:93,86:st,87:ot,89:ct,90:lt},{45:135,85:93,86:st,87:ot,89:ct,90:lt},{45:136,85:93,86:st,87:ot,89:ct,90:lt},{45:137,85:93,86:st,87:ot,89:ct,90:lt},{24:[1,138]},{24:[1,139]},{24:[1,140]},{24:[1,141]},e(ut,[2,9]),{14:142,21:p},{21:[2,13]},{1:[2,15]},e(it,[2,22]),e(rt,[2,24],{31:31,29:143,32:f,33:g,34:y,36:m,38:b}),e(it,[2,44],{29:29,30:30,31:31,53:32,39:58,40:70,42:71,23:144,32:f,33:g,34:y,36:m,38:b,44:_,46:x,47:v,48:k,49:w,50:T,51:C,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(at,[2,28]),e(at,[2,29]),e(ht,[2,46]),e(dt,[2,78],{85:93,45:145,86:st,87:ot,89:ct,90:lt}),e(pt,[2,80]),{88:[1,146]},e(pt,[2,82]),e(pt,[2,83]),e(ht,[2,47]),e(ht,[2,48]),e(ht,[2,49]),e(ht,[2,50]),e(ht,[2,51]),e(ht,[2,52]),e(ht,[2,53]),e(ht,[2,54]),e(ht,[2,55]),e(ht,[2,56]),e(ht,[2,57]),e(ht,[2,58]),e(ht,[2,59]),e(ht,[2,60]),e(ht,[2,61]),e(ht,[2,62]),e(ht,[2,63]),e(ht,[2,64]),e(ht,[2,65]),e(ht,[2,67]),e(ht,[2,68]),e(ht,[2,69]),e(ht,[2,70]),e(ht,[2,71]),e(ht,[2,72]),e(ht,[2,73]),e(ht,[2,74]),e(ht,[2,75]),e(ht,[2,76]),e(ht,[2,77]),{41:147,52:[1,148]},{15:[1,149]},{43:[1,150]},e(ft,[2,35]),e(ft,[2,36]),e(ft,[2,37]),e(ft,[2,38]),e(ft,[2,39]),e(ft,[2,40]),e(ft,[2,41]),{1:[2,16]},{1:[2,17]},{1:[2,18]},{1:[2,19]},{15:[1,151]},e(rt,[2,25]),e(it,[2,45]),e(dt,[2,79]),e(pt,[2,81]),e(ht,[2,31]),e(ht,[2,42]),e(gt,[2,32]),e(gt,[2,33],{15:[1,152]}),e(ut,[2,10]),e(gt,[2,34])],defaultActions:{2:[2,1],3:[2,2],5:[2,8],6:[2,4],7:[2,5],8:[2,6],9:[2,7],16:[2,11],17:[2,3],27:[2,14],85:[2,13],86:[2,15],138:[2,16],139:[2,17],140:[2,18],141:[2,19]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},mt=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),18;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 10;case 5:return this.begin("type_directive"),19;case 6:return this.popState(),this.begin("arg_directive"),16;case 7:return this.popState(),this.popState(),21;case 8:return 20;case 9:return 32;case 10:return 33;case 11:return this.begin("acc_title"),34;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),36;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 78:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:case 21:case 75:break;case 19:c;break;case 20:return 15;case 22:return 22;case 23:return 25;case 24:return 26;case 25:return 27;case 26:return 28;case 27:return this.begin("person_ext"),55;case 28:return this.begin("person"),54;case 29:return this.begin("system_ext_queue"),61;case 30:return this.begin("system_ext_db"),60;case 31:return this.begin("system_ext"),59;case 32:return this.begin("system_queue"),58;case 33:return this.begin("system_db"),57;case 34:return this.begin("system"),56;case 35:return this.begin("boundary"),47;case 36:return this.begin("enterprise_boundary"),44;case 37:return this.begin("system_boundary"),46;case 38:return this.begin("container_ext_queue"),67;case 39:return this.begin("container_ext_db"),66;case 40:return this.begin("container_ext"),65;case 41:return this.begin("container_queue"),64;case 42:return this.begin("container_db"),63;case 43:return this.begin("container"),62;case 44:return this.begin("container_boundary"),48;case 45:return this.begin("component_ext_queue"),73;case 46:return this.begin("component_ext_db"),72;case 47:return this.begin("component_ext"),71;case 48:return this.begin("component_queue"),70;case 49:return this.begin("component_db"),69;case 50:return this.begin("component"),68;case 51:case 52:return this.begin("node"),49;case 53:return this.begin("node_l"),50;case 54:return this.begin("node_r"),51;case 55:return this.begin("rel"),74;case 56:return this.begin("birel"),75;case 57:case 58:return this.begin("rel_u"),76;case 59:case 60:return this.begin("rel_d"),77;case 61:case 62:return this.begin("rel_l"),78;case 63:case 64:return this.begin("rel_r"),79;case 65:return this.begin("rel_b"),80;case 66:return this.begin("rel_index"),81;case 67:return this.begin("update_el_style"),82;case 68:return this.begin("update_rel_style"),83;case 69:return this.begin("update_layout_config"),84;case 70:return"EOF_IN_STRUCT";case 71:return this.begin("attribute"),"ATTRIBUTE_EMPTY";case 72:this.begin("attribute");break;case 73:case 84:this.popState(),this.popState();break;case 74:case 76:return 90;case 77:this.begin("string");break;case 79:case 85:return"STR";case 80:this.begin("string_kv");break;case 81:return this.begin("string_kv_key"),"STR_KEY";case 82:this.popState(),this.begin("string_kv_value");break;case 83:return"STR_VALUE";case 86:return"LBRACE";case 87:return"RBRACE";case 88:return"SPACE";case 89:return"EOL";case 90:return 24}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},string_kv_value:{rules:[83,84],inclusive:!1},string_kv_key:{rules:[82],inclusive:!1},string_kv:{rules:[81],inclusive:!1},string:{rules:[78,79],inclusive:!1},attribute:{rules:[73,74,75,76,77,80,85],inclusive:!1},update_layout_config:{rules:[70,71,72,73],inclusive:!1},update_rel_style:{rules:[70,71,72,73],inclusive:!1},update_el_style:{rules:[70,71,72,73],inclusive:!1},rel_b:{rules:[70,71,72,73],inclusive:!1},rel_r:{rules:[70,71,72,73],inclusive:!1},rel_l:{rules:[70,71,72,73],inclusive:!1},rel_d:{rules:[70,71,72,73],inclusive:!1},rel_u:{rules:[70,71,72,73],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[70,71,72,73],inclusive:!1},node_r:{rules:[70,71,72,73],inclusive:!1},node_l:{rules:[70,71,72,73],inclusive:!1},node:{rules:[70,71,72,73],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[70,71,72,73],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[70,71,72,73],inclusive:!1},component_ext:{rules:[70,71,72,73],inclusive:!1},component_queue:{rules:[70,71,72,73],inclusive:!1},component_db:{rules:[70,71,72,73],inclusive:!1},component:{rules:[70,71,72,73],inclusive:!1},container_boundary:{rules:[70,71,72,73],inclusive:!1},container_ext_queue:{rules:[],inclusive:!1},container_ext_db:{rules:[70,71,72,73],inclusive:!1},container_ext:{rules:[70,71,72,73],inclusive:!1},container_queue:{rules:[70,71,72,73],inclusive:!1},container_db:{rules:[70,71,72,73],inclusive:!1},container:{rules:[70,71,72,73],inclusive:!1},birel:{rules:[70,71,72,73],inclusive:!1},system_boundary:{rules:[70,71,72,73],inclusive:!1},enterprise_boundary:{rules:[70,71,72,73],inclusive:!1},boundary:{rules:[70,71,72,73],inclusive:!1},system_ext_queue:{rules:[70,71,72,73],inclusive:!1},system_ext_db:{rules:[70,71,72,73],inclusive:!1},system_ext:{rules:[70,71,72,73],inclusive:!1},system_queue:{rules:[70,71,72,73],inclusive:!1},system_db:{rules:[70,71,72,73],inclusive:!1},system:{rules:[70,71,72,73],inclusive:!1},person_ext:{rules:[70,71,72,73],inclusive:!1},person:{rules:[70,71,72,73],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,86,87,88,89,90],inclusive:!0}}},t);function bt(){this.yy={}}return yt.lexer=mt,bt.prototype=yt,yt.Parser=bt,new bt}();Mk.parser=Mk;const Ik=Mk,Fk=t=>null!==t.match(/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/);let Rk=[],$k=[""],Pk="global",jk="",Yk=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],zk=[],Uk="",Wk=!1,Hk=4,qk=2;var Vk;const Gk=function(t){return null==t?Rk:Rk.filter((e=>e.parentBoundary===t))},Xk=function(){return Wk},Zk={addPersonOrSystem:function(t,e,n,i,r,a,s){if(null===e||null===n)return;let o={};const c=Rk.find((t=>t.alias===e));if(c&&e===c.alias?o=c:(o.alias=e,Rk.push(o)),o.label=null==n?{text:""}:{text:n},null==i)o.descr={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]={text:e}}else o.descr={text:i};if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.sprite=r;if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=e}else o.tags=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=e}else o.link=s;o.typeC4Shape={text:t},o.parentBoundary=Pk,o.wrap=Xk()},addPersonOrSystemBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Yk.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Yk.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"system"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=Pk,a.wrap=Xk(),jk=Pk,Pk=t,$k.push(jk)},addContainer:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Rk.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Rk.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=Xk(),c.typeC4Shape={text:t},c.parentBoundary=Pk},addContainerBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Yk.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Yk.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"container"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=Pk,a.wrap=Xk(),jk=Pk,Pk=t,$k.push(jk)},addComponent:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Rk.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Rk.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=Xk(),c.typeC4Shape={text:t},c.parentBoundary=Pk},addDeploymentNode:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Yk.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Yk.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.type={text:"node"};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.type={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.nodeType=t,c.parentBoundary=Pk,c.wrap=Xk(),jk=Pk,Pk=e,$k.push(jk)},popBoundaryParseStack:function(){Pk=jk,$k.pop(),jk=$k.pop(),$k.push(jk)},addRel:function(t,e,n,i,r,a,s,o,c){if(null==t||null==e||null==n||null==i)return;let l={};const h=zk.find((t=>t.from===e&&t.to===n));if(h?l=h:zk.push(l),l.type=t,l.from=e,l.to=n,l.label={text:i},null==r)l.techn={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];l[t]={text:e}}else l.techn={text:r};if(null==a)l.descr={text:""};else if("object"==typeof a){let[t,e]=Object.entries(a)[0];l[t]={text:e}}else l.descr={text:a};if("object"==typeof s){let[t,e]=Object.entries(s)[0];l[t]=e}else l.sprite=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];l[t]=e}else l.tags=o;if("object"==typeof c){let[t,e]=Object.entries(c)[0];l[t]=e}else l.link=c;l.wrap=Xk()},updateElStyle:function(t,e,n,i,r,a,s,o,c,l,h){let u=Rk.find((t=>t.alias===e));if(void 0!==u||(u=Yk.find((t=>t.alias===e)),void 0!==u)){if(null!=n)if("object"==typeof n){let[t,e]=Object.entries(n)[0];u[t]=e}else u.bgColor=n;if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];u[t]=e}else u.fontColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];u[t]=e}else u.borderColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];u[t]=e}else u.shadowing=a;if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];u[t]=e}else u.shape=s;if(null!=o)if("object"==typeof o){let[t,e]=Object.entries(o)[0];u[t]=e}else u.sprite=o;if(null!=c)if("object"==typeof c){let[t,e]=Object.entries(c)[0];u[t]=e}else u.techn=c;if(null!=l)if("object"==typeof l){let[t,e]=Object.entries(l)[0];u[t]=e}else u.legendText=l;if(null!=h)if("object"==typeof h){let[t,e]=Object.entries(h)[0];u[t]=e}else u.legendSprite=h}},updateRelStyle:function(t,e,n,i,r,a,s){const o=zk.find((t=>t.from===e&&t.to===n));if(void 0!==o){if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]=e}else o.textColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.lineColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=parseInt(e)}else o.offsetX=parseInt(a);if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=parseInt(e)}else o.offsetY=parseInt(s)}},updateLayoutConfig:function(t,e,n){let i=Hk,r=qk;if("object"==typeof e){const t=Object.values(e)[0];i=parseInt(t)}else i=parseInt(e);if("object"==typeof n){const t=Object.values(n)[0];r=parseInt(t)}else r=parseInt(n);i>=1&&(Hk=i),r>=1&&(qk=r)},autoWrap:Xk,setWrap:function(t){Wk=t},getC4ShapeArray:Gk,getC4Shape:function(t){return Rk.find((e=>e.alias===t))},getC4ShapeKeys:function(t){return Object.keys(Gk(t))},getBoundarys:function(t){return null==t?Yk:Yk.filter((e=>e.parentBoundary===t))},getCurrentBoundaryParse:function(){return Pk},getParentBoundaryParse:function(){return jk},getRels:function(){return zk},getTitle:function(){return Uk},getC4Type:function(){return Vk},getC4ShapeInRow:function(){return Hk},getC4BoundaryInRow:function(){return qk},setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().c4,clear:function(){Rk=[],Yk=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],jk="",Pk="global",$k=[""],zk=[],$k=[""],Uk="",Wk=!1,Hk=4,qk=2},LINETYPE:{SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},setTitle:function(t){let e=Mb(t,hv());Uk=e},setC4Type:function(t){let e=Mb(t,hv());Vk=e}},Qk=function(t,e){const n=t.append("rect");if(n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),"undefined"!==e.attrs&&null!==e.attrs)for(let i in e.attrs)n.attr(i,e.attrs[i]);return"undefined"!==e.class&&n.attr("class",e.class),n},Kk=function(t,e,n,i,r,a){const s=t.append("image");s.attr("width",e),s.attr("height",n),s.attr("x",i),s.attr("y",r);let o=a.startsWith("data:image/png;base64")?a:(0,xt.N)(a);s.attr("xlink:href",o)},Jk=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},tw=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),ew=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{fontSize:l,fontFamily:h,fontWeight:u}=c,d=t.split(jb.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,s=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").attr("dominant-baseline","middle").style("font-size",l).style("font-weight",u).style("font-family",h);s.append("tspan").attr("dy",t).text(d[p]).attr("alignment-baseline","mathematical"),i(s,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,0,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),nw=function(t,e,n){const i=t.append("g");let r=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",o={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(o={"stroke-width":1});let c={x:e.x,y:e.y,fill:r,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:o};Qk(i,c);let l=n.boundaryFont();l.fontWeight="bold",l.fontSize=l.fontSize+2,l.fontColor=s,ew(n)(e.label.text,i,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},l),e.type&&""!==e.type.text&&(l=n.boundaryFont(),l.fontColor=s,ew(n)(e.type.text,i,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},l)),e.descr&&""!==e.descr.text&&(l=n.boundaryFont(),l.fontSize=l.fontSize-2,l.fontColor=s,ew(n)(e.descr.text,i,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},l))},iw=function(t,e,n){let i=e.bgColor?e.bgColor:n[e.typeC4Shape.text+"_bg_color"],r=e.borderColor?e.borderColor:n[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="}const o=t.append("g");o.attr("class","person-man");const c=Jk();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":c.x=e.x,c.y=e.y,c.fill=i,c.width=e.width,c.height=e.height,c.style="stroke:"+r+";stroke-width:0.5;",c.rx=2.5,c.ry=2.5,Qk(o,c);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":o.append("path").attr("fill",i).attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":o.append("path").attr("fill",i).attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2))}let l=tw(n,e.typeC4Shape.text);switch(o.append("text").attr("fill",a).attr("font-family",l.fontFamily).attr("font-size",l.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":Kk(o,48,48,e.x+e.width/2-24,e.y+e.image.Y,s)}let h=n[e.typeC4Shape.text+"Font"]();return h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=a,ew(n)(e.label.text,o,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},h),h=n[e.typeC4Shape.text+"Font"](),h.fontColor=a,e.thchn&&""!==e.thchn.text?ew(n)(e.thchn.text,o,e.x,e.y+e.thchn.Y,e.width,e.height,{fill:a,"font-style":"italic"},h):e.type&&""!==e.type.text&&ew(n)(e.type.text,o,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},h),e.descr&&""!==e.descr.text&&(h=n.personFont(),h.fontColor=a,ew(n)(e.descr.text,o,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},h)),e.height},rw=(t,e,n)=>{const i=t.append("g");let r=0;for(let a of e){let t=a.textColor?a.textColor:"#444444",e=a.lineColor?a.lineColor:"#444444",s=a.offsetX?parseInt(a.offsetX):0,o=a.offsetY?parseInt(a.offsetY):0,c="";if(0===r){let t=i.append("line");t.attr("x1",a.startPoint.x),t.attr("y1",a.startPoint.y),t.attr("x2",a.endPoint.x),t.attr("y2",a.endPoint.y),t.attr("stroke-width","1"),t.attr("stroke",e),t.style("fill","none"),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)"),r=-1}else{let t=i.append("path");t.attr("fill","none").attr("stroke-width","1").attr("stroke",e).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)")}let l=n.messageFont();ew(n)(a.label.text,i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+o,a.label.width,a.label.height,{fill:t},l),a.techn&&""!==a.techn.text&&(l=n.messageFont(),ew(n)("["+a.techn.text+"]",i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+n.messageFontSize+5+o,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:t,"font-style":"italic"},l))}},aw=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},sw=function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},ow=function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},cw=function(t){const e=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);e.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),e.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},lw=function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},hw=function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},uw=function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")};xt.N;let dw=0,pw=0,fw=4,gw=2;Mk.yy=Zk;let yw={};class mw{constructor(t){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,bw(t.db.getConfig())}setData(t,e,n,i){this.nextData.startx=this.data.startx=t,this.nextData.stopx=this.data.stopx=e,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])}insert(t){this.nextData.cnt=this.nextData.cnt+1;let e=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+t.margin:this.nextData.stopx+2*t.margin,n=e+t.width,i=this.nextData.starty+2*t.margin,r=i+t.height;(e>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>fw)&&(e=this.nextData.startx+t.margin+yw.nextLinePaddingX,i=this.nextData.stopy+2*t.margin,this.nextData.stopx=n=e+t.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=r=i+t.height,this.nextData.cnt=1),t.x=e,t.y=i,this.updateVal(this.data,"startx",e,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",r,Math.max),this.updateVal(this.nextData,"startx",e,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",r,Math.max)}init(t){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},bw(t.db.getConfig())}bumpLastMargin(t){this.data.stopx+=t,this.data.stopy+=t}}const bw=function(t){Bx(yw,t),t.fontFamily&&(yw.personFontFamily=yw.systemFontFamily=yw.messageFontFamily=t.fontFamily),t.fontSize&&(yw.personFontSize=yw.systemFontSize=yw.messageFontSize=t.fontSize),t.fontWeight&&(yw.personFontWeight=yw.systemFontWeight=yw.messageFontWeight=t.fontWeight)},_w=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),xw=t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight});function vw(t,e,n,i,r){if(!e[t].width)if(n)e[t].text=Hx(e[t].text,r,i),e[t].textLines=e[t].text.split(jb.lineBreakRegex).length,e[t].width=r,e[t].height=Vx(e[t].text,i);else{let n=e[t].text.split(jb.lineBreakRegex);e[t].textLines=n.length;let r=0;e[t].height=0,e[t].width=0;for(const a of n)e[t].width=Math.max(Gx(a,i),e[t].width),r=Vx(a,i),e[t].height=e[t].height+r}}const kw=function(t,e,n){e.x=n.data.startx,e.y=n.data.starty,e.width=n.data.stopx-n.data.startx,e.height=n.data.stopy-n.data.starty,e.label.y=yw.c4ShapeMargin-35;let i=e.wrap&&yw.wrap,r=xw(yw);r.fontSize=r.fontSize+2,r.fontWeight="bold",vw("label",e,i,r,Gx(e.label.text,r)),nw(t,e,yw)},ww=function(t,e,n,i){let r=0;for(const a of i){r=0;const i=n[a];let s=_w(yw,i.typeC4Shape.text);switch(s.fontSize=s.fontSize-2,i.typeC4Shape.width=Gx("<<"+i.typeC4Shape.text+">>",s),i.typeC4Shape.height=s.fontSize+2,i.typeC4Shape.Y=yw.c4ShapePadding,r=i.typeC4Shape.Y+i.typeC4Shape.height-4,i.image={width:0,height:0,Y:0},i.typeC4Shape.text){case"person":case"external_person":i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height}i.sprite&&(i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height);let o=i.wrap&&yw.wrap,c=yw.width-2*yw.c4ShapePadding,l=_w(yw,i.typeC4Shape.text);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",vw("label",i,o,l,c),i.label.Y=r+8,r=i.label.Y+i.label.height,i.type&&""!==i.type.text){i.type.text="["+i.type.text+"]",vw("type",i,o,_w(yw,i.typeC4Shape.text),c),i.type.Y=r+5,r=i.type.Y+i.type.height}else if(i.techn&&""!==i.techn.text){i.techn.text="["+i.techn.text+"]",vw("techn",i,o,_w(yw,i.techn.text),c),i.techn.Y=r+5,r=i.techn.Y+i.techn.height}let h=r,u=i.label.width;if(i.descr&&""!==i.descr.text){vw("descr",i,o,_w(yw,i.typeC4Shape.text),c),i.descr.Y=r+20,r=i.descr.Y+i.descr.height,u=Math.max(i.label.width,i.descr.width),h=r-5*i.descr.textLines}u+=yw.c4ShapePadding,i.width=Math.max(i.width||yw.width,u,yw.width),i.height=Math.max(i.height||yw.height,h,yw.height),i.margin=i.margin||yw.c4ShapeMargin,t.insert(i),iw(e,i,yw)}t.bumpLastMargin(yw.c4ShapeMargin)};class Tw{constructor(t,e){this.x=t,this.y=e}}let Cw=function(t,e){let n=t.x,i=t.y,r=e.x,a=e.y,s=n+t.width/2,o=i+t.height/2,c=Math.abs(n-r),l=Math.abs(i-a),h=l/c,u=t.height/t.width,d=null;return i==a&&n<r?d=new Tw(n+t.width,o):i==a&&n>r?d=new Tw(n,o):n==r&&i<a?d=new Tw(s,i+t.height):n==r&&i>a&&(d=new Tw(s,i)),n>r&&i<a?d=u>=h?new Tw(n,o+h*t.width/2):new Tw(s-c/l*t.height/2,i+t.height):n<r&&i<a?d=u>=h?new Tw(n+t.width,o+h*t.width/2):new Tw(s+c/l*t.height/2,i+t.height):n<r&&i>a?d=u>=h?new Tw(n+t.width,o-h*t.width/2):new Tw(s+t.height/2*c/l,i):n>r&&i>a&&(d=u>=h?new Tw(n,o-t.width/2*h):new Tw(s-t.height/2*c/l,i)),d},Ew=function(t,e){let n={x:0,y:0};n.x=e.x+e.width/2,n.y=e.y+e.height/2;let i=Cw(t,n);return n.x=t.x+t.width/2,n.y=t.y+t.height/2,{startPoint:i,endPoint:Cw(e,n)}};function Sw(t,e,n,i,r){let a=new mw(r);a.data.widthLimit=n.data.widthLimit/Math.min(gw,i.length);for(let[s,o]of i.entries()){let i=0;o.image={width:0,height:0,Y:0},o.sprite&&(o.image.width=48,o.image.height=48,o.image.Y=i,i=o.image.Y+o.image.height);let c=o.wrap&&yw.wrap,l=xw(yw);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",vw("label",o,c,l,a.data.widthLimit),o.label.Y=i+8,i=o.label.Y+o.label.height,o.type&&""!==o.type.text){o.type.text="["+o.type.text+"]",vw("type",o,c,xw(yw),a.data.widthLimit),o.type.Y=i+5,i=o.type.Y+o.type.height}if(o.descr&&""!==o.descr.text){let t=xw(yw);t.fontSize=t.fontSize-2,vw("descr",o,c,t,a.data.widthLimit),o.descr.Y=i+20,i=o.descr.Y+o.descr.height}if(0==s||s%gw==0){let t=n.data.startx+yw.diagramMarginX,e=n.data.stopy+yw.diagramMarginY+i;a.setData(t,t,e,e)}else{let t=a.data.stopx!==a.data.startx?a.data.stopx+yw.diagramMarginX:a.data.startx,e=a.data.starty;a.setData(t,t,e,e)}a.name=o.alias;let h=r.db.getC4ShapeArray(o.alias),u=r.db.getC4ShapeKeys(o.alias);u.length>0&&ww(a,t,h,u),e=o.alias;let d=r.db.getBoundarys(e);d.length>0&&Sw(t,e,a,d,r),"global"!==o.alias&&kw(t,o,a),n.data.stopy=Math.max(a.data.stopy+yw.c4ShapeMargin,n.data.stopy),n.data.stopx=Math.max(a.data.stopx+yw.c4ShapeMargin,n.data.stopx),dw=Math.max(dw,n.data.stopx),pw=Math.max(pw,n.data.stopy)}}const Aw={drawPersonOrSystemArray:ww,drawBoundary:kw,setConf:bw,draw:function(t,e,n,i){yw=hv().c4;const r=hv().securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body");let o=i.db;i.db.setWrap(yw.wrap),fw=o.getC4ShapeInRow(),gw=o.getC4BoundaryInRow(),Db.debug(`C:${JSON.stringify(yw,null,2)}`);const c="sandbox"===r?s.select(`[id="${e}"]`):Ho(`[id="${e}"]`);hw(c),lw(c),uw(c);let l=new mw(i);l.setData(yw.diagramMarginX,yw.diagramMarginX,yw.diagramMarginY,yw.diagramMarginY),l.data.widthLimit=screen.availWidth,dw=yw.diagramMarginX,pw=yw.diagramMarginY;const h=i.db.getTitle();Sw(c,"",l,i.db.getBoundarys(""),i),aw(c),sw(c),cw(c),ow(c),function(t,e,n,i){let r=0;for(let s of e){r+=1;let t=s.wrap&&yw.wrap,e={fontFamily:(a=yw).messageFontFamily,fontSize:a.messageFontSize,fontWeight:a.messageFontWeight};"C4Dynamic"===i.db.getC4Type()&&(s.label.text=r+": "+s.label.text);let o=Gx(s.label.text,e);vw("label",s,t,e,o),s.techn&&""!==s.techn.text&&(o=Gx(s.techn.text,e),vw("techn",s,t,e,o)),s.descr&&""!==s.descr.text&&(o=Gx(s.descr.text,e),vw("descr",s,t,e,o));let c=n(s.from),l=n(s.to),h=Ew(c,l);s.startPoint=h.startPoint,s.endPoint=h.endPoint}var a;rw(t,e,yw)}(c,i.db.getRels(),i.db.getC4Shape,i),l.data.stopx=dw,l.data.stopy=pw;const u=l.data;let d=u.stopy-u.starty+2*yw.diagramMarginY;const p=u.stopx-u.startx+2*yw.diagramMarginX;h&&c.append("text").text(h).attr("x",(u.stopx-u.startx)/2-4*yw.diagramMarginX).attr("y",u.starty+yw.diagramMarginY),mv(c,d,p,yw.useMaxWidth);const f=h?60:0;c.attr("viewBox",u.startx-yw.diagramMarginX+" -"+(yw.diagramMarginY+f)+" "+p+" "+(d+f)),Db.debug("models:",u)}};var Dw=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,7],r=[1,8],a=[1,9],s=[1,10],o=[1,13],c=[1,12],l=[1,16,25],h=[1,20],u=[1,32],d=[1,33],p=[1,34],f=[1,36],g=[1,39],y=[1,37],m=[1,38],b=[1,44],_=[1,45],x=[1,40],v=[1,41],k=[1,42],w=[1,43],T=[1,48],C=[1,49],E=[1,50],S=[1,51],A=[16,25],D=[1,65],L=[1,66],N=[1,67],O=[1,68],B=[1,69],M=[1,70],I=[1,71],F=[1,80],R=[16,25,32,45,46,54,60,61,62,63,64,65,66,71,73],$=[16,25,30,32,45,46,50,54,60,61,62,63,64,65,66,71,73,88,89,90,91],P=[5,8,9,10,11,16,19,23,25],j=[54,88,89,90,91],Y=[54,65,66,88,89,90,91],z=[54,60,61,62,63,64,88,89,90,91],U=[16,25,32],W=[1,107],H={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statments:5,direction:6,directive:7,direction_tb:8,direction_bt:9,direction_rl:10,direction_lr:11,graphConfig:12,openDirective:13,typeDirective:14,closeDirective:15,NEWLINE:16,":":17,argDirective:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,CLASS_DIAGRAM:23,statements:24,EOF:25,statement:26,className:27,alphaNumToken:28,classLiteralName:29,GENERICTYPE:30,relationStatement:31,LABEL:32,classStatement:33,methodStatement:34,annotationStatement:35,clickStatement:36,cssClassStatement:37,noteStatement:38,acc_title:39,acc_title_value:40,acc_descr:41,acc_descr_value:42,acc_descr_multiline_value:43,CLASS:44,STYLE_SEPARATOR:45,STRUCT_START:46,members:47,STRUCT_STOP:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,STR:54,NOTE_FOR:55,noteText:56,NOTE:57,relationType:58,lineType:59,AGGREGATION:60,EXTENSION:61,COMPOSITION:62,DEPENDENCY:63,LOLLIPOP:64,LINE:65,DOTTED_LINE:66,CALLBACK:67,LINK:68,LINK_TARGET:69,CLICK:70,CALLBACK_NAME:71,CALLBACK_ARGS:72,HREF:73,CSSCLASS:74,commentToken:75,textToken:76,graphCodeTokens:77,textNoTagsToken:78,TAGSTART:79,TAGEND:80,"==":81,"--":82,PCT:83,DEFAULT:84,SPACE:85,MINUS:86,keywords:87,UNICODE_TEXT:88,NUM:89,ALPHA:90,BQUOTE_STR:91,$accept:0,$end:1},terminals_:{2:"error",5:"statments",8:"direction_tb",9:"direction_bt",10:"direction_rl",11:"direction_lr",16:"NEWLINE",17:":",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",23:"CLASS_DIAGRAM",25:"EOF",30:"GENERICTYPE",32:"LABEL",39:"acc_title",40:"acc_title_value",41:"acc_descr",42:"acc_descr_value",43:"acc_descr_multiline_value",44:"CLASS",45:"STYLE_SEPARATOR",46:"STRUCT_START",48:"STRUCT_STOP",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"STR",55:"NOTE_FOR",57:"NOTE",60:"AGGREGATION",61:"EXTENSION",62:"COMPOSITION",63:"DEPENDENCY",64:"LOLLIPOP",65:"LINE",66:"DOTTED_LINE",67:"CALLBACK",68:"LINK",69:"LINK_TARGET",70:"CLICK",71:"CALLBACK_NAME",72:"CALLBACK_ARGS",73:"HREF",74:"CSSCLASS",77:"graphCodeTokens",79:"TAGSTART",80:"TAGEND",81:"==",82:"--",83:"PCT",84:"DEFAULT",85:"SPACE",86:"MINUS",87:"keywords",88:"UNICODE_TEXT",89:"NUM",90:"ALPHA",91:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[3,1],[3,2],[6,1],[6,1],[6,1],[6,1],[4,1],[7,4],[7,6],[13,1],[14,1],[18,1],[15,1],[12,4],[24,1],[24,2],[24,3],[27,1],[27,1],[27,2],[27,2],[27,2],[26,1],[26,2],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,2],[26,2],[26,1],[33,2],[33,4],[33,5],[33,7],[35,4],[47,1],[47,2],[34,1],[34,2],[34,1],[34,1],[31,3],[31,4],[31,4],[31,5],[38,3],[38,2],[53,3],[53,2],[53,2],[53,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[36,3],[36,4],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[37,3],[75,1],[75,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[78,1],[78,1],[78,1],[78,1],[28,1],[28,1],[28,1],[29,1],[56,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.setDirection("TB");break;case 6:i.setDirection("BT");break;case 7:i.setDirection("RL");break;case 8:i.setDirection("LR");break;case 12:i.parseDirective("%%{","open_directive");break;case 13:i.parseDirective(a[o],"type_directive");break;case 14:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 15:i.parseDirective("}%%","close_directive","class");break;case 20:case 21:this.$=a[o];break;case 22:this.$=a[o-1]+a[o];break;case 23:case 24:this.$=a[o-1]+"~"+a[o];break;case 25:i.addRelation(a[o]);break;case 26:a[o-1].title=i.cleanupLabel(a[o]),i.addRelation(a[o-1]);break;case 35:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 36:case 37:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 38:i.addClass(a[o]);break;case 39:i.addClass(a[o-2]),i.setCssClass(a[o-2],a[o]);break;case 40:i.addClass(a[o-3]),i.addMembers(a[o-3],a[o-1]);break;case 41:i.addClass(a[o-5]),i.setCssClass(a[o-5],a[o-3]),i.addMembers(a[o-5],a[o-1]);break;case 42:i.addAnnotation(a[o],a[o-2]);break;case 43:this.$=[a[o]];break;case 44:a[o].push(a[o-1]),this.$=a[o];break;case 45:case 47:case 48:break;case 46:i.addMember(a[o-1],i.cleanupLabel(a[o]));break;case 49:this.$={id1:a[o-2],id2:a[o],relation:a[o-1],relationTitle1:"none",relationTitle2:"none"};break;case 50:this.$={id1:a[o-3],id2:a[o],relation:a[o-1],relationTitle1:a[o-2],relationTitle2:"none"};break;case 51:this.$={id1:a[o-3],id2:a[o],relation:a[o-2],relationTitle1:"none",relationTitle2:a[o-1]};break;case 52:this.$={id1:a[o-4],id2:a[o],relation:a[o-2],relationTitle1:a[o-3],relationTitle2:a[o-1]};break;case 53:i.addNote(a[o],a[o-1]);break;case 54:i.addNote(a[o]);break;case 55:this.$={type1:a[o-2],type2:a[o],lineType:a[o-1]};break;case 56:this.$={type1:"none",type2:a[o],lineType:a[o-1]};break;case 57:this.$={type1:a[o-1],type2:"none",lineType:a[o]};break;case 58:this.$={type1:"none",type2:"none",lineType:a[o]};break;case 59:this.$=i.relationType.AGGREGATION;break;case 60:this.$=i.relationType.EXTENSION;break;case 61:this.$=i.relationType.COMPOSITION;break;case 62:this.$=i.relationType.DEPENDENCY;break;case 63:this.$=i.relationType.LOLLIPOP;break;case 64:this.$=i.lineType.LINE;break;case 65:this.$=i.lineType.DOTTED_LINE;break;case 66:case 72:this.$=a[o-2],i.setClickEvent(a[o-1],a[o]);break;case 67:case 73:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 68:case 76:this.$=a[o-2],i.setLink(a[o-1],a[o]);break;case 69:case 77:this.$=a[o-3],i.setLink(a[o-2],a[o-1],a[o]);break;case 70:case 78:this.$=a[o-3],i.setLink(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 71:case 79:this.$=a[o-4],i.setLink(a[o-3],a[o-2],a[o]),i.setTooltip(a[o-3],a[o-1]);break;case 74:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 75:this.$=a[o-4],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setTooltip(a[o-3],a[o]);break;case 80:i.setCssClass(a[o-1],a[o])}},table:[{3:1,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{3:14,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[2,9]},e(l,[2,5]),e(l,[2,6]),e(l,[2,7]),e(l,[2,8]),{14:15,20:[1,16]},{16:[1,17]},{20:[2,12]},{1:[2,4]},{15:18,17:[1,19],22:h},e([17,22],[2,13]),{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:21,26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:T,89:C,90:E,91:S},{16:[1,52]},{18:53,21:[1,54]},{16:[2,15]},{25:[1,55]},{16:[1,56],25:[2,17]},e(A,[2,25],{32:[1,57]}),e(A,[2,27]),e(A,[2,28]),e(A,[2,29]),e(A,[2,30]),e(A,[2,31]),e(A,[2,32]),e(A,[2,33]),e(A,[2,34]),{40:[1,58]},{42:[1,59]},e(A,[2,37]),e(A,[2,45],{53:60,58:63,59:64,32:[1,62],54:[1,61],60:D,61:L,62:N,63:O,64:B,65:M,66:I}),{27:72,28:46,29:47,88:T,89:C,90:E,91:S},e(A,[2,47]),e(A,[2,48]),{28:73,88:T,89:C,90:E},{27:74,28:46,29:47,88:T,89:C,90:E,91:S},{27:75,28:46,29:47,88:T,89:C,90:E,91:S},{27:76,28:46,29:47,88:T,89:C,90:E,91:S},{54:[1,77]},{27:78,28:46,29:47,88:T,89:C,90:E,91:S},{54:F,56:79},e(R,[2,20],{28:46,29:47,27:81,30:[1,82],88:T,89:C,90:E,91:S}),e(R,[2,21],{30:[1,83]}),e($,[2,94]),e($,[2,95]),e($,[2,96]),e([16,25,30,32,45,46,54,60,61,62,63,64,65,66,71,73],[2,97]),e(P,[2,10]),{15:84,22:h},{22:[2,14]},{1:[2,16]},{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:85,25:[2,18],26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:T,89:C,90:E,91:S},e(A,[2,26]),e(A,[2,35]),e(A,[2,36]),{27:86,28:46,29:47,54:[1,87],88:T,89:C,90:E,91:S},{53:88,58:63,59:64,60:D,61:L,62:N,63:O,64:B,65:M,66:I},e(A,[2,46]),{59:89,65:M,66:I},e(j,[2,58],{58:90,60:D,61:L,62:N,63:O,64:B}),e(Y,[2,59]),e(Y,[2,60]),e(Y,[2,61]),e(Y,[2,62]),e(Y,[2,63]),e(z,[2,64]),e(z,[2,65]),e(A,[2,38],{45:[1,91],46:[1,92]}),{50:[1,93]},{54:[1,94]},{54:[1,95]},{71:[1,96],73:[1,97]},{28:98,88:T,89:C,90:E},{54:F,56:99},e(A,[2,54]),e(A,[2,98]),e(R,[2,22]),e(R,[2,23]),e(R,[2,24]),{16:[1,100]},{25:[2,19]},e(U,[2,49]),{27:101,28:46,29:47,88:T,89:C,90:E,91:S},{27:102,28:46,29:47,54:[1,103],88:T,89:C,90:E,91:S},e(j,[2,57],{58:104,60:D,61:L,62:N,63:O,64:B}),e(j,[2,56]),{28:105,88:T,89:C,90:E},{47:106,51:W},{27:108,28:46,29:47,88:T,89:C,90:E,91:S},e(A,[2,66],{54:[1,109]}),e(A,[2,68],{54:[1,111],69:[1,110]}),e(A,[2,72],{54:[1,112],72:[1,113]}),e(A,[2,76],{54:[1,115],69:[1,114]}),e(A,[2,80]),e(A,[2,53]),e(P,[2,11]),e(U,[2,51]),e(U,[2,50]),{27:116,28:46,29:47,88:T,89:C,90:E,91:S},e(j,[2,55]),e(A,[2,39],{46:[1,117]}),{48:[1,118]},{47:119,48:[2,43],51:W},e(A,[2,42]),e(A,[2,67]),e(A,[2,69]),e(A,[2,70],{69:[1,120]}),e(A,[2,73]),e(A,[2,74],{54:[1,121]}),e(A,[2,77]),e(A,[2,78],{69:[1,122]}),e(U,[2,52]),{47:123,51:W},e(A,[2,40]),{48:[2,44]},e(A,[2,71]),e(A,[2,75]),e(A,[2,79]),{48:[1,124]},e(A,[2,41])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],6:[2,9],13:[2,12],14:[2,4],20:[2,15],54:[2,14],55:[2,16],85:[2,19],119:[2,44]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},q=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return 8;case 2:return 9;case 3:return 10;case 4:return 11;case 5:return this.begin("type_directive"),20;case 6:return this.popState(),this.begin("arg_directive"),17;case 7:return this.popState(),this.popState(),22;case 8:return 21;case 9:case 10:case 19:case 27:break;case 11:return this.begin("acc_title"),39;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),41;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 39:case 42:case 45:case 48:case 51:case 54:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:return 16;case 20:case 21:return 23;case 22:return this.begin("struct"),46;case 23:return"EDGE_STATE";case 24:return"EOF_IN_STRUCT";case 25:return"OPEN_IN_STRUCT";case 26:return this.popState(),48;case 28:return"MEMBER";case 29:return 44;case 30:return 74;case 31:return 67;case 32:return 68;case 33:return 70;case 34:return 55;case 35:return 57;case 36:return 49;case 37:return 50;case 38:this.begin("generic");break;case 40:return"GENERICTYPE";case 41:this.begin("string");break;case 43:return"STR";case 44:this.begin("bqstring");break;case 46:return"BQUOTE_STR";case 47:this.begin("href");break;case 49:return 73;case 50:this.begin("callback_name");break;case 52:this.popState(),this.begin("callback_args");break;case 53:return 71;case 55:return 72;case 56:case 57:case 58:case 59:return 69;case 60:case 61:return 61;case 62:case 63:return 63;case 64:return 62;case 65:return 60;case 66:return 64;case 67:return 65;case 68:return 66;case 69:return 32;case 70:return 45;case 71:return 86;case 72:return"DOT";case 73:return"PLUS";case 74:return 83;case 75:case 76:return"EQUALS";case 77:return 90;case 78:return"PUNCTUATION";case 79:return 89;case 80:return 88;case 81:return 85;case 82:return 25}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:\[\*\])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[`])/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},callback_args:{rules:[54,55],inclusive:!1},callback_name:{rules:[51,52,53],inclusive:!1},href:{rules:[48,49],inclusive:!1},struct:{rules:[23,24,25,26,27,28],inclusive:!1},generic:{rules:[39,40],inclusive:!1},bqstring:{rules:[45,46],inclusive:!1},string:{rules:[42,43],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,29,30,31,32,33,34,35,36,37,38,41,44,47,50,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82],inclusive:!0}}},t);function V(){this.yy={}}return H.lexer=q,V.prototype=H,H.Parser=V,new V}();Dw.parser=Dw;const Lw=Dw,Nw=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*classDiagram/)},Ow=(t,e)=>{var n;return null!==t.match(/^\s*classDiagram/)&&"dagre-wrapper"===(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)||null!==t.match(/^\s*classDiagram-v2/)},Bw="classid-";let Mw=[],Iw={},Fw=[],Rw=0,$w=[];const Pw=t=>jb.sanitizeText(t,hv()),jw=function(t){let e="",n=t;if(t.indexOf("~")>0){let i=t.split("~");n=i[0],e=jb.sanitizeText(i[1],hv())}return{className:n,type:e}},Yw=function(t){let e=jw(t);void 0===Iw[e.className]&&(Iw[e.className]={id:e.className,type:e.type,cssClasses:[],methods:[],members:[],annotations:[],domId:Bw+e.className+"-"+Rw},Rw++)},zw=function(t){const e=Object.keys(Iw);for(const n of e)if(Iw[n].id===t)return Iw[n].domId},Uw=function(t,e){const n=jw(t).className,i=Iw[n];if("string"==typeof e){const t=e.trim();t.startsWith("<<")&&t.endsWith(">>")?i.annotations.push(Pw(t.substring(2,t.length-2))):t.indexOf(")")>0?i.methods.push(Pw(t)):t&&i.members.push(Pw(t))}},Ww=function(t,e){t.split(",").forEach((function(t){let n=t;t[0].match(/\d/)&&(n=Bw+n),void 0!==Iw[n]&&Iw[n].cssClasses.push(e)}))},Hw=function(t,e,n){const i=hv();let r=t,a=zw(r);if("loose"===i.securityLevel&&void 0!==e&&void 0!==Iw[r]){let t=[];if("string"==typeof n){t=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let e=0;e<t.length;e++){let n=t[e].trim();'"'===n.charAt(0)&&'"'===n.charAt(n.length-1)&&(n=n.substr(1,n.length-2)),t[e]=n}}0===t.length&&t.push(a),$w.push((function(){const n=document.querySelector(`[id="${a}"]`);null!==n&&n.addEventListener("click",(function(){tv.runFunc(e,...t)}),!1)}))}},qw=function(t){let e=Ho(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=Ho("body").append("div").attr("class","mermaidTooltip").style("opacity",0));Ho(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=Ho(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);Ho(this).classed("hover",!1)}))};$w.push(qw);let Vw="TB";const Gw={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,getConfig:()=>hv().class,addClass:Yw,bindFunctions:function(t){$w.forEach((function(e){e(t)}))},clear:function(){Mw=[],Iw={},Fw=[],$w=[],$w.push(qw),Gv()},getClass:function(t){return Iw[t]},getClasses:function(){return Iw},getNotes:function(){return Fw},addAnnotation:function(t,e){const n=jw(t).className;Iw[n].annotations.push(e)},addNote:function(t,e){const n={id:`note${Fw.length}`,class:e,text:t};Fw.push(n)},getRelations:function(){return Mw},addRelation:function(t){Db.debug("Adding relation: "+JSON.stringify(t)),Yw(t.id1),Yw(t.id2),t.id1=jw(t.id1).className,t.id2=jw(t.id2).className,t.relationTitle1=jb.sanitizeText(t.relationTitle1.trim(),hv()),t.relationTitle2=jb.sanitizeText(t.relationTitle2.trim(),hv()),Mw.push(t)},getDirection:()=>Vw,setDirection:t=>{Vw=t},addMember:Uw,addMembers:function(t,e){Array.isArray(e)&&(e.reverse(),e.forEach((e=>Uw(t,e))))},cleanupLabel:function(t){return":"===t.substring(0,1)?jb.sanitizeText(t.substr(1).trim(),hv()):Pw(t.trim())},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){Hw(t,e,n),Iw[t].haveCallback=!0})),Ww(t,"clickable")},setCssClass:Ww,setLink:function(t,e,n){const i=hv();t.split(",").forEach((function(t){let r=t;t[0].match(/\d/)&&(r=Bw+r),void 0!==Iw[r]&&(Iw[r].link=tv.formatUrl(e,i),"sandbox"===i.securityLevel?Iw[r].linkTarget="_top":Iw[r].linkTarget="string"==typeof n?Pw(n):"_blank")})),Ww(t,"clickable")},getTooltip:function(t){return Iw[t].tooltip},setTooltip:function(t,e){const n=hv();t.split(",").forEach((function(t){void 0!==e&&(Iw[t].tooltip=jb.sanitizeText(e,n))}))},lookUpDomId:zw,setDiagramTitle:Jv,getDiagramTitle:tk};let Xw=0;const Zw=function(t){let e=t.match(/^([#+~-])?(\w+)(~\w+~|\[])?\s+(\w+) *([$*])?$/),n=t.match(/^([#+|~-])?(\w+) *\( *(.*)\) *([$*])? *(\w*[[\]|~]*\s*\w*~?)$/);return e&&!n?Qw(e):n?Kw(n):Jw(t)},Qw=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pb(t[3].trim()):"",s=t[4]?t[4].trim():"",o=t[5]?t[5].trim():"";n=i+r+a+" "+s,e=eT(o)}catch(i){n=t}return{displayText:n,cssStyle:e}},Kw=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pb(t[3].trim()):"",s=t[4]?t[4].trim():"";n=i+r+"("+a+")"+(t[5]?" : "+Pb(t[5]).trim():""),e=eT(s)}catch(i){n=t}return{displayText:n,cssStyle:e}},Jw=function(t){let e="",n="",i="",r=t.indexOf("("),a=t.indexOf(")");if(r>1&&a>r&&a<=t.length){let s="",o="",c=t.substring(0,1);c.match(/\w/)?o=t.substring(0,r).trim():(c.match(/[#+~-]/)&&(s=c),o=t.substring(1,r).trim());const l=t.substring(r+1,a);t.substring(a+1,1),n=eT(t.substring(a+1,a+2)),e=s+o+"("+Pb(l.trim())+")",a<t.length&&(i=t.substring(a+2).trim(),""!==i&&(i=" : "+Pb(i),e+=i))}else e=Pb(t);return{displayText:e,cssStyle:n}},tT=function(t,e,n,i){let r=Zw(e);const a=t.append("tspan").attr("x",i.padding).text(r.displayText);""!==r.cssStyle&&a.attr("style",r.cssStyle),n||a.attr("dy",i.textHeight)},eT=function(t){switch(t){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}},nT=function(t,e,n,i){Db.debug("Rendering class ",e,n);const r=e.id,a={id:r,label:e.id,width:0,height:0},s=t.append("g").attr("id",i.db.lookUpDomId(r)).attr("class","classGroup");let o;o=e.link?s.append("svg:a").attr("xlink:href",e.link).attr("target",e.linkTarget).append("text").attr("y",n.textHeight+n.padding).attr("x",0):s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);let c=!0;e.annotations.forEach((function(t){const e=o.append("tspan").text("\xab"+t+"\xbb");c||e.attr("dy",n.textHeight),c=!1}));let l=e.id;void 0!==e.type&&""!==e.type&&(l+="<"+e.type+">");const h=o.append("tspan").text(l).attr("class","title");c||h.attr("dy",n.textHeight);const u=o.node().getBBox().height,d=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin/2).attr("y2",n.padding+u+n.dividerMargin/2),p=s.append("text").attr("x",n.padding).attr("y",u+n.dividerMargin+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.members.forEach((function(t){tT(p,t,c,n),c=!1}));const f=p.node().getBBox(),g=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin+f.height).attr("y2",n.padding+u+n.dividerMargin+f.height),y=s.append("text").attr("x",n.padding).attr("y",u+2*n.dividerMargin+f.height+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.methods.forEach((function(t){tT(y,t,c,n),c=!1}));const m=s.node().getBBox();var b=" ";e.cssClasses.length>0&&(b+=e.cssClasses.join(" "));const _=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",m.width+2*n.padding).attr("height",m.height+n.padding+.5*n.dividerMargin).attr("class",b).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(_-t.getBBox().width)/2)})),e.tooltip&&o.insert("title").text(e.tooltip),d.attr("x2",_),g.attr("x2",_),a.width=_,a.height=m.height+n.padding+.5*n.dividerMargin,a},iT=function(t,e,n,i,r){const a=function(t){switch(t){case r.db.relationType.AGGREGATION:return"aggregation";case r.db.relationType.EXTENSION:return"extension";case r.db.relationType.COMPOSITION:return"composition";case r.db.relationType.DEPENDENCY:return"dependency";case r.db.relationType.LOLLIPOP:return"lollipop"}};e.points=e.points.filter((t=>!Number.isNaN(t.y)));const s=e.points,o=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(Bc),c=t.append("path").attr("d",o(s)).attr("id","edge"+Xw).attr("class","relation");let l,h,u="";i.arrowMarkerAbsolute&&(u=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,u=u.replace(/\(/g,"\\("),u=u.replace(/\)/g,"\\)")),1==n.relation.lineType&&c.attr("class","relation dashed-line"),10==n.relation.lineType&&c.attr("class","relation dotted-line"),"none"!==n.relation.type1&&c.attr("marker-start","url("+u+"#"+a(n.relation.type1)+"Start)"),"none"!==n.relation.type2&&c.attr("marker-end","url("+u+"#"+a(n.relation.type2)+"End)");const d=e.points.length;let p,f,g,y,m=tv.calcLabelPosition(e.points);if(l=m.x,h=m.y,d%2!=0&&d>1){let t=tv.calcCardinalityPosition("none"!==n.relation.type1,e.points,e.points[0]),i=tv.calcCardinalityPosition("none"!==n.relation.type2,e.points,e.points[d-1]);Db.debug("cardinality_1_point "+JSON.stringify(t)),Db.debug("cardinality_2_point "+JSON.stringify(i)),p=t.x,f=t.y,g=i.x,y=i.y}if(void 0!==n.title){const e=t.append("g").attr("class","classLabel"),r=e.append("text").attr("class","label").attr("x",l).attr("y",h).attr("fill","red").attr("text-anchor","middle").text(n.title);window.label=r;const a=r.node().getBBox();e.insert("rect",":first-child").attr("class","box").attr("x",a.x-i.padding/2).attr("y",a.y-i.padding/2).attr("width",a.width+i.padding).attr("height",a.height+i.padding)}if(Db.info("Rendering relation "+JSON.stringify(n)),void 0!==n.relationTitle1&&"none"!==n.relationTitle1){t.append("g").attr("class","cardinality").append("text").attr("class","type1").attr("x",p).attr("y",f).attr("fill","black").attr("font-size","6").text(n.relationTitle1)}if(void 0!==n.relationTitle2&&"none"!==n.relationTitle2){t.append("g").attr("class","cardinality").append("text").attr("class","type2").attr("x",g).attr("y",y).attr("fill","black").attr("font-size","6").text(n.relationTitle2)}Xw++},rT=function(t,e,n,i){Db.debug("Rendering note ",e,n);const r=e.id,a={id:r,text:e.text,width:0,height:0},s=t.append("g").attr("id",r).attr("class","classGroup");let o=s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);const c=JSON.parse(`"${e.text}"`).split("\n");c.forEach((function(t){Db.debug(`Adding line: ${t}`),o.append("tspan").text(t).attr("class","title").attr("dy",n.textHeight)}));const l=s.node().getBBox(),h=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",l.width+2*n.padding).attr("height",l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(h-t.getBBox().width)/2)})),a.width=h,a.height=l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin,a};let aT={};const sT=function(t){const e=Object.entries(aT).find((e=>e[1].label===t));if(e)return e[0]},oT={draw:function(t,e,n,i){const r=hv().class;aT={},Db.info("Rendering diagram "+t);const a=hv().securityLevel;let s;"sandbox"===a&&(s=Ho("#i"+e));const o=Ho("sandbox"===a?s.nodes()[0].contentDocument.body:"body"),c=o.select(`[id='${e}']`);var l;(l=c).append("defs").append("marker").attr("id","extensionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),l.append("defs").append("marker").attr("id","extensionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z"),l.append("defs").append("marker").attr("id","compositionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","compositionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","aggregationStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","aggregationEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","dependencyStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z");const h=new Vf({multigraph:!0});h.setGraph({isMultiGraph:!0}),h.setDefaultEdgeLabel((function(){return{}}));const u=i.db.getClasses(),d=Object.keys(u);for(const m of d){const t=u[m],e=nT(c,t,r,i);aT[e.id]=e,h.setNode(e.id,e),Db.info("Org height: "+e.height)}i.db.getRelations().forEach((function(t){Db.info("tjoho"+sT(t.id1)+sT(t.id2)+JSON.stringify(t)),h.setEdge(sT(t.id1),sT(t.id2),{relation:t},t.title||"DEFAULT")}));i.db.getNotes().forEach((function(t){Db.debug(`Adding note: ${JSON.stringify(t)}`);const e=rT(c,t,r,i);aT[e.id]=e,h.setNode(e.id,e),t.class&&t.class in u&&h.setEdge(t.id,sT(t.class),{relation:{id1:t.id,id2:t.class,relation:{type1:"none",type2:"none",lineType:10}}},"DEFAULT")})),Em(h),h.nodes().forEach((function(t){void 0!==t&&void 0!==h.node(t)&&(Db.debug("Node "+t+": "+JSON.stringify(h.node(t))),o.select("#"+(i.db.lookUpDomId(t)||t)).attr("transform","translate("+(h.node(t).x-h.node(t).width/2)+","+(h.node(t).y-h.node(t).height/2)+" )"))})),h.edges().forEach((function(t){void 0!==t&&void 0!==h.edge(t)&&(Db.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(h.edge(t))),iT(c,h.edge(t),h.edge(t).relation,r,i))}));const p=c.node().getBBox(),f=p.width+40,g=p.height+40;mv(c,g,f,r.useMaxWidth);const y=`${p.x-20} ${p.y-20} ${f} ${g}`;Db.debug(`viewBox ${y}`),c.attr("viewBox",y)}},cT={extension:(t,e,n)=>{Db.trace("Making markers for ",n),t.append("defs").append("marker").attr("id",e+"-extensionStart").attr("class","marker extension "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},composition:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-compositionStart").attr("class","marker composition "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},aggregation:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},dependency:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},lollipop:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","white").attr("cx",6).attr("cy",7).attr("r",6)},point:(t,e)=>{t.append("marker").attr("id",e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",10).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",0).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},circle:(t,e)=>{t.append("marker").attr("id",e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},cross:(t,e)=>{t.append("marker").attr("id",e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},barb:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")}},lT=(t,e,n,i)=>{e.forEach((e=>{cT[e](t,n,i)}))};const hT=(t,e,n,i)=>{let r=t||"";if("object"==typeof r&&(r=r[0]),$b(hv().flowchart.htmlLabels)){r=r.replace(/\\n|\n/g,"<br />"),Db.info("vertexText"+r);let t=function(t){const e=Ho(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),n=e.append("xhtml:div"),i=t.label,r=t.isNode?"nodeLabel":"edgeLabel";var a,s;return n.html('<span class="'+r+'" '+(t.labelStyle?'style="'+t.labelStyle+'"':"")+">"+i+"</span>"),a=n,(s=t.labelStyle)&&a.attr("style",s),n.style("display","inline-block"),n.style("white-space","nowrap"),n.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}({isNode:i,label:lL(r).replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`)),labelStyle:e.replace("fill:","color:")});return t}{const t=document.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",e.replace("color:","fill:"));let i=[];i="string"==typeof r?r.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(r)?r:[];for(const e of i){const i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),n?i.setAttribute("class","title-row"):i.setAttribute("class","row"),i.textContent=e.trim(),t.appendChild(i)}return t}},uT=(t,e,n,i)=>{let r;r=n||"node default";const a=t.insert("g").attr("class",r).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",e.labelStyle);let o;o=void 0===e.labelText?"":"string"==typeof e.labelText?e.labelText:e.labelText[0];const c=s.node().appendChild(hT(Mb(lL(o),hv()),e.labelStyle,!1,i));let l=c.getBBox();if($b(hv().flowchart.htmlLabels)){const t=c.children[0],e=Ho(c);l=t.getBoundingClientRect(),e.attr("width",l.width),e.attr("height",l.height)}const h=e.padding/2;return s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),{shapeSvg:a,bbox:l,halfPadding:h,label:s}},dT=(t,e)=>{const n=e.node().getBBox();t.width=n.width,t.height=n.height};function pT(t,e,n,i){return t.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+n/2+")")}let fT={},gT={},yT={};const mT=(t,e)=>(Db.trace("In isDecendant",e," ",t," = ",gT[e].includes(t)),!!gT[e].includes(t)),bT=(t,e,n,i)=>{Db.warn("Copying children of ",t,"root",i,"data",e.node(t),i);const r=e.children(t)||[];t!==i&&r.push(t),Db.warn("Copying (nodes) clusterId",t,"nodes",r),r.forEach((r=>{if(e.children(r).length>0)bT(r,e,n,i);else{const a=e.node(r);Db.info("cp ",r," to ",i," with parent ",t),n.setNode(r,a),i!==e.parent(r)&&(Db.warn("Setting parent",r,e.parent(r)),n.setParent(r,e.parent(r))),t!==i&&r!==t?(Db.debug("Setting parent",r,t),n.setParent(r,t)):(Db.info("In copy ",t,"root",i,"data",e.node(t),i),Db.debug("Not Setting parent for node=",r,"cluster!==rootId",t!==i,"node!==clusterId",r!==t));const s=e.edges(r);Db.debug("Copying Edges",s),s.forEach((r=>{Db.info("Edge",r);const a=e.edge(r.v,r.w,r.name);Db.info("Edge data",a,i);try{((t,e)=>(Db.info("Decendants of ",e," is ",gT[e]),Db.info("Edge is ",t),t.v!==e&&t.w!==e&&(gT[e]?gT[e].includes(t.v)||mT(t.v,e)||mT(t.w,e)||gT[e].includes(t.w):(Db.debug("Tilt, ",e,",not in decendants"),!1))))(r,i)?(Db.info("Copying as ",r.v,r.w,a,r.name),n.setEdge(r.v,r.w,a,r.name),Db.info("newGraph edges ",n.edges(),n.edge(n.edges()[0]))):Db.info("Skipping copy of edge ",r.v,"--\x3e",r.w," rootId: ",i," clusterId:",t)}catch(s){Db.error(s)}}))}Db.debug("Removing node",r),e.removeNode(r)}))},_T=(t,e)=>{const n=e.children(t);let i=[...n];for(const r of n)yT[r]=t,i=[...i,..._T(r,e)];return i},xT=(t,e)=>{Db.trace("Searching",t);const n=e.children(t);if(Db.trace("Searching children of id ",t,n),n.length<1)return Db.trace("This is a valid node",t),t;for(const i of n){const n=xT(i,e);if(n)return Db.trace("Found replacement for",t," => ",n),n}},vT=t=>fT[t]&&fT[t].externalConnections&&fT[t]?fT[t].id:t,kT=(t,e)=>{if(Db.warn("extractor - ",e,fb(t),t.children("D")),e>10)return void Db.error("Bailing out");let n=t.nodes(),i=!1;for(const r of n){const e=t.children(r);i=i||e.length>0}if(i){Db.debug("Nodes = ",n,e);for(const i of n)if(Db.debug("Extracting node",i,fT,fT[i]&&!fT[i].externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),fT[i])if(!fT[i].externalConnections&&t.children(i)&&t.children(i).length>0){Db.warn("Cluster without external connections, without a parent and with children",i,e);let n="TB"===t.graph().rankdir?"LR":"TB";fT[i]&&fT[i].clusterData&&fT[i].clusterData.dir&&(n=fT[i].clusterData.dir,Db.warn("Fixing dir",fT[i].clusterData.dir,n));const r=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:n,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));Db.warn("Old graph before copy",fb(t)),bT(i,t,r,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:fT[i].clusterData,labelText:fT[i].labelText,graph:r}),Db.warn("New graph after copy node: (",i,")",fb(r)),Db.debug("Old graph after copy",fb(t))}else Db.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!fT[i].externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),Db.debug(fT);else Db.debug("Not a cluster",i,e);n=t.nodes(),Db.warn("New list of nodes",n);for(const i of n){const n=t.node(i);Db.warn(" Now next level",i,n),n.clusterNode&&kT(n.graph,e+1)}}else Db.debug("Done, no node has children",t.nodes())},wT=(t,e)=>{if(0===e.length)return[];let n=Object.assign(e);return e.forEach((e=>{const i=t.children(e),r=wT(t,i);n=[...n,...r]})),n};function TT(t,e,n,i){var r=t.x,a=t.y,s=r-i.x,o=a-i.y,c=Math.sqrt(e*e*o*o+n*n*s*s),l=Math.abs(e*n*s/c);i.x<r&&(l=-l);var h=Math.abs(e*n*o/c);return i.y<a&&(h=-h),{x:r+l,y:a+h}}function CT(t,e,n,i){var r,a,s,o,c,l,h,u,d,p,f,g,y;if(r=e.y-t.y,s=t.x-e.x,c=e.x*t.y-t.x*e.y,d=r*n.x+s*n.y+c,p=r*i.x+s*i.y+c,!(0!==d&&0!==p&&ET(d,p)||(a=i.y-n.y,o=n.x-i.x,l=i.x*n.y-n.x*i.y,h=a*t.x+o*t.y+l,u=a*e.x+o*e.y+l,0!==h&&0!==u&&ET(h,u)||0==(f=r*o-a*s))))return g=Math.abs(f/2),{x:(y=s*l-o*c)<0?(y-g)/f:(y+g)/f,y:(y=a*c-r*l)<0?(y-g)/f:(y+g)/f}}function ET(t,e){return t*e>0}const ST=(t,e)=>{var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=0===o?0:l*s/o,i=l):(s<0&&(c=-c),n=c,i=0===s?0:c*o/s),{x:r+n,y:a+i}},AT={node:function(t,e){return t.intersect(e)},circle:function(t,e,n){return TT(t,e,e,n)},ellipse:TT,polygon:function(t,e,n){var i=t.x,r=t.y,a=[],s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY;"function"==typeof e.forEach?e.forEach((function(t){s=Math.min(s,t.x),o=Math.min(o,t.y)})):(s=Math.min(s,e.x),o=Math.min(o,e.y));for(var c=i-t.width/2-s,l=r-t.height/2-o,h=0;h<e.length;h++){var u=e[h],d=e[h<e.length-1?h+1:0],p=CT(t,n,{x:c+u.x,y:l+u.y},{x:c+d.x,y:l+d.y});p&&a.push(p)}return a.length?(a.length>1&&a.sort((function(t,e){var i=t.x-n.x,r=t.y-n.y,a=Math.sqrt(i*i+r*r),s=e.x-n.x,o=e.y-n.y,c=Math.sqrt(s*s+o*o);return a<c?-1:a===c?0:1})),a[0]):t},rect:ST},DT=(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,"node "+e.classes,!0);Db.info("Classes = ",e.classes);const a=n.insert("rect",":first-child");return a.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),dT(e,a),e.intersect=function(t){return AT.rect(e,t)},n};function LT(t,e,n,i){const r=[],a=t=>{r.push(t,0)},s=t=>{r.push(0,t)};e.includes("t")?(Db.debug("add top border"),a(n)):s(n),e.includes("r")?(Db.debug("add right border"),a(i)):s(i),e.includes("b")?(Db.debug("add bottom border"),a(n)):s(n),e.includes("l")?(Db.debug("add left border"),a(i)):s(i),t.attr("stroke-dasharray",r.join(" "))}const NT=(t,e,n)=>{const i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id);let r=70,a=10;"LR"===n&&(r=10,a=70);const s=i.append("rect").attr("x",-1*r/2).attr("y",-1*a/2).attr("width",r).attr("height",a).attr("class","fork-join");return dT(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(t){return AT.rect(e,t)},i},OT={question:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding+(i.height+e.padding),a=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];Db.info("Question main (Circle)");const s=pT(n,r,r,a);return s.attr("style",e.style),dT(e,s),e.intersect=function(t){return Db.warn("Intersect called"),AT.polygon(e,a,t)},n},rect:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,"node "+e.classes,!0);Db.trace("Classes = ",e.classes);const a=n.insert("rect",":first-child"),s=i.width+e.padding,o=i.height+e.padding;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",s).attr("height",o),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(LT(a,e.props.borders,s,o),t.delete("borders")),t.forEach((t=>{Db.warn(`Unknown node property ${t}`)}))}return dT(e,a),e.intersect=function(t){return AT.rect(e,t)},n},labelRect:(t,e)=>{const{shapeSvg:n}=uT(t,e,"label",!0);Db.trace("Classes = ",e.classes);const i=n.insert("rect",":first-child");if(i.attr("width",0).attr("height",0),n.attr("class","label edgeLabel"),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(LT(i,e.props.borders,0,0),t.delete("borders")),t.forEach((t=>{Db.warn(`Unknown node property ${t}`)}))}return dT(e,i),e.intersect=function(t){return AT.rect(e,t)},n},rectWithTitle:(t,e)=>{let n;n=e.classes?"node "+e.classes:"node default";const i=t.insert("g").attr("class",n).attr("id",e.domId||e.id),r=i.insert("rect",":first-child"),a=i.insert("line"),s=i.insert("g").attr("class","label"),o=e.labelText.flat?e.labelText.flat():e.labelText;let c="";c="object"==typeof o?o[0]:o,Db.info("Label text abc79",c,o,"object"==typeof o);const l=s.node().appendChild(hT(c,e.labelStyle,!0,!0));let h={width:0,height:0};if($b(hv().flowchart.htmlLabels)){const t=l.children[0],e=Ho(l);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}Db.info("Text 2",o);const u=o.slice(1,o.length);let d=l.getBBox();const p=s.node().appendChild(hT(u.join?u.join("<br/>"):u,e.labelStyle,!0,!0));if($b(hv().flowchart.htmlLabels)){const t=p.children[0],e=Ho(p);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}const f=e.padding/2;return Ho(p).attr("transform","translate( "+(h.width>d.width?0:(d.width-h.width)/2)+", "+(d.height+f+5)+")"),Ho(l).attr("transform","translate( "+(h.width<d.width?0:-(d.width-h.width)/2)+", 0)"),h=s.node().getBBox(),s.attr("transform","translate("+-h.width/2+", "+(-h.height/2-f+3)+")"),r.attr("class","outer title-state").attr("x",-h.width/2-f).attr("y",-h.height/2-f).attr("width",h.width+e.padding).attr("height",h.height+e.padding),a.attr("class","divider").attr("x1",-h.width/2-f).attr("x2",h.width/2+f).attr("y1",-h.height/2-f+d.height+f).attr("y2",-h.height/2-f+d.height+f),dT(e,r),e.intersect=function(t){return AT.rect(e,t)},i},choice:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=[{x:0,y:14},{x:14,y:0},{x:0,y:-14},{x:-14,y:0}];return n.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(t){return AT.circle(e,14,t)},n},circle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,void 0,!0),a=n.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Db.info("Circle main"),dT(e,a),e.intersect=function(t){return Db.info("Circle intersect",e,i.width/2+r,t),AT.circle(e,i.width/2+r,t)},n},doublecircle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,void 0,!0),a=n.insert("g",":first-child"),s=a.insert("circle"),o=a.insert("circle");return s.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r+5).attr("width",i.width+e.padding+10).attr("height",i.height+e.padding+10),o.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Db.info("DoubleCircle main"),dT(e,s),e.intersect=function(t){return Db.info("DoubleCircle intersect",e,i.width/2+r+5,t),AT.circle(e,i.width/2+r+5,t)},n},stadium:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.height+e.padding,a=i.width+r/4+e.padding,s=n.insert("rect",":first-child").attr("style",e.style).attr("rx",r/2).attr("ry",r/2).attr("x",-a/2).attr("y",-r/2).attr("width",a).attr("height",r);return dT(e,s),e.intersect=function(t){return AT.rect(e,t)},n},hexagon:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.height+e.padding,a=r/4,s=i.width+2*a+e.padding,o=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-r/2},{x:s-a,y:-r},{x:a,y:-r},{x:0,y:-r/2}],c=pT(n,s,r,o);return c.attr("style",e.style),dT(e,c),e.intersect=function(t){return AT.polygon(e,o,t)},n},rect_left_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-a/2,y:0},{x:r,y:0},{x:r,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return pT(n,r,a,s).attr("style",e.style),e.width=r+a,e.height=a,e.intersect=function(t){return AT.polygon(e,s,t)},n},lean_right:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},lean_left:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:2*a/6,y:0},{x:r+a/6,y:0},{x:r-2*a/6,y:-a},{x:-a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r+2*a/6,y:0},{x:r-a/6,y:-a},{x:a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},inv_trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:-2*a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},rect_right_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r+a/2,y:0},{x:r,y:-a/2},{x:r+a/2,y:-a},{x:0,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},cylinder:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=r/2,s=a/(2.5+r/50),o=i.height+s+e.padding,c="M 0,"+s+" a "+a+","+s+" 0,0,0 "+r+" 0 a "+a+","+s+" 0,0,0 "+-r+" 0 l 0,"+o+" a "+a+","+s+" 0,0,0 "+r+" 0 l 0,"+-o,l=n.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",c).attr("transform","translate("+-r/2+","+-(o/2+s)+")");return dT(e,l),e.intersect=function(t){const n=AT.rect(e,t),i=n.x-e.x;if(0!=a&&(Math.abs(i)<e.width/2||Math.abs(i)==e.width/2&&Math.abs(n.y-e.y)>e.height/2-s)){let r=s*s*(1-i*i/(a*a));0!=r&&(r=Math.sqrt(r)),r=s-r,t.y-e.y>0&&(r=-r),n.y+=r}return n},n},start:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),dT(e,i),e.intersect=function(t){return AT.circle(e,7,t)},n},end:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child"),r=n.insert("circle",":first-child");return r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),i.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),dT(e,r),e.intersect=function(t){return AT.circle(e,7,t)},n},note:DT,subroutine:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r,y:0},{x:r,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:r+8,y:0},{x:r+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},fork:NT,join:NT,class_box:(t,e)=>{const n=e.padding/2;let i;i=e.classes?"node "+e.classes:"node default";const r=t.insert("g").attr("class",i).attr("id",e.domId||e.id),a=r.insert("rect",":first-child"),s=r.insert("line"),o=r.insert("line");let c=0,l=4;const h=r.insert("g").attr("class","label");let u=0;const d=e.classData.annotations&&e.classData.annotations[0],p=e.classData.annotations[0]?"\xab"+e.classData.annotations[0]+"\xbb":"",f=h.node().appendChild(hT(p,e.labelStyle,!0,!0));let g=f.getBBox();if($b(hv().flowchart.htmlLabels)){const t=f.children[0],e=Ho(f);g=t.getBoundingClientRect(),e.attr("width",g.width),e.attr("height",g.height)}e.classData.annotations[0]&&(l+=g.height+4,c+=g.width);let y=e.classData.id;void 0!==e.classData.type&&""!==e.classData.type&&(hv().flowchart.htmlLabels?y+="<"+e.classData.type+">":y+="<"+e.classData.type+">");const m=h.node().appendChild(hT(y,e.labelStyle,!0,!0));Ho(m).attr("class","classTitle");let b=m.getBBox();if($b(hv().flowchart.htmlLabels)){const t=m.children[0],e=Ho(m);b=t.getBoundingClientRect(),e.attr("width",b.width),e.attr("height",b.height)}l+=b.height+4,b.width>c&&(c=b.width);const _=[];e.classData.members.forEach((t=>{const n=Zw(t);let i=n.displayText;hv().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=h.node().appendChild(hT(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if($b(hv().flowchart.htmlLabels)){const t=r.children[0],e=Ho(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>c&&(c=a.width),l+=a.height+4,_.push(r)})),l+=8;const x=[];if(e.classData.methods.forEach((t=>{const n=Zw(t);let i=n.displayText;hv().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=h.node().appendChild(hT(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if($b(hv().flowchart.htmlLabels)){const t=r.children[0],e=Ho(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>c&&(c=a.width),l+=a.height+4,x.push(r)})),l+=8,d){let t=(c-g.width)/2;Ho(f).attr("transform","translate( "+(-1*c/2+t)+", "+-1*l/2+")"),u=g.height+4}let v=(c-b.width)/2;return Ho(m).attr("transform","translate( "+(-1*c/2+v)+", "+(-1*l/2+u)+")"),u+=b.height+4,s.attr("class","divider").attr("x1",-c/2-n).attr("x2",c/2+n).attr("y1",-l/2-n+8+u).attr("y2",-l/2-n+8+u),u+=8,_.forEach((t=>{Ho(t).attr("transform","translate( "+-c/2+", "+(-1*l/2+u+4)+")"),u+=b.height+4})),u+=8,o.attr("class","divider").attr("x1",-c/2-n).attr("x2",c/2+n).attr("y1",-l/2-n+8+u).attr("y2",-l/2-n+8+u),u+=8,x.forEach((t=>{Ho(t).attr("transform","translate( "+-c/2+", "+(-1*l/2+u)+")"),u+=b.height+4})),a.attr("class","outer title-state").attr("x",-c/2-n).attr("y",-l/2-n).attr("width",c+e.padding).attr("height",l+e.padding),dT(e,a),e.intersect=function(t){return AT.rect(e,t)},r}};let BT={};const MT=t=>{const e=BT[t.id];Db.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");const n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-8)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},IT={rect:(t,e)=>{Db.trace("Creating subgraph rect for ",e.id,e);const n=t.insert("g").attr("class","cluster"+(e.class?" "+e.class:"")).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=r.node().appendChild(hT(e.labelText,e.labelStyle,void 0,!0));let s=a.getBBox();if($b(hv().flowchart.htmlLabels)){const t=a.children[0],e=Ho(a);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}const o=0*e.padding,c=o/2,l=e.width<=s.width+o?s.width+o:e.width;e.width<=s.width+o?e.diff=(s.width-e.width)/2-e.padding/2:e.diff=-e.padding/2,Db.trace("Data ",e,JSON.stringify(e)),i.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-l/2).attr("y",e.y-e.height/2-c).attr("width",l).attr("height",e.height+o),r.attr("transform","translate("+(e.x-s.width/2)+", "+(e.y-e.height/2)+")");const h=i.node().getBBox();return e.width=h.width,e.height=h.height,e.intersect=function(t){return ST(e,t)},n},roundedWithTitle:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=n.append("rect"),s=r.node().appendChild(hT(e.labelText,e.labelStyle,void 0,!0));let o=s.getBBox();if($b(hv().flowchart.htmlLabels)){const t=s.children[0],e=Ho(s);o=t.getBoundingClientRect(),e.attr("width",o.width),e.attr("height",o.height)}o=s.getBBox();const c=0*e.padding,l=c/2,h=e.width<=o.width+e.padding?o.width+e.padding:e.width;e.width<=o.width+e.padding?e.diff=(o.width+0*e.padding-e.width)/2:e.diff=-e.padding/2,i.attr("class","outer").attr("x",e.x-h/2-l).attr("y",e.y-e.height/2-l).attr("width",h+c).attr("height",e.height+c),a.attr("class","inner").attr("x",e.x-h/2-l).attr("y",e.y-e.height/2-l+o.height-1).attr("width",h+c).attr("height",e.height+c-o.height-3),r.attr("transform","translate("+(e.x-o.width/2)+", "+(e.y-e.height/2-e.padding/3+($b(hv().flowchart.htmlLabels)?5:3))+")");const u=i.node().getBBox();return e.height=u.height,e.intersect=function(t){return ST(e,t)},n},noteGroup:(t,e)=>{const n=t.insert("g").attr("class","note-cluster").attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+r).attr("height",e.height+r).attr("fill","none");const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(t){return ST(e,t)},n},divider:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("class","divider").attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2).attr("width",e.width+r).attr("height",e.height+r);const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.diff=-e.padding/2,e.intersect=function(t){return ST(e,t)},n}};let FT={};let RT={},$T={};function PT(t,e){hv().flowchart.htmlLabels&&t&&(t.style.width=9*e.length+"px",t.style.height="12px")}const jT=(t,e)=>{Db.warn("abc88 cutPathAtIntersect",t,e);let n=[],i=t[0],r=!1;return t.forEach((t=>{if(Db.info("abc88 checking point",t,e),((t,e)=>{const n=t.x,i=t.y,r=Math.abs(e.x-n),a=Math.abs(e.y-i),s=t.width/2,o=t.height/2;return r>=s||a>=o})(e,t)||r)Db.warn("abc88 outside",t,i),i=t,r||n.push(t);else{const a=((t,e,n)=>{Db.warn(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(e)}\n insidePoint : ${JSON.stringify(n)}\n node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);const i=t.x,r=t.y,a=Math.abs(i-n.x),s=t.width/2;let o=n.x<e.x?s-a:s+a;const c=t.height/2,l=Math.abs(e.y-n.y),h=Math.abs(e.x-n.x);if(Math.abs(r-e.y)*s>Math.abs(i-e.x)*c){let t=n.y<e.y?e.y-c-r:r-c-e.y;o=h*t/l;const i={x:n.x<e.x?n.x+o:n.x-h+o,y:n.y<e.y?n.y+l-t:n.y-l+t};return 0===o&&(i.x=e.x,i.y=e.y),0===h&&(i.x=e.x),0===l&&(i.y=e.y),Db.warn(`abc89 topp/bott calc, Q ${l}, q ${t}, R ${h}, r ${o}`,i),i}{o=n.x<e.x?e.x-s-i:i-s-e.x;let t=l*o/h,r=n.x<e.x?n.x+h-o:n.x-h+o,a=n.y<e.y?n.y+t:n.y-t;return Db.warn(`sides calc abc89, Q ${l}, q ${t}, R ${h}, r ${o}`,{_x:r,_y:a}),0===o&&(r=e.x,a=e.y),0===h&&(r=e.x),0===l&&(a=e.y),{x:r,y:a}}})(e,i,t);Db.warn("abc88 inside",t,i,a),Db.warn("abc88 intersection",a);let s=!1;n.forEach((t=>{s=s||t.x===a.x&&t.y===a.y})),n.some((t=>t.x===a.x&&t.y===a.y))?Db.warn("abc88 no intersect",a,n):n.push(a),r=!0}})),Db.warn("abc88 returning points",n),n},YT=(t,e,n,i)=>{Db.info("Graph in recursive render: XXX",fb(e),i);const r=e.graph().rankdir;Db.trace("Dir in recursive render - dir:",r);const a=t.insert("g").attr("class","root");e.nodes()?Db.info("Recursive render XXX",e.nodes()):Db.info("No nodes found for",e),e.edges().length>0&&Db.trace("Recursive edges",e.edge(e.edges()[0]));const s=a.insert("g").attr("class","clusters"),o=a.insert("g").attr("class","edgePaths"),c=a.insert("g").attr("class","edgeLabels"),l=a.insert("g").attr("class","nodes");e.nodes().forEach((function(t){const a=e.node(t);if(void 0!==i){const n=JSON.parse(JSON.stringify(i.clusterData));Db.info("Setting data for cluster XXX (",t,") ",n,i),e.setNode(i.id,n),e.parent(t)||(Db.trace("Setting parent",t,i.id),e.setParent(t,i.id,n))}if(Db.info("(Insert) Node XXX"+t+": "+JSON.stringify(e.node(t))),a&&a.clusterNode){Db.info("Cluster identified",t,a.width,e.node(t));const i=YT(l,a.graph,n,e.node(t)),r=i.elem;dT(a,r),a.diff=i.diff||0,Db.info("Node bounds (abc123)",t,a,a.width,a.x,a.y),((t,e)=>{BT[e.id]=t})(r,a),Db.warn("Recursive render complete ",r,a)}else e.children(t).length>0?(Db.info("Cluster - the non recursive path XXX",t,a.id,a,e),Db.info(xT(a.id,e)),fT[a.id]={id:xT(a.id,e),node:a}):(Db.info("Node - the non recursive path",t,a.id,a),((t,e,n)=>{let i,r;if(e.link){let a;"sandbox"===hv().securityLevel?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),i=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),r=OT[e.shape](i,e,n)}else r=OT[e.shape](t,e,n),i=r;e.tooltip&&r.attr("title",e.tooltip),e.class&&r.attr("class","node default "+e.class),BT[e.id]=i,e.haveCallback&&BT[e.id].attr("class",BT[e.id].attr("class")+" clickable")})(l,e.node(t),r))})),e.edges().forEach((function(t){const n=e.edge(t.v,t.w,t.name);Db.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t)),Db.info("Edge "+t.v+" -> "+t.w+": ",t," ",JSON.stringify(e.edge(t))),Db.info("Fix",fT,"ids:",t.v,t.w,"Translateing: ",fT[t.v],fT[t.w]),((t,e)=>{const n=hT(e.label,e.labelStyle),i=t.insert("g").attr("class","edgeLabel"),r=i.insert("g").attr("class","label");r.node().appendChild(n);let a,s=n.getBBox();if($b(hv().flowchart.htmlLabels)){const t=n.children[0],e=Ho(n);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}if(r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),RT[e.id]=i,e.width=s.width,e.height=s.height,e.startLabelLeft){const n=hT(e.startLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),$T[e.id]||($T[e.id]={}),$T[e.id].startLeft=i,PT(a,e.startLabelLeft)}if(e.startLabelRight){const n=hT(e.startLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=i.node().appendChild(n),r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),$T[e.id]||($T[e.id]={}),$T[e.id].startRight=i,PT(a,e.startLabelRight)}if(e.endLabelLeft){const n=hT(e.endLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),$T[e.id]||($T[e.id]={}),$T[e.id].endLeft=i,PT(a,e.endLabelLeft)}if(e.endLabelRight){const n=hT(e.endLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),$T[e.id]||($T[e.id]={}),$T[e.id].endRight=i,PT(a,e.endLabelRight)}})(c,n)})),e.edges().forEach((function(t){Db.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t))})),Db.info("#############################################"),Db.info("### Layout ###"),Db.info("#############################################"),Db.info(e),Em(e),Db.info("Graph after layout:",fb(e));let h=0;return(t=>wT(t,t.children()))(e).forEach((function(t){const n=e.node(t);Db.info("Position "+t+": "+JSON.stringify(e.node(t))),Db.info("Position "+t+": ("+n.x,","+n.y,") width: ",n.width," height: ",n.height),n&&n.clusterNode?MT(n):e.children(t).length>0?(((t,e)=>{Db.trace("Inserting cluster");const n=e.shape||"rect";FT[e.id]=IT[n](t,e)})(s,n),fT[n.id].node=n):MT(n)})),e.edges().forEach((function(t){const i=e.edge(t);Db.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(i),i);const r=function(t,e,n,i,r,a){let s=n.points,o=!1;const c=a.node(e.v);var l=a.node(e.w);Db.info("abc88 InsertEdge: ",n),l.intersect&&c.intersect&&(s=s.slice(1,n.points.length-1),s.unshift(c.intersect(s[0])),Db.info("Last point",s[s.length-1],l,l.intersect(s[s.length-1])),s.push(l.intersect(s[s.length-1]))),n.toCluster&&(Db.info("to cluster abc88",i[n.toCluster]),s=jT(n.points,i[n.toCluster].node),o=!0),n.fromCluster&&(Db.info("from cluster abc88",i[n.fromCluster]),s=jT(s.reverse(),i[n.fromCluster].node).reverse(),o=!0);const h=s.filter((t=>!Number.isNaN(t.y)));let u;u=("graph"===r||"flowchart"===r)&&n.curve||Bc;const d=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(u);let p;switch(n.thickness){case"normal":p="edge-thickness-normal";break;case"thick":p="edge-thickness-thick";break;default:p=""}switch(n.pattern){case"solid":p+=" edge-pattern-solid";break;case"dotted":p+=" edge-pattern-dotted";break;case"dashed":p+=" edge-pattern-dashed"}const f=t.append("path").attr("d",d(h)).attr("id",n.id).attr("class"," "+p+(n.classes?" "+n.classes:"")).attr("style",n.style);let g="";switch((hv().flowchart.arrowMarkerAbsolute||hv().state.arrowMarkerAbsolute)&&(g=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,g=g.replace(/\(/g,"\\("),g=g.replace(/\)/g,"\\)")),Db.info("arrowTypeStart",n.arrowTypeStart),Db.info("arrowTypeEnd",n.arrowTypeEnd),n.arrowTypeStart){case"arrow_cross":f.attr("marker-start","url("+g+"#"+r+"-crossStart)");break;case"arrow_point":f.attr("marker-start","url("+g+"#"+r+"-pointStart)");break;case"arrow_barb":f.attr("marker-start","url("+g+"#"+r+"-barbStart)");break;case"arrow_circle":f.attr("marker-start","url("+g+"#"+r+"-circleStart)");break;case"aggregation":f.attr("marker-start","url("+g+"#"+r+"-aggregationStart)");break;case"extension":f.attr("marker-start","url("+g+"#"+r+"-extensionStart)");break;case"composition":f.attr("marker-start","url("+g+"#"+r+"-compositionStart)");break;case"dependency":f.attr("marker-start","url("+g+"#"+r+"-dependencyStart)");break;case"lollipop":f.attr("marker-start","url("+g+"#"+r+"-lollipopStart)")}switch(n.arrowTypeEnd){case"arrow_cross":f.attr("marker-end","url("+g+"#"+r+"-crossEnd)");break;case"arrow_point":f.attr("marker-end","url("+g+"#"+r+"-pointEnd)");break;case"arrow_barb":f.attr("marker-end","url("+g+"#"+r+"-barbEnd)");break;case"arrow_circle":f.attr("marker-end","url("+g+"#"+r+"-circleEnd)");break;case"aggregation":f.attr("marker-end","url("+g+"#"+r+"-aggregationEnd)");break;case"extension":f.attr("marker-end","url("+g+"#"+r+"-extensionEnd)");break;case"composition":f.attr("marker-end","url("+g+"#"+r+"-compositionEnd)");break;case"dependency":f.attr("marker-end","url("+g+"#"+r+"-dependencyEnd)");break;case"lollipop":f.attr("marker-end","url("+g+"#"+r+"-lollipopEnd)")}let y={};return o&&(y.updatedPath=s),y.originalPath=n.points,y}(o,t,i,fT,n,e);((t,e)=>{Db.info("Moving label abc78 ",t.id,t.label,RT[t.id]);let n=e.updatedPath?e.updatedPath:e.originalPath;if(t.label){const i=RT[t.id];let r=t.x,a=t.y;if(n){const i=tv.calcLabelPosition(n);Db.info("Moving label "+t.label+" from (",r,",",a,") to (",i.x,",",i.y,") abc78"),e.updatedPath&&(r=i.x,a=i.y)}i.attr("transform","translate("+r+", "+a+")")}if(t.startLabelLeft){const e=$T[t.id].startLeft;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.startLabelRight){const e=$T[t.id].startRight;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelLeft){const e=$T[t.id].endLeft;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelRight){const e=$T[t.id].endRight;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}})(i,r)})),e.nodes().forEach((function(t){const n=e.node(t);Db.info(t,n.type,n.diff),"group"===n.type&&(h=n.diff)})),{elem:a,diff:h}},zT=(t,e,n,i,r)=>{lT(t,n,i,r),BT={},RT={},$T={},FT={},gT={},yT={},fT={},Db.warn("Graph at first:",fb(e)),((t,e)=>{!t||e>10?Db.debug("Opting out, no graph "):(Db.debug("Opting in, graph "),t.nodes().forEach((function(e){t.children(e).length>0&&(Db.warn("Cluster identified",e," Replacement id in edges: ",xT(e,t)),gT[e]=_T(e,t),fT[e]={id:xT(e,t),clusterData:t.node(e)})})),t.nodes().forEach((function(e){const n=t.children(e),i=t.edges();n.length>0?(Db.debug("Cluster identified",e,gT),i.forEach((t=>{t.v!==e&&t.w!==e&&mT(t.v,e)^mT(t.w,e)&&(Db.warn("Edge: ",t," leaves cluster ",e),Db.warn("Decendants of XXX ",e,": ",gT[e]),fT[e].externalConnections=!0)}))):Db.debug("Not a cluster ",e,gT)})),t.edges().forEach((function(e){const n=t.edge(e);Db.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(e)),Db.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(t.edge(e)));let i=e.v,r=e.w;if(Db.warn("Fix XXX",fT,"ids:",e.v,e.w,"Translating: ",fT[e.v]," --- ",fT[e.w]),fT[e.v]&&fT[e.w]&&fT[e.v]===fT[e.w]){Db.warn("Fixing and trixing link to self - removing XXX",e.v,e.w,e.name),Db.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=vT(e.v),r=vT(e.w),t.removeEdge(e.v,e.w,e.name);const a=e.w+"---"+e.v;t.setNode(a,{domId:a,id:a,labelStyle:"",labelText:n.label,padding:0,shape:"labelRect",style:""});const s=JSON.parse(JSON.stringify(n)),o=JSON.parse(JSON.stringify(n));s.label="",s.arrowTypeEnd="none",o.label="",s.fromCluster=e.v,o.toCluster=e.v,t.setEdge(i,a,s,e.name+"-cyclic-special"),t.setEdge(a,r,o,e.name+"-cyclic-special")}else(fT[e.v]||fT[e.w])&&(Db.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=vT(e.v),r=vT(e.w),t.removeEdge(e.v,e.w,e.name),i!==e.v&&(n.fromCluster=e.v),r!==e.w&&(n.toCluster=e.w),Db.warn("Fix Replacing with XXX",i,r,e.name),t.setEdge(i,r,n,e.name))})),Db.warn("Adjusted Graph",fb(t)),kT(t,0),Db.trace(fT))})(e),Db.warn("Graph after:",fb(e)),YT(t,e,i)},UT=t=>jb.sanitizeText(t,hv());let WT={dividerMargin:10,padding:5,textHeight:10};function HT(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}const qT={setConf:function(t){Object.keys(t).forEach((function(e){WT[e]=t[e]}))},draw:function(t,e,n,i){Db.info("Drawing class - ",e);const r=hv().flowchart,a=hv().securityLevel;Db.info("config:",r);const s=r.nodeSpacing||50,o=r.rankSpacing||50,c=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:i.db.getDirection(),nodesep:s,ranksep:o,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}})),l=i.db.getClasses(),h=i.db.getRelations(),u=i.db.getNotes();let d;Db.info(h),function(t,e,n,i){const r=Object.keys(t);Db.info("keys:",r),Db.info(t),r.forEach((function(n){const r=t[n];let a="";r.cssClasses.length>0&&(a=a+" "+r.cssClasses.join(" "));const s={labelStyle:""};let o=void 0!==r.text?r.text:r.id,c="";r.type,c="class_box",e.setNode(r.id,{labelStyle:s.labelStyle,shape:c,labelText:UT(o),classData:r,rx:0,ry:0,class:a,style:s.style,id:r.id,domId:r.domId,tooltip:i.db.getTooltip(r.id)||"",haveCallback:r.haveCallback,link:r.link,width:"group"===r.type?500:void 0,type:r.type,padding:hv().flowchart.padding}),Db.info("setNode",{labelStyle:s.labelStyle,shape:c,labelText:o,rx:0,ry:0,class:a,style:s.style,id:r.id,width:"group"===r.type?500:void 0,type:r.type,padding:hv().flowchart.padding})}))}(l,c,0,i),function(t,e){const n=hv().flowchart;let i=0;t.forEach((function(r){i++;const a={classes:"relation"};a.pattern=1==r.relation.lineType?"dashed":"solid",a.id="id"+i,"arrow_open"===r.type?a.arrowhead="none":a.arrowhead="normal",Db.info(a,r),a.startLabelRight="none"===r.relationTitle1?"":r.relationTitle1,a.endLabelLeft="none"===r.relationTitle2?"":r.relationTitle2,a.arrowTypeStart=HT(r.relation.type1),a.arrowTypeEnd=HT(r.relation.type2);let s="",o="";if(void 0!==r.style){const t=jx(r.style);s=t.style,o=t.labelStyle}else s="fill:none";a.style=s,a.labelStyle=o,void 0!==r.interpolate?a.curve=$x(r.interpolate,Tc):void 0!==t.defaultInterpolate?a.curve=$x(t.defaultInterpolate,Tc):a.curve=$x(n.curve,Tc),r.text=r.title,void 0===r.text?void 0!==r.style&&(a.arrowheadStyle="fill: #333"):(a.arrowheadStyle="fill: #333",a.labelpos="c",hv().flowchart.htmlLabels?(a.labelType="html",a.label='<span class="edgeLabel">'+r.text+"</span>"):(a.labelType="text",a.label=r.text.replace(jb.lineBreakRegex,"\n"),void 0===r.style&&(a.style=a.style||"stroke: #333; stroke-width: 1.5px;fill:none"),a.labelStyle=a.labelStyle.replace("color:","fill:"))),e.setEdge(r.id1,r.id2,a,i)}))}(h,c),function(t,e,n,i){Db.info(t),t.forEach((function(t,r){const a=t,s="",o="";let c=a.text,l="note";if(e.setNode(a.id,{labelStyle:s,shape:l,labelText:UT(c),noteData:a,rx:0,ry:0,class:"",style:o,id:a.id,domId:a.id,tooltip:"",type:"note",padding:hv().flowchart.padding}),Db.info("setNode",{labelStyle:s,shape:l,labelText:c,rx:0,ry:0,style:o,id:a.id,type:"note",padding:hv().flowchart.padding}),!a.class||!(a.class in i))return;const h=n+r,u={classes:"relation",pattern:"dotted"};u.id=`edgeNote${h}`,u.arrowhead="none",Db.info(`Note edge: ${JSON.stringify(u)}, ${JSON.stringify(a)}`),u.startLabelRight="",u.endLabelLeft="",u.arrowTypeStart="none",u.arrowTypeEnd="none",u.style="fill:none",u.labelStyle="",u.curve=$x(WT.curve,Tc),e.setEdge(a.id,a.class,u,h)}))}(u,c,h.length+1,l),"sandbox"===a&&(d=Ho("#i"+e));const p=Ho("sandbox"===a?d.nodes()[0].contentDocument.body:"body"),f=p.select(`[id="${e}"]`),g=p.select("#"+e+" g");if(zT(g,c,["aggregation","extension","composition","dependency","lollipop"],"classDiagram",e),tv.insertTitle(f,"classTitleText",r.titleTopMargin,i.db.getDiagramTitle()),bv(c,f,r.diagramPadding,r.useMaxWidth),!r.htmlLabels){const t="sandbox"===a?d.nodes()[0].contentDocument:document,n=t.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of n){const n=e.getBBox(),i=t.createElementNS("http://www.w3.org/2000/svg","rect");i.setAttribute("rx",0),i.setAttribute("ry",0),i.setAttribute("width",n.width),i.setAttribute("height",n.height),e.insertBefore(i,e.firstChild)}}}};var VT=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,23,25,27,29,30,31,49],a=[1,17],s=[1,18],o=[1,19],c=[1,20],l=[1,21],h=[1,22],u=[1,25],d=[1,30],p=[1,31],f=[1,32],g=[1,33],y=[6,9,11,15,20,23,25,27,29,30,31,42,43,44,45,49],m=[1,45],b=[30,31,46,47],_=[4,6,9,11,23,25,27,29,30,31,49],x=[42,43,44,45],v=[22,37],k=[1,64],w={trace:function(){},yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,entityName:17,relSpec:18,role:19,BLOCK_START:20,attributes:21,BLOCK_STOP:22,title:23,title_value:24,acc_title:25,acc_title_value:26,acc_descr:27,acc_descr_value:28,acc_descr_multiline_value:29,ALPHANUM:30,ENTITY_NAME:31,attribute:32,attributeType:33,attributeName:34,attributeKeyType:35,attributeComment:36,ATTRIBUTE_WORD:37,ATTRIBUTE_KEY:38,COMMENT:39,cardinality:40,relType:41,ZERO_OR_ONE:42,ZERO_OR_MORE:43,ONE_OR_MORE:44,ONLY_ONE:45,NON_IDENTIFYING:46,IDENTIFYING:47,WORD:48,open_directive:49,type_directive:50,arg_directive:51,close_directive:52,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",20:"BLOCK_START",22:"BLOCK_STOP",23:"title",24:"title_value",25:"acc_title",26:"acc_title_value",27:"acc_descr",28:"acc_descr_value",29:"acc_descr_multiline_value",30:"ALPHANUM",31:"ENTITY_NAME",37:"ATTRIBUTE_WORD",38:"ATTRIBUTE_KEY",39:"COMMENT",42:"ZERO_OR_ONE",43:"ZERO_OR_MORE",44:"ONE_OR_MORE",45:"ONLY_ONE",46:"NON_IDENTIFYING",47:"IDENTIFYING",48:"WORD",49:"open_directive",50:"type_directive",51:"arg_directive",52:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[10,4],[10,3],[10,1],[10,2],[10,2],[10,2],[10,1],[17,1],[17,1],[21,1],[21,2],[32,2],[32,3],[32,3],[32,4],[33,1],[34,1],[35,1],[36,1],[18,3],[40,1],[40,1],[40,1],[40,1],[41,1],[41,1],[19,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:break;case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:case 20:case 41:case 28:case 29:case 30:this.$=a[o];break;case 12:i.addEntity(a[o-4]),i.addEntity(a[o-2]),i.addRelationship(a[o-4],a[o],a[o-2],a[o-3]);break;case 13:i.addEntity(a[o-3]),i.addAttributes(a[o-3],a[o-1]);break;case 14:i.addEntity(a[o-2]);break;case 15:i.addEntity(a[o]);break;case 16:case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:case 39:case 40:case 31:this.$=a[o].replace(/"/g,"");break;case 22:this.$=[a[o]];break;case 23:a[o].push(a[o-1]),this.$=a[o];break;case 24:this.$={attributeType:a[o-1],attributeName:a[o]};break;case 25:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeKeyType:a[o]};break;case 26:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeComment:a[o]};break;case 27:this.$={attributeType:a[o-3],attributeName:a[o-2],attributeKeyType:a[o-1],attributeComment:a[o]};break;case 32:this.$={cardA:a[o],relType:a[o-1],cardB:a[o-2]};break;case 33:this.$=i.Cardinality.ZERO_OR_ONE;break;case 34:this.$=i.Cardinality.ZERO_OR_MORE;break;case 35:this.$=i.Cardinality.ONE_OR_MORE;break;case 36:this.$=i.Cardinality.ONLY_ONE;break;case 37:this.$=i.Identification.NON_IDENTIFYING;break;case 38:this.$=i.Identification.IDENTIFYING;break;case 42:i.parseDirective("%%{","open_directive");break;case 43:i.parseDirective(a[o],"type_directive");break;case 44:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 45:i.parseDirective("}%%","close_directive","er")}},table:[{3:1,4:n,7:3,12:4,49:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,49:i},{13:8,50:[1,9]},{50:[2,42]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,49:i},{1:[2,2]},{14:23,15:[1,24],52:u},e([15,52],[2,43]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:15,10:26,12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,49:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),e(r,[2,15],{18:27,40:29,20:[1,28],42:d,43:p,44:f,45:g}),{24:[1,34]},{26:[1,35]},{28:[1,36]},e(r,[2,19]),e(y,[2,20]),e(y,[2,21]),{11:[1,37]},{16:38,51:[1,39]},{11:[2,45]},e(r,[2,5]),{17:40,30:l,31:h},{21:41,22:[1,42],32:43,33:44,37:m},{41:46,46:[1,47],47:[1,48]},e(b,[2,33]),e(b,[2,34]),e(b,[2,35]),e(b,[2,36]),e(r,[2,16]),e(r,[2,17]),e(r,[2,18]),e(_,[2,9]),{14:49,52:u},{52:[2,44]},{15:[1,50]},{22:[1,51]},e(r,[2,14]),{21:52,22:[2,22],32:43,33:44,37:m},{34:53,37:[1,54]},{37:[2,28]},{40:55,42:d,43:p,44:f,45:g},e(x,[2,37]),e(x,[2,38]),{11:[1,56]},{19:57,30:[1,60],31:[1,59],48:[1,58]},e(r,[2,13]),{22:[2,23]},e(v,[2,24],{35:61,36:62,38:[1,63],39:k}),e([22,37,38,39],[2,29]),e([30,31],[2,32]),e(_,[2,10]),e(r,[2,12]),e(r,[2,39]),e(r,[2,40]),e(r,[2,41]),e(v,[2,25],{36:65,39:k}),e(v,[2,26]),e([22,37,39],[2,30]),e(v,[2,31]),e(v,[2,27])],defaultActions:{5:[2,42],7:[2,2],25:[2,45],39:[2,44],45:[2,28],52:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},T=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("acc_title"),25;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),27;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.begin("open_directive"),49;case 8:return this.begin("type_directive"),50;case 9:return this.popState(),this.begin("arg_directive"),15;case 10:return this.popState(),this.popState(),52;case 11:return 51;case 12:case 13:case 15:case 21:case 26:break;case 14:return 11;case 16:return 9;case 17:return 31;case 18:return 48;case 19:return 4;case 20:return this.begin("block"),20;case 22:return 38;case 23:case 24:return 37;case 25:return 39;case 27:return this.popState(),22;case 28:case 57:return e.yytext[0];case 29:case 33:case 34:case 47:return 42;case 30:case 31:case 32:case 40:case 42:case 49:return 44;case 35:case 36:case 37:case 38:case 39:case 41:case 48:return 43;case 43:case 44:case 45:case 46:return 45;case 50:case 53:case 54:case 55:return 46;case 51:case 52:return 47;case 56:return 30;case 58:return 6}},rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK))\b)/i,/^(?:(.*?)[~](.*?)*[~])/i,/^(?:[A-Za-z][A-Za-z0-9\-_\[\]]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},open_directive:{rules:[8],inclusive:!1},type_directive:{rules:[9,10],inclusive:!1},arg_directive:{rules:[10,11],inclusive:!1},block:{rules:[21,22,23,24,25,26,27,28],inclusive:!1},INITIAL:{rules:[0,2,4,7,12,13,14,15,16,17,18,19,20,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58],inclusive:!0}}},t);function C(){this.yy={}}return w.lexer=T,C.prototype=w,w.Parser=C,new C}();VT.parser=VT;const GT=VT,XT=t=>null!==t.match(/^\s*erDiagram/);let ZT={},QT=[];const KT=function(t){return void 0===ZT[t]&&(ZT[t]={attributes:[]},Db.info("Added new entity :",t)),ZT[t]},JT={Cardinality:{ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE"},Identification:{NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().er,addEntity:KT,addAttributes:function(t,e){let n,i=KT(t);for(n=e.length-1;n>=0;n--)i.attributes.push(e[n]),Db.debug("Added attribute ",e[n].attributeName)},getEntities:()=>ZT,addRelationship:function(t,e,n,i){let r={entityA:t,roleA:e,entityB:n,relSpec:i};QT.push(r),Db.debug("Added new relationship :",r)},getRelationships:()=>QT,clear:function(){ZT={},QT=[],Gv()},setAccTitle:Xv,getAccTitle:Zv,setAccDescription:Qv,getAccDescription:Kv,setDiagramTitle:Jv,getDiagramTitle:tk},tC={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END"},eC=tC,nC=function(t,e){let n;t.append("defs").append("marker").attr("id",tC.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",tC.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,0 L21,18"),t.append("defs").append("marker").attr("id",tC.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",tC.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},iC=/[^\dA-Za-z](\W)*/g;let rC={},aC=new Map;const sC=function(t,e,n){let i;return Object.keys(e).forEach((function(r){const a=function(t="",e=""){const n=t.replace(iC,"");return`${lC(e)}${lC(n)}${wb()}`}(r,"entity");aC.set(r,a);const s=t.append("g").attr("id",a);i=void 0===i?a:i;const o="text-"+a,c=s.append("text").classed("er entityLabel",!0).attr("id",o).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","middle").style("font-family",hv().fontFamily).style("font-size",rC.fontSize+"px").text(r),{width:l,height:h}=((t,e,n)=>{const i=rC.entityPadding/3,r=rC.entityPadding/3,a=.85*rC.fontSize,s=e.node().getBBox(),o=[];let c=!1,l=!1,h=0,u=0,d=0,p=0,f=s.height+2*i,g=1;n.forEach((t=>{void 0!==t.attributeKeyType&&(c=!0),void 0!==t.attributeComment&&(l=!0)})),n.forEach((n=>{const r=`${e.node().id}-attr-${g}`;let s=0;const y=Pb(n.attributeType),m=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-type`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(y),b=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-name`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(n.attributeName),_={};_.tn=m,_.nn=b;const x=m.node().getBBox(),v=b.node().getBBox();if(h=Math.max(h,x.width),u=Math.max(u,v.width),s=Math.max(x.height,v.height),c){const e=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-key`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(n.attributeKeyType||"");_.kn=e;const i=e.node().getBBox();d=Math.max(d,i.width),s=Math.max(s,i.height)}if(l){const e=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-comment`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(n.attributeComment||"");_.cn=e;const i=e.node().getBBox();p=Math.max(p,i.width),s=Math.max(s,i.height)}_.height=s,o.push(_),f+=s+2*i,g+=1}));let y=4;c&&(y+=2),l&&(y+=2);const m=h+u+d+p,b={width:Math.max(rC.minEntityWidth,Math.max(s.width+2*rC.entityPadding,m+r*y)),height:n.length>0?f:Math.max(rC.minEntityHeight,s.height+2*rC.entityPadding)};if(n.length>0){const n=Math.max(0,(b.width-m-r*y)/(y/2));e.attr("transform","translate("+b.width/2+","+(i+s.height/2)+")");let a=s.height+2*i,f="attributeBoxOdd";o.forEach((e=>{const s=a+i+e.height/2;e.tn.attr("transform","translate("+r+","+s+")");const o=t.insert("rect","#"+e.tn.node().id).classed(`er ${f}`,!0).attr("x",0).attr("y",a).attr("width",h+2*r+n).attr("height",e.height+2*i),g=parseFloat(o.attr("x"))+parseFloat(o.attr("width"));e.nn.attr("transform","translate("+(g+r)+","+s+")");const y=t.insert("rect","#"+e.nn.node().id).classed(`er ${f}`,!0).attr("x",g).attr("y",a).attr("width",u+2*r+n).attr("height",e.height+2*i);let m=parseFloat(y.attr("x"))+parseFloat(y.attr("width"));if(c){e.kn.attr("transform","translate("+(m+r)+","+s+")");const o=t.insert("rect","#"+e.kn.node().id).classed(`er ${f}`,!0).attr("x",m).attr("y",a).attr("width",d+2*r+n).attr("height",e.height+2*i);m=parseFloat(o.attr("x"))+parseFloat(o.attr("width"))}l&&(e.cn.attr("transform","translate("+(m+r)+","+s+")"),t.insert("rect","#"+e.cn.node().id).classed(`er ${f}`,"true").attr("x",m).attr("y",a).attr("width",p+2*r+n).attr("height",e.height+2*i)),a+=e.height+2*i,f="attributeBoxOdd"===f?"attributeBoxEven":"attributeBoxOdd"}))}else b.height=Math.max(rC.minEntityHeight,f),e.attr("transform","translate("+b.width/2+","+b.height/2+")");return b})(s,c,e[r].attributes),u=s.insert("rect","#"+o).classed("er entityBox",!0).attr("x",0).attr("y",0).attr("width",l).attr("height",h).node().getBBox();n.setNode(a,{width:u.width,height:u.height,shape:"rect",id:a})})),i},oC=function(t){return(t.entityA+t.roleA+t.entityB).replace(/\s/g,"")};let cC=0;function lC(t=""){return t.length>0?`${t}-`:""}const hC={setConf:function(t){const e=Object.keys(t);for(const n of e)rC[n]=t[n]},draw:function(t,e,n,i){rC=hv().er,Db.info("Drawing ER diagram");const r=hv().securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body").select(`[id='${e}']`);let o;nC(s,rC),o=new Vf({multigraph:!0,directed:!0,compound:!1}).setGraph({rankdir:rC.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));const c=sC(s,i.db.getEntities(),o),l=function(t,e){return t.forEach((function(t){e.setEdge(aC.get(t.entityA),aC.get(t.entityB),{relationship:t},oC(t))})),t}(i.db.getRelationships(),o);Em(o),function(t,e){e.nodes().forEach((function(n){void 0!==n&&void 0!==e.node(n)&&t.select("#"+n).attr("transform","translate("+(e.node(n).x-e.node(n).width/2)+","+(e.node(n).y-e.node(n).height/2)+" )")}))}(s,o),l.forEach((function(t){!function(t,e,n,i,r){cC++;const a=n.edge(aC.get(e.entityA),aC.get(e.entityB),oC(e)),s=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(Bc),o=t.insert("path","#"+i).classed("er relationshipLine",!0).attr("d",s(a.points)).style("stroke",rC.stroke).style("fill","none");e.relSpec.relType===r.db.Identification.NON_IDENTIFYING&&o.attr("stroke-dasharray","8,8");let c="";switch(rC.arrowMarkerAbsolute&&(c=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,c=c.replace(/\(/g,"\\("),c=c.replace(/\)/g,"\\)")),e.relSpec.cardA){case r.db.Cardinality.ZERO_OR_ONE:o.attr("marker-end","url("+c+"#"+eC.ZERO_OR_ONE_END+")");break;case r.db.Cardinality.ZERO_OR_MORE:o.attr("marker-end","url("+c+"#"+eC.ZERO_OR_MORE_END+")");break;case r.db.Cardinality.ONE_OR_MORE:o.attr("marker-end","url("+c+"#"+eC.ONE_OR_MORE_END+")");break;case r.db.Cardinality.ONLY_ONE:o.attr("marker-end","url("+c+"#"+eC.ONLY_ONE_END+")")}switch(e.relSpec.cardB){case r.db.Cardinality.ZERO_OR_ONE:o.attr("marker-start","url("+c+"#"+eC.ZERO_OR_ONE_START+")");break;case r.db.Cardinality.ZERO_OR_MORE:o.attr("marker-start","url("+c+"#"+eC.ZERO_OR_MORE_START+")");break;case r.db.Cardinality.ONE_OR_MORE:o.attr("marker-start","url("+c+"#"+eC.ONE_OR_MORE_START+")");break;case r.db.Cardinality.ONLY_ONE:o.attr("marker-start","url("+c+"#"+eC.ONLY_ONE_START+")")}const l=o.node().getTotalLength(),h=o.node().getPointAtLength(.5*l),u="rel"+cC,d=t.append("text").classed("er relationshipLabel",!0).attr("id",u).attr("x",h.x).attr("y",h.y).style("text-anchor","middle").style("dominant-baseline","middle").style("font-family",hv().fontFamily).style("font-size",rC.fontSize+"px").text(e.roleA).node().getBBox();t.insert("rect","#"+u).classed("er relationshipLabelBox",!0).attr("x",h.x-d.width/2).attr("y",h.y-d.height/2).attr("width",d.width).attr("height",d.height)}(s,t,o,c,i)}));const h=rC.diagramPadding;tv.insertTitle(s,"entityTitleText",rC.titleTopMargin,i.db.getDiagramTitle());const u=s.node().getBBox(),d=u.width+2*h,p=u.height+2*h;mv(s,p,d,rC.useMaxWidth),s.attr("viewBox",`${u.x-h} ${u.y-h} ${d} ${p}`)}};var uC=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,9],i=[1,7],r=[1,6],a=[1,8],s=[1,20,21,22,23,38,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],o=[2,10],c=[1,20],l=[1,21],h=[1,22],u=[1,23],d=[1,30],p=[1,32],f=[1,33],g=[1,34],y=[1,62],m=[1,48],b=[1,52],_=[1,36],x=[1,37],v=[1,38],k=[1,39],w=[1,40],T=[1,56],C=[1,63],E=[1,51],S=[1,53],A=[1,55],D=[1,59],L=[1,60],N=[1,41],O=[1,42],B=[1,43],M=[1,44],I=[1,61],F=[1,50],R=[1,54],$=[1,57],P=[1,58],j=[1,49],Y=[1,66],z=[1,71],U=[1,20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],W=[1,75],H=[1,74],q=[1,76],V=[20,21,23,81,82],G=[1,99],X=[1,104],Z=[1,107],Q=[1,108],K=[1,101],J=[1,106],tt=[1,109],et=[1,102],nt=[1,114],it=[1,113],rt=[1,103],at=[1,105],st=[1,110],ot=[1,111],ct=[1,112],lt=[1,115],ht=[20,21,22,23,81,82],ut=[20,21,22,23,53,81,82],dt=[20,21,22,23,40,52,53,55,57,59,61,63,65,66,67,69,71,73,74,76,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],pt=[20,21,23],ft=[20,21,23,52,66,67,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],gt=[1,12,20,21,22,23,24,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],yt=[52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],mt=[1,149],bt=[1,157],_t=[1,158],xt=[1,159],vt=[1,160],kt=[1,144],wt=[1,145],Tt=[1,141],Ct=[1,152],Et=[1,153],St=[1,154],At=[1,155],Dt=[1,156],Lt=[1,161],Nt=[1,162],Ot=[1,147],Bt=[1,150],Mt=[1,146],It=[1,143],Ft=[20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],Rt=[1,165],$t=[20,21,22,23,26,52,66,67,91,105,106,109,111,112,122,123,124,125,126,127],Pt=[20,21,22,23,24,26,38,40,41,42,52,56,58,60,62,64,66,67,68,70,72,73,75,77,81,82,86,87,88,89,90,91,92,95,105,106,109,111,112,113,114,122,123,124,125,126,127],jt=[12,21,22,24],Yt=[22,106],zt=[1,250],Ut=[1,245],Wt=[1,246],Ht=[1,254],qt=[1,251],Vt=[1,248],Gt=[1,247],Xt=[1,249],Zt=[1,252],Qt=[1,253],Kt=[1,255],Jt=[1,273],te=[20,21,23,106],ee=[20,21,22,23,66,67,86,102,105,106,109,110,111,112,113],ne={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,directive:5,openDirective:6,typeDirective:7,closeDirective:8,separator:9,":":10,argDirective:11,open_directive:12,type_directive:13,arg_directive:14,close_directive:15,graphConfig:16,document:17,line:18,statement:19,SEMI:20,NEWLINE:21,SPACE:22,EOF:23,GRAPH:24,NODIR:25,DIR:26,FirstStmtSeperator:27,ending:28,endToken:29,spaceList:30,spaceListNewline:31,verticeStatement:32,styleStatement:33,linkStyleStatement:34,classDefStatement:35,classStatement:36,clickStatement:37,subgraph:38,text:39,SQS:40,SQE:41,end:42,direction:43,acc_title:44,acc_title_value:45,acc_descr:46,acc_descr_value:47,acc_descr_multiline_value:48,link:49,node:50,vertex:51,AMP:52,STYLE_SEPARATOR:53,idString:54,DOUBLECIRCLESTART:55,DOUBLECIRCLEEND:56,PS:57,PE:58,"(-":59,"-)":60,STADIUMSTART:61,STADIUMEND:62,SUBROUTINESTART:63,SUBROUTINEEND:64,VERTEX_WITH_PROPS_START:65,ALPHA:66,COLON:67,PIPE:68,CYLINDERSTART:69,CYLINDEREND:70,DIAMOND_START:71,DIAMOND_STOP:72,TAGEND:73,TRAPSTART:74,TRAPEND:75,INVTRAPSTART:76,INVTRAPEND:77,linkStatement:78,arrowText:79,TESTSTR:80,START_LINK:81,LINK:82,textToken:83,STR:84,keywords:85,STYLE:86,LINKSTYLE:87,CLASSDEF:88,CLASS:89,CLICK:90,DOWN:91,UP:92,textNoTags:93,textNoTagsToken:94,DEFAULT:95,stylesOpt:96,alphaNum:97,CALLBACKNAME:98,CALLBACKARGS:99,HREF:100,LINK_TARGET:101,HEX:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,MINUS:109,UNIT:110,BRKT:111,DOT:112,PCT:113,TAGSTART:114,alphaNumToken:115,idStringToken:116,alphaNumStatement:117,direction_tb:118,direction_bt:119,direction_rl:120,direction_lr:121,PUNCTUATION:122,UNICODE_TEXT:123,PLUS:124,EQUALS:125,MULT:126,UNDERSCORE:127,graphCodeTokens:128,ARROW_CROSS:129,ARROW_POINT:130,ARROW_CIRCLE:131,ARROW_OPEN:132,QUOTE:133,$accept:0,$end:1},terminals_:{2:"error",10:":",12:"open_directive",13:"type_directive",14:"arg_directive",15:"close_directive",20:"SEMI",21:"NEWLINE",22:"SPACE",23:"EOF",24:"GRAPH",25:"NODIR",26:"DIR",38:"subgraph",40:"SQS",41:"SQE",42:"end",44:"acc_title",45:"acc_title_value",46:"acc_descr",47:"acc_descr_value",48:"acc_descr_multiline_value",52:"AMP",53:"STYLE_SEPARATOR",55:"DOUBLECIRCLESTART",56:"DOUBLECIRCLEEND",57:"PS",58:"PE",59:"(-",60:"-)",61:"STADIUMSTART",62:"STADIUMEND",63:"SUBROUTINESTART",64:"SUBROUTINEEND",65:"VERTEX_WITH_PROPS_START",66:"ALPHA",67:"COLON",68:"PIPE",69:"CYLINDERSTART",70:"CYLINDEREND",71:"DIAMOND_START",72:"DIAMOND_STOP",73:"TAGEND",74:"TRAPSTART",75:"TRAPEND",76:"INVTRAPSTART",77:"INVTRAPEND",80:"TESTSTR",81:"START_LINK",82:"LINK",84:"STR",86:"STYLE",87:"LINKSTYLE",88:"CLASSDEF",89:"CLASS",90:"CLICK",91:"DOWN",92:"UP",95:"DEFAULT",98:"CALLBACKNAME",99:"CALLBACKARGS",100:"HREF",101:"LINK_TARGET",102:"HEX",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"MINUS",110:"UNIT",111:"BRKT",112:"DOT",113:"PCT",114:"TAGSTART",118:"direction_tb",119:"direction_bt",120:"direction_rl",121:"direction_lr",122:"PUNCTUATION",123:"UNICODE_TEXT",124:"PLUS",125:"EQUALS",126:"MULT",127:"UNDERSCORE",129:"ARROW_CROSS",130:"ARROW_POINT",131:"ARROW_CIRCLE",132:"ARROW_OPEN",133:"QUOTE"},productions_:[0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[19,1],[19,2],[19,2],[19,1],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[50,1],[50,5],[50,3],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,8],[51,4],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,4],[51,4],[51,1],[49,2],[49,3],[49,3],[49,1],[49,3],[78,1],[79,3],[39,1],[39,2],[39,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[93,1],[93,2],[35,5],[35,5],[36,5],[37,2],[37,4],[37,3],[37,5],[37,2],[37,4],[37,4],[37,6],[37,2],[37,4],[37,2],[37,4],[37,4],[37,6],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[103,1],[103,3],[96,1],[96,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[94,1],[94,1],[94,1],[94,1],[54,1],[54,2],[97,1],[97,2],[117,1],[117,1],[117,1],[117,1],[43,1],[43,1],[43,1],[43,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.parseDirective("%%{","open_directive");break;case 6:i.parseDirective(a[o],"type_directive");break;case 7:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 8:i.parseDirective("}%%","close_directive","flowchart");break;case 10:case 36:case 37:case 38:case 39:case 40:this.$=[];break;case 11:(!Array.isArray(a[o])||a[o].length>0)&&a[o-1].push(a[o]),this.$=a[o-1];break;case 12:case 82:case 84:case 96:case 152:case 154:case 155:case 78:case 150:this.$=a[o];break;case 19:i.setDirection("TB"),this.$="TB";break;case 20:i.setDirection(a[o-1]),this.$=a[o-1];break;case 35:this.$=a[o-1].nodes;break;case 41:this.$=i.addSubGraph(a[o-6],a[o-1],a[o-4]);break;case 42:this.$=i.addSubGraph(a[o-3],a[o-1],a[o-3]);break;case 43:this.$=i.addSubGraph(void 0,a[o-1],void 0);break;case 45:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 46:case 47:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 51:i.addLink(a[o-2].stmt,a[o],a[o-1]),this.$={stmt:a[o],nodes:a[o].concat(a[o-2].nodes)};break;case 52:i.addLink(a[o-3].stmt,a[o-1],a[o-2]),this.$={stmt:a[o-1],nodes:a[o-1].concat(a[o-3].nodes)};break;case 53:this.$={stmt:a[o-1],nodes:a[o-1]};break;case 54:this.$={stmt:a[o],nodes:a[o]};break;case 55:case 123:case 125:this.$=[a[o]];break;case 56:this.$=a[o-4].concat(a[o]);break;case 57:this.$=[a[o-2]],i.setClass(a[o-2],a[o]);break;case 58:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"square");break;case 59:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"doublecircle");break;case 60:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"circle");break;case 61:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"ellipse");break;case 62:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"stadium");break;case 63:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"subroutine");break;case 64:this.$=a[o-7],i.addVertex(a[o-7],a[o-1],"rect",void 0,void 0,void 0,Object.fromEntries([[a[o-5],a[o-3]]]));break;case 65:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"cylinder");break;case 66:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"round");break;case 67:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"diamond");break;case 68:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"hexagon");break;case 69:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"odd");break;case 70:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"trapezoid");break;case 71:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"inv_trapezoid");break;case 72:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_right");break;case 73:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_left");break;case 74:this.$=a[o],i.addVertex(a[o]);break;case 75:a[o-1].text=a[o],this.$=a[o-1];break;case 76:case 77:a[o-2].text=a[o-1],this.$=a[o-2];break;case 79:var c=i.destructLink(a[o],a[o-2]);this.$={type:c.type,stroke:c.stroke,length:c.length,text:a[o-1]};break;case 80:c=i.destructLink(a[o]);this.$={type:c.type,stroke:c.stroke,length:c.length};break;case 81:this.$=a[o-1];break;case 83:case 97:case 153:case 151:this.$=a[o-1]+""+a[o];break;case 98:case 99:this.$=a[o-4],i.addClass(a[o-2],a[o]);break;case 100:this.$=a[o-4],i.setClass(a[o-2],a[o]);break;case 101:case 109:this.$=a[o-1],i.setClickEvent(a[o-1],a[o]);break;case 102:case 110:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 103:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 104:this.$=a[o-4],i.setClickEvent(a[o-4],a[o-3],a[o-2]),i.setTooltip(a[o-4],a[o]);break;case 105:case 111:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 106:case 112:this.$=a[o-3],i.setLink(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 107:case 113:this.$=a[o-3],i.setLink(a[o-3],a[o-2],a[o]);break;case 108:case 114:this.$=a[o-5],i.setLink(a[o-5],a[o-4],a[o]),i.setTooltip(a[o-5],a[o-2]);break;case 115:this.$=a[o-4],i.addVertex(a[o-2],void 0,void 0,a[o]);break;case 116:case 118:this.$=a[o-4],i.updateLink(a[o-2],a[o]);break;case 117:this.$=a[o-4],i.updateLink([a[o-2]],a[o]);break;case 119:this.$=a[o-8],i.updateLinkInterpolate([a[o-6]],a[o-2]),i.updateLink([a[o-6]],a[o]);break;case 120:this.$=a[o-8],i.updateLinkInterpolate(a[o-6],a[o-2]),i.updateLink(a[o-6],a[o]);break;case 121:this.$=a[o-6],i.updateLinkInterpolate([a[o-4]],a[o]);break;case 122:this.$=a[o-6],i.updateLinkInterpolate(a[o-4],a[o]);break;case 124:case 126:a[o-2].push(a[o]),this.$=a[o-2];break;case 128:this.$=a[o-1]+a[o];break;case 156:this.$="v";break;case 157:this.$="-";break;case 158:this.$={stmt:"dir",value:"TB"};break;case 159:this.$={stmt:"dir",value:"BT"};break;case 160:this.$={stmt:"dir",value:"RL"};break;case 161:this.$={stmt:"dir",value:"LR"}}},table:[{3:1,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},e(s,o,{17:11}),{7:12,13:[1,13]},{16:14,21:i,22:r,24:a},{16:15,21:i,22:r,24:a},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},{8:64,10:[1,65],15:Y},e([10,15],[2,6]),e(s,[2,17]),e(s,[2,18]),e(s,[2,19]),{20:[1,68],21:[1,69],22:z,27:67,30:70},e(U,[2,11]),e(U,[2,12]),e(U,[2,13]),e(U,[2,14]),e(U,[2,15]),e(U,[2,16]),{9:72,20:W,21:H,23:q,49:73,78:77,81:[1,78],82:[1,79]},{9:80,20:W,21:H,23:q},{9:81,20:W,21:H,23:q},{9:82,20:W,21:H,23:q},{9:83,20:W,21:H,23:q},{9:84,20:W,21:H,23:q},{9:86,20:W,21:H,22:[1,85],23:q},e(U,[2,44]),{45:[1,87]},{47:[1,88]},e(U,[2,47]),e(V,[2,54],{30:89,22:z}),{22:[1,90]},{22:[1,91]},{22:[1,92]},{22:[1,93]},{26:G,52:X,66:Z,67:Q,84:[1,97],91:K,97:96,98:[1,94],100:[1,95],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(U,[2,158]),e(U,[2,159]),e(U,[2,160]),e(U,[2,161]),e(ht,[2,55],{53:[1,116]}),e(ut,[2,74],{116:129,40:[1,117],52:y,55:[1,118],57:[1,119],59:[1,120],61:[1,121],63:[1,122],65:[1,123],66:m,67:b,69:[1,124],71:[1,125],73:[1,126],74:[1,127],76:[1,128],91:T,95:C,105:E,106:S,109:A,111:D,112:L,122:I,123:F,124:R,125:$,126:P,127:j}),e(dt,[2,150]),e(dt,[2,175]),e(dt,[2,176]),e(dt,[2,177]),e(dt,[2,178]),e(dt,[2,179]),e(dt,[2,180]),e(dt,[2,181]),e(dt,[2,182]),e(dt,[2,183]),e(dt,[2,184]),e(dt,[2,185]),e(dt,[2,186]),e(dt,[2,187]),e(dt,[2,188]),e(dt,[2,189]),e(dt,[2,190]),{9:130,20:W,21:H,23:q},{11:131,14:[1,132]},e(pt,[2,8]),e(s,[2,20]),e(s,[2,26]),e(s,[2,27]),{21:[1,133]},e(ft,[2,34],{30:134,22:z}),e(U,[2,35]),{50:135,51:45,52:y,54:46,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,122:I,123:F,124:R,125:$,126:P,127:j},e(gt,[2,48]),e(gt,[2,49]),e(gt,[2,50]),e(yt,[2,78],{79:136,68:[1,138],80:[1,137]}),{22:mt,24:bt,26:_t,38:xt,39:139,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e([52,66,67,68,80,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,80]),e(U,[2,36]),e(U,[2,37]),e(U,[2,38]),e(U,[2,39]),e(U,[2,40]),{22:mt,24:bt,26:_t,38:xt,39:163,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:164}),e(U,[2,45]),e(U,[2,46]),e(V,[2,53],{52:Rt}),{26:G,52:X,66:Z,67:Q,91:K,97:166,102:[1,167],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{95:[1,168],103:169,105:[1,170]},{26:G,52:X,66:Z,67:Q,91:K,95:[1,171],97:172,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:G,52:X,66:Z,67:Q,91:K,97:173,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,101],{22:[1,174],99:[1,175]}),e(pt,[2,105],{22:[1,176]}),e(pt,[2,109],{115:100,117:178,22:[1,177],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,111],{22:[1,179]}),e($t,[2,152]),e($t,[2,154]),e($t,[2,155]),e($t,[2,156]),e($t,[2,157]),e(Pt,[2,162]),e(Pt,[2,163]),e(Pt,[2,164]),e(Pt,[2,165]),e(Pt,[2,166]),e(Pt,[2,167]),e(Pt,[2,168]),e(Pt,[2,169]),e(Pt,[2,170]),e(Pt,[2,171]),e(Pt,[2,172]),e(Pt,[2,173]),e(Pt,[2,174]),{52:y,54:180,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,122:I,123:F,124:R,125:$,126:P,127:j},{22:mt,24:bt,26:_t,38:xt,39:181,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:182,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:184,42:vt,52:X,57:[1,183],66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:185,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:186,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:187,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{66:[1,188]},{22:mt,24:bt,26:_t,38:xt,39:189,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:190,42:vt,52:X,66:Z,67:Q,71:[1,191],73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:192,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:193,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:194,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(dt,[2,151]),e(jt,[2,3]),{8:195,15:Y},{15:[2,7]},e(s,[2,28]),e(ft,[2,33]),e(V,[2,51],{30:196,22:z}),e(yt,[2,75],{22:[1,197]}),{22:[1,198]},{22:mt,24:bt,26:_t,38:xt,39:199,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,82:[1,200],83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Pt,[2,82]),e(Pt,[2,84]),e(Pt,[2,140]),e(Pt,[2,141]),e(Pt,[2,142]),e(Pt,[2,143]),e(Pt,[2,144]),e(Pt,[2,145]),e(Pt,[2,146]),e(Pt,[2,147]),e(Pt,[2,148]),e(Pt,[2,149]),e(Pt,[2,85]),e(Pt,[2,86]),e(Pt,[2,87]),e(Pt,[2,88]),e(Pt,[2,89]),e(Pt,[2,90]),e(Pt,[2,91]),e(Pt,[2,92]),e(Pt,[2,93]),e(Pt,[2,94]),e(Pt,[2,95]),{9:203,20:W,21:H,22:mt,23:q,24:bt,26:_t,38:xt,40:[1,202],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,204],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},{22:z,30:205},{22:[1,206],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,207]},{22:[1,208]},{22:[1,209],106:[1,210]},e(Yt,[2,123]),{22:[1,211]},{22:[1,212],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,213],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{84:[1,214]},e(pt,[2,103],{22:[1,215]}),{84:[1,216],101:[1,217]},{84:[1,218]},e($t,[2,153]),{84:[1,219],101:[1,220]},e(ht,[2,57],{116:129,52:y,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,122:I,123:F,124:R,125:$,126:P,127:j}),{22:mt,24:bt,26:_t,38:xt,41:[1,221],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,56:[1,222],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:223,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,58:[1,224],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,60:[1,225],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,62:[1,226],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,64:[1,227],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{67:[1,228]},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,70:[1,229],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,72:[1,230],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:231,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,41:[1,232],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,73:kt,75:[1,233],77:[1,234],81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,73:kt,75:[1,236],77:[1,235],81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{9:237,20:W,21:H,23:q},e(V,[2,52],{52:Rt}),e(yt,[2,77]),e(yt,[2,76]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,68:[1,238],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(yt,[2,79]),e(Pt,[2,83]),{22:mt,24:bt,26:_t,38:xt,39:239,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:240}),e(U,[2,43]),{51:241,52:y,54:46,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,122:I,123:F,124:R,125:$,126:P,127:j},{22:zt,66:Ut,67:Wt,86:Ht,96:242,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:256,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:257,102:qt,104:[1,258],105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:259,102:qt,104:[1,260],105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{105:[1,261]},{22:zt,66:Ut,67:Wt,86:Ht,96:262,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:263,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{26:G,52:X,66:Z,67:Q,91:K,97:264,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,102]),{84:[1,265]},e(pt,[2,106],{22:[1,266]}),e(pt,[2,107]),e(pt,[2,110]),e(pt,[2,112],{22:[1,267]}),e(pt,[2,113]),e(ut,[2,58]),e(ut,[2,59]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,58:[1,268],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,66]),e(ut,[2,61]),e(ut,[2,62]),e(ut,[2,63]),{66:[1,269]},e(ut,[2,65]),e(ut,[2,67]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,72:[1,270],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,69]),e(ut,[2,70]),e(ut,[2,72]),e(ut,[2,71]),e(ut,[2,73]),e(jt,[2,4]),e([22,52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,81]),{22:mt,24:bt,26:_t,38:xt,41:[1,271],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,272],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},e(ht,[2,56]),e(pt,[2,115],{106:Jt}),e(te,[2,125],{108:274,22:zt,66:Ut,67:Wt,86:Ht,102:qt,105:Vt,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt}),e(ee,[2,127]),e(ee,[2,129]),e(ee,[2,130]),e(ee,[2,131]),e(ee,[2,132]),e(ee,[2,133]),e(ee,[2,134]),e(ee,[2,135]),e(ee,[2,136]),e(ee,[2,137]),e(ee,[2,138]),e(ee,[2,139]),e(pt,[2,116],{106:Jt}),e(pt,[2,117],{106:Jt}),{22:[1,275]},e(pt,[2,118],{106:Jt}),{22:[1,276]},e(Yt,[2,124]),e(pt,[2,98],{106:Jt}),e(pt,[2,99],{106:Jt}),e(pt,[2,100],{115:100,117:178,26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,104]),{101:[1,277]},{101:[1,278]},{58:[1,279]},{68:[1,280]},{72:[1,281]},{9:282,20:W,21:H,23:q},e(U,[2,42]),{22:zt,66:Ut,67:Wt,86:Ht,102:qt,105:Vt,107:283,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},e(ee,[2,128]),{26:G,52:X,66:Z,67:Q,91:K,97:284,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:G,52:X,66:Z,67:Q,91:K,97:285,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,108]),e(pt,[2,114]),e(ut,[2,60]),{22:mt,24:bt,26:_t,38:xt,39:286,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,68]),e(Ft,o,{17:287}),e(te,[2,126],{108:274,22:zt,66:Ut,67:Wt,86:Ht,102:qt,105:Vt,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt}),e(pt,[2,121],{115:100,117:178,22:[1,288],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,122],{115:100,117:178,22:[1,289],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),{22:mt,24:bt,26:_t,38:xt,41:[1,290],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,291],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},{22:zt,66:Ut,67:Wt,86:Ht,96:292,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:293,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},e(ut,[2,64]),e(U,[2,41]),e(pt,[2,119],{106:Jt}),e(pt,[2,120],{106:Jt})],defaultActions:{2:[2,1],9:[2,5],10:[2,2],132:[2,7]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},ie=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),12;case 1:return this.begin("type_directive"),13;case 2:return this.popState(),this.begin("arg_directive"),10;case 3:return this.popState(),this.popState(),15;case 4:return 14;case 5:case 6:break;case 7:return this.begin("acc_title"),44;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),46;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:case 15:case 24:case 27:case 30:case 33:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:this.begin("string");break;case 16:return"STR";case 17:return 86;case 18:return 95;case 19:return 87;case 20:return 104;case 21:return 88;case 22:return 89;case 23:this.begin("href");break;case 25:return 100;case 26:this.begin("callbackname");break;case 28:this.popState(),this.begin("callbackargs");break;case 29:return 98;case 31:return 99;case 32:this.begin("click");break;case 34:return 90;case 35:case 36:return t.lex.firstGraph()&&this.begin("dir"),24;case 37:return 38;case 38:return 42;case 39:case 40:case 41:case 42:return 101;case 43:return this.popState(),25;case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:return this.popState(),26;case 54:return 118;case 55:return 119;case 56:return 120;case 57:return 121;case 58:return 105;case 59:return 111;case 60:return 53;case 61:return 67;case 62:return 52;case 63:return 20;case 64:return 106;case 65:return 126;case 66:case 67:case 68:return 82;case 69:case 70:case 71:return 81;case 72:return 59;case 73:return 60;case 74:return 61;case 75:return 62;case 76:return 63;case 77:return 64;case 78:return 65;case 79:return 69;case 80:return 70;case 81:return 55;case 82:return 56;case 83:return 109;case 84:return 112;case 85:return 127;case 86:return 124;case 87:return 113;case 88:case 89:return 125;case 90:return 114;case 91:return 73;case 92:return 92;case 93:return"SEP";case 94:return 91;case 95:return 66;case 96:return 75;case 97:return 74;case 98:return 77;case 99:return 76;case 100:return 122;case 101:return 123;case 102:return 68;case 103:return 57;case 104:return 58;case 105:return 40;case 106:return 41;case 107:return 71;case 108:return 72;case 109:return 133;case 110:return 21;case 111:return 22;case 112:return 23}},rules:[/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\])/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[30,31],inclusive:!1},callbackname:{rules:[27,28,29],inclusive:!1},href:{rules:[24,25],inclusive:!1},click:{rules:[33,34],inclusive:!1},vertex:{rules:[],inclusive:!1},dir:{rules:[43,44,45,46,47,48,49,50,51,52,53],inclusive:!1},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},string:{rules:[15,16],inclusive:!1},INITIAL:{rules:[0,5,6,7,9,11,14,17,18,19,20,21,22,23,26,32,35,36,37,38,39,40,41,42,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112],inclusive:!0}}},t);function re(){this.yy={}}return ne.lexer=ie,re.prototype=ne,ne.Parser=re,new re}();uC.parser=uC;const dC=uC,pC=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*graph/)},fC=(t,e)=>{var n;return"dagre-wrapper"===(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*graph/)||null!==t.match(/^\s*flowchart/)};let gC,yC,mC=0,bC=hv(),_C={},xC=[],vC={},kC=[],wC={},TC={},CC=0,EC=!0,SC=[];const AC=t=>jb.sanitizeText(t,bC),DC=function(t){const e=Object.keys(_C);for(const n of e)if(_C[n].id===t)return _C[n].domId;return t},LC=function(t,e,n,i){const r={start:t,end:e,type:void 0,text:""};void 0!==(i=n.text)&&(r.text=AC(i.trim()),'"'===r.text[0]&&'"'===r.text[r.text.length-1]&&(r.text=r.text.substring(1,r.text.length-1))),void 0!==n&&(r.type=n.type,r.stroke=n.stroke,r.length=n.length),xC.push(r)},NC=function(t,e){t.split(",").forEach((function(t){let n=t;void 0!==_C[n]&&_C[n].classes.push(e),void 0!==wC[n]&&wC[n].classes.push(e)}))},OC=function(t){let e=Ho(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=Ho("body").append("div").attr("class","mermaidTooltip").style("opacity",0));Ho(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=Ho(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);Ho(this).classed("hover",!1)}))};SC.push(OC);const BC=function(t){for(const[e,n]of kC.entries())if(n.id===t)return e;return-1};let MC=-1;const IC=[],FC=function(t,e){const n=kC[e].nodes;if(MC+=1,MC>2e3)return;if(IC[MC]=e,kC[e].id===t)return{result:!0,count:0};let i=0,r=1;for(;i<n.length;){const e=BC(n[i]);if(e>=0){const n=FC(t,e);if(n.result)return{result:!0,count:r+n.count};r+=n.count}i+=1}return{result:!1,count:r}},RC=(t,e)=>{let n=!1;return t.forEach((t=>{t.nodes.indexOf(e)>=0&&(n=!0)})),n},$C=(t,e)=>{const n=[];return t.nodes.forEach(((i,r)=>{RC(e,i)||n.push(t.nodes[r])})),{nodes:n}},PC={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},defaultConfig:()=>nv.flowchart,setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,addVertex:function(t,e,n,i,r,a,s={}){let o,c=t;void 0!==c&&0!==c.trim().length&&(void 0===_C[c]&&(_C[c]={id:c,domId:"flowchart-"+c+"-"+mC,styles:[],classes:[]}),mC++,void 0!==e?(bC=hv(),o=AC(e.trim()),'"'===o[0]&&'"'===o[o.length-1]&&(o=o.substring(1,o.length-1)),_C[c].text=o):void 0===_C[c].text&&(_C[c].text=t),void 0!==n&&(_C[c].type=n),null!=i&&i.forEach((function(t){_C[c].styles.push(t)})),null!=r&&r.forEach((function(t){_C[c].classes.push(t)})),void 0!==a&&(_C[c].dir=a),void 0===_C[c].props?_C[c].props=s:void 0!==s&&Object.assign(_C[c].props,s))},lookUpDomId:DC,addLink:function(t,e,n,i){let r,a;for(r=0;r<t.length;r++)for(a=0;a<e.length;a++)LC(t[r],e[a],n,i)},updateLinkInterpolate:function(t,e){t.forEach((function(t){"default"===t?xC.defaultInterpolate=e:xC[t].interpolate=e}))},updateLink:function(t,e){t.forEach((function(t){"default"===t?xC.defaultStyle=e:(-1===tv.isSubstringInArray("fill",e)&&e.push("fill:none"),xC[t].style=e)}))},addClass:function(t,e){void 0===vC[t]&&(vC[t]={id:t,styles:[],textStyles:[]}),null!=e&&e.forEach((function(e){if(e.match("color")){const n=e.replace("fill","bgFill").replace("color","fill");vC[t].textStyles.push(n)}vC[t].styles.push(e)}))},setDirection:function(t){gC=t,gC.match(/.*</)&&(gC="RL"),gC.match(/.*\^/)&&(gC="BT"),gC.match(/.*>/)&&(gC="LR"),gC.match(/.*v/)&&(gC="TB")},setClass:NC,setTooltip:function(t,e){t.split(",").forEach((function(t){void 0!==e&&(TC["gen-1"===yC?DC(t):t]=AC(e))}))},getTooltip:function(t){return TC[t]},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){let i=DC(t);if("loose"!==hv().securityLevel)return;if(void 0===e)return;let r=[];if("string"==typeof n){r=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<r.length;t++){let e=r[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),r[t]=e}}0===r.length&&r.push(t),void 0!==_C[t]&&(_C[t].haveCallback=!0,SC.push((function(){const t=document.querySelector(`[id="${i}"]`);null!==t&&t.addEventListener("click",(function(){tv.runFunc(e,...r)}),!1)})))}(t,e,n)})),NC(t,"clickable")},setLink:function(t,e,n){t.split(",").forEach((function(t){void 0!==_C[t]&&(_C[t].link=tv.formatUrl(e,bC),_C[t].linkTarget=n)})),NC(t,"clickable")},bindFunctions:function(t){SC.forEach((function(e){e(t)}))},getDirection:function(){return gC.trim()},getVertices:function(){return _C},getEdges:function(){return xC},getClasses:function(){return vC},clear:function(t="gen-1"){_C={},vC={},xC=[],SC=[OC],kC=[],wC={},CC=0,TC=[],EC=!0,yC=t,Gv()},setGen:t=>{yC=t||"gen-1"},defaultStyle:function(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"},addSubGraph:function(t,e,n){let i=t.trim(),r=n;t===n&&n.match(/\s/)&&(i=void 0);let a=[];const{nodeList:s,dir:o}=function(t){const e={boolean:{},number:{},string:{}},n=[];let i;return{nodeList:t.filter((function(t){const r=typeof t;return t.stmt&&"dir"===t.stmt?(i=t.value,!1):""!==t.trim()&&(r in e?!e[r].hasOwnProperty(t)&&(e[r][t]=!0):!n.includes(t)&&n.push(t))})),dir:i}}(a.concat.apply(a,e));if(a=s,"gen-1"===yC)for(let l=0;l<a.length;l++)a[l]=DC(a[l]);i=i||"subGraph"+CC,r=r||"",r=AC(r),CC+=1;const c={id:i,nodes:a,title:r.trim(),classes:[],dir:o};return Db.info("Adding",c.id,c.nodes,c.dir),c.nodes=$C(c,kC).nodes,kC.push(c),wC[i]=c,i},getDepthFirstPos:function(t){return IC[t]},indexNodes:function(){MC=-1,kC.length>0&&FC("none",kC.length-1)},getSubGraphs:function(){return kC},destructLink:(t,e)=>{const n=(t=>{const e=t.trim();let n=e.slice(0,-1),i="arrow_open";switch(e.slice(-1)){case"x":i="arrow_cross","x"===e[0]&&(i="double_"+i,n=n.slice(1));break;case">":i="arrow_point","<"===e[0]&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle","o"===e[0]&&(i="double_"+i,n=n.slice(1))}let r="normal",a=n.length-1;"="===n[0]&&(r="thick");let s=((t,e)=>{const n=e.length;let i=0;for(let r=0;r<n;++r)e[r]===t&&++i;return i})(".",n);return s&&(r="dotted",a=s),{type:i,stroke:r,length:a}})(t);let i;if(e){if(i=(t=>{let e=t.trim(),n="arrow_open";switch(e[0]){case"<":n="arrow_point",e=e.slice(1);break;case"x":n="arrow_cross",e=e.slice(1);break;case"o":n="arrow_circle",e=e.slice(1)}let i="normal";return e.includes("=")&&(i="thick"),e.includes(".")&&(i="dotted"),{type:n,stroke:i}})(e),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if("arrow_open"===i.type)i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return"double_arrow"===i.type&&(i.type="double_arrow_point"),i.length=n.length,i}return n},lex:{firstGraph:()=>!!EC&&(EC=!1,!0)},exists:RC,makeUniq:$C,setDiagramTitle:Jv,getDiagramTitle:tk};const jC={},YC=function(t){const e=Object.keys(t);for(const n of e)jC[n]=t[n]},zC={},UC=function(t,e,n,i,r,a){const s=i.select(`[id="${n}"]`);Object.keys(t).forEach((function(n){const i=t[n];let o="default";i.classes.length>0&&(o=i.classes.join(" "));const c=jx(i.styles);let l,h=void 0!==i.text?i.text:i.id;if($b(hv().flowchart.htmlLabels)){const t={label:h.replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`))};l=Cb(s,t).node(),l.parentNode.removeChild(l)}else{const t=r.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",c.labelStyle.replace("color:","fill:"));const e=h.split(jb.lineBreakRegex);for(const n of e){const e=r.createElementNS("http://www.w3.org/2000/svg","tspan");e.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),e.setAttribute("dy","1em"),e.setAttribute("x","1"),e.textContent=n,t.appendChild(e)}l=t}let u=0,d="";switch(i.type){case"round":u=5,d="rect";break;case"square":case"group":default:d="rect";break;case"diamond":d="question";break;case"hexagon":d="hexagon";break;case"odd":case"odd_right":d="rect_left_inv_arrow";break;case"lean_right":d="lean_right";break;case"lean_left":d="lean_left";break;case"trapezoid":d="trapezoid";break;case"inv_trapezoid":d="inv_trapezoid";break;case"circle":d="circle";break;case"ellipse":d="ellipse";break;case"stadium":d="stadium";break;case"subroutine":d="subroutine";break;case"cylinder":d="cylinder";break;case"doublecircle":d="doublecircle"}e.setNode(i.id,{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,link:i.link,linkTarget:i.linkTarget,tooltip:a.db.getTooltip(i.id)||"",domId:a.db.lookUpDomId(i.id),haveCallback:i.haveCallback,width:"group"===i.type?500:void 0,dir:i.dir,type:i.type,props:i.props,padding:hv().flowchart.padding}),Db.info("setNode",{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,domId:a.db.lookUpDomId(i.id),width:"group"===i.type?500:void 0,type:i.type,dir:i.dir,props:i.props,padding:hv().flowchart.padding})}))},WC=function(t,e,n){Db.info("abc78 edges = ",t);let i,r,a=0,s={};if(void 0!==t.defaultStyle){const e=jx(t.defaultStyle);i=e.style,r=e.labelStyle}t.forEach((function(n){a++;var o="L-"+n.start+"-"+n.end;void 0===s[o]?(s[o]=0,Db.info("abc78 new entry",o,s[o])):(s[o]++,Db.info("abc78 new entry",o,s[o]));let c=o+"-"+s[o];Db.info("abc78 new link id to be used is",o,c,s[o]);var l="LS-"+n.start,h="LE-"+n.end;const u={style:"",labelStyle:""};switch(u.minlen=n.length||1,"arrow_open"===n.type?u.arrowhead="none":u.arrowhead="normal",u.arrowTypeStart="arrow_open",u.arrowTypeEnd="arrow_open",n.type){case"double_arrow_cross":u.arrowTypeStart="arrow_cross";case"arrow_cross":u.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":u.arrowTypeStart="arrow_point";case"arrow_point":u.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":u.arrowTypeStart="arrow_circle";case"arrow_circle":u.arrowTypeEnd="arrow_circle"}let d="",p="";switch(n.stroke){case"normal":d="fill:none;",void 0!==i&&(d=i),void 0!==r&&(p=r),u.thickness="normal",u.pattern="solid";break;case"dotted":u.thickness="normal",u.pattern="dotted",u.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":u.thickness="thick",u.pattern="solid",u.style="stroke-width: 3.5px;fill:none;"}if(void 0!==n.style){const t=jx(n.style);d=t.style,p=t.labelStyle}u.style=u.style+=d,u.labelStyle=u.labelStyle+=p,void 0!==n.interpolate?u.curve=$x(n.interpolate,Tc):void 0!==t.defaultInterpolate?u.curve=$x(t.defaultInterpolate,Tc):u.curve=$x(zC.curve,Tc),void 0===n.text?void 0!==n.style&&(u.arrowheadStyle="fill: #333"):(u.arrowheadStyle="fill: #333",u.labelpos="c"),u.labelType="text",u.label=n.text.replace(jb.lineBreakRegex,"\n"),void 0===n.style&&(u.style=u.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),u.labelStyle=u.labelStyle.replace("color:","fill:"),u.id=c,u.classes="flowchart-link "+l+" "+h,e.setEdge(n.start,n.end,u,a)}))},HC={setConf:function(t){const e=Object.keys(t);for(const n of e)zC[n]=t[n]},addVertices:UC,addEdges:WC,getClasses:function(t,e){Db.info("Extracting classes"),e.db.clear();try{return e.parse(t),e.db.getClasses()}catch(n){return}},draw:function(t,e,n,i){Db.info("Drawing flowchart"),i.db.clear(),PC.setGen("gen-2"),i.parser.parse(t);let r=i.db.getDirection();void 0===r&&(r="TD");const{securityLevel:a,flowchart:s}=hv(),o=s.nodeSpacing||50,c=s.rankSpacing||50;let l;"sandbox"===a&&(l=Ho("#i"+e));const h=Ho("sandbox"===a?l.nodes()[0].contentDocument.body:"body"),u="sandbox"===a?l.nodes()[0].contentDocument:document,d=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:r,nodesep:o,ranksep:c,marginx:0,marginy:0}).setDefaultEdgeLabel((function(){return{}}));let p;const f=i.db.getSubGraphs();Db.info("Subgraphs - ",f);for(let x=f.length-1;x>=0;x--)p=f[x],Db.info("Subgraph - ",p),i.db.addVertex(p.id,p.title,"group",void 0,p.classes,p.dir);const g=i.db.getVertices(),y=i.db.getEdges();Db.info(y);let m=0;for(m=f.length-1;m>=0;m--){p=f[m],qo("cluster").append("text");for(let t=0;t<p.nodes.length;t++)Db.info("Setting up subgraphs",p.nodes[t],p.id),d.setParent(p.nodes[t],p.id)}UC(g,d,e,h,u,i),WC(y,d);const b=h.select(`[id="${e}"]`),_=h.select("#"+e+" g");if(zT(_,d,["point","circle","cross"],"flowchart",e),tv.insertTitle(b,"flowchartTitleText",s.titleTopMargin,i.db.getDiagramTitle()),bv(d,b,s.diagramPadding,s.useMaxWidth),i.db.indexNodes("subGraph"+m),!s.htmlLabels){const t=u.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of t){const t=e.getBBox(),n=u.createElementNS("http://www.w3.org/2000/svg","rect");n.setAttribute("rx",0),n.setAttribute("ry",0),n.setAttribute("width",t.width),n.setAttribute("height",t.height),e.insertBefore(n,e.firstChild)}}Object.keys(g).forEach((function(t){const n=g[t];if(n.link){const i=Ho("#"+e+' [id="'+t+'"]');if(i){const t=u.createElementNS("http://www.w3.org/2000/svg","a");t.setAttributeNS("http://www.w3.org/2000/svg","class",n.classes.join(" ")),t.setAttributeNS("http://www.w3.org/2000/svg","href",n.link),t.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),"sandbox"===a?t.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):n.linkTarget&&t.setAttributeNS("http://www.w3.org/2000/svg","target",n.linkTarget);const e=i.insert((function(){return t}),":first-child"),r=i.select(".label-container");r&&e.append((function(){return r.node()}));const s=i.select(".label");s&&e.append((function(){return s.node()}))}}}))}};var qC=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,21],d=[1,22],p=[1,23],f=[1,24],g=[1,25],y=[1,26],m=[1,27],b=[1,29],_=[1,31],x=[1,34],v=[5,7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],k={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,gantt:5,document:6,EOF:7,line:8,SPACE:9,statement:10,NL:11,dateFormat:12,inclusiveEndDates:13,topAxis:14,axisFormat:15,tickInterval:16,excludes:17,includes:18,todayMarker:19,title:20,acc_title:21,acc_title_value:22,acc_descr:23,acc_descr_value:24,acc_descr_multiline_value:25,section:26,clickStatement:27,taskTxt:28,taskData:29,openDirective:30,typeDirective:31,closeDirective:32,":":33,argDirective:34,click:35,callbackname:36,callbackargs:37,href:38,clickStatementDebug:39,open_directive:40,type_directive:41,arg_directive:42,close_directive:43,$accept:0,$end:1},terminals_:{2:"error",5:"gantt",7:"EOF",9:"SPACE",11:"NL",12:"dateFormat",13:"inclusiveEndDates",14:"topAxis",15:"axisFormat",16:"tickInterval",17:"excludes",18:"includes",19:"todayMarker",20:"title",21:"acc_title",22:"acc_title_value",23:"acc_descr",24:"acc_descr_value",25:"acc_descr_multiline_value",26:"section",28:"taskTxt",29:"taskData",33:":",35:"click",36:"callbackname",37:"callbackargs",38:"href",40:"open_directive",41:"type_directive",42:"arg_directive",43:"close_directive"},productions_:[0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[27,2],[27,3],[27,3],[27,4],[27,3],[27,4],[27,2],[39,2],[39,3],[39,3],[39,4],[39,3],[39,4],[39,2],[30,1],[31,1],[34,1],[32,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 2:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 9:i.setDateFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 10:i.enableInclusiveEndDates(),this.$=a[o].substr(18);break;case 11:i.TopAxis(),this.$=a[o].substr(8);break;case 12:i.setAxisFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 13:i.setTickInterval(a[o].substr(13)),this.$=a[o].substr(13);break;case 14:i.setExcludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 15:i.setIncludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 16:i.setTodayMarker(a[o].substr(12)),this.$=a[o].substr(12);break;case 17:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 18:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 19:case 20:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 23:i.addTask(a[o-1],a[o]),this.$="task";break;case 27:this.$=a[o-1],i.setClickEvent(a[o-1],a[o],null);break;case 28:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 29:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],null),i.setLink(a[o-2],a[o]);break;case 30:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setLink(a[o-3],a[o]);break;case 31:this.$=a[o-2],i.setClickEvent(a[o-2],a[o],null),i.setLink(a[o-2],a[o-1]);break;case 32:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-1],a[o]),i.setLink(a[o-3],a[o-2]);break;case 33:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 34:case 40:this.$=a[o-1]+" "+a[o];break;case 35:case 36:case 38:this.$=a[o-2]+" "+a[o-1]+" "+a[o];break;case 37:case 39:this.$=a[o-3]+" "+a[o-2]+" "+a[o-1]+" "+a[o];break;case 41:i.parseDirective("%%{","open_directive");break;case 42:i.parseDirective(a[o],"type_directive");break;case 43:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 44:i.parseDirective("}%%","close_directive","gantt")}},table:[{3:1,4:2,5:n,30:4,40:i},{1:[3]},{3:6,4:2,5:n,30:4,40:i},e(r,[2,3],{6:7}),{31:8,41:[1,9]},{41:[2,41]},{1:[2,1]},{4:30,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},{32:32,33:[1,33],43:x},e([33,43],[2,42]),e(r,[2,8],{1:[2,2]}),e(r,[2,4]),{4:30,10:35,12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,9]),e(r,[2,10]),e(r,[2,11]),e(r,[2,12]),e(r,[2,13]),e(r,[2,14]),e(r,[2,15]),e(r,[2,16]),e(r,[2,17]),{22:[1,36]},{24:[1,37]},e(r,[2,20]),e(r,[2,21]),e(r,[2,22]),{29:[1,38]},e(r,[2,24]),{36:[1,39],38:[1,40]},{11:[1,41]},{34:42,42:[1,43]},{11:[2,44]},e(r,[2,5]),e(r,[2,18]),e(r,[2,19]),e(r,[2,23]),e(r,[2,27],{37:[1,44],38:[1,45]}),e(r,[2,33],{36:[1,46]}),e(v,[2,25]),{32:47,43:x},{43:[2,43]},e(r,[2,28],{38:[1,48]}),e(r,[2,29]),e(r,[2,31],{37:[1,49]}),{11:[1,50]},e(r,[2,30]),e(r,[2,32]),e(v,[2,26])],defaultActions:{5:[2,41],6:[2,1],34:[2,44],43:[2,43]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),40;case 1:return this.begin("type_directive"),41;case 2:return this.popState(),this.begin("arg_directive"),33;case 3:return this.popState(),this.popState(),43;case 4:return 42;case 5:return this.begin("acc_title"),21;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),23;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 20:case 23:case 26:case 29:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:case 13:case 14:case 16:case 17:case 18:break;case 15:return 11;case 19:this.begin("href");break;case 21:return 38;case 22:this.begin("callbackname");break;case 24:this.popState(),this.begin("callbackargs");break;case 25:return 36;case 27:return 37;case 28:this.begin("click");break;case 30:return 35;case 31:return 5;case 32:return 12;case 33:return 13;case 34:return 14;case 35:return 15;case 36:return 16;case 37:return 18;case 38:return 17;case 39:return 19;case 40:return"date";case 41:return 20;case 42:return"accDescription";case 43:return 26;case 44:return 28;case 45:return 29;case 46:return 33;case 47:return 7;case 48:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[26,27],inclusive:!1},callbackname:{rules:[23,24,25],inclusive:!1},href:{rules:[20,21],inclusive:!1},click:{rules:[29,30],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,22,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],inclusive:!0}}},t);function T(){this.yy={}}return k.lexer=w,T.prototype=k,k.Parser=T,new T}();qC.parser=qC;const VC=qC,GC=t=>null!==t.match(/^\s*gantt/);let XC,ZC="",QC="",KC="",JC=[],tE=[],eE={},nE=[],iE=[],rE="";const aE=["active","done","crit","milestone"];let sE=[],oE=!1,cE=!1,lE=0;const hE=function(t,e,n,i){return!i.includes(t.format(e.trim()))&&(!!(t.isoWeekday()>=6&&n.includes("weekends"))||(!!n.includes(t.format("dddd").toLowerCase())||n.includes(t.format(e.trim()))))},uE=function(t,e,n,i){if(!n.length||t.manualEndTime)return;let r=_t(t.startTime,e,!0);r.add(1,"d");let a=_t(t.endTime,e,!0),s=dE(r,a,e,n,i);t.endTime=a.toDate(),t.renderEndTime=s},dE=function(t,e,n,i,r){let a=!1,s=null;for(;t<=e;)a||(s=e.toDate()),a=hE(t,n,i,r),a&&e.add(1,"d"),t.add(1,"d");return s},pE=function(t,e,n){n=n.trim();const i=/^after\s+([\d\w- ]+)/.exec(n.trim());if(null!==i){let t=null;if(i[1].split(" ").forEach((function(e){let n=kE(e);void 0!==n&&(t?n.endTime>t.endTime&&(t=n):t=n)})),t)return t.endTime;{const t=new Date;return t.setHours(0,0,0,0),t}}let r=_t(n,e.trim(),!0);if(r.isValid())return r.toDate();{Db.debug("Invalid date:"+n),Db.debug("With date format:"+e.trim());const t=new Date(n);if(void 0===t||isNaN(t.getTime()))throw new Error("Invalid date:"+n);return t}},fE=function(t){const e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return null!==e?_t.duration(Number.parseFloat(e[1]),e[2]):_t.duration.invalid()},gE=function(t,e,n,i=!1){n=n.trim();let r=_t(n,e.trim(),!0);if(r.isValid())return i&&r.add(1,"d"),r.toDate();const a=_t(t),s=fE(n);return s.isValid()&&a.add(s),a.toDate()};let yE=0;const mE=function(t){return void 0===t?(yE+=1,"task"+yE):t};let bE,_E,xE=[];const vE={},kE=function(t){const e=vE[t];return xE[e]},wE=function(){const t=function(t){const e=xE[t];let n="";switch(xE[t].raw.startTime.type){case"prevTaskEnd":{const t=kE(e.prevTaskId);e.startTime=t.endTime;break}case"getStartDate":n=pE(0,ZC,xE[t].raw.startTime.startData),n&&(xE[t].startTime=n)}return xE[t].startTime&&(xE[t].endTime=gE(xE[t].startTime,ZC,xE[t].raw.endTime.data,oE),xE[t].endTime&&(xE[t].processed=!0,xE[t].manualEndTime=_t(xE[t].raw.endTime.data,"YYYY-MM-DD",!0).isValid(),uE(xE[t],ZC,tE,JC))),xE[t].processed};let e=!0;for(const[n,i]of xE.entries())t(n),e=e&&i.processed;return e},TE=function(t,e){t.split(",").forEach((function(t){let n=kE(t);void 0!==n&&n.classes.push(e)}))},CE=function(t,e){sE.push((function(){const n=document.querySelector(`[id="${t}"]`);null!==n&&n.addEventListener("click",(function(){e()}))}),(function(){const n=document.querySelector(`[id="${t}-text"]`);null!==n&&n.addEventListener("click",(function(){e()}))}))},EE={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().gantt,clear:function(){nE=[],iE=[],rE="",sE=[],yE=0,bE=void 0,_E=void 0,xE=[],ZC="",QC="",XC=void 0,KC="",JC=[],tE=[],oE=!1,cE=!1,lE=0,eE={},Gv()},setDateFormat:function(t){ZC=t},getDateFormat:function(){return ZC},enableInclusiveEndDates:function(){oE=!0},endDatesAreInclusive:function(){return oE},enableTopAxis:function(){cE=!0},topAxisEnabled:function(){return cE},setAxisFormat:function(t){QC=t},getAxisFormat:function(){return QC},setTickInterval:function(t){XC=t},getTickInterval:function(){return XC},setTodayMarker:function(t){KC=t},getTodayMarker:function(){return KC},setAccTitle:Xv,getAccTitle:Zv,setDiagramTitle:Jv,getDiagramTitle:tk,setAccDescription:Qv,getAccDescription:Kv,addSection:function(t){rE=t,nE.push(t)},getSections:function(){return nE},getTasks:function(){let t=wE();let e=0;for(;!t&&e<10;)t=wE(),e++;return iE=xE,iE},addTask:function(t,e){const n={section:rE,type:rE,processed:!1,manualEndTime:!1,renderEndTime:null,raw:{data:e},task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};SE(i,r,aE);for(let a=0;a<i.length;a++)i[a]=i[a].trim();switch(i.length){case 1:r.id=mE(),r.startTime={type:"prevTaskEnd",id:t},r.endTime={data:i[0]};break;case 2:r.id=mE(),r.startTime={type:"getStartDate",startData:i[0]},r.endTime={data:i[1]};break;case 3:r.id=mE(i[0]),r.startTime={type:"getStartDate",startData:i[1]},r.endTime={data:i[2]}}return r}(_E,e);n.raw.startTime=i.startTime,n.raw.endTime=i.endTime,n.id=i.id,n.prevTaskId=_E,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,n.order=lE,lE++;const r=xE.push(n);_E=n.id,vE[n.id]=r-1},findTaskById:kE,addTaskOrg:function(t,e){const n={section:rE,type:rE,description:t,task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};SE(i,r,aE);for(let s=0;s<i.length;s++)i[s]=i[s].trim();let a="";switch(i.length){case 1:r.id=mE(),r.startTime=t.endTime,a=i[0];break;case 2:r.id=mE(),r.startTime=pE(0,ZC,i[0]),a=i[1];break;case 3:r.id=mE(i[0]),r.startTime=pE(0,ZC,i[1]),a=i[2]}return a&&(r.endTime=gE(r.startTime,ZC,a,oE),r.manualEndTime=_t(a,"YYYY-MM-DD",!0).isValid(),uE(r,ZC,tE,JC)),r}(bE,e);n.startTime=i.startTime,n.endTime=i.endTime,n.id=i.id,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,bE=n,iE.push(n)},setIncludes:function(t){JC=t.toLowerCase().split(/[\s,]+/)},getIncludes:function(){return JC},setExcludes:function(t){tE=t.toLowerCase().split(/[\s,]+/)},getExcludes:function(){return tE},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){if("loose"!==hv().securityLevel)return;if(void 0===e)return;let i=[];if("string"==typeof n){i=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<i.length;t++){let e=i[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),i[t]=e}}0===i.length&&i.push(t),void 0!==kE(t)&&CE(t,(()=>{tv.runFunc(e,...i)}))}(t,e,n)})),TE(t,"clickable")},setLink:function(t,e){let n=e;"loose"!==hv().securityLevel&&(n=(0,xt.N)(e)),t.split(",").forEach((function(t){void 0!==kE(t)&&(CE(t,(()=>{window.open(n,"_self")})),eE[t]=n)})),TE(t,"clickable")},getLinks:function(){return eE},bindFunctions:function(t){sE.forEach((function(e){e(t)}))},parseDuration:fE,isInvalidDate:hE};function SE(t,e,n){let i=!0;for(;i;)i=!1,n.forEach((function(n){const r=new RegExp("^\\s*"+n+"\\s*$");t[0].match(r)&&(e[n]=!0,t.shift(1),i=!0)}))}let AE;const DE={setConf:function(){Db.debug("Something is calling, setConf, remove the call")},draw:function(t,e,n,i){const r=hv().gantt,a=hv().securityLevel;let s;"sandbox"===a&&(s=Ho("#i"+e));const o=Ho("sandbox"===a?s.nodes()[0].contentDocument.body:"body"),c="sandbox"===a?s.nodes()[0].contentDocument:document,l=c.getElementById(e);AE=l.parentElement.offsetWidth,void 0===AE&&(AE=1200),void 0!==r.useWidth&&(AE=r.useWidth);const h=i.db.getTasks(),u=h.length*(r.barHeight+r.barGap)+2*r.topPadding;l.setAttribute("viewBox","0 0 "+AE+" "+u);const d=o.select(`[id="${e}"]`),p=function(){return na.apply(Wo(ms,bs,ds,hs,Xa,Ha,Ua,Ya,ja,ws).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}().domain([kt(h,(function(t){return t.startTime})),vt(h,(function(t){return t.endTime}))]).rangeRound([0,AE-r.leftPadding-r.rightPadding]);let f=[];for(const m of h)f.push(m.type);const g=f;function y(t,e){return function(t){let e=t.length;const n={};for(;e;)n[t[--e]]=(n[t[e]]||0)+1;return n}(e)[t]||0}f=function(t){const e={},n=[];for(let i=0,r=t.length;i<r;++i)Object.prototype.hasOwnProperty.call(e,t[i])||(e[t[i]]=!0,n.push(t[i]));return n}(f),h.sort((function(t,e){const n=t.startTime,i=e.startTime;let r=0;return n>i?r=1:n<i&&(r=-1),r})),function(t,n,a){const s=r.barHeight,o=s+r.barGap,l=r.topPadding,h=r.leftPadding;xa().domain([0,f.length]).range(["#00B9FA","#F95002"]).interpolate(Sr);(function(t,e,n,a,s,o,c,l){const h=o.reduce(((t,{startTime:e})=>t?Math.min(t,e):e),0),u=o.reduce(((t,{endTime:e})=>t?Math.max(t,e):e),0),f=i.db.getDateFormat();if(!h||!u)return;const g=[];let y=null,m=_t(h);for(;m.valueOf()<=u;)i.db.isInvalidDate(m,f,c,l)?y?y.end=m.clone():y={start:m.clone(),end:m.clone()}:y&&(g.push(y),y=null),m.add(1,"d");d.append("g").selectAll("rect").data(g).enter().append("rect").attr("id",(function(t){return"exclude-"+t.start.format("YYYY-MM-DD")})).attr("x",(function(t){return p(t.start)+n})).attr("y",r.gridLineStartPadding).attr("width",(function(t){const e=t.end.clone().add(1,"day");return p(e)-p(t.start)})).attr("height",s-e-r.gridLineStartPadding).attr("transform-origin",(function(e,i){return(p(e.start)+n+.5*(p(e.end)-p(e.start))).toString()+"px "+(i*t+.5*s).toString()+"px"})).attr("class","exclude-range")})(o,l,h,0,a,t,i.db.getExcludes(),i.db.getIncludes()),function(t,e,n,a){let s=(o=p,Lt(3,o)).tickSize(-a+e+r.gridLineStartPadding).tickFormat(ws(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));var o;const c=/^([1-9]\d*)(minute|hour|day|week|month)$/.exec(i.db.getTickInterval()||r.tickInterval);if(null!==c){const t=c[1];switch(c[2]){case"minute":s.ticks(Ya.every(t));break;case"hour":s.ticks(Ua.every(t));break;case"day":s.ticks(Ha.every(t));break;case"week":s.ticks(Xa.every(t));break;case"month":s.ticks(hs.every(t))}}if(d.append("g").attr("class","grid").attr("transform","translate("+t+", "+(a-50)+")").call(s).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),i.db.topAxisEnabled()||r.topAxis){let n=function(t){return Lt(1,t)}(p).tickSize(-a+e+r.gridLineStartPadding).tickFormat(ws(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));if(null!==c){const t=c[1];switch(c[2]){case"minute":n.ticks(Ya.every(t));break;case"hour":n.ticks(Ua.every(t));break;case"day":n.ticks(Ha.every(t));break;case"week":n.ticks(Xa.every(t));break;case"month":n.ticks(hs.every(t))}}d.append("g").attr("class","grid").attr("transform","translate("+t+", "+e+")").call(n).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}(h,l,0,a),function(t,n,a,s,o,c,l){d.append("g").selectAll("rect").data(t).enter().append("rect").attr("x",0).attr("y",(function(t,e){return t.order*n+a-2})).attr("width",(function(){return l-r.rightPadding/2})).attr("height",n).attr("class",(function(t){for(const[e,n]of f.entries())if(t.type===n)return"section section"+e%r.numberSectionStyles;return"section section0"}));const h=d.append("g").selectAll("rect").data(t).enter(),u=i.db.getLinks();h.append("rect").attr("id",(function(t){return t.id})).attr("rx",3).attr("ry",3).attr("x",(function(t){return t.milestone?p(t.startTime)+s+.5*(p(t.endTime)-p(t.startTime))-.5*o:p(t.startTime)+s})).attr("y",(function(t,e){return t.order*n+a})).attr("width",(function(t){return t.milestone?o:p(t.renderEndTime||t.endTime)-p(t.startTime)})).attr("height",o).attr("transform-origin",(function(t,e){return e=t.order,(p(t.startTime)+s+.5*(p(t.endTime)-p(t.startTime))).toString()+"px "+(e*n+a+.5*o).toString()+"px"})).attr("class",(function(t){const e="task";let n="";t.classes.length>0&&(n=t.classes.join(" "));let i=0;for(const[s,o]of f.entries())t.type===o&&(i=s%r.numberSectionStyles);let a="";return t.active?t.crit?a+=" activeCrit":a=" active":t.done?a=t.crit?" doneCrit":" done":t.crit&&(a+=" crit"),0===a.length&&(a=" task"),t.milestone&&(a=" milestone "+a),a+=i,a+=" "+n,e+a})),h.append("text").attr("id",(function(t){return t.id+"-text"})).text((function(t){return t.task})).attr("font-size",r.fontSize).attr("x",(function(t){let e=p(t.startTime),n=p(t.renderEndTime||t.endTime);t.milestone&&(e+=.5*(p(t.endTime)-p(t.startTime))-.5*o),t.milestone&&(n=e+o);const i=this.getBBox().width;return i>n-e?n+i+1.5*r.leftPadding>l?e+s-5:n+s+5:(n-e)/2+e+s})).attr("y",(function(t,e){return t.order*n+r.barHeight/2+(r.fontSize/2-2)+a})).attr("text-height",o).attr("class",(function(t){const e=p(t.startTime);let n=p(t.endTime);t.milestone&&(n=e+o);const i=this.getBBox().width;let a="";t.classes.length>0&&(a=t.classes.join(" "));let s=0;for(const[o,l]of f.entries())t.type===l&&(s=o%r.numberSectionStyles);let c="";return t.active&&(c=t.crit?"activeCritText"+s:"activeText"+s),t.done?c=t.crit?c+" doneCritText"+s:c+" doneText"+s:t.crit&&(c=c+" critText"+s),t.milestone&&(c+=" milestoneText"),i>n-e?n+i+1.5*r.leftPadding>l?a+" taskTextOutsideLeft taskTextOutside"+s+" "+c:a+" taskTextOutsideRight taskTextOutside"+s+" "+c+" width-"+i:a+" taskText taskText"+s+" "+c+" width-"+i}));if("sandbox"===hv().securityLevel){let t;t=Ho("#i"+e);const n=t.nodes()[0].contentDocument;h.filter((function(t){return void 0!==u[t.id]})).each((function(t){var e=n.querySelector("#"+t.id),i=n.querySelector("#"+t.id+"-text");const r=e.parentNode;var a=n.createElement("a");a.setAttribute("xlink:href",u[t.id]),a.setAttribute("target","_top"),r.appendChild(a),a.appendChild(e),a.appendChild(i)}))}}(t,o,l,h,s,0,n),function(t,e){const n=[];let i=0;for(const[r,a]of f.entries())n[r]=[a,y(a,g)];d.append("g").selectAll("text").data(n).enter().append((function(t){const e=t[0].split(jb.lineBreakRegex),n=-(e.length-1)/2,i=c.createElementNS("http://www.w3.org/2000/svg","text");i.setAttribute("dy",n+"em");for(const[r,a]of e.entries()){const t=c.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttribute("alignment-baseline","central"),t.setAttribute("x","10"),r>0&&t.setAttribute("dy","1em"),t.textContent=a,i.appendChild(t)}return i})).attr("x",10).attr("y",(function(r,a){if(!(a>0))return r[1]*t/2+e;for(let s=0;s<a;s++)return i+=n[a-1][1],r[1]*t/2+i*t+e})).attr("font-size",r.sectionFontSize).attr("font-size",r.sectionFontSize).attr("class",(function(t){for(const[e,n]of f.entries())if(t[0]===n)return"sectionTitle sectionTitle"+e%r.numberSectionStyles;return"sectionTitle"}))}(o,l),function(t,e,n,a){const s=i.db.getTodayMarker();if("off"===s)return;const o=d.append("g").attr("class","today"),c=new Date,l=o.append("line");l.attr("x1",p(c)+t).attr("x2",p(c)+t).attr("y1",r.titleTopMargin).attr("y2",a-r.titleTopMargin).attr("class","today"),""!==s&&l.attr("style",s.replace(/,/g,";"))}(h,0,0,a)}(h,AE,u),mv(d,u,AE,r.useMaxWidth),d.append("text").text(i.db.getDiagramTitle()).attr("x",AE/2).attr("y",r.titleTopMargin).attr("class","titleText")}};var LE=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[6,9,10],i={trace:function(){},yy:{},symbols_:{error:2,start:3,info:4,document:5,EOF:6,line:7,statement:8,NL:9,showInfo:10,$accept:0,$end:1},terminals_:{2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},productions_:[0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],performAction:function(t,e,n,i,r,a,s){switch(a.length,r){case 1:return i;case 4:break;case 6:i.setInfo(!0)}},table:[{3:1,4:[1,2]},{1:[3]},e(n,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},e(n,[2,3]),e(n,[2,4]),e(n,[2,5]),e(n,[2,6])],defaultActions:{4:[2,1]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},r=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 4;case 1:return 9;case 2:return"space";case 3:return 10;case 4:return 6;case 5:return"TXT"}},rules:[/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5],inclusive:!0}}},t);function a(){this.yy={}}return i.lexer=r,a.prototype=i,i.Parser=a,new a}();LE.parser=LE;const NE=LE;var OE="",BE=!1;const ME={setMessage:t=>{Db.debug("Setting message to: "+t),OE=t},getMessage:()=>OE,setInfo:t=>{BE=t},getInfo:()=>BE,clear:Gv},IE={draw:(t,e,n)=>{try{Db.debug("Rendering info diagram\n"+t);const i=hv().securityLevel;let r;"sandbox"===i&&(r=Ho("#i"+e));const a=Ho("sandbox"===i?r.nodes()[0].contentDocument.body:"body").select("#"+e);a.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size","32px").style("text-anchor","middle").text("v "+n),a.attr("height",100),a.attr("width",400)}catch(i){Db.error("Error while rendering info diagram"),Db.error(i.message)}}},FE=t=>null!==t.match(/^\s*info/);var RE=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,5],r=[1,6],a=[1,7],s=[1,9],o=[1,11,13,15,17,19,20,26,27,28,29],c=[2,5],l=[1,6,11,13,15,17,19,20,26,27,28,29],h=[26,27,28],u=[2,8],d=[1,18],p=[1,19],f=[1,20],g=[1,21],y=[1,22],m=[1,23],b=[1,28],_=[6,26,27,28,29],x={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,PIE:6,document:7,showData:8,line:9,statement:10,txt:11,value:12,title:13,title_value:14,acc_title:15,acc_title_value:16,acc_descr:17,acc_descr_value:18,acc_descr_multiline_value:19,section:20,openDirective:21,typeDirective:22,closeDirective:23,":":24,argDirective:25,NEWLINE:26,";":27,EOF:28,open_directive:29,type_directive:30,arg_directive:31,close_directive:32,$accept:0,$end:1},terminals_:{2:"error",6:"PIE",8:"showData",11:"txt",12:"value",13:"title",14:"title_value",15:"acc_title",16:"acc_title_value",17:"acc_descr",18:"acc_descr_value",19:"acc_descr_multiline_value",20:"section",24:":",26:"NEWLINE",27:";",28:"EOF",29:"open_directive",30:"type_directive",31:"arg_directive",32:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,3],[7,0],[7,2],[9,2],[10,0],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,1],[5,3],[5,5],[4,1],[4,1],[4,1],[21,1],[22,1],[25,1],[23,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setShowData(!0);break;case 7:this.$=a[o-1];break;case 9:i.addSection(a[o-1],i.cleanupValue(a[o]));break;case 10:this.$=a[o].trim(),i.setDiagramTitle(this.$);break;case 11:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 12:case 13:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 14:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 21:i.parseDirective("%%{","open_directive");break;case 22:i.parseDirective(a[o],"type_directive");break;case 23:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 24:i.parseDirective("}%%","close_directive","pie")}},table:[{3:1,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{1:[3]},{3:10,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{3:11,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},e(o,c,{7:12,8:[1,13]}),e(l,[2,18]),e(l,[2,19]),e(l,[2,20]),{22:14,30:[1,15]},{30:[2,21]},{1:[2,1]},{1:[2,2]},e(h,u,{21:8,9:16,10:17,5:24,1:[2,3],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(o,c,{7:25}),{23:26,24:[1,27],32:b},e([24,32],[2,22]),e(o,[2,6]),{4:29,26:i,27:r,28:a},{12:[1,30]},{14:[1,31]},{16:[1,32]},{18:[1,33]},e(h,[2,13]),e(h,[2,14]),e(h,[2,15]),e(h,u,{21:8,9:16,10:17,5:24,1:[2,4],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(_,[2,16]),{25:34,31:[1,35]},e(_,[2,24]),e(o,[2,7]),e(h,[2,9]),e(h,[2,10]),e(h,[2,11]),e(h,[2,12]),{23:36,32:b},{32:[2,23]},e(_,[2,17])],defaultActions:{9:[2,21],10:[2,1],11:[2,2],35:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},v=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),29;case 1:return this.begin("type_directive"),30;case 2:return this.popState(),this.begin("arg_directive"),24;case 3:return this.popState(),this.popState(),32;case 4:return 31;case 5:case 6:case 8:case 9:break;case 7:return 26;case 10:return this.begin("title"),13;case 11:return this.popState(),"title_value";case 12:return this.begin("acc_title"),15;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),17;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:case 20:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:this.begin("string");break;case 21:return"txt";case 22:return 6;case 23:return 8;case 24:return"value";case 25:return 28}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?:showData\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},title:{rules:[11],inclusive:!1},string:{rules:[20,21],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,12,14,16,19,22,23,24,25],inclusive:!0}}},t);function k(){this.yy={}}return x.lexer=v,k.prototype=x,x.Parser=k,new k}();RE.parser=RE;const $E=RE,PE=t=>null!==t.match(/^\s*pie/)||null!==t.match(/^\s*bar/);let jE={},YE=!1;const zE={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().pie,addSection:function(t,e){t=jb.sanitizeText(t,hv()),void 0===jE[t]&&(jE[t]=e,Db.debug("Added new section :",t))},getSections:()=>jE,cleanupValue:function(t){return":"===t.substring(0,1)?(t=t.substring(1).trim(),Number(t.trim())):Number(t.trim())},clear:function(){jE={},YE=!1,Gv()},setAccTitle:Xv,getAccTitle:Zv,setDiagramTitle:Jv,getDiagramTitle:tk,setShowData:function(t){YE=t},getShowData:function(){return YE},getAccDescription:Kv,setAccDescription:Qv};let UE,WE=hv();const HE=450,qE={draw:(t,e,n,i)=>{try{WE=hv(),Db.debug("Rendering info diagram\n"+t);const n=hv().securityLevel;let y;"sandbox"===n&&(y=Ho("#i"+e));const m=Ho("sandbox"===n?y.nodes()[0].contentDocument.body:"body"),b="sandbox"===n?y.nodes()[0].contentDocument:document;i.db.clear(),i.parser.parse(t),Db.debug("Parsed info diagram");const _=b.getElementById(e);UE=_.parentElement.offsetWidth,void 0===UE&&(UE=1200),void 0!==WE.useWidth&&(UE=WE.useWidth),void 0!==WE.pie.useWidth&&(UE=WE.pie.useWidth);const x=m.select("#"+e);mv(x,HE,UE,WE.pie.useMaxWidth),_.setAttribute("viewBox","0 0 "+UE+" "+HE);var r=18,a=Math.min(UE,HE)/2-40,s=x.append("g").attr("transform","translate("+UE/2+",225)"),o=i.db.getSections(),c=0;Object.keys(o).forEach((function(t){c+=o[t]}));const v=WE.themeVariables;var l=[v.pie1,v.pie2,v.pie3,v.pie4,v.pie5,v.pie6,v.pie7,v.pie8,v.pie9,v.pie10,v.pie11,v.pie12],h=Aa().range(l),u=Object.entries(o).map((function(t,e){return{order:e,name:t[0],value:t[1]}})),d=function(){var t=Dc,e=Ac,n=null,i=Vo(0),r=Vo(rc),a=Vo(0);function s(s){var o,c,l,h,u,d=(s=kc(s)).length,p=0,f=new Array(d),g=new Array(d),y=+i.apply(this,arguments),m=Math.min(rc,Math.max(-rc,r.apply(this,arguments)-y)),b=Math.min(Math.abs(m)/d,a.apply(this,arguments)),_=b*(m<0?-1:1);for(o=0;o<d;++o)(u=g[f[o]=o]=+t(s[o],o,s))>0&&(p+=u);for(null!=e?f.sort((function(t,n){return e(g[t],g[n])})):null!=n&&f.sort((function(t,e){return n(s[t],s[e])})),o=0,l=p?(m-d*_)/p:0;o<d;++o,y=h)c=f[o],h=y+((u=g[c])>0?u*l:0)+_,g[c]={data:s[c],index:o,value:u,startAngle:y,endAngle:h,padAngle:b};return g}return s.value=function(e){return arguments.length?(t="function"==typeof e?e:Vo(+e),s):t},s.sortValues=function(t){return arguments.length?(e=t,n=null,s):e},s.sort=function(t){return arguments.length?(n=t,e=null,s):n},s.startAngle=function(t){return arguments.length?(i="function"==typeof t?t:Vo(+t),s):i},s.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:Vo(+t),s):r},s.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:Vo(+t),s):a},s}().value((function(t){return t.value})).sort((function(t,e){return t.order-e.order})),p=d(u),f=vc().innerRadius(0).outerRadius(a);s.selectAll("mySlices").data(p).enter().append("path").attr("d",f).attr("fill",(function(t){return h(t.data.name)})).attr("class","pieCircle"),s.selectAll("mySlices").data(p).enter().append("text").text((function(t){return(t.data.value/c*100).toFixed(0)+"%"})).attr("transform",(function(t){return"translate("+f.centroid(t)+")"})).style("text-anchor","middle").attr("class","slice"),s.append("text").text(i.db.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");var g=s.selectAll(".legend").data(h.domain()).enter().append("g").attr("class","legend").attr("transform",(function(t,e){return"translate(216,"+(22*e-22*h.domain().length/2)+")"}));g.append("rect").attr("width",r).attr("height",r).style("fill",h).style("stroke",h),g.data(p).append("text").attr("x",22).attr("y",14).text((function(t){return i.db.getShowData()||WE.showData||WE.pie.showData?t.data.name+" ["+t.data.value+"]":t.data.name}))}catch(y){Db.error("Error while rendering info diagram"),Db.error(y)}}};var VE=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[1,6],a=[1,7],s=[1,8],o=[5,6,8,14,16,18,19,40,41,42,43,44,45,53,71,72],c=[1,22],l=[2,13],h=[1,26],u=[1,27],d=[1,28],p=[1,29],f=[1,30],g=[1,31],y=[1,24],m=[1,32],b=[1,33],_=[1,36],x=[71,72],v=[5,8,14,16,18,19,40,41,42,43,44,45,53,60,62,71,72],k=[1,56],w=[1,57],T=[1,58],C=[1,59],E=[1,60],S=[1,61],A=[1,62],D=[62,63],L=[1,74],N=[1,70],O=[1,71],B=[1,72],M=[1,73],I=[1,75],F=[1,79],R=[1,80],$=[1,77],P=[1,78],j=[5,8,14,16,18,19,40,41,42,43,44,45,53,71,72],Y={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,openDirective:9,typeDirective:10,closeDirective:11,":":12,argDirective:13,acc_title:14,acc_title_value:15,acc_descr:16,acc_descr_value:17,acc_descr_multiline_value:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,requirementDef:23,elementDef:24,relationshipDef:25,requirementType:26,requirementName:27,STRUCT_START:28,requirementBody:29,ID:30,COLONSEP:31,id:32,TEXT:33,text:34,RISK:35,riskLevel:36,VERIFYMTHD:37,verifyType:38,STRUCT_STOP:39,REQUIREMENT:40,FUNCTIONAL_REQUIREMENT:41,INTERFACE_REQUIREMENT:42,PERFORMANCE_REQUIREMENT:43,PHYSICAL_REQUIREMENT:44,DESIGN_CONSTRAINT:45,LOW_RISK:46,MED_RISK:47,HIGH_RISK:48,VERIFY_ANALYSIS:49,VERIFY_DEMONSTRATION:50,VERIFY_INSPECTION:51,VERIFY_TEST:52,ELEMENT:53,elementName:54,elementBody:55,TYPE:56,type:57,DOCREF:58,ref:59,END_ARROW_L:60,relationship:61,LINE:62,END_ARROW_R:63,CONTAINS:64,COPIES:65,DERIVES:66,SATISFIES:67,VERIFIES:68,REFINES:69,TRACES:70,unqString:71,qString:72,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",12:":",14:"acc_title",15:"acc_title_value",16:"acc_descr",17:"acc_descr_value",18:"acc_descr_multiline_value",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",28:"STRUCT_START",30:"ID",31:"COLONSEP",33:"TEXT",35:"RISK",37:"VERIFYMTHD",39:"STRUCT_STOP",40:"REQUIREMENT",41:"FUNCTIONAL_REQUIREMENT",42:"INTERFACE_REQUIREMENT",43:"PERFORMANCE_REQUIREMENT",44:"PHYSICAL_REQUIREMENT",45:"DESIGN_CONSTRAINT",46:"LOW_RISK",47:"MED_RISK",48:"HIGH_RISK",49:"VERIFY_ANALYSIS",50:"VERIFY_DEMONSTRATION",51:"VERIFY_INSPECTION",52:"VERIFY_TEST",53:"ELEMENT",56:"TYPE",58:"DOCREF",60:"END_ARROW_L",62:"LINE",63:"END_ARROW_R",64:"CONTAINS",65:"COPIES",66:"DERIVES",67:"SATISFIES",68:"VERIFIES",69:"REFINES",70:"TRACES",71:"unqString",72:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,3],[4,5],[4,2],[4,2],[4,1],[9,1],[10,1],[13,1],[11,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[23,5],[29,5],[29,5],[29,5],[29,5],[29,2],[29,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[36,1],[36,1],[36,1],[38,1],[38,1],[38,1],[38,1],[24,5],[55,5],[55,5],[55,2],[55,1],[25,5],[25,5],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[27,1],[27,1],[32,1],[32,1],[34,1],[34,1],[54,1],[54,1],[57,1],[57,1],[59,1],[59,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 6:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 7:case 8:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 9:i.parseDirective("%%{","open_directive");break;case 10:i.parseDirective(a[o],"type_directive");break;case 11:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 12:i.parseDirective("}%%","close_directive","pie");break;case 13:this.$=[];break;case 19:i.addRequirement(a[o-3],a[o-4]);break;case 20:i.setNewReqId(a[o-2]);break;case 21:i.setNewReqText(a[o-2]);break;case 22:i.setNewReqRisk(a[o-2]);break;case 23:i.setNewReqVerifyMethod(a[o-2]);break;case 26:this.$=i.RequirementType.REQUIREMENT;break;case 27:this.$=i.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 28:this.$=i.RequirementType.INTERFACE_REQUIREMENT;break;case 29:this.$=i.RequirementType.PERFORMANCE_REQUIREMENT;break;case 30:this.$=i.RequirementType.PHYSICAL_REQUIREMENT;break;case 31:this.$=i.RequirementType.DESIGN_CONSTRAINT;break;case 32:this.$=i.RiskLevel.LOW_RISK;break;case 33:this.$=i.RiskLevel.MED_RISK;break;case 34:this.$=i.RiskLevel.HIGH_RISK;break;case 35:this.$=i.VerifyType.VERIFY_ANALYSIS;break;case 36:this.$=i.VerifyType.VERIFY_DEMONSTRATION;break;case 37:this.$=i.VerifyType.VERIFY_INSPECTION;break;case 38:this.$=i.VerifyType.VERIFY_TEST;break;case 39:i.addElement(a[o-3]);break;case 40:i.setNewElementType(a[o-2]);break;case 41:i.setNewElementDocRef(a[o-2]);break;case 44:i.addRelationship(a[o-2],a[o],a[o-4]);break;case 45:i.addRelationship(a[o-2],a[o-4],a[o]);break;case 46:this.$=i.Relationships.CONTAINS;break;case 47:this.$=i.Relationships.COPIES;break;case 48:this.$=i.Relationships.DERIVES;break;case 49:this.$=i.Relationships.SATISFIES;break;case 50:this.$=i.Relationships.VERIFIES;break;case 51:this.$=i.Relationships.REFINES;break;case 52:this.$=i.Relationships.TRACES}},table:[{3:1,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[3]},{3:10,4:2,5:[1,9],6:n,9:4,14:i,16:r,18:a,19:s},{5:[1,11]},{10:12,20:[1,13]},{15:[1,14]},{17:[1,15]},e(o,[2,8]),{20:[2,9]},{3:16,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[2,2]},{4:21,5:c,7:17,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{11:34,12:[1,35],22:_},e([12,22],[2,10]),e(o,[2,6]),e(o,[2,7]),{1:[2,1]},{8:[1,37]},{4:21,5:c,7:38,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:39,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:40,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:41,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:42,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{27:43,71:[1,44],72:[1,45]},{54:46,71:[1,47],72:[1,48]},{60:[1,49],62:[1,50]},e(x,[2,26]),e(x,[2,27]),e(x,[2,28]),e(x,[2,29]),e(x,[2,30]),e(x,[2,31]),e(v,[2,55]),e(v,[2,56]),e(o,[2,4]),{13:51,21:[1,52]},e(o,[2,12]),{1:[2,3]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{8:[2,17]},{8:[2,18]},{28:[1,53]},{28:[2,53]},{28:[2,54]},{28:[1,54]},{28:[2,59]},{28:[2,60]},{61:55,64:k,65:w,66:T,67:C,68:E,69:S,70:A},{61:63,64:k,65:w,66:T,67:C,68:E,69:S,70:A},{11:64,22:_},{22:[2,11]},{5:[1,65]},{5:[1,66]},{62:[1,67]},e(D,[2,46]),e(D,[2,47]),e(D,[2,48]),e(D,[2,49]),e(D,[2,50]),e(D,[2,51]),e(D,[2,52]),{63:[1,68]},e(o,[2,5]),{5:L,29:69,30:N,33:O,35:B,37:M,39:I},{5:F,39:R,55:76,56:$,58:P},{32:81,71:m,72:b},{32:82,71:m,72:b},e(j,[2,19]),{31:[1,83]},{31:[1,84]},{31:[1,85]},{31:[1,86]},{5:L,29:87,30:N,33:O,35:B,37:M,39:I},e(j,[2,25]),e(j,[2,39]),{31:[1,88]},{31:[1,89]},{5:F,39:R,55:90,56:$,58:P},e(j,[2,43]),e(j,[2,44]),e(j,[2,45]),{32:91,71:m,72:b},{34:92,71:[1,93],72:[1,94]},{36:95,46:[1,96],47:[1,97],48:[1,98]},{38:99,49:[1,100],50:[1,101],51:[1,102],52:[1,103]},e(j,[2,24]),{57:104,71:[1,105],72:[1,106]},{59:107,71:[1,108],72:[1,109]},e(j,[2,42]),{5:[1,110]},{5:[1,111]},{5:[2,57]},{5:[2,58]},{5:[1,112]},{5:[2,32]},{5:[2,33]},{5:[2,34]},{5:[1,113]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[2,38]},{5:[1,114]},{5:[2,61]},{5:[2,62]},{5:[1,115]},{5:[2,63]},{5:[2,64]},{5:L,29:116,30:N,33:O,35:B,37:M,39:I},{5:L,29:117,30:N,33:O,35:B,37:M,39:I},{5:L,29:118,30:N,33:O,35:B,37:M,39:I},{5:L,29:119,30:N,33:O,35:B,37:M,39:I},{5:F,39:R,55:120,56:$,58:P},{5:F,39:R,55:121,56:$,58:P},e(j,[2,20]),e(j,[2,21]),e(j,[2,22]),e(j,[2,23]),e(j,[2,40]),e(j,[2,41])],defaultActions:{8:[2,9],10:[2,2],16:[2,1],37:[2,3],38:[2,14],39:[2,15],40:[2,16],41:[2,17],42:[2,18],44:[2,53],45:[2,54],47:[2,59],48:[2,60],52:[2,11],93:[2,57],94:[2,58],96:[2,32],97:[2,33],98:[2,34],100:[2,35],101:[2,36],102:[2,37],103:[2,38],105:[2,61],106:[2,62],108:[2,63],109:[2,64]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},z=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return this.begin("type_directive"),20;case 2:return this.popState(),this.begin("arg_directive"),12;case 3:return this.popState(),this.popState(),22;case 4:return 21;case 5:return"title";case 6:return this.begin("acc_title"),14;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),16;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 53:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 5;case 14:case 15:case 16:break;case 17:return 8;case 18:return 6;case 19:return 28;case 20:return 39;case 21:return 31;case 22:return 30;case 23:return 33;case 24:return 35;case 25:return 37;case 26:return 40;case 27:return 41;case 28:return 42;case 29:return 43;case 30:return 44;case 31:return 45;case 32:return 46;case 33:return 47;case 34:return 48;case 35:return 49;case 36:return 50;case 37:return 51;case 38:return 52;case 39:return 53;case 40:return 64;case 41:return 65;case 42:return 66;case 43:return 67;case 44:return 68;case 45:return 69;case 46:return 70;case 47:return 56;case 48:return 58;case 49:return 60;case 50:return 63;case 51:return 62;case 52:this.begin("string");break;case 54:return"qString";case 55:return e.yytext=e.yytext.trim(),71}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[53,54],inclusive:!1},INITIAL:{rules:[0,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55],inclusive:!0}}},t);function U(){this.yy={}}return Y.lexer=z,U.prototype=Y,Y.Parser=U,new U}();VE.parser=VE;const GE=VE,XE=t=>null!==t.match(/^\s*requirement(Diagram)?/);let ZE=[],QE={},KE={},JE={},tS={};const eS={RequirementType:{REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},RiskLevel:{LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},VerifyType:{VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},Relationships:{CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().req,addRequirement:(t,e)=>(void 0===KE[t]&&(KE[t]={name:t,type:e,id:QE.id,text:QE.text,risk:QE.risk,verifyMethod:QE.verifyMethod}),QE={},KE[t]),getRequirements:()=>KE,setNewReqId:t=>{void 0!==QE&&(QE.id=t)},setNewReqText:t=>{void 0!==QE&&(QE.text=t)},setNewReqRisk:t=>{void 0!==QE&&(QE.risk=t)},setNewReqVerifyMethod:t=>{void 0!==QE&&(QE.verifyMethod=t)},setAccTitle:Xv,getAccTitle:Zv,setAccDescription:Qv,getAccDescription:Kv,addElement:t=>(void 0===tS[t]&&(tS[t]={name:t,type:JE.type,docRef:JE.docRef},Db.info("Added new requirement: ",t)),JE={},tS[t]),getElements:()=>tS,setNewElementType:t=>{void 0!==JE&&(JE.type=t)},setNewElementDocRef:t=>{void 0!==JE&&(JE.docRef=t)},addRelationship:(t,e,n)=>{ZE.push({type:t,src:e,dst:n})},getRelationships:()=>ZE,clear:()=>{ZE=[],QE={},KE={},JE={},tS={},Gv()}},nS={CONTAINS:"contains",ARROW:"arrow"},iS=nS,rS=(t,e)=>{let n=t.append("defs").append("marker").attr("id",nS.CONTAINS+"_line_ending").attr("refX",0).attr("refY",e.line_height/2).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("g");n.append("circle").attr("cx",e.line_height/2).attr("cy",e.line_height/2).attr("r",e.line_height/2).attr("fill","none"),n.append("line").attr("x1",0).attr("x2",e.line_height).attr("y1",e.line_height/2).attr("y2",e.line_height/2).attr("stroke-width",1),n.append("line").attr("y1",0).attr("y2",e.line_height).attr("x1",e.line_height/2).attr("x2",e.line_height/2).attr("stroke-width",1),t.append("defs").append("marker").attr("id",nS.ARROW+"_line_ending").attr("refX",e.line_height).attr("refY",.5*e.line_height).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("path").attr("d",`M0,0\n L${e.line_height},${e.line_height/2}\n M${e.line_height},${e.line_height/2}\n L0,${e.line_height}`).attr("stroke-width",1)};let aS={},sS=0;const oS=(t,e)=>t.insert("rect","#"+e).attr("class","req reqBox").attr("x",0).attr("y",0).attr("width",aS.rect_min_width+"px").attr("height",aS.rect_min_height+"px"),cS=(t,e,n)=>{let i=aS.rect_min_width/2,r=t.append("text").attr("class","req reqLabel reqTitle").attr("id",e).attr("x",i).attr("y",aS.rect_padding).attr("dominant-baseline","hanging"),a=0;n.forEach((t=>{0==a?r.append("tspan").attr("text-anchor","middle").attr("x",aS.rect_min_width/2).attr("dy",0).text(t):r.append("tspan").attr("text-anchor","middle").attr("x",aS.rect_min_width/2).attr("dy",.75*aS.line_height).text(t),a++}));let s=1.5*aS.rect_padding+a*aS.line_height*.75;return t.append("line").attr("class","req-title-line").attr("x1","0").attr("x2",aS.rect_min_width).attr("y1",s).attr("y2",s),{titleNode:r,y:s}},lS=(t,e,n,i)=>{let r=t.append("text").attr("class","req reqLabel").attr("id",e).attr("x",aS.rect_padding).attr("y",i).attr("dominant-baseline","hanging"),a=0;let s=[];return n.forEach((t=>{let e=t.length;for(;e>30&&a<3;){let n=t.substring(0,30);e=(t=t.substring(30,t.length)).length,s[s.length]=n,a++}if(3==a){let t=s[s.length-1];s[s.length-1]=t.substring(0,t.length-4)+"..."}else s[s.length]=t;a=0})),s.forEach((t=>{r.append("tspan").attr("x",aS.rect_padding).attr("dy",aS.line_height).text(t)})),r},hS=function(t,e,n,i,r){const a=n.edge(uS(e.src),uS(e.dst)),s=Sc().x((function(t){return t.x})).y((function(t){return t.y})),o=t.insert("path","#"+i).attr("class","er relationshipLine").attr("d",s(a.points)).attr("fill","none");e.type==r.db.Relationships.CONTAINS?o.attr("marker-start","url("+jb.getUrl(aS.arrowMarkerAbsolute)+"#"+e.type+"_line_ending)"):(o.attr("stroke-dasharray","10,7"),o.attr("marker-end","url("+jb.getUrl(aS.arrowMarkerAbsolute)+"#"+iS.ARROW+"_line_ending)")),((t,e,n,i)=>{const r=e.node().getTotalLength(),a=e.node().getPointAtLength(.5*r),s="rel"+sS;sS++;const o=t.append("text").attr("class","req relationshipLabel").attr("id",s).attr("x",a.x).attr("y",a.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(i).node().getBBox();t.insert("rect","#"+s).attr("class","req reqLabelBox").attr("x",a.x-o.width/2).attr("y",a.y-o.height/2).attr("width",o.width).attr("height",o.height).attr("fill","white").attr("fill-opacity","85%")})(t,o,0,`<<${e.type}>>`)},uS=t=>t.replace(/\s/g,"").replace(/\./g,"_"),dS={draw:(t,e,n,i)=>{aS=hv().requirement,i.db.clear(),i.parser.parse(t);const r=aS.securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body").select(`[id='${e}']`);rS(s,aS);const o=new Vf({multigraph:!1,compound:!1,directed:!0}).setGraph({rankdir:aS.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));let c=i.db.getRequirements(),l=i.db.getElements(),h=i.db.getRelationships();((t,e,n)=>{Object.keys(t).forEach((i=>{let r=t[i];i=uS(i),Db.info("Added new requirement: ",i);const a=n.append("g").attr("id",i),s=oS(a,"req-"+i);let o=cS(a,i+"_title",[`<<${r.type}>>`,`${r.name}`]);lS(a,i+"_body",[`Id: ${r.id}`,`Text: ${r.text}`,`Risk: ${r.risk}`,`Verification: ${r.verifyMethod}`],o.y);const c=s.node().getBBox();e.setNode(i,{width:c.width,height:c.height,shape:"rect",id:i})}))})(c,o,s),((t,e,n)=>{Object.keys(t).forEach((i=>{let r=t[i];const a=uS(i),s=n.append("g").attr("id",a),o="element-"+a,c=oS(s,o);let l=cS(s,o+"_title",["<<Element>>",`${i}`]);lS(s,o+"_body",[`Type: ${r.type||"Not Specified"}`,`Doc Ref: ${r.docRef||"None"}`],l.y);const h=c.node().getBBox();e.setNode(a,{width:h.width,height:h.height,shape:"rect",id:a})}))})(l,o,s),((t,e)=>{t.forEach((function(t){let n=uS(t.src),i=uS(t.dst);e.setEdge(n,i,{relationship:t})}))})(h,o),Em(o),function(t,e){e.nodes().forEach((function(n){void 0!==n&&void 0!==e.node(n)&&(t.select("#"+n),t.select("#"+n).attr("transform","translate("+(e.node(n).x-e.node(n).width/2)+","+(e.node(n).y-e.node(n).height/2)+" )"))}))}(s,o),h.forEach((function(t){hS(s,t,o,e,i)}));const u=aS.rect_padding,d=s.node().getBBox(),p=d.width+2*u,f=d.height+2*u;mv(s,f,p,aS.useMaxWidth),s.attr("viewBox",`${d.x-u} ${d.y-u} ${p} ${f}`)}};var pS=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,18],h=[1,19],u=[1,21],d=[1,22],p=[1,23],f=[1,29],g=[1,30],y=[1,31],m=[1,32],b=[1,33],_=[1,34],x=[1,35],v=[1,36],k=[1,37],w=[1,38],T=[1,39],C=[1,40],E=[1,43],S=[1,44],A=[1,45],D=[1,46],L=[1,47],N=[1,48],O=[1,51],B=[1,4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,51,52,53,58,59,60,61,69,79],M=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,53,58,59,60,61,69,79],I=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,52,53,58,59,60,61,69,79],F=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,51,53,58,59,60,61,69,79],R=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,53,58,59,60,61,69,79],$=[67,68,69],P=[1,121],j=[1,4,5,7,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,51,52,53,58,59,60,61,69,79],Y={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,directive:6,SD:7,document:8,line:9,statement:10,openDirective:11,typeDirective:12,closeDirective:13,":":14,argDirective:15,participant:16,actor:17,AS:18,restOfLine:19,participant_actor:20,signal:21,autonumber:22,NUM:23,off:24,activate:25,deactivate:26,note_statement:27,links_statement:28,link_statement:29,properties_statement:30,details_statement:31,title:32,legacy_title:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,loop:39,end:40,rect:41,opt:42,alt:43,else_sections:44,par:45,par_sections:46,critical:47,option_sections:48,break:49,option:50,and:51,else:52,note:53,placement:54,text2:55,over:56,actor_pair:57,links:58,link:59,properties:60,details:61,spaceList:62,",":63,left_of:64,right_of:65,signaltype:66,"+":67,"-":68,ACTOR:69,SOLID_OPEN_ARROW:70,DOTTED_OPEN_ARROW:71,SOLID_ARROW:72,DOTTED_ARROW:73,SOLID_CROSS:74,DOTTED_CROSS:75,SOLID_POINT:76,DOTTED_POINT:77,TXT:78,open_directive:79,type_directive:80,arg_directive:81,close_directive:82,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",7:"SD",14:":",16:"participant",18:"AS",19:"restOfLine",20:"participant_actor",22:"autonumber",23:"NUM",24:"off",25:"activate",26:"deactivate",32:"title",33:"legacy_title",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",39:"loop",40:"end",41:"rect",42:"opt",43:"alt",45:"par",47:"critical",49:"break",50:"option",51:"and",52:"else",53:"note",56:"over",58:"links",59:"link",60:"properties",61:"details",63:",",64:"left_of",65:"right_of",67:"+",68:"-",69:"ACTOR",70:"SOLID_OPEN_ARROW",71:"DOTTED_OPEN_ARROW",72:"SOLID_ARROW",73:"DOTTED_ARROW",74:"SOLID_CROSS",75:"DOTTED_CROSS",76:"SOLID_POINT",77:"DOTTED_POINT",78:"TXT",79:"open_directive",80:"type_directive",81:"arg_directive",82:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[6,4],[6,6],[10,5],[10,3],[10,5],[10,3],[10,2],[10,4],[10,3],[10,3],[10,2],[10,3],[10,3],[10,2],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,2],[10,2],[10,1],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,1],[48,1],[48,4],[46,1],[46,4],[44,1],[44,4],[27,4],[27,4],[28,3],[29,3],[30,3],[31,3],[62,2],[62,1],[57,3],[57,1],[54,1],[54,1],[21,5],[21,5],[21,4],[17,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[55,1],[11,1],[12,1],[15,1],[13,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.apply(a[o]),a[o];case 5:case 9:this.$=[];break;case 6:a[o-1].push(a[o]),this.$=a[o-1];break;case 7:case 8:case 56:this.$=a[o];break;case 12:a[o-3].type="addParticipant",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 13:a[o-1].type="addParticipant",this.$=a[o-1];break;case 14:a[o-3].type="addActor",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 15:a[o-1].type="addActor",this.$=a[o-1];break;case 17:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-2]),sequenceIndexStep:Number(a[o-1]),sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:i.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]};break;case 22:this.$={type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-1]};break;case 28:i.setDiagramTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 29:i.setDiagramTitle(a[o].substring(7)),this.$=a[o].substring(7);break;case 30:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 33:a[o-1].unshift({type:"loopStart",loopText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.LOOP_START}),a[o-1].push({type:"loopEnd",loopText:a[o-2],signalType:i.LINETYPE.LOOP_END}),this.$=a[o-1];break;case 34:a[o-1].unshift({type:"rectStart",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_START}),a[o-1].push({type:"rectEnd",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_END}),this.$=a[o-1];break;case 35:a[o-1].unshift({type:"optStart",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_START}),a[o-1].push({type:"optEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_END}),this.$=a[o-1];break;case 36:a[o-1].unshift({type:"altStart",altText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.ALT_START}),a[o-1].push({type:"altEnd",signalType:i.LINETYPE.ALT_END}),this.$=a[o-1];break;case 37:a[o-1].unshift({type:"parStart",parText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.PAR_START}),a[o-1].push({type:"parEnd",signalType:i.LINETYPE.PAR_END}),this.$=a[o-1];break;case 38:a[o-1].unshift({type:"criticalStart",criticalText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.CRITICAL_START}),a[o-1].push({type:"criticalEnd",signalType:i.LINETYPE.CRITICAL_END}),this.$=a[o-1];break;case 39:a[o-1].unshift({type:"breakStart",breakText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_START}),a[o-1].push({type:"breakEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_END}),this.$=a[o-1];break;case 42:this.$=a[o-3].concat([{type:"option",optionText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.CRITICAL_OPTION},a[o]]);break;case 44:this.$=a[o-3].concat([{type:"and",parText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.PAR_AND},a[o]]);break;case 46:this.$=a[o-3].concat([{type:"else",altText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.ALT_ELSE},a[o]]);break;case 47:this.$=[a[o-1],{type:"addNote",placement:a[o-2],actor:a[o-1].actor,text:a[o]}];break;case 48:a[o-2]=[].concat(a[o-1],a[o-1]).slice(0,2),a[o-2][0]=a[o-2][0].actor,a[o-2][1]=a[o-2][1].actor,this.$=[a[o-1],{type:"addNote",placement:i.PLACEMENT.OVER,actor:a[o-2].slice(0,2),text:a[o]}];break;case 49:this.$=[a[o-1],{type:"addLinks",actor:a[o-1].actor,text:a[o]}];break;case 50:this.$=[a[o-1],{type:"addALink",actor:a[o-1].actor,text:a[o]}];break;case 51:this.$=[a[o-1],{type:"addProperties",actor:a[o-1].actor,text:a[o]}];break;case 52:this.$=[a[o-1],{type:"addDetails",actor:a[o-1].actor,text:a[o]}];break;case 55:this.$=[a[o-2],a[o]];break;case 57:this.$=i.PLACEMENT.LEFTOF;break;case 58:this.$=i.PLACEMENT.RIGHTOF;break;case 59:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]}];break;case 60:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-4]}];break;case 61:this.$=[a[o-3],a[o-1],{type:"addMessage",from:a[o-3].actor,to:a[o-1].actor,signalType:a[o-2],msg:a[o]}];break;case 62:this.$={type:"addParticipant",actor:a[o]};break;case 63:this.$=i.LINETYPE.SOLID_OPEN;break;case 64:this.$=i.LINETYPE.DOTTED_OPEN;break;case 65:this.$=i.LINETYPE.SOLID;break;case 66:this.$=i.LINETYPE.DOTTED;break;case 67:this.$=i.LINETYPE.SOLID_CROSS;break;case 68:this.$=i.LINETYPE.DOTTED_CROSS;break;case 69:this.$=i.LINETYPE.SOLID_POINT;break;case 70:this.$=i.LINETYPE.DOTTED_POINT;break;case 71:this.$=i.parseMessage(a[o].trim().substring(1));break;case 72:i.parseDirective("%%{","open_directive");break;case 73:i.parseDirective(a[o],"type_directive");break;case 74:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 75:i.parseDirective("}%%","close_directive","sequence")}},table:[{3:1,4:n,5:i,6:4,7:r,11:6,79:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,11:6,79:a},{3:9,4:n,5:i,6:4,7:r,11:6,79:a},{3:10,4:n,5:i,6:4,7:r,11:6,79:a},e([1,4,5,16,20,22,25,26,32,33,34,36,38,39,41,42,43,45,47,49,53,58,59,60,61,69,79],s,{8:11}),{12:12,80:[1,13]},{80:[2,72]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{13:49,14:[1,50],82:O},e([14,82],[2,73]),e(B,[2,6]),{6:41,10:52,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},e(B,[2,8]),e(B,[2,9]),{17:53,69:N},{17:54,69:N},{5:[1,55]},{5:[1,58],23:[1,56],24:[1,57]},{17:59,69:N},{17:60,69:N},{5:[1,61]},{5:[1,62]},{5:[1,63]},{5:[1,64]},{5:[1,65]},e(B,[2,28]),e(B,[2,29]),{35:[1,66]},{37:[1,67]},e(B,[2,32]),{19:[1,68]},{19:[1,69]},{19:[1,70]},{19:[1,71]},{19:[1,72]},{19:[1,73]},{19:[1,74]},e(B,[2,40]),{66:75,70:[1,76],71:[1,77],72:[1,78],73:[1,79],74:[1,80],75:[1,81],76:[1,82],77:[1,83]},{54:84,56:[1,85],64:[1,86],65:[1,87]},{17:88,69:N},{17:89,69:N},{17:90,69:N},{17:91,69:N},e([5,18,63,70,71,72,73,74,75,76,77,78],[2,62]),{5:[1,92]},{15:93,81:[1,94]},{5:[2,75]},e(B,[2,7]),{5:[1,96],18:[1,95]},{5:[1,98],18:[1,97]},e(B,[2,16]),{5:[1,100],23:[1,99]},{5:[1,101]},e(B,[2,20]),{5:[1,102]},{5:[1,103]},e(B,[2,23]),e(B,[2,24]),e(B,[2,25]),e(B,[2,26]),e(B,[2,27]),e(B,[2,30]),e(B,[2,31]),e(M,s,{8:104}),e(M,s,{8:105}),e(M,s,{8:106}),e(I,s,{44:107,8:108}),e(F,s,{46:109,8:110}),e(R,s,{48:111,8:112}),e(M,s,{8:113}),{17:116,67:[1,114],68:[1,115],69:N},e($,[2,63]),e($,[2,64]),e($,[2,65]),e($,[2,66]),e($,[2,67]),e($,[2,68]),e($,[2,69]),e($,[2,70]),{17:117,69:N},{17:119,57:118,69:N},{69:[2,57]},{69:[2,58]},{55:120,78:P},{55:122,78:P},{55:123,78:P},{55:124,78:P},e(j,[2,10]),{13:125,82:O},{82:[2,74]},{19:[1,126]},e(B,[2,13]),{19:[1,127]},e(B,[2,15]),{5:[1,128]},e(B,[2,18]),e(B,[2,19]),e(B,[2,21]),e(B,[2,22]),{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,129],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,130],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,131],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{40:[1,132]},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[2,45],41:x,42:v,43:k,45:w,47:T,49:C,52:[1,133],53:E,58:S,59:A,60:D,61:L,69:N,79:a},{40:[1,134]},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[2,43],41:x,42:v,43:k,45:w,47:T,49:C,51:[1,135],53:E,58:S,59:A,60:D,61:L,69:N,79:a},{40:[1,136]},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[2,41],41:x,42:v,43:k,45:w,47:T,49:C,50:[1,137],53:E,58:S,59:A,60:D,61:L,69:N,79:a},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,138],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{17:139,69:N},{17:140,69:N},{55:141,78:P},{55:142,78:P},{55:143,78:P},{63:[1,144],78:[2,56]},{5:[2,49]},{5:[2,71]},{5:[2,50]},{5:[2,51]},{5:[2,52]},{5:[1,145]},{5:[1,146]},{5:[1,147]},e(B,[2,17]),e(B,[2,33]),e(B,[2,34]),e(B,[2,35]),e(B,[2,36]),{19:[1,148]},e(B,[2,37]),{19:[1,149]},e(B,[2,38]),{19:[1,150]},e(B,[2,39]),{55:151,78:P},{55:152,78:P},{5:[2,61]},{5:[2,47]},{5:[2,48]},{17:153,69:N},e(j,[2,11]),e(B,[2,12]),e(B,[2,14]),e(I,s,{8:108,44:154}),e(F,s,{8:110,46:155}),e(R,s,{8:112,48:156}),{5:[2,59]},{5:[2,60]},{78:[2,55]},{40:[2,46]},{40:[2,44]},{40:[2,42]}],defaultActions:{7:[2,72],8:[2,1],9:[2,2],10:[2,3],51:[2,75],86:[2,57],87:[2,58],94:[2,74],120:[2,49],121:[2,71],122:[2,50],123:[2,51],124:[2,52],141:[2,61],142:[2,47],143:[2,48],151:[2,59],152:[2,60],153:[2,55],154:[2,46],155:[2,44],156:[2,42]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},z=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),79;case 1:return this.begin("type_directive"),80;case 2:return this.popState(),this.begin("arg_directive"),14;case 3:return this.popState(),this.popState(),82;case 4:return 81;case 5:case 52:case 65:return 5;case 6:case 7:case 8:case 9:case 10:break;case 11:return 23;case 12:return this.begin("ID"),16;case 13:return this.begin("ID"),20;case 14:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),69;case 15:return this.popState(),this.popState(),this.begin("LINE"),18;case 16:return this.popState(),this.popState(),5;case 17:return this.begin("LINE"),39;case 18:return this.begin("LINE"),41;case 19:return this.begin("LINE"),42;case 20:return this.begin("LINE"),43;case 21:return this.begin("LINE"),52;case 22:return this.begin("LINE"),45;case 23:return this.begin("LINE"),51;case 24:return this.begin("LINE"),47;case 25:return this.begin("LINE"),50;case 26:return this.begin("LINE"),49;case 27:return this.popState(),19;case 28:return 40;case 29:return 64;case 30:return 65;case 31:return 58;case 32:return 59;case 33:return 60;case 34:return 61;case 35:return 56;case 36:return 53;case 37:return this.begin("ID"),25;case 38:return this.begin("ID"),26;case 39:return 32;case 40:return 33;case 41:return this.begin("acc_title"),34;case 42:return this.popState(),"acc_title_value";case 43:return this.begin("acc_descr"),36;case 44:return this.popState(),"acc_descr_value";case 45:this.begin("acc_descr_multiline");break;case 46:this.popState();break;case 47:return"acc_descr_multiline_value";case 48:return 7;case 49:return 22;case 50:return 24;case 51:return 63;case 53:return e.yytext=e.yytext.trim(),69;case 54:return 72;case 55:return 73;case 56:return 70;case 57:return 71;case 58:return 74;case 59:return 75;case 60:return 76;case 61:return 77;case 62:return 78;case 63:return 67;case 64:return 68;case 66:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:[^\->:\n,;]+?([\-]*[^\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[46,47],inclusive:!1},acc_descr:{rules:[44],inclusive:!1},acc_title:{rules:[42],inclusive:!1},open_directive:{rules:[1,8],inclusive:!1},type_directive:{rules:[2,3,8],inclusive:!1},arg_directive:{rules:[3,4,8],inclusive:!1},ID:{rules:[7,8,14],inclusive:!1},ALIAS:{rules:[7,8,15,16],inclusive:!1},LINE:{rules:[7,8,27],inclusive:!1},INITIAL:{rules:[0,5,6,8,9,10,11,12,13,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,45,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66],inclusive:!0}}},t);function U(){this.yy={}}return Y.lexer=z,U.prototype=Y,Y.Parser=U,new U}();pS.parser=pS;const fS=pS,gS=t=>null!==t.match(/^\s*sequenceDiagram/);let yS,mS,bS={},_S=[],xS=!1;const vS=function(t,e,n,i){const r=bS[t];r&&e===r.name&&null==n||(null!=n&&null!=n.text||(n={text:e,wrap:null,type:i}),null!=i&&null!=n.text||(n={text:e,wrap:null,type:i}),bS[t]={name:e,description:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,prevActor:yS,links:{},properties:{},actorCnt:null,rectData:null,type:i||"participant"},yS&&bS[yS]&&(bS[yS].nextActor=t),yS=t)},kS=function(t,e,n={text:void 0,wrap:void 0},i){if(i===CS.ACTIVE_END){const e=(t=>{let e,n=0;for(e=0;e<_S.length;e++)_S[e].type===CS.ACTIVE_START&&_S[e].from.actor===t&&n++,_S[e].type===CS.ACTIVE_END&&_S[e].from.actor===t&&n--;return n})(t.actor);if(e<1){let e=new Error("Trying to inactivate an inactive participant ("+t.actor+")");throw e.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},e}}return _S.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,type:i}),!0},wS=function(t){return bS[t]},TS=()=>void 0!==mS?mS:hv().sequence.wrap,CS={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31},ES=function(t,e,n){n.text,void 0===n.wrap&&TS()||n.wrap;const i=[].concat(t,t);_S.push({from:i[0],to:i[1],message:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,type:CS.NOTE,placement:e})},SS=function(t,e){const n=wS(t);try{let t=Mb(e.text,hv());t=t.replace(/&/g,"&"),t=t.replace(/=/g,"=");AS(n,JSON.parse(t))}catch(i){Db.error("error while parsing actor link text",i)}};function AS(t,e){if(null==t.links)t.links=e;else for(let n in e)t.links[n]=e[n]}const DS=function(t,e){const n=wS(t);try{let t=Mb(e.text,hv());LS(n,JSON.parse(t))}catch(i){Db.error("error while parsing actor properties text",i)}};function LS(t,e){if(null==t.properties)t.properties=e;else for(let n in e)t.properties[n]=e[n]}const NS=function(t,e){const n=wS(t),i=document.getElementById(e.text);try{const t=i.innerHTML,e=JSON.parse(t);e.properties&&LS(n,e.properties),e.links&&AS(n,e.links)}catch(r){Db.error("error while parsing actor details text",r)}},OS=function(t){if(Array.isArray(t))t.forEach((function(t){OS(t)}));else switch(t.type){case"sequenceIndex":_S.push({from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":vS(t.actor,t.actor,t.description,"participant");break;case"addActor":vS(t.actor,t.actor,t.description,"actor");break;case"activeStart":case"activeEnd":kS(t.actor,void 0,void 0,t.signalType);break;case"addNote":ES(t.actor,t.placement,t.text);break;case"addLinks":SS(t.actor,t.text);break;case"addALink":!function(t,e){const n=wS(t);try{const t={};let s=Mb(e.text,hv());var i=s.indexOf("@");s=s.replace(/&/g,"&"),s=s.replace(/=/g,"=");var r=s.slice(0,i-1).trim(),a=s.slice(i+1).trim();t[r]=a,AS(n,t)}catch(s){Db.error("error while parsing actor link text",s)}}(t.actor,t.text);break;case"addProperties":DS(t.actor,t.text);break;case"addDetails":NS(t.actor,t.text);break;case"addMessage":kS(t.from,t.to,t.msg,t.signalType);break;case"loopStart":kS(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":case"rectEnd":case"optEnd":case"altEnd":case"parEnd":case"criticalEnd":case"breakEnd":kS(void 0,void 0,void 0,t.signalType);break;case"rectStart":kS(void 0,void 0,t.color,t.signalType);break;case"optStart":kS(void 0,void 0,t.optText,t.signalType);break;case"altStart":case"else":kS(void 0,void 0,t.altText,t.signalType);break;case"setAccTitle":Xv(t.text);break;case"parStart":case"and":kS(void 0,void 0,t.parText,t.signalType);break;case"criticalStart":kS(void 0,void 0,t.criticalText,t.signalType);break;case"option":kS(void 0,void 0,t.optionText,t.signalType);break;case"breakStart":kS(void 0,void 0,t.breakText,t.signalType)}},BS={addActor:vS,addMessage:function(t,e,n,i){_S.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,answer:i})},addSignal:kS,addLinks:SS,addDetails:NS,addProperties:DS,autoWrap:TS,setWrap:function(t){mS=t},enableSequenceNumbers:function(){xS=!0},disableSequenceNumbers:function(){xS=!1},showSequenceNumbers:()=>xS,getMessages:function(){return _S},getActors:function(){return bS},getActor:wS,getActorKeys:function(){return Object.keys(bS)},getActorProperty:function(t,e){if(void 0!==t&&void 0!==t.properties)return t.properties[e]},getAccTitle:Zv,getDiagramTitle:tk,setDiagramTitle:Jv,parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().sequence,clear:function(){bS={},_S=[],xS=!1,Gv()},parseMessage:function(t){const e=t.trim(),n={text:e.replace(/^:?(?:no)?wrap:/,"").trim(),wrap:null!==e.match(/^:?wrap:/)||null===e.match(/^:?nowrap:/)&&void 0};return Db.debug("parseMessage:",n),n},LINETYPE:CS,ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},addNote:ES,setAccTitle:Xv,apply:OS,setAccDescription:Qv,getAccDescription:Kv};let MS=[];const IS=()=>{MS.forEach((t=>{t()})),MS=[]},FS=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},RS=(t,e)=>{var n;n=()=>{const n=document.querySelectorAll(t);0!==n.length&&(n[0].addEventListener("mouseover",(function(){jS("actor"+e+"_popup")})),n[0].addEventListener("mouseout",(function(){YS("actor"+e+"_popup")})))},MS.push(n)},$S=function(t,e,n,i){const r=t.append("image");r.attr("x",e),r.attr("y",n);var a=(0,xt.N)(i);r.attr("xlink:href",a)},PS=function(t,e,n,i){const r=t.append("use");r.attr("x",e),r.attr("y",n);var a=(0,xt.N)(i);r.attr("xlink:href","#"+a)},jS=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="block")},YS=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="none")},zS=function(t,e){let n=0,i=0;const r=e.text.split(jb.lineBreakRegex);let a=[],s=0,o=()=>e.y;if(void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0)switch(e.valign){case"top":case"start":o=()=>Math.round(e.y+e.textMargin);break;case"middle":case"center":o=()=>Math.round(e.y+(n+i+e.textMargin)/2);break;case"bottom":case"end":o=()=>Math.round(e.y+(n+i+2*e.textMargin)-e.textMargin)}if(void 0!==e.anchor&&void 0!==e.textMargin&&void 0!==e.width)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle"}for(let[c,l]of r.entries()){void 0!==e.textMargin&&0===e.textMargin&&void 0!==e.fontSize&&(s=c*e.fontSize);const r=t.append("text");if(r.attr("x",e.x),r.attr("y",o()),void 0!==e.anchor&&r.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),void 0!==e.fontFamily&&r.style("font-family",e.fontFamily),void 0!==e.fontSize&&r.style("font-size",e.fontSize),void 0!==e.fontWeight&&r.style("font-weight",e.fontWeight),void 0!==e.fill&&r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class),void 0!==e.dy?r.attr("dy",e.dy):0!==s&&r.attr("dy",s),e.tspan){const t=r.append("tspan");t.attr("x",e.x),void 0!==e.fill&&t.attr("fill",e.fill),t.text(l)}else r.text(l);void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0&&(i+=(r._groups||r)[0][0].getBBox().height,n=i),a.push(r)}return a},US=function(t,e){const n=t.append("polygon");var i,r,a,s,o;return n.attr("points",(i=e.x,r=e.y,a=e.width,s=e.height,i+","+r+" "+(i+a)+","+r+" "+(i+a)+","+(r+s-(o=7))+" "+(i+a-1.2*o)+","+(r+s)+" "+i+","+(r+s))),n.attr("class","labelBox"),e.y=e.y+e.height/2,zS(t,e),n};let WS=-1;const HS=(t,e)=>{t.selectAll&&t.selectAll(".actor-line").attr("class","200").attr("y2",e-55)},qS=function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},VS=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},GS=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c;let d=l&&l.replace?l.replace("px",""):l;const p=t.split(jb.lineBreakRegex);for(let f=0;f<p.length;f++){const t=f*d-d*(p.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").style("font-size",l).style("font-weight",u).style("font-family",h);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(p[f]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),XS=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c,d=t.split(jb.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,a=e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").style("font-size",l).style("font-weight",u).style("font-family",h);a.append("tspan").attr("x",n).attr("dy",t).text(d[p]),a.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(a,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,0,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),ZS={drawRect:FS,drawText:zS,drawLabel:US,drawActor:function(t,e,n){switch(e.type){case"actor":return function(t,e,n){const i=e.x+e.width/2;0===e.y&&(WS++,t.append("line").attr("id","actor"+WS).attr("x1",i).attr("y1",80).attr("x2",i).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"));const r=t.append("g");r.attr("class","actor-man");const a=VS();a.x=e.x,a.y=e.y,a.fill="#eaeaea",a.width=e.width,a.height=e.height,a.class="actor",a.rx=3,a.ry=3,r.append("line").attr("id","actor-man-torso"+WS).attr("x1",i).attr("y1",e.y+25).attr("x2",i).attr("y2",e.y+45),r.append("line").attr("id","actor-man-arms"+WS).attr("x1",i-18).attr("y1",e.y+33).attr("x2",i+18).attr("y2",e.y+33),r.append("line").attr("x1",i-18).attr("y1",e.y+60).attr("x2",i).attr("y2",e.y+45),r.append("line").attr("x1",i).attr("y1",e.y+45).attr("x2",i+16).attr("y2",e.y+60);const s=r.append("circle");s.attr("cx",e.x+e.width/2),s.attr("cy",e.y+10),s.attr("r",15),s.attr("width",e.width),s.attr("height",e.height);const o=r.node().getBBox();return e.height=o.height,GS(n)(e.description,r,a.x,a.y+35,a.width,a.height,{class:"actor"},n),e.height}(t,e,n);case"participant":return function(t,e,n){const i=e.x+e.width/2,r=t.append("g");var a=r;0===e.y&&(WS++,a.append("line").attr("id","actor"+WS).attr("x1",i).attr("y1",5).attr("x2",i).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"),a=r.append("g"),e.actorCnt=WS,null!=e.links&&(a.attr("id","root-"+WS),RS("#root-"+WS,WS)));const s=VS();var o="actor";null!=e.properties&&e.properties.class?o=e.properties.class:s.fill="#eaeaea",s.x=e.x,s.y=e.y,s.width=e.width,s.height=e.height,s.class=o,s.rx=3,s.ry=3;const c=FS(a,s);if(e.rectData=s,null!=e.properties&&e.properties.icon){const t=e.properties.icon.trim();"@"===t.charAt(0)?PS(a,s.x+s.width-20,s.y+10,t.substr(1)):$S(a,s.x+s.width-20,s.y+10,t)}GS(n)(e.description,a,s.x,s.y,s.width,s.height,{class:"actor"},n);let l=e.height;if(c.node){const t=c.node().getBBox();e.height=t.height,l=t.height}return l}(t,e,n)}},drawPopup:function(t,e,n,i,r){if(void 0===e.links||null===e.links||0===Object.keys(e.links).length)return{height:0,width:0};const a=e.links,s=e.actorCnt,o=e.rectData;var c="none";r&&(c="block !important");const l=t.append("g");l.attr("id","actor"+s+"_popup"),l.attr("class","actorPopupMenu"),l.attr("display",c),RS("#actor"+s+"_popup",s);var h="";void 0!==o.class&&(h=" "+o.class);let u=o.width>n?o.width:n;const d=l.append("rect");if(d.attr("class","actorPopupMenuPanel"+h),d.attr("x",o.x),d.attr("y",o.height),d.attr("fill",o.fill),d.attr("stroke",o.stroke),d.attr("width",u),d.attr("height",o.height),d.attr("rx",o.rx),d.attr("ry",o.ry),null!=a){var p=20;for(let t in a){var f=l.append("a"),g=(0,xt.N)(a[t]);f.attr("xlink:href",g),f.attr("target","_blank"),XS(i)(t,f,o.x+10,o.height+p,u,20,{class:"actor"},i),p+=30}}return d.attr("height",p),{height:o.height+p,width:u}},drawImage:$S,drawEmbeddedImage:PS,anchorElement:function(t){return t.append("g")},drawActivation:function(t,e,n,i,r){const a=VS(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+r%3,a.width=e.stopx-e.startx,a.height=n-e.starty,FS(s,a)},drawLoop:function(t,e,n,i){const{boxMargin:r,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:o,messageFontFamily:c,messageFontSize:l,messageFontWeight:h}=i,u=t.append("g"),d=function(t,e,n,i){return u.append("line").attr("x1",t).attr("y1",e).attr("x2",n).attr("y2",i).attr("class","loopLine")};d(e.startx,e.starty,e.stopx,e.starty),d(e.stopx,e.starty,e.stopx,e.stopy),d(e.startx,e.stopy,e.stopx,e.stopy),d(e.startx,e.starty,e.startx,e.stopy),void 0!==e.sections&&e.sections.forEach((function(t){d(e.startx,t.y,e.stopx,t.y).style("stroke-dasharray","3, 3")}));let p=qS();p.text=n,p.x=e.startx,p.y=e.starty,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.anchor="middle",p.valign="middle",p.tspan=!1,p.width=o||50,p.height=s||20,p.textMargin=a,p.class="labelText",US(u,p),p=qS(),p.text=e.title,p.x=e.startx+o/2+(e.stopx-e.startx)/2,p.y=e.starty+r+a,p.anchor="middle",p.valign="middle",p.textMargin=a,p.class="loopText",p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=!0;let f=zS(u,p);return void 0!==e.sectionTitles&&e.sectionTitles.forEach((function(t,n){if(t.message){p.text=t.message,p.x=e.startx+(e.stopx-e.startx)/2,p.y=e.sections[n].y+r+a,p.class="loopText",p.anchor="middle",p.valign="middle",p.tspan=!1,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=e.wrap,f=zS(u,p);let i=Math.round(f.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));e.sections[n].height+=i-(r+a)}})),e.height=Math.round(e.stopy-e.starty),u},drawBackgroundRect:function(t,e){FS(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},insertArrowHead:function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},insertArrowFilledHead:function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},insertSequenceNumber:function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},insertArrowCrossHead:function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},insertDatabaseIcon:function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},insertComputerIcon:function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},insertClockIcon:function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},getTextObj:qS,getNoteRect:VS,popupMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'block'; }"},popdownMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'none'; }"},fixLifeLineHeights:HS,sanitizeUrl:xt.N};let QS={};const KS={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:function(){return Math.max.apply(null,0===this.actors.length?[0]:this.actors.map((t=>t.height||0)))+(0===this.loops.length?0:this.loops.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.messages.length?0:this.messages.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.notes.length?0:this.notes.map((t=>t.height||0)).reduce(((t,e)=>t+e)))},clear:function(){this.actors=[],this.loops=[],this.messages=[],this.notes=[]},addActor:function(t){this.actors.push(t)},addLoop:function(t){this.loops.push(t)},addMessage:function(t){this.messages.push(t)},addNote:function(t){this.notes.push(t)},lastActor:function(){return this.actors[this.actors.length-1]},lastLoop:function(){return this.loops[this.loops.length-1]},lastMessage:function(){return this.messages[this.messages.length-1]},lastNote:function(){return this.notes[this.notes.length-1]},actors:[],loops:[],messages:[],notes:[]},init:function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,rA(hv())},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=this;let a=0;function s(s){return function(o){a++;const c=r.sequenceItems.length-a+1;r.updateVal(o,"starty",e-c*QS.boxMargin,Math.min),r.updateVal(o,"stopy",i+c*QS.boxMargin,Math.max),r.updateVal(KS.data,"startx",t-c*QS.boxMargin,Math.min),r.updateVal(KS.data,"stopx",n+c*QS.boxMargin,Math.max),"activation"!==s&&(r.updateVal(o,"startx",t-c*QS.boxMargin,Math.min),r.updateVal(o,"stopx",n+c*QS.boxMargin,Math.max),r.updateVal(KS.data,"starty",e-c*QS.boxMargin,Math.min),r.updateVal(KS.data,"stopy",i+c*QS.boxMargin,Math.max))}}this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal(KS.data,"startx",r,Math.min),this.updateVal(KS.data,"starty",s,Math.min),this.updateVal(KS.data,"stopx",a,Math.max),this.updateVal(KS.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},newActivation:function(t,e,n){const i=n[t.from.actor],r=aA(t.from.actor).length||0,a=i.x+i.width/2+(r-1)*QS.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+QS.activationWidth,stopy:void 0,actor:t.from.actor,anchored:ZS.anchorElement(e)})},endActivation:function(t){const e=this.activations.map((function(t){return t.actor})).lastIndexOf(t.from.actor);return this.activations.splice(e,1)[0]},createLoop:function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},newLoop:function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},endLoop:function(){return this.sequenceItems.pop()},addSectionToLoop:function(t){const e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:KS.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return{bounds:this.data,models:this.models}}},JS=t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),tA=t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),eA=t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight});const nA=function(t,e,n,i,r,a){if(!0===r.hideUnusedParticipants){const t=new Set;a.forEach((e=>{t.add(e.from),t.add(e.to)})),n=n.filter((e=>t.has(e)))}let s=0,o=0,c=0;for(const l of n){const n=e[l];n.width=n.width||QS.width,n.height=Math.max(n.height||QS.height,QS.height),n.margin=n.margin||QS.actorMargin,n.x=s+o,n.y=i;const r=ZS.drawActor(t,n,QS);c=Math.max(c,r),KS.insert(n.x,i,n.x+n.width,n.height),s+=n.width,o+=n.margin,KS.models.addActor(n)}KS.bumpVerticalPos(c)},iA=function(t,e,n,i){let r=0,a=0;for(const s of n){const n=e[s],o=cA(n),c=ZS.drawPopup(t,n,o,QS,QS.forceMenus,i);c.height>r&&(r=c.height),c.width+n.x>a&&(a=c.width+n.x)}return{maxHeight:r,maxWidth:a}},rA=function(t){Bx(QS,t),t.fontFamily&&(QS.actorFontFamily=QS.noteFontFamily=QS.messageFontFamily=t.fontFamily),t.fontSize&&(QS.actorFontSize=QS.noteFontSize=QS.messageFontSize=t.fontSize),t.fontWeight&&(QS.actorFontWeight=QS.noteFontWeight=QS.messageFontWeight=t.fontWeight)},aA=function(t){return KS.activations.filter((function(e){return e.actor===t}))},sA=function(t,e){const n=e[t],i=aA(t);return[i.reduce((function(t,e){return Math.min(t,e.startx)}),n.x+n.width/2),i.reduce((function(t,e){return Math.max(t,e.stopx)}),n.x+n.width/2)]};function oA(t,e,n,i,r){KS.bumpVerticalPos(n);let a=i;if(e.id&&e.message&&t[e.id]){const n=t[e.id].width,r=JS(QS);e.message=tv.wrapLabel(`[${e.message}]`,n-2*QS.wrapPadding,r),e.width=n,e.wrap=!0;const s=tv.calculateTextDimensions(e.message,r),o=Math.max(s.height,QS.labelBoxHeight);a=i+o,Db.debug(`${o} - ${e.message}`)}r(e),KS.bumpVerticalPos(a)}const cA=function(t){let e=0;const n=eA(QS);for(const i in t.links){const t=tv.calculateTextDimensions(i,n).width+2*QS.wrapPadding+2*QS.boxMargin;e<t&&(e=t)}return e};const lA=function(t,e,n,i){const r={},a=[];let s,o,c;return t.forEach((function(t){switch(t.id=tv.random({length:10}),t.type){case i.db.LINETYPE.LOOP_START:case i.db.LINETYPE.ALT_START:case i.db.LINETYPE.OPT_START:case i.db.LINETYPE.PAR_START:case i.db.LINETYPE.CRITICAL_START:case i.db.LINETYPE.BREAK_START:a.push({id:t.id,msg:t.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case i.db.LINETYPE.ALT_ELSE:case i.db.LINETYPE.PAR_AND:case i.db.LINETYPE.CRITICAL_OPTION:t.message&&(s=a.pop(),r[s.id]=s,r[t.id]=s,a.push(s));break;case i.db.LINETYPE.LOOP_END:case i.db.LINETYPE.ALT_END:case i.db.LINETYPE.OPT_END:case i.db.LINETYPE.PAR_END:case i.db.LINETYPE.CRITICAL_END:case i.db.LINETYPE.BREAK_END:s=a.pop(),r[s.id]=s;break;case i.db.LINETYPE.ACTIVE_START:{const n=e[t.from?t.from.actor:t.to.actor],i=aA(t.from?t.from.actor:t.to.actor).length,r=n.x+n.width/2+(i-1)*QS.activationWidth/2,a={startx:r,stopx:r+QS.activationWidth,actor:t.from.actor,enabled:!0};KS.activations.push(a)}break;case i.db.LINETYPE.ACTIVE_END:{const e=KS.activations.map((t=>t.actor)).lastIndexOf(t.from.actor);delete KS.activations.splice(e,1)[0]}}void 0!==t.placement?(o=function(t,e,n){const i=e[t.from].x,r=e[t.to].x,a=t.wrap&&t.message;let s=tv.calculateTextDimensions(a?tv.wrapLabel(t.message,QS.width,tA(QS)):t.message,tA(QS));const o={width:a?QS.width:Math.max(QS.width,s.width+2*QS.noteMargin),height:0,startx:e[t.from].x,stopx:0,starty:0,stopy:0,message:t.message};return t.placement===n.db.PLACEMENT.RIGHTOF?(o.width=a?Math.max(QS.width,s.width):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*QS.noteMargin),o.startx=i+(e[t.from].width+QS.actorMargin)/2):t.placement===n.db.PLACEMENT.LEFTOF?(o.width=a?Math.max(QS.width,s.width+2*QS.noteMargin):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*QS.noteMargin),o.startx=i-o.width+(e[t.from].width-QS.actorMargin)/2):t.to===t.from?(s=tv.calculateTextDimensions(a?tv.wrapLabel(t.message,Math.max(QS.width,e[t.from].width),tA(QS)):t.message,tA(QS)),o.width=a?Math.max(QS.width,e[t.from].width):Math.max(e[t.from].width,QS.width,s.width+2*QS.noteMargin),o.startx=i+(e[t.from].width-o.width)/2):(o.width=Math.abs(i+e[t.from].width/2-(r+e[t.to].width/2))+QS.actorMargin,o.startx=i<r?i+e[t.from].width/2-QS.actorMargin/2:r+e[t.to].width/2-QS.actorMargin/2),a&&(o.message=tv.wrapLabel(t.message,o.width-2*QS.wrapPadding,tA(QS))),Db.debug(`NM:[${o.startx},${o.stopx},${o.starty},${o.stopy}:${o.width},${o.height}=${t.message}]`),o}(t,e,i),t.noteModel=o,a.forEach((t=>{s=t,s.from=Math.min(s.from,o.startx),s.to=Math.max(s.to,o.startx+o.width),s.width=Math.max(s.width,Math.abs(s.from-s.to))-QS.labelBoxWidth}))):(c=function(t,e,n){let i=!1;if([n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(i=!0),!i)return{};const r=sA(t.from,e),a=sA(t.to,e),s=r[0]<=a[0]?1:0,o=r[0]<a[0]?0:1,c=[...r,...a],l=Math.abs(a[o]-r[s]);t.wrap&&t.message&&(t.message=tv.wrapLabel(t.message,Math.max(l+2*QS.wrapPadding,QS.width),JS(QS)));const h=tv.calculateTextDimensions(t.message,JS(QS));return{width:Math.max(t.wrap?0:h.width+2*QS.wrapPadding,l+2*QS.wrapPadding,QS.width),height:0,startx:r[s],stopx:a[o],starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,c),toBounds:Math.max.apply(null,c)}}(t,e,i),t.msgModel=c,c.startx&&c.stopx&&a.length>0&&a.forEach((n=>{if(s=n,c.startx===c.stopx){const n=e[t.from],i=e[t.to];s.from=Math.min(n.x-c.width/2,n.x-n.width/2,s.from),s.to=Math.max(i.x+c.width/2,i.x+n.width/2,s.to),s.width=Math.max(s.width,Math.abs(s.to-s.from))-QS.labelBoxWidth}else s.from=Math.min(c.startx,s.from),s.to=Math.max(c.stopx,s.to),s.width=Math.max(s.width,c.width)-QS.labelBoxWidth})))})),KS.activations=[],Db.debug("Loop type widths:",r),r},hA={bounds:KS,drawActors:nA,drawActorsPopup:iA,setConf:rA,draw:function(t,e,n,i){const{securityLevel:r,sequence:a}=hv();let s;QS=a,"sandbox"===r&&(s=Ho("#i"+e));const o=Ho("sandbox"===r?s.nodes()[0].contentDocument.body:"body"),c="sandbox"===r?s.nodes()[0].contentDocument:document;KS.init(),Db.debug(i.db);const l="sandbox"===r?o.select(`[id="${e}"]`):Ho(`[id="${e}"]`),h=i.db.getActors(),u=i.db.getActorKeys(),d=i.db.getMessages(),p=i.db.getDiagramTitle(),f=function(t,e,n){const i={};return e.forEach((function(e){if(t[e.to]&&t[e.from]){const r=t[e.to];if(e.placement===n.db.PLACEMENT.LEFTOF&&!r.prevActor)return;if(e.placement===n.db.PLACEMENT.RIGHTOF&&!r.nextActor)return;const a=void 0!==e.placement,s=!a,o=a?tA(QS):JS(QS),c=e.wrap?tv.wrapLabel(e.message,QS.width-2*QS.wrapPadding,o):e.message,l=tv.calculateTextDimensions(c,o).width+2*QS.wrapPadding;s&&e.from===r.nextActor?i[e.to]=Math.max(i[e.to]||0,l):s&&e.from===r.prevActor?i[e.from]=Math.max(i[e.from]||0,l):s&&e.from===e.to?(i[e.from]=Math.max(i[e.from]||0,l/2),i[e.to]=Math.max(i[e.to]||0,l/2)):e.placement===n.db.PLACEMENT.RIGHTOF?i[e.from]=Math.max(i[e.from]||0,l):e.placement===n.db.PLACEMENT.LEFTOF?i[r.prevActor]=Math.max(i[r.prevActor]||0,l):e.placement===n.db.PLACEMENT.OVER&&(r.prevActor&&(i[r.prevActor]=Math.max(i[r.prevActor]||0,l/2)),r.nextActor&&(i[e.from]=Math.max(i[e.from]||0,l/2)))}})),Db.debug("maxMessageWidthPerActor:",i),i}(h,d,i);QS.height=function(t,e){let n=0;Object.keys(t).forEach((e=>{const i=t[e];i.wrap&&(i.description=tv.wrapLabel(i.description,QS.width-2*QS.wrapPadding,eA(QS)));const r=tv.calculateTextDimensions(i.description,eA(QS));i.width=i.wrap?QS.width:Math.max(QS.width,r.width+2*QS.wrapPadding),i.height=i.wrap?Math.max(r.height,QS.height):QS.height,n=Math.max(n,i.height)}));for(const i in e){const n=t[i];if(!n)continue;const r=t[n.nextActor];if(!r)continue;const a=e[i]+QS.actorMargin-n.width/2-r.width/2;n.margin=Math.max(a,QS.actorMargin)}return Math.max(n,QS.height)}(h,f),ZS.insertComputerIcon(l),ZS.insertDatabaseIcon(l),ZS.insertClockIcon(l),nA(l,h,u,0,QS,d);const g=lA(d,h,f,i);ZS.insertArrowHead(l),ZS.insertArrowCrossHead(l),ZS.insertArrowFilledHead(l),ZS.insertSequenceNumber(l);let y=1,m=1;const b=[];d.forEach((function(t){let e,n,r;switch(t.type){case i.db.LINETYPE.NOTE:n=t.noteModel,function(t,e){KS.bumpVerticalPos(QS.boxMargin),e.height=QS.boxMargin,e.starty=KS.getVerticalPos();const n=ZS.getNoteRect();n.x=e.startx,n.y=e.starty,n.width=e.width||QS.width,n.class="note";const i=t.append("g"),r=ZS.drawRect(i,n),a=ZS.getTextObj();a.x=e.startx,a.y=e.starty,a.width=n.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=QS.noteFontFamily,a.fontSize=QS.noteFontSize,a.fontWeight=QS.noteFontWeight,a.anchor=QS.noteAlign,a.textMargin=QS.noteMargin,a.valign="center";const s=zS(i,a),o=Math.round(s.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));r.attr("height",o+2*QS.noteMargin),e.height+=o+2*QS.noteMargin,KS.bumpVerticalPos(o+2*QS.noteMargin),e.stopy=e.starty+o+2*QS.noteMargin,e.stopx=e.startx+n.width,KS.insert(e.startx,e.starty,e.stopx,e.stopy),KS.models.addNote(e)}(l,n);break;case i.db.LINETYPE.ACTIVE_START:KS.newActivation(t,l,h);break;case i.db.LINETYPE.ACTIVE_END:!function(t,e){const n=KS.endActivation(t);n.starty+18>e&&(n.starty=e-6,e+=12),ZS.drawActivation(l,n,e,QS,aA(t.from.actor).length),KS.insert(n.startx,e-10,n.stopx,e)}(t,KS.getVerticalPos());break;case i.db.LINETYPE.LOOP_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.LOOP_END:e=KS.endLoop(),ZS.drawLoop(l,e,"loop",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.RECT_START:oA(g,t,QS.boxMargin,QS.boxMargin,(t=>KS.newLoop(void 0,t.message)));break;case i.db.LINETYPE.RECT_END:e=KS.endLoop(),ZS.drawBackgroundRect(l,e),KS.models.addLoop(e),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos());break;case i.db.LINETYPE.OPT_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.OPT_END:e=KS.endLoop(),ZS.drawLoop(l,e,"opt",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.ALT_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.ALT_ELSE:oA(g,t,QS.boxMargin+QS.boxTextMargin,QS.boxMargin,(t=>KS.addSectionToLoop(t)));break;case i.db.LINETYPE.ALT_END:e=KS.endLoop(),ZS.drawLoop(l,e,"alt",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.PAR_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.PAR_AND:oA(g,t,QS.boxMargin+QS.boxTextMargin,QS.boxMargin,(t=>KS.addSectionToLoop(t)));break;case i.db.LINETYPE.PAR_END:e=KS.endLoop(),ZS.drawLoop(l,e,"par",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.AUTONUMBER:y=t.message.start||y,m=t.message.step||m,t.message.visible?i.db.enableSequenceNumbers():i.db.disableSequenceNumbers();break;case i.db.LINETYPE.CRITICAL_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.CRITICAL_OPTION:oA(g,t,QS.boxMargin+QS.boxTextMargin,QS.boxMargin,(t=>KS.addSectionToLoop(t)));break;case i.db.LINETYPE.CRITICAL_END:e=KS.endLoop(),ZS.drawLoop(l,e,"critical",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.BREAK_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.BREAK_END:e=KS.endLoop(),ZS.drawLoop(l,e,"break",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;default:try{r=t.msgModel,r.starty=KS.getVerticalPos(),r.sequenceIndex=y,r.sequenceVisible=i.db.showSequenceNumbers();const e=function(t,e){KS.bumpVerticalPos(10);const{startx:n,stopx:i,message:r}=e,a=jb.splitBreaks(r).length,s=tv.calculateTextDimensions(r,JS(QS)),o=s.height/a;let c;e.height+=o,KS.bumpVerticalPos(o);let l=s.height-10;const h=s.width;if(n===i){c=KS.getVerticalPos()+l,QS.rightAngles||(l+=QS.boxMargin,c=KS.getVerticalPos()+l),l+=30;const t=Math.max(h/2,QS.width/2);KS.insert(n-t,KS.getVerticalPos()-10+l,i+t,KS.getVerticalPos()+30+l)}else l+=QS.boxMargin,c=KS.getVerticalPos()+l,KS.insert(n,c-10,i,c);return KS.bumpVerticalPos(l),e.height+=l,e.stopy=e.starty+e.height,KS.insert(e.fromBounds,e.starty,e.toBounds,e.stopy),c}(0,r);b.push({messageModel:r,lineStartY:e}),KS.models.addMessage(r)}catch(a){Db.error("error while drawing message",a)}}[i.db.LINETYPE.SOLID_OPEN,i.db.LINETYPE.DOTTED_OPEN,i.db.LINETYPE.SOLID,i.db.LINETYPE.DOTTED,i.db.LINETYPE.SOLID_CROSS,i.db.LINETYPE.DOTTED_CROSS,i.db.LINETYPE.SOLID_POINT,i.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(y+=m)})),b.forEach((t=>function(t,e,n,i){const{startx:r,stopx:a,starty:s,message:o,type:c,sequenceIndex:l,sequenceVisible:h}=e,u=tv.calculateTextDimensions(o,JS(QS)),d=ZS.getTextObj();d.x=r,d.y=s+10,d.width=a-r,d.class="messageText",d.dy="1em",d.text=o,d.fontFamily=QS.messageFontFamily,d.fontSize=QS.messageFontSize,d.fontWeight=QS.messageFontWeight,d.anchor=QS.messageAlign,d.valign="center",d.textMargin=QS.wrapPadding,d.tspan=!1,zS(t,d);const p=u.width;let f;r===a?f=QS.rightAngles?t.append("path").attr("d",`M ${r},${n} H ${r+Math.max(QS.width/2,p/2)} V ${n+25} H ${r}`):t.append("path").attr("d","M "+r+","+n+" C "+(r+60)+","+(n-10)+" "+(r+60)+","+(n+30)+" "+r+","+(n+20)):(f=t.append("line"),f.attr("x1",r),f.attr("y1",n),f.attr("x2",a),f.attr("y2",n)),c===i.db.LINETYPE.DOTTED||c===i.db.LINETYPE.DOTTED_CROSS||c===i.db.LINETYPE.DOTTED_POINT||c===i.db.LINETYPE.DOTTED_OPEN?(f.style("stroke-dasharray","3, 3"),f.attr("class","messageLine1")):f.attr("class","messageLine0");let g="";QS.arrowMarkerAbsolute&&(g=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,g=g.replace(/\(/g,"\\("),g=g.replace(/\)/g,"\\)")),f.attr("stroke-width",2),f.attr("stroke","none"),f.style("fill","none"),c!==i.db.LINETYPE.SOLID&&c!==i.db.LINETYPE.DOTTED||f.attr("marker-end","url("+g+"#arrowhead)"),c!==i.db.LINETYPE.SOLID_POINT&&c!==i.db.LINETYPE.DOTTED_POINT||f.attr("marker-end","url("+g+"#filled-head)"),c!==i.db.LINETYPE.SOLID_CROSS&&c!==i.db.LINETYPE.DOTTED_CROSS||f.attr("marker-end","url("+g+"#crosshead)"),(h||QS.showSequenceNumbers)&&(f.attr("marker-start","url("+g+"#sequencenumber)"),t.append("text").attr("x",r).attr("y",n+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(l))}(l,t.messageModel,t.lineStartY,i))),QS.mirrorActors&&(KS.bumpVerticalPos(2*QS.boxMargin),nA(l,h,u,KS.getVerticalPos(),QS,d),KS.bumpVerticalPos(QS.boxMargin),HS(l,KS.getVerticalPos()));const _=iA(l,h,u,c),{bounds:x}=KS.getBounds();Db.debug("For line height fix Querying: #"+e+" .actor-line");qo("#"+e+" .actor-line").attr("y2",x.stopy);let v=x.stopy-x.starty;v<_.maxHeight&&(v=_.maxHeight);let k=v+2*QS.diagramMarginY;QS.mirrorActors&&(k=k-QS.boxMargin+QS.bottomMarginAdj);let w=x.stopx-x.startx;w<_.maxWidth&&(w=_.maxWidth);const T=w+2*QS.diagramMarginX;p&&l.append("text").text(p).attr("x",(x.stopx-x.startx)/2-2*QS.diagramMarginX).attr("y",-25),mv(l,k,T,QS.useMaxWidth);const C=p?40:0;l.attr("viewBox",x.startx-QS.diagramMarginX+" -"+(QS.diagramMarginY+C)+" "+T+" "+(k+C)),Db.debug("models:",KS.models)}};var uA=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,21],h=[1,22],u=[1,23],d=[1,24],p=[1,37],f=[1,25],g=[1,26],y=[1,27],m=[1,28],b=[1,29],_=[1,32],x=[1,33],v=[1,34],k=[1,35],w=[1,36],T=[1,39],C=[1,40],E=[1,41],S=[1,42],A=[1,38],D=[1,45],L=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],N=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],O=[1,4,5,7,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],B=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],M={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,directive:6,SD:7,document:8,line:9,statement:10,classDefStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"--\x3e":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,class:42,CLASSENTITY_IDS:43,STYLECLASS:44,openDirective:45,typeDirective:46,closeDirective:47,":":48,argDirective:49,direction_tb:50,direction_bt:51,direction_rl:52,direction_lr:53,eol:54,";":55,EDGE_STATE:56,STYLE_SEPARATOR:57,left_of:58,right_of:59,open_directive:60,type_directive:61,arg_directive:62,close_directive:63,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",7:"SD",14:"DESCR",15:"--\x3e",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"class",43:"CLASSENTITY_IDS",44:"STYLECLASS",48:":",50:"direction_tb",51:"direction_bt",52:"direction_rl",53:"direction_lr",55:";",56:"EDGE_STATE",57:"STYLE_SEPARATOR",58:"left_of",59:"right_of",60:"open_directive",61:"type_directive",62:"arg_directive",63:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[10,1],[10,2],[10,2],[10,1],[11,3],[11,3],[12,3],[6,3],[6,5],[32,1],[32,1],[32,1],[32,1],[54,1],[54,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1],[45,1],[46,1],[49,1],[47,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.setRootDoc(a[o]),a[o];case 5:this.$=[];break;case 6:"nl"!=a[o]&&(a[o-1].push(a[o]),this.$=a[o-1]);break;case 7:case 8:case 12:this.$=a[o];break;case 9:this.$="nl";break;case 13:const t=a[o-1];t.description=i.trimColon(a[o]),this.$=t;break;case 14:this.$={stmt:"relation",state1:a[o-2],state2:a[o]};break;case 15:const e=i.trimColon(a[o]);this.$={stmt:"relation",state1:a[o-3],state2:a[o-1],description:e};break;case 19:this.$={stmt:"state",id:a[o-3],type:"default",description:"",doc:a[o-1]};break;case 20:var c=a[o],l=a[o-2].trim();if(a[o].match(":")){var h=a[o].split(":");c=h[0],l=[l,h[1]]}this.$={stmt:"state",id:c,type:"default",description:l};break;case 21:this.$={stmt:"state",id:a[o-3],type:"default",description:a[o-5],doc:a[o-1]};break;case 22:this.$={stmt:"state",id:a[o],type:"fork"};break;case 23:this.$={stmt:"state",id:a[o],type:"join"};break;case 24:this.$={stmt:"state",id:a[o],type:"choice"};break;case 25:this.$={stmt:"state",id:i.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:a[o-1].trim(),note:{position:a[o-2].trim(),text:a[o].trim()}};break;case 30:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 33:case 34:this.$={stmt:"classDef",id:a[o-1].trim(),classes:a[o].trim()};break;case 35:this.$={stmt:"applyClass",id:a[o-1].trim(),styleClass:a[o].trim()};break;case 38:i.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:i.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:i.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:i.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:a[o].trim(),type:"default",description:""};break;case 46:case 47:this.$={stmt:"state",id:a[o-2].trim(),classes:[a[o].trim()],type:"default",description:""};break;case 50:i.parseDirective("%%{","open_directive");break;case 51:i.parseDirective(a[o],"type_directive");break;case 52:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 53:i.parseDirective("}%%","close_directive","state")}},table:[{3:1,4:n,5:i,6:4,7:r,45:6,60:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,45:6,60:a},{3:9,4:n,5:i,6:4,7:r,45:6,60:a},{3:10,4:n,5:i,6:4,7:r,45:6,60:a},e([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],s,{8:11}),{46:12,61:[1,13]},{61:[2,50]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},{47:43,48:[1,44],63:D},e([48,63],[2,51]),e(L,[2,6]),{6:30,10:46,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},e(L,[2,8]),e(L,[2,9]),e(L,[2,10]),e(L,[2,11]),e(L,[2,12],{14:[1,47],15:[1,48]}),e(L,[2,16]),{18:[1,49]},e(L,[2,18],{20:[1,50]}),{23:[1,51]},e(L,[2,22]),e(L,[2,23]),e(L,[2,24]),e(L,[2,25]),{30:52,31:[1,53],58:[1,54],59:[1,55]},e(L,[2,28]),e(L,[2,29]),{34:[1,56]},{36:[1,57]},e(L,[2,32]),{39:[1,58],41:[1,59]},{43:[1,60]},e(N,[2,44],{57:[1,61]}),e(N,[2,45],{57:[1,62]}),e(L,[2,38]),e(L,[2,39]),e(L,[2,40]),e(L,[2,41]),e(O,[2,36]),{49:63,62:[1,64]},e(O,[2,53]),e(L,[2,7]),e(L,[2,13]),{13:65,24:p,56:A},e(L,[2,17]),e(B,s,{8:66}),{24:[1,67]},{24:[1,68]},{23:[1,69]},{24:[2,48]},{24:[2,49]},e(L,[2,30]),e(L,[2,31]),{40:[1,70]},{40:[1,71]},{44:[1,72]},{24:[1,73]},{24:[1,74]},{47:75,63:D},{63:[2,52]},e(L,[2,14],{14:[1,76]}),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,77],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},e(L,[2,20],{20:[1,78]}),{31:[1,79]},{24:[1,80]},e(L,[2,33]),e(L,[2,34]),e(L,[2,35]),e(N,[2,46]),e(N,[2,47]),e(O,[2,37]),e(L,[2,15]),e(L,[2,19]),e(B,s,{8:81}),e(L,[2,26]),e(L,[2,27]),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,82],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},e(L,[2,21])],defaultActions:{7:[2,50],8:[2,1],9:[2,2],10:[2,3],54:[2,48],55:[2,49],64:[2,52]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},I=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 41;case 1:case 44:return 50;case 2:case 45:return 51;case 3:case 46:return 52;case 4:case 47:return 53;case 5:return this.begin("open_directive"),60;case 6:return this.begin("type_directive"),61;case 7:return this.popState(),this.begin("arg_directive"),48;case 8:return this.popState(),this.popState(),63;case 9:return 62;case 10:case 11:case 13:case 14:case 15:case 16:case 56:case 58:case 64:break;case 12:case 79:return 5;case 17:case 34:return this.pushState("SCALE"),17;case 18:case 35:return 18;case 19:case 25:case 36:case 51:case 54:this.popState();break;case 20:return this.begin("acc_title"),33;case 21:return this.popState(),"acc_title_value";case 22:return this.begin("acc_descr"),35;case 23:return this.popState(),"acc_descr_value";case 24:this.begin("acc_descr_multiline");break;case 26:return"acc_descr_multiline_value";case 27:return this.pushState("CLASSDEF"),38;case 28:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 29:return this.popState(),this.pushState("CLASSDEFID"),39;case 30:return this.popState(),40;case 31:return this.pushState("CLASS"),42;case 32:return this.popState(),this.pushState("CLASS_STYLE"),43;case 33:return this.popState(),44;case 37:this.pushState("STATE");break;case 38:case 41:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),25;case 39:case 42:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),26;case 40:case 43:return this.popState(),e.yytext=e.yytext.slice(0,-10).trim(),27;case 48:this.begin("STATE_STRING");break;case 49:return this.popState(),this.pushState("STATE_ID"),"AS";case 50:case 66:return this.popState(),"ID";case 52:return"STATE_DESCR";case 53:return 19;case 55:return this.popState(),this.pushState("struct"),20;case 57:return this.popState(),21;case 59:return this.begin("NOTE"),29;case 60:return this.popState(),this.pushState("NOTE_ID"),58;case 61:return this.popState(),this.pushState("NOTE_ID"),59;case 62:this.popState(),this.pushState("FLOATING_NOTE");break;case 63:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 65:return"NOTE_TEXT";case 67:return this.popState(),this.pushState("NOTE_TEXT"),24;case 68:return this.popState(),e.yytext=e.yytext.substr(2).trim(),31;case 69:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),31;case 70:case 71:return 7;case 72:return 16;case 73:return 56;case 74:return 24;case 75:return e.yytext=e.yytext.trim(),14;case 76:return 15;case 77:return 28;case 78:return 57;case 80:return"INVALID"}},rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<<fork>>)/i,/^(?:.*<<join>>)/i,/^(?:.*<<choice>>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[14,15],inclusive:!1},close_directive:{rules:[14,15],inclusive:!1},arg_directive:{rules:[8,9,14,15],inclusive:!1},type_directive:{rules:[7,8,14,15],inclusive:!1},open_directive:{rules:[6,14,15],inclusive:!1},struct:{rules:[14,15,27,31,37,44,45,46,47,56,57,58,59,73,74,75,76,77],inclusive:!1},FLOATING_NOTE_ID:{rules:[66],inclusive:!1},FLOATING_NOTE:{rules:[63,64,65],inclusive:!1},NOTE_TEXT:{rules:[68,69],inclusive:!1},NOTE_ID:{rules:[67],inclusive:!1},NOTE:{rules:[60,61,62],inclusive:!1},CLASS_STYLE:{rules:[33],inclusive:!1},CLASS:{rules:[32],inclusive:!1},CLASSDEFID:{rules:[30],inclusive:!1},CLASSDEF:{rules:[28,29],inclusive:!1},acc_descr_multiline:{rules:[25,26],inclusive:!1},acc_descr:{rules:[23],inclusive:!1},acc_title:{rules:[21],inclusive:!1},SCALE:{rules:[18,19,35,36],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[50],inclusive:!1},STATE_STRING:{rules:[51,52],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[14,15,38,39,40,41,42,43,48,49,53,54,55],inclusive:!1},ID:{rules:[14,15],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,10,11,12,13,15,16,17,20,22,24,27,31,34,37,55,59,70,71,72,73,74,75,76,78,79,80],inclusive:!0}}},t);function F(){this.yy={}}return M.lexer=I,F.prototype=M,M.Parser=F,new F}();uA.parser=uA;const dA=uA,pA=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*stateDiagram/)},fA=(t,e)=>{var n;return null!==t.match(/^\s*stateDiagram-v2/)||!(!t.match(/^\s*stateDiagram/)||"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer))},gA="state",yA="relation",mA="default",bA="divider",_A="[*]",xA="start",vA="color",kA="fill";let wA="LR",TA=[],CA={};let EA={root:{relations:[],states:{},documents:{}}},SA=EA.root,AA=0,DA=0;const LA=t=>JSON.parse(JSON.stringify(t)),NA=(t,e,n)=>{if(e.stmt===yA)NA(t,e.state1,!0),NA(t,e.state2,!1);else if(e.stmt===gA&&"[*]"===e.id&&(e.id=n?t.id+"_start":t.id+"_end",e.start=n),e.doc){const t=[];let n,i=[];for(n=0;n<e.doc.length;n++)if(e.doc[n].type===bA){const r=LA(e.doc[n]);r.doc=LA(i),t.push(r),i=[]}else i.push(e.doc[n]);if(t.length>0&&i.length>0){const n={stmt:gA,id:zx(),type:"divider",doc:LA(i)};t.push(LA(n)),e.doc=t}e.doc.forEach((t=>NA(e,t,!0)))}},OA=function(t,e="default",n=null,i=null,r=null,a=null,s=null,o=null){if(void 0===SA.states[t]?(Db.info("Adding state ",t,i),SA.states[t]={id:t,descriptions:[],type:e,doc:n,note:r,classes:[],styles:[],textStyles:[]}):(SA.states[t].doc||(SA.states[t].doc=n),SA.states[t].type||(SA.states[t].type=e)),i&&(Db.info("Setting state description",t,i),"string"==typeof i&&$A(t,i.trim()),"object"==typeof i&&i.forEach((e=>$A(t,e.trim())))),r&&(SA.states[t].note=r,SA.states[t].note.text=jb.sanitizeText(SA.states[t].note.text,hv())),a){Db.info("Setting state classes",t,a);("string"==typeof a?[a]:a).forEach((e=>jA(t,e.trim())))}if(s){Db.info("Setting state styles",t,s);("string"==typeof s?[s]:s).forEach((e=>YA(t,e.trim())))}if(o){Db.info("Setting state styles",t,s);("string"==typeof o?[o]:o).forEach((e=>zA(t,e.trim())))}},BA=function(t){EA={root:{relations:[],states:{},documents:{}}},SA=EA.root,AA=0,CA={},t||Gv()},MA=function(t){return SA.states[t]};function IA(t=""){let e=t;return t===_A&&(AA++,e=`start${AA}`),e}function FA(t="",e="default"){return t===_A?xA:e}const RA=function(t,e,n){if("object"==typeof t)!function(t,e,n){let i=IA(t.id),r=FA(t.id,t.type),a=IA(e.id),s=FA(e.id,e.type);OA(i,r,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),OA(a,s,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),SA.relations.push({id1:i,id2:a,relationTitle:jb.sanitizeText(n,hv())})}(t,e,n);else{const i=IA(t),r=FA(t),a=function(t=""){let e=t;return"[*]"===t&&(AA++,e=`end${AA}`),e}(e),s=function(t="",e="default"){return"[*]"===t?"end":e}(e);OA(i,r),OA(a,s),SA.relations.push({id1:i,id2:a,title:jb.sanitizeText(n,hv())})}},$A=function(t,e){const n=SA.states[t],i=e.startsWith(":")?e.replace(":","").trim():e;n.descriptions.push(jb.sanitizeText(i,hv()))},PA=function(t,e=""){void 0===CA[t]&&(CA[t]={id:t,styles:[],textStyles:[]});const n=CA[t];null!=e&&e.split(",").forEach((t=>{const e=t.replace(/([^;]*);/,"$1").trim();if(t.match(vA)){const t=e.replace(kA,"bgFill").replace(vA,kA);n.textStyles.push(t)}n.styles.push(e)}))},jA=function(t,e){t.split(",").forEach((function(t){let n=MA(t);if(void 0===n){const e=t.trim();OA(e),n=MA(e)}n.classes.push(e)}))},YA=function(t,e){const n=MA(t);void 0!==n&&n.textStyles.push(e)},zA=function(t,e){const n=MA(t);void 0!==n&&n.textStyles.push(e)},UA={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().state,addState:OA,clear:BA,getState:MA,getStates:function(){return SA.states},getRelations:function(){return SA.relations},getClasses:function(){return CA},getDirection:()=>wA,addRelation:RA,getDividerId:()=>(DA++,"divider-id-"+DA),setDirection:t=>{wA=t},cleanupLabel:function(t){return":"===t.substring(0,1)?t.substr(2).trim():t.trim()},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3},logDocuments:function(){Db.info("Documents = ",EA)},getRootDoc:()=>TA,setRootDoc:t=>{Db.info("Setting root doc",t),TA=t},getRootDocV2:()=>(NA({id:"root"},{id:"root",doc:TA},!0),{id:"root",doc:TA}),extract:t=>{let e;e=t.doc?t.doc:t,Db.info(e),BA(!0),Db.info("Extract",e),e.forEach((t=>{switch(t.stmt){case gA:OA(t.id,t.type,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles);break;case yA:RA(t.state1,t.state2,t.description);break;case"classDef":PA(t.id,t.classes);break;case"applyClass":jA(t.id,t.styleClass)}}))},trimColon:t=>t&&":"===t[0]?t.substr(1).trim():t.trim(),getAccTitle:Zv,setAccTitle:Xv,getAccDescription:Kv,setAccDescription:Qv,addStyleClass:PA,setCssClass:jA,addDescription:$A,setDiagramTitle:Jv,getDiagramTitle:tk},WA={},HA=(t,e)=>{WA[t]=e},qA=(t,e)=>{const n=t.append("text").attr("x",2*hv().state.padding).attr("y",hv().state.textHeight+1.3*hv().state.padding).attr("font-size",hv().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),i=n.height,r=t.append("text").attr("x",hv().state.padding).attr("y",i+.4*hv().state.padding+hv().state.dividerMargin+hv().state.textHeight).attr("class","state-description");let a=!0,s=!0;e.descriptions.forEach((function(t){a||(!function(t,e,n){const i=t.append("tspan").attr("x",2*hv().state.padding).text(e);n||i.attr("dy",hv().state.textHeight)}(r,t,s),s=!1),a=!1}));const o=t.append("line").attr("x1",hv().state.padding).attr("y1",hv().state.padding+i+hv().state.dividerMargin/2).attr("y2",hv().state.padding+i+hv().state.dividerMargin/2).attr("class","descr-divider"),c=r.node().getBBox(),l=Math.max(c.width,n.width);return o.attr("x2",l+3*hv().state.padding),t.insert("rect",":first-child").attr("x",hv().state.padding).attr("y",hv().state.padding).attr("width",l+2*hv().state.padding).attr("height",c.height+i+2*hv().state.padding).attr("rx",hv().state.radius),t},VA=(t,e,n)=>{const i=hv().state.padding,r=2*hv().state.padding,a=t.node().getBBox(),s=a.width,o=a.x,c=t.append("text").attr("x",0).attr("y",hv().state.titleShift).attr("font-size",hv().state.fontSize).attr("class","state-title").text(e.id),l=c.node().getBBox().width+r;let h,u=Math.max(l,s);u===s&&(u+=r);const d=t.node().getBBox();e.doc,h=o-i,l>s&&(h=(s-u)/2+i),Math.abs(o-d.x)<i&&l>s&&(h=o-(l-s)/2);const p=1-hv().state.textHeight;return t.insert("rect",":first-child").attr("x",h).attr("y",p).attr("class",n?"alt-composit":"composit").attr("width",u).attr("height",d.height+hv().state.textHeight+hv().state.titleShift+1).attr("rx","0"),c.attr("x",h+i),l<=s&&c.attr("x",o+(u-r)/2-l/2+i),t.insert("rect",":first-child").attr("x",h).attr("y",hv().state.titleShift-hv().state.textHeight-hv().state.padding).attr("width",u).attr("height",3*hv().state.textHeight).attr("rx",hv().state.radius),t.insert("rect",":first-child").attr("x",h).attr("y",hv().state.titleShift-hv().state.textHeight-hv().state.padding).attr("width",u).attr("height",d.height+3+2*hv().state.textHeight).attr("rx",hv().state.radius),t},GA=(t,e)=>{e.attr("class","state-note");const n=e.append("rect").attr("x",0).attr("y",hv().state.padding),i=e.append("g"),{textWidth:r,textHeight:a}=((t,e,n,i)=>{let r=0;const a=i.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"<br/>");s=s.replace(/\n/g,"<br/>");const o=s.split(jb.lineBreakRegex);let c=1.25*hv().state.noteMargin;for(const l of o){const t=l.trim();if(t.length>0){const i=a.append("tspan");i.text(t),0===c&&(c+=i.node().getBBox().height),r+=c,i.attr("x",e+hv().state.noteMargin),i.attr("y",n+r+1.25*hv().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:r}})(t,0,0,i);return n.attr("height",a+2*hv().state.noteMargin),n.attr("width",r+2*hv().state.noteMargin),n},XA=function(t,e){const n=e.id,i={id:n,label:e.id,width:0,height:0},r=t.append("g").attr("id",n).attr("class","stateGroup");"start"===e.type&&(t=>{t.append("circle").attr("class","start-state").attr("r",hv().state.sizeUnit).attr("cx",hv().state.padding+hv().state.sizeUnit).attr("cy",hv().state.padding+hv().state.sizeUnit)})(r),"end"===e.type&&(t=>{t.append("circle").attr("class","end-state-outer").attr("r",hv().state.sizeUnit+hv().state.miniPadding).attr("cx",hv().state.padding+hv().state.sizeUnit+hv().state.miniPadding).attr("cy",hv().state.padding+hv().state.sizeUnit+hv().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",hv().state.sizeUnit).attr("cx",hv().state.padding+hv().state.sizeUnit+2).attr("cy",hv().state.padding+hv().state.sizeUnit+2)})(r),"fork"!==e.type&&"join"!==e.type||((t,e)=>{let n=hv().state.forkWidth,i=hv().state.forkHeight;if(e.parentId){let t=n;n=i,i=t}t.append("rect").style("stroke","black").style("fill","black").attr("width",n).attr("height",i).attr("x",hv().state.padding).attr("y",hv().state.padding)})(r,e),"note"===e.type&&GA(e.note.text,r),"divider"===e.type&&(t=>{t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",hv().state.textHeight).attr("class","divider").attr("x2",2*hv().state.textHeight).attr("y1",0).attr("y2",0)})(r),"default"===e.type&&0===e.descriptions.length&&((t,e)=>{const n=t.append("text").attr("x",2*hv().state.padding).attr("y",hv().state.textHeight+2*hv().state.padding).attr("font-size",hv().state.fontSize).attr("class","state-title").text(e.id),i=n.node().getBBox();t.insert("rect",":first-child").attr("x",hv().state.padding).attr("y",hv().state.padding).attr("width",i.width+2*hv().state.padding).attr("height",i.height+2*hv().state.padding).attr("rx",hv().state.radius)})(r,e),"default"===e.type&&e.descriptions.length>0&&qA(r,e);const a=r.node().getBBox();return i.width=a.width+2*hv().state.padding,i.height=a.height+2*hv().state.padding,HA(n,i),i};let ZA=0;let QA;const KA={},JA=(t,e,n,i,r,a,s)=>{const o=new Vf({compound:!0,multigraph:!0});let c,l=!0;for(c=0;c<t.length;c++)if("relation"===t[c].stmt){l=!1;break}n?o.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:l?1:QA.edgeLengthFactor,nodeSep:l?1:50,isMultiGraph:!0}):o.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:l?1:QA.edgeLengthFactor,nodeSep:l?1:50,ranker:"tight-tree",isMultiGraph:!0}),o.setDefaultEdgeLabel((function(){return{}})),s.db.extract(t);const h=s.db.getStates(),u=s.db.getRelations(),d=Object.keys(h);for(const m of d){const t=h[m];let c;if(n&&(t.parentId=n),t.doc){let n=e.append("g").attr("id",t.id).attr("class","stateGroup");c=JA(t.doc,n,t.id,!i,r,a,s);{n=VA(n,t,i);let e=n.node().getBBox();c.width=e.width,c.height=e.height+QA.padding/2,KA[t.id]={y:QA.compositTitleSize}}}else c=XA(e,t);if(t.note){const n={descriptions:[],id:t.id+"-note",note:t.note,type:"note"},i=XA(e,n);"left of"===t.note.position?(o.setNode(c.id+"-note",i),o.setNode(c.id,c)):(o.setNode(c.id,c),o.setNode(c.id+"-note",i)),o.setParent(c.id,c.id+"-group"),o.setParent(c.id+"-note",c.id+"-group")}else o.setNode(c.id,c)}Db.debug("Count=",o.nodeCount(),o);let p=0;u.forEach((function(t){var e;p++,Db.debug("Setting edge",t),o.setEdge(t.id1,t.id2,{relation:t,width:(e=t.title,e?e.length*QA.fontSizeFactor:1),height:QA.labelHeight*jb.getRows(t.title).length,labelpos:"c"},"id"+p)})),Em(o),Db.debug("Graph after layout",o.nodes());const f=e.node();o.nodes().forEach((function(t){if(void 0!==t&&void 0!==o.node(t)){Db.warn("Node "+t+": "+JSON.stringify(o.node(t))),r.select("#"+f.id+" #"+t).attr("transform","translate("+(o.node(t).x-o.node(t).width/2)+","+(o.node(t).y+(KA[t]?KA[t].y:0)-o.node(t).height/2)+" )"),r.select("#"+f.id+" #"+t).attr("data-x-shift",o.node(t).x-o.node(t).width/2);a.querySelectorAll("#"+f.id+" #"+t+" .divider").forEach((t=>{const e=t.parentElement;let n=0,i=0;e&&(e.parentElement&&(n=e.parentElement.getBBox().width),i=parseInt(e.getAttribute("data-x-shift"),10),Number.isNaN(i)&&(i=0)),t.setAttribute("x1",0-i+8),t.setAttribute("x2",n-i-8)}))}else Db.debug("No Node "+t+": "+JSON.stringify(o.node(t)))}));let g=f.getBBox();o.edges().forEach((function(t){void 0!==t&&void 0!==o.edge(t)&&(Db.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(o.edge(t))),function(t,e,n){e.points=e.points.filter((t=>!Number.isNaN(t.y)));const i=e.points,r=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(Bc),a=t.append("path").attr("d",r(i)).attr("id","edge"+ZA).attr("class","transition");let s="";if(hv().state.arrowMarkerAbsolute&&(s=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,s=s.replace(/\(/g,"\\("),s=s.replace(/\)/g,"\\)")),a.attr("marker-end","url("+s+"#"+function(t){switch(t){case UA.relationType.AGGREGATION:return"aggregation";case UA.relationType.EXTENSION:return"extension";case UA.relationType.COMPOSITION:return"composition";case UA.relationType.DEPENDENCY:return"dependency"}}(UA.relationType.DEPENDENCY)+"End)"),void 0!==n.title){const i=t.append("g").attr("class","stateLabel"),{x:r,y:a}=tv.calcLabelPosition(e.points),s=jb.getRows(n.title);let o=0;const c=[];let l=0,h=0;for(let t=0;t<=s.length;t++){const e=i.append("text").attr("text-anchor","middle").text(s[t]).attr("x",r).attr("y",a+o),n=e.node().getBBox();if(l=Math.max(l,n.width),h=Math.min(h,n.x),Db.info(n.x,r,a+o),0===o){const t=e.node().getBBox();o=t.height,Db.info("Title height",o,a)}c.push(e)}let u=o*s.length;if(s.length>1){const t=(s.length-1)*o*.5;c.forEach(((e,n)=>e.attr("y",a+n*o-t))),u=o*s.length}const d=i.node().getBBox();i.insert("rect",":first-child").attr("class","box").attr("x",r-l/2-hv().state.padding/2).attr("y",a-u/2-hv().state.padding/2-3.5).attr("width",l+hv().state.padding).attr("height",u+hv().state.padding),Db.info(d)}ZA++}(e,o.edge(t),o.edge(t).relation))})),g=f.getBBox();const y={id:n||"root",label:n||"root",width:0,height:0};return y.width=g.width+2*QA.padding,y.height=g.height+2*QA.padding,Db.debug("Doc rendered",y,o),y},tD={setConf:function(){},draw:function(t,e,n,i){QA=hv().state;const r=hv().securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body"),o="sandbox"===r?a.nodes()[0].contentDocument:document;Db.debug("Rendering diagram "+t);const c=s.select(`[id='${e}']`);c.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z");new Vf({multigraph:!0,compound:!0,rankdir:"RL"}).setDefaultEdgeLabel((function(){return{}}));const l=i.db.getRootDoc();JA(l,c,void 0,!1,s,o,i);const h=QA.padding,u=c.node().getBBox(),d=u.width+2*h,p=u.height+2*h;mv(c,p,1.75*d,QA.useMaxWidth),c.attr("viewBox",`${u.x-QA.padding} ${u.y-QA.padding} `+d+" "+p)}},eD="rect",nD="rectWithTitle",iD="statediagram",rD="transition",aD="parent",sD="note",oD="----parent",cD="fill:none",lD="fill: #333",hD="text",uD="normal";let dD={},pD=0;function fD(t="",e=0,n="",i="----"){return`state-${t}${null!==n&&n.length>0?`${i}${n}`:""}-${e}`}const gD=(t,e,n,i,r,a)=>{const s=n.id,o=null==(c=i[s])?"":c.classes?c.classes.join(" "):"";var c;if("root"!==s){let e=eD;!0===n.start&&(e="start"),!1===n.start&&(e="end"),n.type!==mA&&(e=n.type),dD[s]||(dD[s]={id:s,shape:e,description:jb.sanitizeText(s,hv()),classes:`${o} statediagram-state`});const i=dD[s];n.description&&(Array.isArray(i.description)?(i.shape=nD,i.description.push(n.description)):i.description.length>0?(i.shape=nD,i.description===s?i.description=[n.description]:i.description=[i.description,n.description]):(i.shape=eD,i.description=n.description),i.description=jb.sanitizeTextOrArray(i.description,hv())),1===i.description.length&&i.shape===nD&&(i.shape=eD),!i.type&&n.doc&&(Db.info("Setting cluster for ",s,mD(n)),i.type="group",i.dir=mD(n),i.shape=n.type===bA?"divider":"roundedWithTitle",i.classes=i.classes+" statediagram-cluster "+(a?"statediagram-cluster-alt":""));const r={labelStyle:"",shape:i.shape,labelText:i.description,classes:i.classes,style:"",id:s,dir:i.dir,domId:fD(s,pD),type:i.type,padding:15};if(n.note){const e={labelStyle:"",shape:"note",labelText:n.note.text,classes:"statediagram-note",style:"",id:s+"----note-"+pD,domId:fD(s,pD,sD),type:i.type,padding:15},a={labelStyle:"",shape:"noteGroup",labelText:n.note.text,classes:i.classes,style:"",id:s+oD,domId:fD(s,pD,aD),type:"group",padding:0};pD++;const o=s+oD;t.setNode(o,a),t.setNode(e.id,e),t.setNode(s,r),t.setParent(s,o),t.setParent(e.id,o);let c=s,l=e.id;"left of"===n.note.position&&(c=e.id,l=s),t.setEdge(c,l,{arrowhead:"none",arrowType:"",style:cD,labelStyle:"",classes:"transition note-edge",arrowheadStyle:lD,labelpos:"c",labelType:hD,thickness:uD})}else t.setNode(s,r)}e&&"root"!==e.id&&(Db.trace("Setting node ",s," to be child of its parent ",e.id),t.setParent(s,e.id)),n.doc&&(Db.trace("Adding nodes children "),yD(t,n,n.doc,i,r,!a))},yD=(t,e,n,i,r,a)=>{Db.trace("items",n),n.forEach((n=>{switch(n.stmt){case gA:case mA:gD(t,e,n,i,r,a);break;case yA:{gD(t,e,n.state1,i,r,a),gD(t,e,n.state2,i,r,a);const s={id:"edge"+pD,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:cD,labelStyle:"",label:jb.sanitizeText(n.description,hv()),arrowheadStyle:lD,labelpos:"c",labelType:hD,thickness:uD,classes:rD};t.setEdge(n.state1.id,n.state2.id,s,pD),pD++}}}))},mD=(t,e="TB")=>{let n=e;if(t.doc)for(let i=0;i<t.doc.length;i++){const e=t.doc[i];"dir"===e.stmt&&(n=e.value)}return n},bD={setConf:function(t){const e=Object.keys(t);for(const n of e)t[n]},getClasses:function(t,e){Db.trace("Extracting classes"),e.db.clear();try{return e.parser.parse(t),e.db.extract(e.db.getRootDocV2()),e.db.getClasses()}catch(n){return n}},draw:function(t,e,n,i){Db.info("Drawing state diagram (v2)",e),dD={};let r=i.db.getDirection();void 0===r&&(r="LR");const{securityLevel:a,state:s}=hv(),o=s.nodeSpacing||50,c=s.rankSpacing||50;Db.info(i.db.getRootDocV2()),i.db.extract(i.db.getRootDocV2()),Db.info(i.db.getRootDocV2());const l=i.db.getStates(),h=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:mD(i.db.getRootDocV2()),nodesep:o,ranksep:c,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));let u;gD(h,void 0,i.db.getRootDocV2(),l,i.db,!0),"sandbox"===a&&(u=Ho("#i"+e));const d=Ho("sandbox"===a?u.nodes()[0].contentDocument.body:"body"),p=d.select(`[id="${e}"]`),f=d.select("#"+e+" g");zT(f,h,["barb"],iD,e);tv.insertTitle(p,"statediagramTitleText",s.titleTopMargin,i.db.getDiagramTitle());const g=p.node().getBBox(),y=g.width+16,m=g.height+16;p.attr("class",iD);const b=p.node().getBBox();mv(p,m,y,s.useMaxWidth);const _=`${b.x-8} ${b.y-8} ${y} ${m}`;Db.debug(`viewBox ${_}`),p.attr("viewBox",_);const x=document.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const v of x){const t=v.getBBox(),e=document.createElementNS("http://www.w3.org/2000/svg",eD);e.setAttribute("rx",0),e.setAttribute("ry",0),e.setAttribute("width",t.width),e.setAttribute("height",t.height),v.insertBefore(e,v.firstChild)}}};var _D=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,17,18,20,22,23,24,26],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,24],d=[4,6,9,11,17,18,20,22,23,24,26],p={trace:function(){},yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,acc_title:18,acc_title_value:19,acc_descr:20,acc_descr_value:21,acc_descr_multiline_value:22,section:23,taskName:24,taskData:25,open_directive:26,type_directive:27,arg_directive:28,close_directive:29,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"acc_title",19:"acc_title_value",20:"acc_descr",21:"acc_descr_value",22:"acc_descr_multiline_value",23:"section",24:"taskName",25:"taskData",26:"open_directive",27:"type_directive",28:"arg_directive",29:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,2],[10,2],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 11:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 12:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 13:case 14:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 15:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 16:i.addTask(a[o-1],a[o]),this.$="task";break;case 18:i.parseDirective("%%{","open_directive");break;case 19:i.parseDirective(a[o],"type_directive");break;case 20:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 21:i.parseDirective("}%%","close_directive","journey")}},table:[{3:1,4:n,7:3,12:4,26:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,26:i},{13:8,27:[1,9]},{27:[2,18]},{6:[1,10],7:21,8:11,9:[1,12],10:13,11:[1,14],12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},{1:[2,2]},{14:22,15:[1,23],29:u},e([15,29],[2,19]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:21,10:25,12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),{19:[1,26]},{21:[1,27]},e(r,[2,14]),e(r,[2,15]),{25:[1,28]},e(r,[2,17]),{11:[1,29]},{16:30,28:[1,31]},{11:[2,21]},e(r,[2,5]),e(r,[2,12]),e(r,[2,13]),e(r,[2,16]),e(d,[2,9]),{14:32,29:u},{29:[2,20]},{11:[1,33]},e(d,[2,10])],defaultActions:{5:[2,18],7:[2,2],24:[2,21],31:[2,20]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},f=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),26;case 1:return this.begin("type_directive"),27;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),29;case 4:return 28;case 5:case 6:case 8:case 9:break;case 7:return 11;case 10:return 4;case 11:return 17;case 12:return this.begin("acc_title"),18;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),20;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:return 23;case 20:return 24;case 21:return 25;case 22:return 15;case 23:return 6;case 24:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,14,16,19,20,21,22,23,24],inclusive:!0}}},t);function g(){this.yy={}}return p.lexer=f,g.prototype=p,p.Parser=g,new g}();_D.parser=_D;const xD=_D,vD=t=>null!==t.match(/^\s*journey/);let kD="";const wD=[],TD=[],CD=[],ED=function(){let t=!0;for(const[e,n]of CD.entries())CD[e].processed,t=t&&n.processed;return t},SD={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().journey,clear:function(){wD.length=0,TD.length=0,kD="",CD.length=0,Gv()},setDiagramTitle:Jv,getDiagramTitle:tk,setAccTitle:Xv,getAccTitle:Zv,setAccDescription:Qv,getAccDescription:Kv,addSection:function(t){kD=t,wD.push(t)},getSections:function(){return wD},getTasks:function(){let t=ED();let e=0;for(;!t&&e<100;)t=ED(),e++;return TD.push(...CD),TD},addTask:function(t,e){const n=e.substr(1).split(":");let i=0,r=[];1===n.length?(i=Number(n[0]),r=[]):(i=Number(n[0]),r=n[1].split(","));const a=r.map((t=>t.trim())),s={section:kD,type:kD,people:a,task:t,score:i};CD.push(s)},addTaskOrg:function(t){const e={section:kD,type:kD,description:t,task:t,classes:[]};TD.push(e)},getActors:function(){return function(){const t=[];return TD.forEach((e=>{e.people&&t.push(...e.people)})),[...new Set(t)].sort()}()}},AD=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},DD=function(t,e){const n=t.append("circle");return n.attr("cx",e.cx),n.attr("cy",e.cy),n.attr("class","actor-"+e.pos),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("r",e.r),void 0!==n.class&&n.attr("class",n.class),void 0!==e.title&&n.append("title").text(e.title),n},LD=function(t,e){const n=e.text.replace(/<br\s*\/?>/gi," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.attr("class","legend"),i.style("text-anchor",e.anchor),void 0!==e.class&&i.attr("class",e.class);const r=i.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.text(n),i};let ND=-1;const OD=function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},BD=function(){function t(t,e,n,r,a,s,o,c){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c,l){const{taskFontSize:h,taskFontFamily:u}=c,d=t.split(/<br\s*\/?>/gi);for(let p=0;p<d.length;p++){const t=p*h-h*(d.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).attr("fill",l).style("text-anchor","middle").style("font-size",h).style("font-family",u);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(d[p]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).attr("position","fixed").append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").attr("class","label").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)n in e&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),MD=DD,ID=function(t,e,n){const i=t.append("g"),r=OD();r.x=e.x,r.y=e.y,r.fill=e.fill,r.width=n.width,r.height=n.height,r.class="journey-section section-type-"+e.num,r.rx=3,r.ry=3,AD(i,r),BD(n)(e.text,i,r.x,r.y,r.width,r.height,{class:"journey-section section-type-"+e.num},n,e.colour)},FD=LD,RD=function(t,e,n){const i=e.x+n.width/2,r=t.append("g");ND++;r.append("line").attr("id","task"+ND).attr("x1",i).attr("y1",e.y).attr("x2",i).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),function(t,e){const n=15,i=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",n).attr("stroke-width",2).attr("overflow","visible"),r=t.append("g");r.append("circle").attr("cx",e.cx-5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),r.append("circle").attr("cx",e.cx+5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),e.score>3?function(t){const i=vc().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}(r):e.score<3?function(t){const i=vc().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}(r):r.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}(r,{cx:i,cy:300+30*(5-e.score),score:e.score});const a=OD();a.x=e.x,a.y=e.y,a.fill=e.fill,a.width=n.width,a.height=n.height,a.class="task task-type-"+e.num,a.rx=3,a.ry=3,AD(r,a);let s=e.x+14;e.people.forEach((t=>{const n=e.actors[t].color,i={cx:s,cy:e.y,r:7,fill:n,stroke:"#000",title:t,pos:e.actors[t].position};DD(r,i),s+=10})),BD(n)(e.task,r,a.x,a.y,a.width,a.height,{class:"task"},n,e.colour)},$D=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")},PD={};const jD=hv().journey,YD=jD.leftMargin,zD={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=hv().journey,a=this;let s=0;var o;this.sequenceItems.forEach((function(c){s++;const l=a.sequenceItems.length-s+1;a.updateVal(c,"starty",e-l*r.boxMargin,Math.min),a.updateVal(c,"stopy",i+l*r.boxMargin,Math.max),a.updateVal(zD.data,"startx",t-l*r.boxMargin,Math.min),a.updateVal(zD.data,"stopx",n+l*r.boxMargin,Math.max),"activation"!==o&&(a.updateVal(c,"startx",t-l*r.boxMargin,Math.min),a.updateVal(c,"stopx",n+l*r.boxMargin,Math.max),a.updateVal(zD.data,"starty",e-l*r.boxMargin,Math.min),a.updateVal(zD.data,"stopy",i+l*r.boxMargin,Math.max))}))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal(zD.data,"startx",r,Math.min),this.updateVal(zD.data,"starty",s,Math.min),this.updateVal(zD.data,"stopx",a,Math.max),this.updateVal(zD.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return this.data}},UD=jD.sectionFills,WD=jD.sectionColours,HD=function(t,e,n){const i=hv().journey;let r="";const a=n+(2*i.height+i.diagramMarginY);let s=0,o="#CCC",c="black",l=0;for(const[h,u]of e.entries()){if(r!==u.section){o=UD[s%UD.length],l=s%UD.length,c=WD[s%WD.length];const e={x:h*i.taskMargin+h*i.width+YD,y:50,text:u.section,fill:o,num:l,colour:c};ID(t,e,i),r=u.section,s++}const e=u.people.reduce(((t,e)=>(PD[e]&&(t[e]=PD[e]),t)),{});u.x=h*i.taskMargin+h*i.width+YD,u.y=a,u.width=i.diagramMarginX,u.height=i.diagramMarginY,u.colour=c,u.fill=o,u.num=l,u.actors=e,RD(t,u,i),zD.insert(u.x,u.y,u.x+u.width+i.taskMargin,450)}},qD={setConf:function(t){Object.keys(t).forEach((function(e){jD[e]=t[e]}))},draw:function(t,e,n,i){const r=hv().journey;i.db.clear(),i.parser.parse(t+"\n");const a=hv().securityLevel;let s;"sandbox"===a&&(s=Ho("#i"+e));const o=Ho("sandbox"===a?s.nodes()[0].contentDocument.body:"body");zD.init();const c=o.select("#"+e);$D(c);const l=i.db.getTasks(),h=i.db.getDiagramTitle(),u=i.db.getActors();for(const m in PD)delete PD[m];let d=0;u.forEach((t=>{PD[t]={color:r.actorColours[d%r.actorColours.length],position:d},d++})),function(t){const e=hv().journey;let n=60;Object.keys(PD).forEach((i=>{const r=PD[i].color,a={cx:20,cy:n,r:7,fill:r,stroke:"#000",pos:PD[i].position};MD(t,a);const s={x:40,y:n+7,fill:"#666",text:i,textMargin:5|e.boxTextMargin};FD(t,s),n+=20}))}(c),zD.insert(0,0,YD,50*Object.keys(PD).length),HD(c,l,0);const p=zD.getBounds();h&&c.append("text").text(h).attr("x",YD).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);const f=p.stopy-p.starty+2*r.diagramMarginY,g=YD+p.stopx+2*r.diagramMarginX;mv(c,f,g,r.useMaxWidth),c.append("line").attr("x1",YD).attr("y1",4*r.height).attr("x2",g-YD-4).attr("y2",4*r.height).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");const y=h?70:0;c.attr("viewBox",`${p.startx} -25 ${g} ${f+y}`),c.attr("preserveAspectRatio","xMinYMin meet"),c.attr("height",f+y+25)}};let VD={};const GD={setConf:function(t){VD={...VD,...t}},draw:(t,e,n)=>{try{Db.debug("Renering svg for syntax error\n");const t=Ho("#"+e),i=t.append("g");i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in graph"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text("mermaid version "+n),t.attr("height",100),t.attr("width",500),t.attr("viewBox","768 0 912 512")}catch(r){Db.error("Error while rendering info diagram"),Db.error((i=r)instanceof Error?i.message:String(i))}var i}};let XD=!1;const ZD=()=>{XD||(XD=!0,Pv("error",{db:{clear:()=>{}},styles:vv,renderer:GD,parser:{parser:{yy:{}},parse:()=>{}},init:()=>{}},(t=>"error"===t.toLowerCase().trim())),Pv("c4",{parser:Ik,db:Zk,renderer:Aw,styles:Lv,init:t=>{Aw.setConf(t.c4)}},Fk),Pv("class",{parser:Lw,db:Gw,renderer:oT,styles:_v,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Gw.clear()}},Nw),Pv("classDiagram",{parser:Lw,db:Gw,renderer:qT,styles:_v,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Gw.clear()}},Ow),Pv("er",{parser:GT,db:JT,renderer:hC,styles:xv},XT),Pv("gantt",{parser:VC,db:EE,renderer:DE,styles:wv},GC),Pv("info",{parser:NE,db:ME,renderer:IE,styles:Tv},FE),Pv("pie",{parser:$E,db:zE,renderer:qE,styles:Cv},PE),Pv("requirement",{parser:GE,db:eS,renderer:dS,styles:Ev},XE),Pv("sequence",{parser:fS,db:BS,renderer:hA,styles:Sv,init:t=>{if(t.sequence||(t.sequence={}),t.sequence.arrowMarkerAbsolute=t.arrowMarkerAbsolute,"sequenceDiagram"in t)throw new Error("`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.");BS.setWrap(t.wrap),hA.setConf(t.sequence)}},gS),Pv("state",{parser:dA,db:UA,renderer:tD,styles:Av,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,UA.clear()}},pA),Pv("stateDiagram",{parser:dA,db:UA,renderer:bD,styles:Av,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,UA.clear()}},fA),Pv("journey",{parser:xD,db:SD,renderer:qD,styles:Dv,init:t=>{qD.setConf(t.journey),SD.clear()}},vD),Pv("flowchart",{parser:dC,db:PC,renderer:HC,styles:kv,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,YC(t.flowchart),PC.clear(),PC.setGen("gen-1")}},pC),Pv("flowchart-v2",{parser:dC,db:PC,renderer:HC,styles:kv,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,lv({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}}),HC.setConf(t.flowchart),PC.clear(),PC.setGen("gen-2")}},fC),Pv("gitGraph",{parser:zv,db:mk,renderer:Ok,styles:Bk},Uv))};class QD{constructor(t,e){var n,i;Sb(this,"type","graph"),Sb(this,"parser"),Sb(this,"renderer"),Sb(this,"db"),Sb(this,"detectTypeFailed",!1),this.txt=t;const r=hv();this.txt=t;try{this.type=Lx(t,r)}catch(o){this.handleError(o,e),this.type="error",this.detectTypeFailed=!0}const a=jv(this.type);Db.debug("Type "+this.type),this.db=a.db,null==(i=(n=this.db).clear)||i.call(n),this.renderer=a.renderer,this.parser=a.parser;const s=this.parser.parse.bind(this.parser);this.parser.parse=t=>s(function(t,e){var n;const i=t.match(Ex);if(i){const r=Cx(i[1],{schema:Tx});return(null==r?void 0:r.title)&&(null==(n=e.setDiagramTitle)||n.call(e,r.title)),t.slice(i[0].length)}return t}(t,this.db)),this.parser.parser.yy=this.db,a.init&&(a.init(r),Db.debug("Initialized diagram "+this.type,r)),this.txt+="\n",this.parse(this.txt,e)}parse(t,e){var n,i;if(this.detectTypeFailed)return!1;try{return t+="\n",null==(i=(n=this.db).clear)||i.call(n),this.parser.parse(t),!0}catch(r){this.handleError(r,e)}return!1}handleError(t,e){if(void 0===e)throw t;Jx(t)?e(t.str,t.hash):e(t)}getParser(){return this.parser}getType(){return this.type}}const KD=(t,e)=>{const n=Lx(t,hv());try{jv(n)}catch(i){const r=Dx[n].loader;if(!r)throw new Error(`Diagram ${n} not found.`);return r().then((({diagram:i})=>(Pv(n,i,void 0),new QD(t,e))))}return new QD(t,e)},JD=QD;const tL=["graph","flowchart","flowchart-v2","stateDiagram","stateDiagram-v2"],eL="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",nL="sandbox",iL="loose",rL="http://www.w3.org/1999/xlink",aL="http://www.w3.org/1999/xhtml",sL=["foreignobject"],oL=["dominant-baseline"];const cL=function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/classDef.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/#\w+;/g,(function(t){const e=t.substring(1,t.length-1);return/^\+?\d+$/.test(e)?"\ufb02\xb0\xb0"+e+"\xb6\xdf":"\ufb02\xb0"+e+"\xb6\xdf"})),e},lL=function(t){let e=t;return e=e.replace(/\ufb02\xb0\xb0/g,"&#"),e=e.replace(/\ufb02\xb0/g,"&"),e=e.replace(/\xb6\xdf/g,";"),e},hL=(t,e,n=[])=>`\n.${t} ${e} { ${n.join(" !important; ")} !important; }`,uL=(t,e,n,i)=>{const r=((t,e,n={})=>{var i;let r="";if(void 0!==t.themeCSS&&(r+=`\n${t.themeCSS}`),void 0!==t.fontFamily&&(r+=`\n:root { --mermaid-font-family: ${t.fontFamily}}`),void 0!==t.altFontFamily&&(r+=`\n:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),!bf(n)&&tL.includes(e)){const e=["> *","span"],a=["rect","polygon","ellipse","circle","path"],s=t.htmlLabels||(null==(i=t.flowchart)?void 0:i.htmlLabels)?e:a;for(const t in n){const e=n[t];bf(e.styles)||s.forEach((t=>{r+=hL(e.id,t,e.styles)})),bf(e.textStyles)||(r+=hL(e.id,"tspan",e.textStyles))}}return r})(t,e,n);return Hh(fu(`${i}{${Ov(e,r,t.themeVariables)}}`),qh)},dL=(t="",e,n)=>{let i=t;return n||e||(i=i.replace(/marker-end="url\(.*?#/g,'marker-end="url(#')),i=lL(i),i=i.replace(/<br>/g,"<br/>"),i},pL=(t="",e)=>`<iframe style="width:100%;height:${e?e.viewBox.baseVal.height+"px":"100%"};border:0;margin:0;" src="data:text/html;base64,${btoa('<body style="margin:0">'+t+"</body>")}" sandbox="allow-top-navigation-by-user-activation allow-popups">\n The "iframe" tag is not supported by your browser.\n</iframe>`,fL=(t,e,n,i,r)=>{const a=t.append("div");a.attr("id",n),i&&a.attr("style",i);const s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns","http://www.w3.org/2000/svg");return r&&s.attr("xmlns:xlink",r),s.append("g"),t};function gL(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}const yL=(t,e,n,i)=>{var r,a,s;null==(r=t.getElementById(e))||r.remove(),null==(a=t.getElementById(n))||a.remove(),null==(s=t.getElementById(i))||s.remove()};let mL={};const bL=function(t,e,n){switch(Db.debug(`Directive type=${e.type} with args:`,e.args),e.type){case"init":case"initialize":["config"].forEach((t=>{void 0!==e.args[t]&&("flowchart-v2"===n&&(n="flowchart"),e.args[n]=e.args[t],delete e.args[t])})),Db.debug("sanitize in handleDirective",e.args),Qx(e.args),Db.debug("sanitize in handleDirective (done)",e.args),dv(e.args);break;case"wrap":case"nowrap":t&&t.setWrap&&t.setWrap("wrap"===e.type);break;case"themeCss":Db.warn("themeCss encountered");break;default:Db.warn(`Unhandled directive: source: '%%{${e.type}: ${JSON.stringify(e.args?e.args:{})}}%%`,e)}};function _L(t,e,n,i){!function(t,e){bf(e)||t.attr("aria-roledescription",e)}(e,t),function(t,e,n,i){if(void 0!==t.insert&&(e||n)){if(n){const e="chart-desc-"+i;t.attr("aria-describedby",e),t.insert("desc",":first-child").attr("id",e).text(n)}if(e){const n="chart-title-"+i;t.attr("aria-labelledby",n),t.insert("title",":first-child").attr("id",n).text(e)}}}(e,n,i,e.attr("id"))}const xL=Object.freeze({render:function(t,e,n,i){var r,a,s,o,c;ZD(),pv();const l=tv.detectInit(e);l&&(Qx(l),dv(l));const h=hv();Db.debug(h),e.length>(null!=(r=null==h?void 0:h.maxTextSize)?r:5e4)&&(e=eL),e=e.replace(/\r\n?/g,"\n");const u="#"+t,d="i"+t,p="#"+d,f="d"+t,g="#"+f;let y=Ho("body");const m=h.securityLevel===nL,b=h.securityLevel===iL,_=h.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),m){const t=gL(Ho(i),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho(i);fL(y,t,f,`font-family: ${_}`,rL)}else{if(yL(document,t,f,d),m){const t=gL(Ho("body"),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho("body");fL(y,t,f)}let x,v;e=cL(e);try{if(x=KD(e),"then"in x)throw new Error("Diagram is a promise. Use renderAsync.")}catch(N){x=new JD("error"),v=N}const k=y.select(g).node(),w=x.type,T=k.firstChild,C=T.firstChild,E=tL.includes(w)?x.renderer.getClasses(e,x):{},S=uL(h,w,E,u),A=document.createElement("style");A.innerHTML=S,T.insertBefore(A,C);try{x.renderer.draw(e,t,ev,x)}catch(O){throw GD.draw(e,t,ev),O}_L(w,y.select(`${g} svg`),null==(s=(a=x.db).getAccTitle)?void 0:s.call(a),null==(c=(o=x.db).getAccDescription)?void 0:c.call(o)),y.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",aL);let D=y.select(g).node().innerHTML;if(Db.debug("config.arrowMarkerAbsolute",h.arrowMarkerAbsolute),D=dL(D,m,$b(h.arrowMarkerAbsolute)),m){const t=y.select(g+" svg").node();D=pL(D,t)}else b||(D=Gc.sanitize(D,{ADD_TAGS:sL,ADD_ATTR:oL}));if(void 0!==n)switch(w){case"flowchart":case"flowchart-v2":n(D,PC.bindFunctions);break;case"gantt":n(D,EE.bindFunctions);break;case"class":case"classDiagram":n(D,Gw.bindFunctions);break;default:n(D)}else Db.debug("CB = undefined!");IS();const L=Ho(m?p:g).node();if(L&&"remove"in L&&L.remove(),v)throw v;return D},renderAsync:async function(t,e,n,i){var r,a,s,o,c;ZD(),pv();const l=tv.detectInit(e);l&&(Qx(l),dv(l));const h=hv();Db.debug(h),e.length>(null!=(r=null==h?void 0:h.maxTextSize)?r:5e4)&&(e=eL),e=e.replace(/\r\n?/g,"\n");const u="#"+t,d="i"+t,p="#"+d,f="d"+t,g="#"+f;let y=Ho("body");const m=h.securityLevel===nL,b=h.securityLevel===iL,_=h.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),m){const t=gL(Ho(i),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho(i);fL(y,t,f,`font-family: ${_}`,rL)}else{if(yL(document,t,f,d),m){const t=gL(Ho("body"),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho("body");fL(y,t,f)}let x,v;e=cL(e);try{x=await KD(e)}catch(N){x=new JD("error"),v=N}const k=y.select(g).node(),w=x.type,T=k.firstChild,C=T.firstChild,E=tL.includes(w)?x.renderer.getClasses(e,x):{},S=uL(h,w,E,u),A=document.createElement("style");A.innerHTML=S,T.insertBefore(A,C);try{await x.renderer.draw(e,t,ev,x)}catch(O){throw GD.draw(e,t,ev),O}_L(w,y.select(`${g} svg`),null==(s=(a=x.db).getAccTitle)?void 0:s.call(a),null==(c=(o=x.db).getAccDescription)?void 0:c.call(o)),y.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",aL);let D=y.select(g).node().innerHTML;if(Db.debug("config.arrowMarkerAbsolute",h.arrowMarkerAbsolute),D=dL(D,m,$b(h.arrowMarkerAbsolute)),m){const t=y.select(g+" svg").node();D=pL(D,t)}else b||(D=Gc.sanitize(D,{ADD_TAGS:sL,ADD_ATTR:oL}));if(void 0!==n)switch(w){case"flowchart":case"flowchart-v2":n(D,PC.bindFunctions);break;case"gantt":n(D,EE.bindFunctions);break;case"class":case"classDiagram":n(D,Gw.bindFunctions);break;default:n(D)}else Db.debug("CB = undefined!");IS();const L=Ho(m?p:g).node();if(L&&"remove"in L&&L.remove(),v)throw v;return D},parse:function(t,e){return ZD(),new JD(t,e).parse(t,e)},parseAsync:async function(t,e){return ZD(),(await KD(t,e)).parse(t,e)},parseDirective:function(t,e,n,i){try{if(void 0!==e)switch(e=e.trim(),n){case"open_directive":mL={};break;case"type_directive":if(!mL)throw new Error("currentDirective is undefined");mL.type=e.toLowerCase();break;case"arg_directive":if(!mL)throw new Error("currentDirective is undefined");mL.args=JSON.parse(e);break;case"close_directive":bL(t,mL,i),mL=void 0}}catch(r){Db.error(`Error while rendering sequenceDiagram directive: ${e} jison context: ${n}`),Db.error(r.message)}},initialize:function(t={}){var e;(null==t?void 0:t.fontFamily)&&!(null==(e=t.themeVariables)?void 0:e.fontFamily)&&(t.themeVariables={fontFamily:t.fontFamily}),iv=Bx({},t),(null==t?void 0:t.theme)&&t.theme in Xb?t.themeVariables=Xb[t.theme].getThemeVariables(t.themeVariables):t&&(t.themeVariables=Xb.default.getThemeVariables(t.themeVariables));const n="object"==typeof t?(t=>(rv=Bx({},nv),rv=Bx(rv,t),t.theme&&Xb[t.theme]&&(rv.themeVariables=Xb[t.theme].getThemeVariables(t.themeVariables)),ov(rv,av),rv))(t):cv();Lb(n.logLevel),ZD()},getConfig:hv,setConfig:lv,getSiteConfig:cv,updateSiteConfig:t=>(rv=Bx(rv,t),ov(rv,av),rv),reset:()=>{pv()},globalReset:()=>{pv(nv)},defaultConfig:nv});Lb(hv().logLevel),pv(hv());let vL=!1;const kL=(t,e,n)=>{Db.warn(t),Jx(t)?(n&&n(t.str,t.hash),e.push({...t,message:t.str,error:t})):(n&&n(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},wL=function(t,e,n){const i=xL.getConfig();let r;if(t&&(DL.sequenceConfig=t),Db.debug((n?"":"No ")+"Callback function found"),void 0===e)r=document.querySelectorAll(".mermaid");else if("string"==typeof e)r=document.querySelectorAll(e);else if(e instanceof HTMLElement)r=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");r=e}Db.debug(`Found ${r.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Db.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),xL.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const a=new tv.initIdGenerator(i.deterministicIds,i.deterministicIDSeed);let s;const o=[];for(const l of Array.from(r)){if(Db.info("Rendering diagram: "+l.id),l.getAttribute("data-processed"))continue;l.setAttribute("data-processed","true");const t=`mermaid-${a.next()}`;s=l.innerHTML,s=tv.entityDecode(s).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=tv.detectInit(s);e&&Db.debug("Detected early reinit: ",e);try{xL.render(t,s,((e,i)=>{l.innerHTML=e,void 0!==n&&n(t),i&&i(l)}),l)}catch(c){kL(c,o,DL.parseError)}}if(o.length>0)throw o[0]},TL=async function(t,e,n){const i=xL.getConfig();let r;if(t&&(DL.sequenceConfig=t),Db.debug((n?"":"No ")+"Callback function found"),void 0===e)r=document.querySelectorAll(".mermaid");else if("string"==typeof e)r=document.querySelectorAll(e);else if(e instanceof HTMLElement)r=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");r=e}Db.debug(`Found ${r.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Db.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),xL.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const a=new tv.initIdGenerator(i.deterministicIds,i.deterministicIDSeed);let s;const o=[];for(const l of Array.from(r)){if(Db.info("Rendering diagram: "+l.id),l.getAttribute("data-processed"))continue;l.setAttribute("data-processed","true");const t=`mermaid-${a.next()}`;s=l.innerHTML,s=tv.entityDecode(s).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=tv.detectInit(s);e&&Db.debug("Detected early reinit: ",e);try{await xL.renderAsync(t,s,((e,i)=>{l.innerHTML=e,void 0!==n&&n(t),i&&i(l)}),l)}catch(c){kL(c,o,DL.parseError)}}if(o.length>0)throw o[0]},CL=function(){if(DL.startOnLoad){const{startOnLoad:t}=xL.getConfig();t&&DL.init()}};"undefined"!=typeof document&&window.addEventListener("load",CL,!1);const EL=[];let SL=!1;const AL=async()=>{if(!SL){for(SL=!0;EL.length>0;){const e=EL.shift();if(e)try{await e()}catch(t){Db.error("Error executing queue",t)}}SL=!1}},DL={startOnLoad:!0,diagrams:{},mermaidAPI:xL,parse:t=>xL.parse(t,DL.parseError),parseAsync:t=>new Promise(((e,n)=>{EL.push((()=>new Promise(((i,r)=>{xL.parseAsync(t,DL.parseError).then((t=>{i(t),e(t)}),(t=>{Db.error("Error parsing",t),r(t),n(t)}))})))),AL()})),render:xL.render,renderAsync:(t,e,n,i)=>new Promise(((r,a)=>{EL.push((()=>new Promise(((s,o)=>{xL.renderAsync(t,e,n,i).then((t=>{s(t),r(t)}),(t=>{Db.error("Error parsing",t),o(t),a(t)}))})))),AL()})),init:async function(t,e,n){try{vL?await TL(t,e,n):wL(t,e,n)}catch(i){Db.warn("Syntax Error rendering"),Jx(i)&&Db.warn(i.str),DL.parseError&&DL.parseError(i)}},initThrowsErrors:wL,initThrowsErrorsAsync:TL,registerExternalDiagrams:async(t,{lazyLoad:e=!0}={})=>{e?(t=>{for(const{id:e,detector:n,loader:i}of t)Nx(e,n,i)})(t):await(async t=>{Db.debug(`Loading ${t.length} external diagrams`);const e=await Promise.allSettled(t.map((async({id:t,detector:e,loader:n})=>{const{diagram:i}=await n();Pv(t,i,e)}))),n=e.filter((t=>"rejected"===t.status));if(n.length>0){Db.error(`Failed to load ${n.length} external diagrams`);for(const t of n)Db.error(t);throw new Error(`Failed to load ${n.length} external diagrams`)}})(t),vL=!0},initialize:function(t){xL.initialize(t)},parseError:void 0,contentLoaded:CL,setParseErrorHandler:function(t){DL.parseError=t}};function LL(){const{colorMode:t}=(0,h.I)(),e=(0,u.L)().mermaid,n=e.theme[t],{options:r}=e;return(0,i.useMemo)((()=>({startOnLoad:!1,...r,theme:n})),[n,r])}const NL="container_lyt7";function OL(t){let{value:e}=t;const n=function(t,e){const n=LL(),r=e??n;return(0,i.useMemo)((()=>{DL.mermaidAPI.initialize(r);const e=`mermaid-svg-${Math.round(1e7*Math.random())}`;return DL.render(e,t)}),[t,r])}(e);return i.createElement("div",{className:`docusaurus-mermaid-container ${NL}`,dangerouslySetInnerHTML:{__html:n}})}const BL={head:function(t){const e=i.Children.map(t.children,(t=>i.isValidElement(t)?function(t){if(t.props?.mdxType&&t.props.originalType){const{mdxType:e,originalType:n,...r}=t.props;return i.createElement(t.props.originalType,r)}return t}(t):t));return i.createElement(s.Z,t,e)},code:function(t){const e=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return i.Children.toArray(t.children).every((t=>"string"==typeof t&&!t.includes("\n")||(0,i.isValidElement)(t)&&e.includes(t.props?.mdxType)))?i.createElement("code",t):i.createElement(Z,t)},a:function(t){return i.createElement(Q.Z,t)},pre:function(t){return i.createElement(Z,(0,i.isValidElement)(t.children)&&"code"===t.children.props?.originalType?t.children.props:{...t})},details:function(t){const e=i.Children.toArray(t.children),n=e.find((t=>i.isValidElement(t)&&"summary"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return i.createElement(st,(0,a.Z)({},t,{summary:n}),r)},ul:function(t){return i.createElement("ul",(0,a.Z)({},t,{className:(e=t.className,(0,l.Z)(e,e?.includes("contains-task-list")&<))}));var e},img:function(t){return i.createElement("img",(0,a.Z)({loading:"lazy"},t,{className:(e=t.className,(0,l.Z)(e,ht))}));var e},h1:t=>i.createElement(ct,(0,a.Z)({as:"h1"},t)),h2:t=>i.createElement(ct,(0,a.Z)({as:"h2"},t)),h3:t=>i.createElement(ct,(0,a.Z)({as:"h3"},t)),h4:t=>i.createElement(ct,(0,a.Z)({as:"h4"},t)),h5:t=>i.createElement(ct,(0,a.Z)({as:"h5"},t)),h6:t=>i.createElement(ct,(0,a.Z)({as:"h6"},t)),admonition:function(t){const{children:e,type:n,title:r,icon:a}=mt(t),s=function(t){const e=yt[t]??t;return gt[e]||(console.warn(`No admonition config found for admonition type "${e}". Using Info as fallback.`),gt.info)}(n),o=r??s.label,{iconComponent:c}=s,h=a??i.createElement(c,null);return i.createElement("div",{className:(0,l.Z)(p.k.common.admonition,p.k.common.admonitionType(t.type),"alert",`alert--${s.infimaClassName}`,ut)},i.createElement("div",{className:dt},i.createElement("span",{className:pt},h),o),i.createElement("div",{className:ft},e))},mermaid:function(t){return i.createElement(bt,null,(()=>i.createElement(OL,t)))}},ML=BL;function IL(t){let{children:e}=t;return i.createElement(r.Zo,{components:ML},e)}},2244:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(7294),r=n(6010),a=n(9960);function s(t){const{permalink:e,title:n,subLabel:s,isNext:o}=t;return i.createElement(a.Z,{className:(0,r.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:e},s&&i.createElement("div",{className:"pagination-nav__sublabel"},s),i.createElement("div",{className:"pagination-nav__label"},n))}},3008:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(7294),r=n(6010),a=n(9960);const s="tag_zVej",o="tagRegular_sFm0",c="tagWithCount_h2kH";function l(t){let{permalink:e,label:n,count:l}=t;return i.createElement(a.Z,{href:e,className:(0,r.Z)(s,l?c:o)},n,l&&i.createElement("span",null,l))}},1526:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(7294),r=n(6010),a=n(5999),s=n(3008);const o="tags_jXut",c="tag_QGVx";function l(t){let{tags:e}=t;return i.createElement(i.Fragment,null,i.createElement("b",null,i.createElement(a.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),i.createElement("ul",{className:(0,r.Z)(o,"padding--none","margin-left--sm")},e.map((t=>{let{label:e,permalink:n}=t;return i.createElement("li",{key:n,className:c},i.createElement(s.Z,{label:e,permalink:n}))}))))}},7856:function(t){t.exports=function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,n){return e=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},e(t,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function i(t,r,a){return i=n()?Reflect.construct:function(t,n,i){var r=[null];r.push.apply(r,n);var a=new(Function.bind.apply(t,r));return i&&e(a,i.prototype),a},i.apply(null,arguments)}function r(t){return a(t)||s(t)||o(t)||l()}function a(t){if(Array.isArray(t))return c(t)}function s(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function o(t,e){if(t){if("string"==typeof t)return c(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n<e;n++)i[n]=t[n];return i}function l(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var h=Object.hasOwnProperty,u=Object.setPrototypeOf,d=Object.isFrozen,p=Object.getPrototypeOf,f=Object.getOwnPropertyDescriptor,g=Object.freeze,y=Object.seal,m=Object.create,b="undefined"!=typeof Reflect&&Reflect,_=b.apply,x=b.construct;_||(_=function(t,e,n){return t.apply(e,n)}),g||(g=function(t){return t}),y||(y=function(t){return t}),x||(x=function(t,e){return i(t,r(e))});var v=O(Array.prototype.forEach),k=O(Array.prototype.pop),w=O(Array.prototype.push),T=O(String.prototype.toLowerCase),C=O(String.prototype.toString),E=O(String.prototype.match),S=O(String.prototype.replace),A=O(String.prototype.indexOf),D=O(String.prototype.trim),L=O(RegExp.prototype.test),N=B(TypeError);function O(t){return function(e){for(var n=arguments.length,i=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];return _(t,e,i)}}function B(t){return function(){for(var e=arguments.length,n=new Array(e),i=0;i<e;i++)n[i]=arguments[i];return x(t,n)}}function M(t,e,n){n=n||T,u&&u(t,null);for(var i=e.length;i--;){var r=e[i];if("string"==typeof r){var a=n(r);a!==r&&(d(e)||(e[i]=a),r=a)}t[r]=!0}return t}function I(t){var e,n=m(null);for(e in t)_(h,t,[e])&&(n[e]=t[e]);return n}function F(t,e){for(;null!==t;){var n=f(t,e);if(n){if(n.get)return O(n.get);if("function"==typeof n.value)return O(n.value)}t=p(t)}function i(t){return console.warn("fallback value for",t),null}return i}var R=g(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),$=g(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),P=g(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),j=g(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Y=g(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),z=g(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),U=g(["#text"]),W=g(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),H=g(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),q=g(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),V=g(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),G=y(/\{\{[\w\W]*|[\w\W]*\}\}/gm),X=y(/<%[\w\W]*|[\w\W]*%>/gm),Z=y(/\${[\w\W]*}/gm),Q=y(/^data-[\-\w.\u00B7-\uFFFF]/),K=y(/^aria-[\-\w]+$/),J=y(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),tt=y(/^(?:\w+script|data):/i),et=y(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),nt=y(/^html$/i),it=function(){return"undefined"==typeof window?null:window},rt=function(e,n){if("object"!==t(e)||"function"!=typeof e.createPolicy)return null;var i=null,r="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(r)&&(i=n.currentScript.getAttribute(r));var a="dompurify"+(i?"#"+i:"");try{return e.createPolicy(a,{createHTML:function(t){return t},createScriptURL:function(t){return t}})}catch(s){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};function at(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:it(),n=function(t){return at(t)};if(n.version="2.4.1",n.removed=[],!e||!e.document||9!==e.document.nodeType)return n.isSupported=!1,n;var i=e.document,a=e.document,s=e.DocumentFragment,o=e.HTMLTemplateElement,c=e.Node,l=e.Element,h=e.NodeFilter,u=e.NamedNodeMap,d=void 0===u?e.NamedNodeMap||e.MozNamedAttrMap:u,p=e.HTMLFormElement,f=e.DOMParser,y=e.trustedTypes,m=l.prototype,b=F(m,"cloneNode"),_=F(m,"nextSibling"),x=F(m,"childNodes"),O=F(m,"parentNode");if("function"==typeof o){var B=a.createElement("template");B.content&&B.content.ownerDocument&&(a=B.content.ownerDocument)}var st=rt(y,i),ot=st?st.createHTML(""):"",ct=a,lt=ct.implementation,ht=ct.createNodeIterator,ut=ct.createDocumentFragment,dt=ct.getElementsByTagName,pt=i.importNode,ft={};try{ft=I(a).documentMode?a.documentMode:{}}catch(Oe){}var gt={};n.isSupported="function"==typeof O&<&&void 0!==lt.createHTMLDocument&&9!==ft;var yt,mt,bt=G,_t=X,xt=Z,vt=Q,kt=K,wt=tt,Tt=et,Ct=J,Et=null,St=M({},[].concat(r(R),r($),r(P),r(Y),r(U))),At=null,Dt=M({},[].concat(r(W),r(H),r(q),r(V))),Lt=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Nt=null,Ot=null,Bt=!0,Mt=!0,It=!1,Ft=!1,Rt=!1,$t=!1,Pt=!1,jt=!1,Yt=!1,zt=!1,Ut=!0,Wt=!1,Ht="user-content-",qt=!0,Vt=!1,Gt={},Xt=null,Zt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Qt=null,Kt=M({},["audio","video","img","source","image","track"]),Jt=null,te=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ee="http://www.w3.org/1998/Math/MathML",ne="http://www.w3.org/2000/svg",ie="http://www.w3.org/1999/xhtml",re=ie,ae=!1,se=null,oe=M({},[ee,ne,ie],C),ce=["application/xhtml+xml","text/html"],le="text/html",he=null,ue=a.createElement("form"),de=function(t){return t instanceof RegExp||t instanceof Function},pe=function(e){he&&he===e||(e&&"object"===t(e)||(e={}),e=I(e),yt=yt=-1===ce.indexOf(e.PARSER_MEDIA_TYPE)?le:e.PARSER_MEDIA_TYPE,mt="application/xhtml+xml"===yt?C:T,Et="ALLOWED_TAGS"in e?M({},e.ALLOWED_TAGS,mt):St,At="ALLOWED_ATTR"in e?M({},e.ALLOWED_ATTR,mt):Dt,se="ALLOWED_NAMESPACES"in e?M({},e.ALLOWED_NAMESPACES,C):oe,Jt="ADD_URI_SAFE_ATTR"in e?M(I(te),e.ADD_URI_SAFE_ATTR,mt):te,Qt="ADD_DATA_URI_TAGS"in e?M(I(Kt),e.ADD_DATA_URI_TAGS,mt):Kt,Xt="FORBID_CONTENTS"in e?M({},e.FORBID_CONTENTS,mt):Zt,Nt="FORBID_TAGS"in e?M({},e.FORBID_TAGS,mt):{},Ot="FORBID_ATTR"in e?M({},e.FORBID_ATTR,mt):{},Gt="USE_PROFILES"in e&&e.USE_PROFILES,Bt=!1!==e.ALLOW_ARIA_ATTR,Mt=!1!==e.ALLOW_DATA_ATTR,It=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ft=e.SAFE_FOR_TEMPLATES||!1,Rt=e.WHOLE_DOCUMENT||!1,jt=e.RETURN_DOM||!1,Yt=e.RETURN_DOM_FRAGMENT||!1,zt=e.RETURN_TRUSTED_TYPE||!1,Pt=e.FORCE_BODY||!1,Ut=!1!==e.SANITIZE_DOM,Wt=e.SANITIZE_NAMED_PROPS||!1,qt=!1!==e.KEEP_CONTENT,Vt=e.IN_PLACE||!1,Ct=e.ALLOWED_URI_REGEXP||Ct,re=e.NAMESPACE||ie,e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Lt.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Lt.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Lt.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ft&&(Mt=!1),Yt&&(jt=!0),Gt&&(Et=M({},r(U)),At=[],!0===Gt.html&&(M(Et,R),M(At,W)),!0===Gt.svg&&(M(Et,$),M(At,H),M(At,V)),!0===Gt.svgFilters&&(M(Et,P),M(At,H),M(At,V)),!0===Gt.mathMl&&(M(Et,Y),M(At,q),M(At,V))),e.ADD_TAGS&&(Et===St&&(Et=I(Et)),M(Et,e.ADD_TAGS,mt)),e.ADD_ATTR&&(At===Dt&&(At=I(At)),M(At,e.ADD_ATTR,mt)),e.ADD_URI_SAFE_ATTR&&M(Jt,e.ADD_URI_SAFE_ATTR,mt),e.FORBID_CONTENTS&&(Xt===Zt&&(Xt=I(Xt)),M(Xt,e.FORBID_CONTENTS,mt)),qt&&(Et["#text"]=!0),Rt&&M(Et,["html","head","body"]),Et.table&&(M(Et,["tbody"]),delete Nt.tbody),g&&g(e),he=e)},fe=M({},["mi","mo","mn","ms","mtext"]),ge=M({},["foreignobject","desc","title","annotation-xml"]),ye=M({},["title","style","font","a","script"]),me=M({},$);M(me,P),M(me,j);var be=M({},Y);M(be,z);var _e=function(t){var e=O(t);e&&e.tagName||(e={namespaceURI:re,tagName:"template"});var n=T(t.tagName),i=T(e.tagName);return!!se[t.namespaceURI]&&(t.namespaceURI===ne?e.namespaceURI===ie?"svg"===n:e.namespaceURI===ee?"svg"===n&&("annotation-xml"===i||fe[i]):Boolean(me[n]):t.namespaceURI===ee?e.namespaceURI===ie?"math"===n:e.namespaceURI===ne?"math"===n&&ge[i]:Boolean(be[n]):t.namespaceURI===ie?!(e.namespaceURI===ne&&!ge[i])&&!(e.namespaceURI===ee&&!fe[i])&&!be[n]&&(ye[n]||!me[n]):!("application/xhtml+xml"!==yt||!se[t.namespaceURI]))},xe=function(t){w(n.removed,{element:t});try{t.parentNode.removeChild(t)}catch(Oe){try{t.outerHTML=ot}catch(Oe){t.remove()}}},ve=function(t,e){try{w(n.removed,{attribute:e.getAttributeNode(t),from:e})}catch(Oe){w(n.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t&&!At[t])if(jt||Yt)try{xe(e)}catch(Oe){}else try{e.setAttribute(t,"")}catch(Oe){}},ke=function(t){var e,n;if(Pt)t="<remove></remove>"+t;else{var i=E(t,/^[\r\n\t ]+/);n=i&&i[0]}"application/xhtml+xml"===yt&&re===ie&&(t='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+t+"</body></html>");var r=st?st.createHTML(t):t;if(re===ie)try{e=(new f).parseFromString(r,yt)}catch(Oe){}if(!e||!e.documentElement){e=lt.createDocument(re,"template",null);try{e.documentElement.innerHTML=ae?"":r}catch(Oe){}}var s=e.body||e.documentElement;return t&&n&&s.insertBefore(a.createTextNode(n),s.childNodes[0]||null),re===ie?dt.call(e,Rt?"html":"body")[0]:Rt?e.documentElement:s},we=function(t){return ht.call(t.ownerDocument||t,t,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT,null,!1)},Te=function(t){return t instanceof p&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof d)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore||"function"!=typeof t.hasChildNodes)},Ce=function(e){return"object"===t(c)?e instanceof c:e&&"object"===t(e)&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ee=function(t,e,i){gt[t]&&v(gt[t],(function(t){t.call(n,e,i,he)}))},Se=function(t){var e;if(Ee("beforeSanitizeElements",t,null),Te(t))return xe(t),!0;if(L(/[\u0080-\uFFFF]/,t.nodeName))return xe(t),!0;var i=mt(t.nodeName);if(Ee("uponSanitizeElement",t,{tagName:i,allowedTags:Et}),t.hasChildNodes()&&!Ce(t.firstElementChild)&&(!Ce(t.content)||!Ce(t.content.firstElementChild))&&L(/<[/\w]/g,t.innerHTML)&&L(/<[/\w]/g,t.textContent))return xe(t),!0;if("select"===i&&L(/<template/i,t.innerHTML))return xe(t),!0;if(!Et[i]||Nt[i]){if(!Nt[i]&&De(i)){if(Lt.tagNameCheck instanceof RegExp&&L(Lt.tagNameCheck,i))return!1;if(Lt.tagNameCheck instanceof Function&&Lt.tagNameCheck(i))return!1}if(qt&&!Xt[i]){var r=O(t)||t.parentNode,a=x(t)||t.childNodes;if(a&&r)for(var s=a.length-1;s>=0;--s)r.insertBefore(b(a[s],!0),_(t))}return xe(t),!0}return t instanceof l&&!_e(t)?(xe(t),!0):"noscript"!==i&&"noembed"!==i||!L(/<\/no(script|embed)/i,t.innerHTML)?(Ft&&3===t.nodeType&&(e=t.textContent,e=S(e,bt," "),e=S(e,_t," "),e=S(e,xt," "),t.textContent!==e&&(w(n.removed,{element:t.cloneNode()}),t.textContent=e)),Ee("afterSanitizeElements",t,null),!1):(xe(t),!0)},Ae=function(t,e,n){if(Ut&&("id"===e||"name"===e)&&(n in a||n in ue))return!1;if(Mt&&!Ot[e]&&L(vt,e));else if(Bt&&L(kt,e));else if(!At[e]||Ot[e]){if(!(De(t)&&(Lt.tagNameCheck instanceof RegExp&&L(Lt.tagNameCheck,t)||Lt.tagNameCheck instanceof Function&&Lt.tagNameCheck(t))&&(Lt.attributeNameCheck instanceof RegExp&&L(Lt.attributeNameCheck,e)||Lt.attributeNameCheck instanceof Function&&Lt.attributeNameCheck(e))||"is"===e&&Lt.allowCustomizedBuiltInElements&&(Lt.tagNameCheck instanceof RegExp&&L(Lt.tagNameCheck,n)||Lt.tagNameCheck instanceof Function&&Lt.tagNameCheck(n))))return!1}else if(Jt[e]);else if(L(Ct,S(n,Tt,"")));else if("src"!==e&&"xlink:href"!==e&&"href"!==e||"script"===t||0!==A(n,"data:")||!Qt[t])if(It&&!L(wt,S(n,Tt,"")));else if(n)return!1;return!0},De=function(t){return t.indexOf("-")>0},Le=function(e){var i,r,a,s;Ee("beforeSanitizeAttributes",e,null);var o=e.attributes;if(o){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:At};for(s=o.length;s--;){var l=i=o[s],h=l.name,u=l.namespaceURI;if(r="value"===h?i.value:D(i.value),a=mt(h),c.attrName=a,c.attrValue=r,c.keepAttr=!0,c.forceKeepAttr=void 0,Ee("uponSanitizeAttribute",e,c),r=c.attrValue,!c.forceKeepAttr&&(ve(h,e),c.keepAttr))if(L(/\/>/i,r))ve(h,e);else{Ft&&(r=S(r,bt," "),r=S(r,_t," "),r=S(r,xt," "));var d=mt(e.nodeName);if(Ae(d,a,r)){if(!Wt||"id"!==a&&"name"!==a||(ve(h,e),r=Ht+r),st&&"object"===t(y)&&"function"==typeof y.getAttributeType)if(u);else switch(y.getAttributeType(d,a)){case"TrustedHTML":r=st.createHTML(r);break;case"TrustedScriptURL":r=st.createScriptURL(r)}try{u?e.setAttributeNS(u,h,r):e.setAttribute(h,r),k(n.removed)}catch(Oe){}}}}Ee("afterSanitizeAttributes",e,null)}},Ne=function t(e){var n,i=we(e);for(Ee("beforeSanitizeShadowDOM",e,null);n=i.nextNode();)Ee("uponSanitizeShadowNode",n,null),Se(n)||(n.content instanceof s&&t(n.content),Le(n));Ee("afterSanitizeShadowDOM",e,null)};return n.sanitize=function(r){var a,o,l,h,u,d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((ae=!r)&&(r="\x3c!--\x3e"),"string"!=typeof r&&!Ce(r)){if("function"!=typeof r.toString)throw N("toString is not a function");if("string"!=typeof(r=r.toString()))throw N("dirty is not a string, aborting")}if(!n.isSupported){if("object"===t(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof r)return e.toStaticHTML(r);if(Ce(r))return e.toStaticHTML(r.outerHTML)}return r}if($t||pe(d),n.removed=[],"string"==typeof r&&(Vt=!1),Vt){if(r.nodeName){var p=mt(r.nodeName);if(!Et[p]||Nt[p])throw N("root node is forbidden and cannot be sanitized in-place")}}else if(r instanceof c)1===(o=(a=ke("\x3c!----\x3e")).ownerDocument.importNode(r,!0)).nodeType&&"BODY"===o.nodeName||"HTML"===o.nodeName?a=o:a.appendChild(o);else{if(!jt&&!Ft&&!Rt&&-1===r.indexOf("<"))return st&&zt?st.createHTML(r):r;if(!(a=ke(r)))return jt?null:zt?ot:""}a&&Pt&&xe(a.firstChild);for(var f=we(Vt?r:a);l=f.nextNode();)3===l.nodeType&&l===h||Se(l)||(l.content instanceof s&&Ne(l.content),Le(l),h=l);if(h=null,Vt)return r;if(jt){if(Yt)for(u=ut.call(a.ownerDocument);a.firstChild;)u.appendChild(a.firstChild);else u=a;return At.shadowroot&&(u=pt.call(i,u,!0)),u}var g=Rt?a.outerHTML:a.innerHTML;return Rt&&Et["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&L(nt,a.ownerDocument.doctype.name)&&(g="<!DOCTYPE "+a.ownerDocument.doctype.name+">\n"+g),Ft&&(g=S(g,bt," "),g=S(g,_t," "),g=S(g,xt," ")),st&&zt?st.createHTML(g):g},n.setConfig=function(t){pe(t),$t=!0},n.clearConfig=function(){he=null,$t=!1},n.isValidAttribute=function(t,e,n){he||pe({});var i=mt(t),r=mt(e);return Ae(i,r,n)},n.addHook=function(t,e){"function"==typeof e&&(gt[t]=gt[t]||[],w(gt[t],e))},n.removeHook=function(t){if(gt[t])return k(gt[t])},n.removeHooks=function(t){gt[t]&&(gt[t]=[])},n.removeAllHooks=function(){gt={}},n}return at()}()},9234:()=>{},1941:function(t,e,n){(t=n.nmd(t)).exports=function(){"use strict";var e;function i(){return e.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function a(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function o(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;for(var e in t)if(s(t,e))return;return 1}function c(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function h(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function u(t,e){for(var n=[],i=t.length,r=0;r<i;++r)n.push(e(t[r],r));return n}function d(t,e){for(var n in e)s(e,n)&&(t[n]=e[n]);return s(e,"toString")&&(t.toString=e.toString),s(e,"valueOf")&&(t.valueOf=e.valueOf),t}function p(t,e,n,i){return Le(t,e,n,i,!0).utc()}function f(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),t._pf}function g(t){if(null==t._isValid){var e=f(t),n=m.call(e.parsedDateParts,(function(t){return null!=t}));if(n=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidEra&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n),t._strict&&(n=n&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return n;t._isValid=n}return t._isValid}function y(t){var e=p(NaN);return null!=t?d(f(e),t):f(e).userInvalidated=!0,e}var m=Array.prototype.some||function(t){for(var e=Object(this),n=e.length>>>0,i=0;i<n;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1},b=i.momentProperties=[],_=!1;function x(t,e){var n,i,r,a=b.length;if(c(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),c(e._i)||(t._i=e._i),c(e._f)||(t._f=e._f),c(e._l)||(t._l=e._l),c(e._strict)||(t._strict=e._strict),c(e._tzm)||(t._tzm=e._tzm),c(e._isUTC)||(t._isUTC=e._isUTC),c(e._offset)||(t._offset=e._offset),c(e._pf)||(t._pf=f(e)),c(e._locale)||(t._locale=e._locale),0<a)for(n=0;n<a;n++)c(r=e[i=b[n]])||(t[i]=r);return t}function v(t){x(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===_&&(_=!0,i.updateOffset(this),_=!1)}function k(t){return t instanceof v||null!=t&&null!=t._isAMomentObject}function w(t){!1===i.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function T(t,e){var n=!0;return d((function(){if(null!=i.deprecationHandler&&i.deprecationHandler(null,t),n){for(var r,a,o=[],c=arguments.length,l=0;l<c;l++){if(r="","object"==typeof arguments[l]){for(a in r+="\n["+l+"] ",arguments[0])s(arguments[0],a)&&(r+=a+": "+arguments[0][a]+", ");r=r.slice(0,-2)}else r=arguments[l];o.push(r)}w(t+"\nArguments: "+Array.prototype.slice.call(o).join("")+"\n"+(new Error).stack),n=!1}return e.apply(this,arguments)}),e)}var C={};function E(t,e){null!=i.deprecationHandler&&i.deprecationHandler(t,e),C[t]||(w(e),C[t]=!0)}function S(t){return"undefined"!=typeof Function&&t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function A(t,e){var n,i=d({},t);for(n in e)s(e,n)&&(a(t[n])&&a(e[n])?(i[n]={},d(i[n],t[n]),d(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)s(t,n)&&!s(e,n)&&a(t[n])&&(i[n]=d({},i[n]));return i}function D(t){null!=t&&this.set(t)}i.suppressDeprecationWarnings=!1,i.deprecationHandler=null;var L=Object.keys||function(t){var e,n=[];for(e in t)s(t,e)&&n.push(e);return n};function N(t,e,n){var i=""+Math.abs(t);return(0<=t?n?"+":"":"-")+Math.pow(10,Math.max(0,e-i.length)).toString().substr(1)+i}var O=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,B=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,M={},I={};function F(t,e,n,i){var r="string"==typeof i?function(){return this[i]()}:i;t&&(I[t]=r),e&&(I[e[0]]=function(){return N(r.apply(this,arguments),e[1],e[2])}),n&&(I[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function R(t,e){return t.isValid()?(e=$(e,t.localeData()),M[e]=M[e]||function(t){for(var e,n=t.match(O),i=0,r=n.length;i<r;i++)I[n[i]]?n[i]=I[n[i]]:n[i]=(e=n[i]).match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"");return function(e){for(var i="",a=0;a<r;a++)i+=S(n[a])?n[a].call(e,t):n[a];return i}}(e),M[e](t)):t.localeData().invalidDate()}function $(t,e){var n=5;function i(t){return e.longDateFormat(t)||t}for(B.lastIndex=0;0<=n&&B.test(t);)t=t.replace(B,i),B.lastIndex=0,--n;return t}var P={};function j(t,e){var n=t.toLowerCase();P[n]=P[n+"s"]=P[e]=t}function Y(t){return"string"==typeof t?P[t]||P[t.toLowerCase()]:void 0}function z(t){var e,n,i={};for(n in t)s(t,n)&&(e=Y(n))&&(i[e]=t[n]);return i}var U={};function W(t,e){U[t]=e}function H(t){return t%4==0&&t%100!=0||t%400==0}function q(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function V(t){var e=0;return 0!=(t=+t)&&isFinite(t)?q(t):e}function G(t,e){return function(n){return null!=n?(Z(this,t,n),i.updateOffset(this,e),this):X(this,t)}}function X(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Z(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&H(t.year())&&1===t.month()&&29===t.date()?(n=V(n),t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),Lt(n,t.month()))):t._d["set"+(t._isUTC?"UTC":"")+e](n))}var Q=/\d/,K=/\d\d/,J=/\d{3}/,tt=/\d{4}/,et=/[+-]?\d{6}/,nt=/\d\d?/,it=/\d\d\d\d?/,rt=/\d\d\d\d\d\d?/,at=/\d{1,3}/,st=/\d{1,4}/,ot=/[+-]?\d{1,6}/,ct=/\d+/,lt=/[+-]?\d+/,ht=/Z|[+-]\d\d:?\d\d/gi,ut=/Z|[+-]\d\d(?::?\d\d)?/gi,dt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function pt(t,e,n){yt[t]=S(e)?e:function(t,i){return t&&n?n:e}}function ft(t,e){return s(yt,t)?yt[t](e._strict,e._locale):new RegExp(gt(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,n,i,r){return e||n||i||r}))))}function gt(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var yt={},mt={};function bt(t,e){var n,i,r=e;for("string"==typeof t&&(t=[t]),l(e)&&(r=function(t,n){n[e]=V(t)}),i=t.length,n=0;n<i;n++)mt[t[n]]=r}function _t(t,e){bt(t,(function(t,n,i,r){i._w=i._w||{},e(t,i._w,i,r)}))}var xt,vt=0,kt=1,wt=2,Tt=3,Ct=4,Et=5,St=6,At=7,Dt=8;function Lt(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=(e%(n=12)+n)%n;return t+=(e-n)/12,1==n?H(t)?29:28:31-n%7%2}xt=Array.prototype.indexOf||function(t){for(var e=0;e<this.length;++e)if(this[e]===t)return e;return-1},F("M",["MM",2],"Mo",(function(){return this.month()+1})),F("MMM",0,0,(function(t){return this.localeData().monthsShort(this,t)})),F("MMMM",0,0,(function(t){return this.localeData().months(this,t)})),j("month","M"),W("month",8),pt("M",nt),pt("MM",nt,K),pt("MMM",(function(t,e){return e.monthsShortRegex(t)})),pt("MMMM",(function(t,e){return e.monthsRegex(t)})),bt(["M","MM"],(function(t,e){e[kt]=V(t)-1})),bt(["MMM","MMMM"],(function(t,e,n,i){null!=(i=n._locale.monthsParse(t,i,n._strict))?e[kt]=i:f(n).invalidMonth=t}));var Nt="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Ot="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Bt=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Mt=dt,It=dt;function Ft(t,e){var n;if(t.isValid()){if("string"==typeof e)if(/^\d+$/.test(e))e=V(e);else if(!l(e=t.localeData().monthsParse(e)))return;n=Math.min(t.date(),Lt(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n)}}function Rt(t){return null!=t?(Ft(this,t),i.updateOffset(this,!0),this):X(this,"Month")}function $t(){function t(t,e){return e.length-t.length}for(var e,n=[],i=[],r=[],a=0;a<12;a++)e=p([2e3,a]),n.push(this.monthsShort(e,"")),i.push(this.months(e,"")),r.push(this.months(e,"")),r.push(this.monthsShort(e,""));for(n.sort(t),i.sort(t),r.sort(t),a=0;a<12;a++)n[a]=gt(n[a]),i[a]=gt(i[a]);for(a=0;a<24;a++)r[a]=gt(r[a]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+n.join("|")+")","i")}function Pt(t){return H(t)?366:365}F("Y",0,0,(function(){var t=this.year();return t<=9999?N(t,4):"+"+t})),F(0,["YY",2],0,(function(){return this.year()%100})),F(0,["YYYY",4],0,"year"),F(0,["YYYYY",5],0,"year"),F(0,["YYYYYY",6,!0],0,"year"),j("year","y"),W("year",1),pt("Y",lt),pt("YY",nt,K),pt("YYYY",st,tt),pt("YYYYY",ot,et),pt("YYYYYY",ot,et),bt(["YYYYY","YYYYYY"],vt),bt("YYYY",(function(t,e){e[vt]=2===t.length?i.parseTwoDigitYear(t):V(t)})),bt("YY",(function(t,e){e[vt]=i.parseTwoDigitYear(t)})),bt("Y",(function(t,e){e[vt]=parseInt(t,10)})),i.parseTwoDigitYear=function(t){return V(t)+(68<V(t)?1900:2e3)};var jt=G("FullYear",!0);function Yt(t,e,n,i,r,a,s){var o;return t<100&&0<=t?(o=new Date(t+400,e,n,i,r,a,s),isFinite(o.getFullYear())&&o.setFullYear(t)):o=new Date(t,e,n,i,r,a,s),o}function zt(t){var e;return t<100&&0<=t?((e=Array.prototype.slice.call(arguments))[0]=t+400,e=new Date(Date.UTC.apply(null,e)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)):e=new Date(Date.UTC.apply(null,arguments)),e}function Ut(t,e,n){return(n=7+e-n)-(7+zt(t,0,n).getUTCDay()-e)%7-1}function Wt(t,e,n,i,r){var a;return n=(e=1+7*(e-1)+(7+n-i)%7+Ut(t,i,r))<=0?Pt(a=t-1)+e:e>Pt(t)?(a=t+1,e-Pt(t)):(a=t,e),{year:a,dayOfYear:n}}function Ht(t,e,n){var i,r,a=Ut(t.year(),e,n);return(a=Math.floor((t.dayOfYear()-a-1)/7)+1)<1?i=a+qt(r=t.year()-1,e,n):a>qt(t.year(),e,n)?(i=a-qt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function qt(t,e,n){var i=Ut(t,e,n);return e=Ut(t+1,e,n),(Pt(t)-i+e)/7}function Vt(t,e){return t.slice(e,7).concat(t.slice(0,e))}F("w",["ww",2],"wo","week"),F("W",["WW",2],"Wo","isoWeek"),j("week","w"),j("isoWeek","W"),W("week",5),W("isoWeek",5),pt("w",nt),pt("ww",nt,K),pt("W",nt),pt("WW",nt,K),_t(["w","ww","W","WW"],(function(t,e,n,i){e[i.substr(0,1)]=V(t)})),F("d",0,"do","day"),F("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),F("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),F("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),F("e",0,0,"weekday"),F("E",0,0,"isoWeekday"),j("day","d"),j("weekday","e"),j("isoWeekday","E"),W("day",11),W("weekday",11),W("isoWeekday",11),pt("d",nt),pt("e",nt),pt("E",nt),pt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),pt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),pt("dddd",(function(t,e){return e.weekdaysRegex(t)})),_t(["dd","ddd","dddd"],(function(t,e,n,i){null!=(i=n._locale.weekdaysParse(t,i,n._strict))?e.d=i:f(n).invalidWeekday=t})),_t(["d","e","E"],(function(t,e,n,i){e[i]=V(t)}));var Gt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Xt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Zt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Qt=dt,Kt=dt,Jt=dt;function te(){function t(t,e){return e.length-t.length}for(var e,n,i,r=[],a=[],s=[],o=[],c=0;c<7;c++)i=p([2e3,1]).day(c),e=gt(this.weekdaysMin(i,"")),n=gt(this.weekdaysShort(i,"")),i=gt(this.weekdays(i,"")),r.push(e),a.push(n),s.push(i),o.push(e),o.push(n),o.push(i);r.sort(t),a.sort(t),s.sort(t),o.sort(t),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function ee(){return this.hours()%12||12}function ne(t,e){F(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function ie(t,e){return e._meridiemParse}F("H",["HH",2],0,"hour"),F("h",["hh",2],0,ee),F("k",["kk",2],0,(function(){return this.hours()||24})),F("hmm",0,0,(function(){return""+ee.apply(this)+N(this.minutes(),2)})),F("hmmss",0,0,(function(){return""+ee.apply(this)+N(this.minutes(),2)+N(this.seconds(),2)})),F("Hmm",0,0,(function(){return""+this.hours()+N(this.minutes(),2)})),F("Hmmss",0,0,(function(){return""+this.hours()+N(this.minutes(),2)+N(this.seconds(),2)})),ne("a",!0),ne("A",!1),j("hour","h"),W("hour",13),pt("a",ie),pt("A",ie),pt("H",nt),pt("h",nt),pt("k",nt),pt("HH",nt,K),pt("hh",nt,K),pt("kk",nt,K),pt("hmm",it),pt("hmmss",rt),pt("Hmm",it),pt("Hmmss",rt),bt(["H","HH"],Tt),bt(["k","kk"],(function(t,e,n){t=V(t),e[Tt]=24===t?0:t})),bt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),bt(["h","hh"],(function(t,e,n){e[Tt]=V(t),f(n).bigHour=!0})),bt("hmm",(function(t,e,n){var i=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i)),f(n).bigHour=!0})),bt("hmmss",(function(t,e,n){var i=t.length-4,r=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i,2)),e[Et]=V(t.substr(r)),f(n).bigHour=!0})),bt("Hmm",(function(t,e,n){var i=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i))})),bt("Hmmss",(function(t,e,n){var i=t.length-4,r=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i,2)),e[Et]=V(t.substr(r))})),dt=G("Hours",!0);var re,ae={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Nt,monthsShort:Ot,week:{dow:0,doy:6},weekdays:Gt,weekdaysMin:Zt,weekdaysShort:Xt,meridiemParse:/[ap]\.?m?\.?/i},se={},oe={};function ce(t){return t&&t.toLowerCase().replace("_","-")}function le(t){for(var e,n,i,r,a=0;a<t.length;){for(e=(r=ce(t[a]).split("-")).length,n=(n=ce(t[a+1]))?n.split("-"):null;0<e;){if(i=he(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&function(t,e){for(var n=Math.min(t.length,e.length),i=0;i<n;i+=1)if(t[i]!==e[i])return i;return n}(r,n)>=e-1)break;e--}a++}return re}function he(e){var i;if(void 0===se[e]&&t&&t.exports&&null!=e.match("^[^/\\\\]*$"))try{i=re._abbr,n(1748)("./"+e),ue(i)}catch(i){se[e]=null}return se[e]}function ue(t,e){return t&&((e=c(e)?pe(t):de(t,e))?re=e:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),re._abbr}function de(t,e){if(null===e)return delete se[t],null;var n,i=ae;if(e.abbr=t,null!=se[t])E("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=se[t]._config;else if(null!=e.parentLocale)if(null!=se[e.parentLocale])i=se[e.parentLocale]._config;else{if(null==(n=he(e.parentLocale)))return oe[e.parentLocale]||(oe[e.parentLocale]=[]),oe[e.parentLocale].push({name:t,config:e}),null;i=n._config}return se[t]=new D(A(i,e)),oe[t]&&oe[t].forEach((function(t){de(t.name,t.config)})),ue(t),se[t]}function pe(t){var e;if(!(t=t&&t._locale&&t._locale._abbr?t._locale._abbr:t))return re;if(!r(t)){if(e=he(t))return e;t=[t]}return le(t)}function fe(t){var e=t._a;return e&&-2===f(t).overflow&&(e=e[kt]<0||11<e[kt]?kt:e[wt]<1||e[wt]>Lt(e[vt],e[kt])?wt:e[Tt]<0||24<e[Tt]||24===e[Tt]&&(0!==e[Ct]||0!==e[Et]||0!==e[St])?Tt:e[Ct]<0||59<e[Ct]?Ct:e[Et]<0||59<e[Et]?Et:e[St]<0||999<e[St]?St:-1,f(t)._overflowDayOfYear&&(e<vt||wt<e)&&(e=wt),f(t)._overflowWeeks&&-1===e&&(e=At),f(t)._overflowWeekday&&-1===e&&(e=Dt),f(t).overflow=e),t}var ge=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,me=/Z|[+-]\d\d(?::?\d\d)?/,be=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],_e=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],xe=/^\/?Date\((-?\d+)/i,ve=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,ke={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function we(t){var e,n,i,r,a,s,o=t._i,c=ge.exec(o)||ye.exec(o),l=(o=be.length,_e.length);if(c){for(f(t).iso=!0,e=0,n=o;e<n;e++)if(be[e][1].exec(c[1])){r=be[e][0],i=!1!==be[e][2];break}if(null==r)t._isValid=!1;else{if(c[3]){for(e=0,n=l;e<n;e++)if(_e[e][1].exec(c[3])){a=(c[2]||" ")+_e[e][0];break}if(null==a)return void(t._isValid=!1)}if(i||null==a){if(c[4]){if(!me.exec(c[4]))return void(t._isValid=!1);s="Z"}t._f=r+(a||"")+(s||""),Ae(t)}else t._isValid=!1}}else t._isValid=!1}function Te(t,e,n,i,r,a){return t=[function(t){return(t=parseInt(t,10))<=49?2e3+t:t<=999?1900+t:t}(t),Ot.indexOf(e),parseInt(n,10),parseInt(i,10),parseInt(r,10)],a&&t.push(parseInt(a,10)),t}function Ce(t){var e,n,i,r,a=ve.exec(t._i.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));a?(i=e=Te(a[4],a[3],a[2],a[5],a[6],a[7]),r=t,(n=a[1])&&Xt.indexOf(n)!==new Date(i[0],i[1],i[2]).getDay()?(f(r).weekdayMismatch=!0,r._isValid=!1):(t._a=e,t._tzm=(n=a[8],i=a[9],r=a[10],n?ke[n]:i?0:((n=parseInt(r,10))-(i=n%100))/100*60+i),t._d=zt.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),f(t).rfc2822=!0)):t._isValid=!1}function Ee(t,e,n){return null!=t?t:null!=e?e:n}function Se(t){var e,n,r,a,s,o,c,l,h,u,d,p=[];if(!t._d){for(r=t,a=new Date(i.now()),n=r._useUTC?[a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate()]:[a.getFullYear(),a.getMonth(),a.getDate()],t._w&&null==t._a[wt]&&null==t._a[kt]&&(null!=(a=(r=t)._w).GG||null!=a.W||null!=a.E?(l=1,h=4,s=Ee(a.GG,r._a[vt],Ht(Ne(),1,4).year),o=Ee(a.W,1),((c=Ee(a.E,1))<1||7<c)&&(u=!0)):(l=r._locale._week.dow,h=r._locale._week.doy,d=Ht(Ne(),l,h),s=Ee(a.gg,r._a[vt],d.year),o=Ee(a.w,d.week),null!=a.d?((c=a.d)<0||6<c)&&(u=!0):null!=a.e?(c=a.e+l,(a.e<0||6<a.e)&&(u=!0)):c=l),o<1||o>qt(s,l,h)?f(r)._overflowWeeks=!0:null!=u?f(r)._overflowWeekday=!0:(d=Wt(s,o,c,l,h),r._a[vt]=d.year,r._dayOfYear=d.dayOfYear)),null!=t._dayOfYear&&(a=Ee(t._a[vt],n[vt]),(t._dayOfYear>Pt(a)||0===t._dayOfYear)&&(f(t)._overflowDayOfYear=!0),u=zt(a,0,t._dayOfYear),t._a[kt]=u.getUTCMonth(),t._a[wt]=u.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=p[e]=n[e];for(;e<7;e++)t._a[e]=p[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Tt]&&0===t._a[Ct]&&0===t._a[Et]&&0===t._a[St]&&(t._nextDay=!0,t._a[Tt]=0),t._d=(t._useUTC?zt:Yt).apply(null,p),s=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Tt]=24),t._w&&void 0!==t._w.d&&t._w.d!==s&&(f(t).weekdayMismatch=!0)}}function Ae(t){if(t._f===i.ISO_8601)we(t);else if(t._f===i.RFC_2822)Ce(t);else{t._a=[],f(t).empty=!0;for(var e,n,r,a,o,c=""+t._i,l=c.length,h=0,u=$(t._f,t._locale).match(O)||[],d=u.length,p=0;p<d;p++)n=u[p],(e=(c.match(ft(n,t))||[])[0])&&(0<(r=c.substr(0,c.indexOf(e))).length&&f(t).unusedInput.push(r),c=c.slice(c.indexOf(e)+e.length),h+=e.length),I[n]?(e?f(t).empty=!1:f(t).unusedTokens.push(n),r=n,o=t,null!=(a=e)&&s(mt,r)&&mt[r](a,o._a,o,r)):t._strict&&!e&&f(t).unusedTokens.push(n);f(t).charsLeftOver=l-h,0<c.length&&f(t).unusedInput.push(c),t._a[Tt]<=12&&!0===f(t).bigHour&&0<t._a[Tt]&&(f(t).bigHour=void 0),f(t).parsedDateParts=t._a.slice(0),f(t).meridiem=t._meridiem,t._a[Tt]=function(t,e,n){return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((t=t.isPM(n))&&e<12&&(e+=12),e=t||12!==e?e:0):e}(t._locale,t._a[Tt],t._meridiem),null!==(l=f(t).era)&&(t._a[vt]=t._locale.erasConvertYear(l,t._a[vt])),Se(t),fe(t)}}function De(t){var e,n,s,o=t._i,p=t._f;return t._locale=t._locale||pe(t._l),null===o||void 0===p&&""===o?y({nullInput:!0}):("string"==typeof o&&(t._i=o=t._locale.preparse(o)),k(o)?new v(fe(o)):(h(o)?t._d=o:r(p)?function(t){var e,n,i,r,a,s,o=!1,c=t._f.length;if(0===c)return f(t).invalidFormat=!0,t._d=new Date(NaN);for(r=0;r<c;r++)a=0,s=!1,e=x({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[r],Ae(e),g(e)&&(s=!0),a=(a+=f(e).charsLeftOver)+10*f(e).unusedTokens.length,f(e).score=a,o?a<i&&(i=a,n=e):(null==i||a<i||s)&&(i=a,n=e,s&&(o=!0));d(t,n||e)}(t):p?Ae(t):c(p=(o=t)._i)?o._d=new Date(i.now()):h(p)?o._d=new Date(p.valueOf()):"string"==typeof p?(n=o,null!==(e=xe.exec(n._i))?n._d=new Date(+e[1]):(we(n),!1===n._isValid&&(delete n._isValid,Ce(n),!1===n._isValid&&(delete n._isValid,n._strict?n._isValid=!1:i.createFromInputFallback(n))))):r(p)?(o._a=u(p.slice(0),(function(t){return parseInt(t,10)})),Se(o)):a(p)?(e=o)._d||(s=void 0===(n=z(e._i)).day?n.date:n.day,e._a=u([n.year,n.month,s,n.hour,n.minute,n.second,n.millisecond],(function(t){return t&&parseInt(t,10)})),Se(e)):l(p)?o._d=new Date(p):i.createFromInputFallback(o),g(t)||(t._d=null),t))}function Le(t,e,n,i,s){var c={};return!0!==e&&!1!==e||(i=e,e=void 0),!0!==n&&!1!==n||(i=n,n=void 0),(a(t)&&o(t)||r(t)&&0===t.length)&&(t=void 0),c._isAMomentObject=!0,c._useUTC=c._isUTC=s,c._l=n,c._i=t,c._f=e,c._strict=i,(s=new v(fe(De(s=c))))._nextDay&&(s.add(1,"d"),s._nextDay=void 0),s}function Ne(t,e,n,i){return Le(t,e,n,i,!1)}function Oe(t,e){var n,i;if(!(e=1===e.length&&r(e[0])?e[0]:e).length)return Ne();for(n=e[0],i=1;i<e.length;++i)e[i].isValid()&&!e[i][t](n)||(n=e[i]);return n}i.createFromInputFallback=T("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",(function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))})),i.ISO_8601=function(){},i.RFC_2822=function(){},it=T("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Ne.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:y()})),rt=T("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Ne.apply(null,arguments);return this.isValid()&&t.isValid()?this<t?this:t:y()}));var Be=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Me(t){var e=(t=z(t)).year||0,n=t.quarter||0,i=t.month||0,r=t.week||t.isoWeek||0,a=t.day||0,o=t.hour||0,c=t.minute||0,l=t.second||0,h=t.millisecond||0;this._isValid=function(t){var e,n,i=!1,r=Be.length;for(e in t)if(s(t,e)&&(-1===xt.call(Be,e)||null!=t[e]&&isNaN(t[e])))return!1;for(n=0;n<r;++n)if(t[Be[n]]){if(i)return!1;parseFloat(t[Be[n]])!==V(t[Be[n]])&&(i=!0)}return!0}(t),this._milliseconds=+h+1e3*l+6e4*c+1e3*o*60*60,this._days=+a+7*r,this._months=+i+3*n+12*e,this._data={},this._locale=pe(),this._bubble()}function Ie(t){return t instanceof Me}function Fe(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function Re(t,e){F(t,0,0,(function(){var t=this.utcOffset(),n="+";return t<0&&(t=-t,n="-"),n+N(~~(t/60),2)+e+N(~~t%60,2)}))}Re("Z",":"),Re("ZZ",""),pt("Z",ut),pt("ZZ",ut),bt(["Z","ZZ"],(function(t,e,n){n._useUTC=!0,n._tzm=Pe(ut,t)}));var $e=/([\+\-]|\d\d)/gi;function Pe(t,e){return null===(e=(e||"").match(t))?null:0===(e=60*(t=((e[e.length-1]||[])+"").match($e)||["-",0,0])[1]+V(t[2]))?0:"+"===t[0]?e:-e}function je(t,e){var n;return e._isUTC?(e=e.clone(),n=(k(t)||h(t)?t:Ne(t)).valueOf()-e.valueOf(),e._d.setTime(e._d.valueOf()+n),i.updateOffset(e,!1),e):Ne(t).local()}function Ye(t){return-Math.round(t._d.getTimezoneOffset())}function ze(){return!!this.isValid()&&this._isUTC&&0===this._offset}i.updateOffset=function(){};var Ue=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,We=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function He(t,e){var n,i=t,r=null;return Ie(t)?i={ms:t._milliseconds,d:t._days,M:t._months}:l(t)||!isNaN(+t)?(i={},e?i[e]=+t:i.milliseconds=+t):(r=Ue.exec(t))?(n="-"===r[1]?-1:1,i={y:0,d:V(r[wt])*n,h:V(r[Tt])*n,m:V(r[Ct])*n,s:V(r[Et])*n,ms:V(Fe(1e3*r[St]))*n}):(r=We.exec(t))?(n="-"===r[1]?-1:1,i={y:qe(r[2],n),M:qe(r[3],n),w:qe(r[4],n),d:qe(r[5],n),h:qe(r[6],n),m:qe(r[7],n),s:qe(r[8],n)}):null==i?i={}:"object"==typeof i&&("from"in i||"to"in i)&&(e=function(t,e){var n;return t.isValid()&&e.isValid()?(e=je(e,t),t.isBefore(e)?n=Ve(t,e):((n=Ve(e,t)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}(Ne(i.from),Ne(i.to)),(i={}).ms=e.milliseconds,i.M=e.months),r=new Me(i),Ie(t)&&s(t,"_locale")&&(r._locale=t._locale),Ie(t)&&s(t,"_isValid")&&(r._isValid=t._isValid),r}function qe(t,e){return t=t&&parseFloat(t.replace(",",".")),(isNaN(t)?0:t)*e}function Ve(t,e){var n={};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function Ge(t,e){return function(n,i){var r;return null===i||isNaN(+i)||(E(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),r=n,n=i,i=r),Xe(this,He(n,i),t),this}}function Xe(t,e,n,r){var a=e._milliseconds,s=Fe(e._days);e=Fe(e._months),t.isValid()&&(r=null==r||r,e&&Ft(t,X(t,"Month")+e*n),s&&Z(t,"Date",X(t,"Date")+s*n),a&&t._d.setTime(t._d.valueOf()+a*n),r&&i.updateOffset(t,s||e))}function Ze(t){return"string"==typeof t||t instanceof String}function Qe(t){return k(t)||h(t)||Ze(t)||l(t)||function(t){var e=r(t),n=!1;return e&&(n=0===t.filter((function(e){return!l(e)&&Ze(t)})).length),e&&n}(t)||function(t){var e,n,i=a(t)&&!o(t),r=!1,c=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],l=c.length;for(e=0;e<l;e+=1)n=c[e],r=r||s(t,n);return i&&r}(t)||null==t}function Ke(t,e){if(t.date()<e.date())return-Ke(e,t);var n=12*(e.year()-t.year())+(e.month()-t.month()),i=t.clone().add(n,"months");return-(n+(e=e-i<0?(e-i)/(i-t.clone().add(n-1,"months")):(e-i)/(t.clone().add(1+n,"months")-i)))||0}function Je(t){return void 0===t?this._locale._abbr:(null!=(t=pe(t))&&(this._locale=t),this)}function tn(){return this._locale}He.fn=Me.prototype,He.invalid=function(){return He(NaN)},Nt=Ge(1,"add"),Gt=Ge(-1,"subtract"),i.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",i.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]",Zt=T("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(t){return void 0===t?this.localeData():this.locale(t)}));var en,nn=126227808e5;function rn(t,e){return(t%e+e)%e}function an(t,e,n){return t<100&&0<=t?new Date(t+400,e,n)-nn:new Date(t,e,n).valueOf()}function sn(t,e,n){return t<100&&0<=t?Date.UTC(t+400,e,n)-nn:Date.UTC(t,e,n)}function on(t,e){return e.erasAbbrRegex(t)}function cn(){for(var t=[],e=[],n=[],i=[],r=this.eras(),a=0,s=r.length;a<s;++a)e.push(gt(r[a].name)),t.push(gt(r[a].abbr)),n.push(gt(r[a].narrow)),i.push(gt(r[a].name)),i.push(gt(r[a].abbr)),i.push(gt(r[a].narrow));this._erasRegex=new RegExp("^("+i.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+e.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+t.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+n.join("|")+")","i")}function ln(t,e){F(0,[t,t.length],0,e)}function hn(t,e,n,i,r){var a;return null==t?Ht(this,i,r).year:(a=qt(t,i,r),function(t,e,n,i,r){return e=zt((t=Wt(t,e,n,i,r)).year,0,t.dayOfYear),this.year(e.getUTCFullYear()),this.month(e.getUTCMonth()),this.date(e.getUTCDate()),this}.call(this,t,e=a<e?a:e,n,i,r))}for(F("N",0,0,"eraAbbr"),F("NN",0,0,"eraAbbr"),F("NNN",0,0,"eraAbbr"),F("NNNN",0,0,"eraName"),F("NNNNN",0,0,"eraNarrow"),F("y",["y",1],"yo","eraYear"),F("y",["yy",2],0,"eraYear"),F("y",["yyy",3],0,"eraYear"),F("y",["yyyy",4],0,"eraYear"),pt("N",on),pt("NN",on),pt("NNN",on),pt("NNNN",(function(t,e){return e.erasNameRegex(t)})),pt("NNNNN",(function(t,e){return e.erasNarrowRegex(t)})),bt(["N","NN","NNN","NNNN","NNNNN"],(function(t,e,n,i){(i=n._locale.erasParse(t,i,n._strict))?f(n).era=i:f(n).invalidEra=t})),pt("y",ct),pt("yy",ct),pt("yyy",ct),pt("yyyy",ct),pt("yo",(function(t,e){return e._eraYearOrdinalRegex||ct})),bt(["y","yy","yyy","yyyy"],vt),bt(["yo"],(function(t,e,n,i){var r;n._locale._eraYearOrdinalRegex&&(r=t.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?e[vt]=n._locale.eraYearOrdinalParse(t,r):e[vt]=parseInt(t,10)})),F(0,["gg",2],0,(function(){return this.weekYear()%100})),F(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),ln("gggg","weekYear"),ln("ggggg","weekYear"),ln("GGGG","isoWeekYear"),ln("GGGGG","isoWeekYear"),j("weekYear","gg"),j("isoWeekYear","GG"),W("weekYear",1),W("isoWeekYear",1),pt("G",lt),pt("g",lt),pt("GG",nt,K),pt("gg",nt,K),pt("GGGG",st,tt),pt("gggg",st,tt),pt("GGGGG",ot,et),pt("ggggg",ot,et),_t(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,n,i){e[i.substr(0,2)]=V(t)})),_t(["gg","GG"],(function(t,e,n,r){e[r]=i.parseTwoDigitYear(t)})),F("Q",0,"Qo","quarter"),j("quarter","Q"),W("quarter",7),pt("Q",Q),bt("Q",(function(t,e){e[kt]=3*(V(t)-1)})),F("D",["DD",2],"Do","date"),j("date","D"),W("date",9),pt("D",nt),pt("DD",nt,K),pt("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),bt(["D","DD"],wt),bt("Do",(function(t,e){e[wt]=V(t.match(nt)[0])})),st=G("Date",!0),F("DDD",["DDDD",3],"DDDo","dayOfYear"),j("dayOfYear","DDD"),W("dayOfYear",4),pt("DDD",at),pt("DDDD",J),bt(["DDD","DDDD"],(function(t,e,n){n._dayOfYear=V(t)})),F("m",["mm",2],0,"minute"),j("minute","m"),W("minute",14),pt("m",nt),pt("mm",nt,K),bt(["m","mm"],Ct),tt=G("Minutes",!1),F("s",["ss",2],0,"second"),j("second","s"),W("second",15),pt("s",nt),pt("ss",nt,K),bt(["s","ss"],Et),ot=G("Seconds",!1),F("S",0,0,(function(){return~~(this.millisecond()/100)})),F(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),F(0,["SSS",3],0,"millisecond"),F(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),F(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),F(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),F(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),F(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),F(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),j("millisecond","ms"),W("millisecond",16),pt("S",at,Q),pt("SS",at,K),pt("SSS",at,J),en="SSSS";en.length<=9;en+="S")pt(en,ct);function un(t,e){e[St]=V(1e3*("0."+t))}for(en="S";en.length<=9;en+="S")bt(en,un);function dn(t){return t}function pn(t,e,n,i){var r=pe();return i=p().set(i,e),r[n](i,t)}function fn(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return pn(t,e,n,"month");for(var i=[],r=0;r<12;r++)i[r]=pn(t,r,n,"month");return i}function gn(t,e,n,i){"boolean"==typeof t?l(e)&&(n=e,e=void 0):(e=t,t=!1,l(n=e)&&(n=e,e=void 0)),e=e||"";var r,a=pe(),s=t?a._week.dow:0,o=[];if(null!=n)return pn(e,(n+s)%7,i,"day");for(r=0;r<7;r++)o[r]=pn(e,(r+s)%7,i,"day");return o}et=G("Milliseconds",!1),F("z",0,0,"zoneAbbr"),F("zz",0,0,"zoneName"),(Q=v.prototype).add=Nt,Q.calendar=function(t,e){1===arguments.length&&(arguments[0]?Qe(arguments[0])?(t=arguments[0],e=void 0):function(t){for(var e=a(t)&&!o(t),n=!1,i=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],r=0;r<i.length;r+=1)n=n||s(t,i[r]);return e&&n}(arguments[0])&&(e=arguments[0],t=void 0):e=t=void 0);var n=je(t=t||Ne(),this).startOf("day");return n=i.calendarFormat(this,n)||"sameElse",e=e&&(S(e[n])?e[n].call(this,t):e[n]),this.format(e||this.localeData().calendar(n,this,Ne(t)))},Q.clone=function(){return new v(this)},Q.diff=function(t,e,n){var i,r,a;if(!this.isValid())return NaN;if(!(i=je(t,this)).isValid())return NaN;switch(r=6e4*(i.utcOffset()-this.utcOffset()),e=Y(e)){case"year":a=Ke(this,i)/12;break;case"month":a=Ke(this,i);break;case"quarter":a=Ke(this,i)/3;break;case"second":a=(this-i)/1e3;break;case"minute":a=(this-i)/6e4;break;case"hour":a=(this-i)/36e5;break;case"day":a=(this-i-r)/864e5;break;case"week":a=(this-i-r)/6048e5;break;default:a=this-i}return n?a:q(a)},Q.endOf=function(t){var e,n;if(void 0===(t=Y(t))||"millisecond"===t||!this.isValid())return this;switch(n=this._isUTC?sn:an,t){case"year":e=n(this.year()+1,0,1)-1;break;case"quarter":e=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=n(this.year(),this.month()+1,1)-1;break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=36e5-rn(e+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":e=this._d.valueOf(),e+=6e4-rn(e,6e4)-1;break;case"second":e=this._d.valueOf(),e+=1e3-rn(e,1e3)-1}return this._d.setTime(e),i.updateOffset(this,!0),this},Q.format=function(t){return t=R(this,t=t||(this.isUtc()?i.defaultFormatUtc:i.defaultFormat)),this.localeData().postformat(t)},Q.from=function(t,e){return this.isValid()&&(k(t)&&t.isValid()||Ne(t).isValid())?He({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Q.fromNow=function(t){return this.from(Ne(),t)},Q.to=function(t,e){return this.isValid()&&(k(t)&&t.isValid()||Ne(t).isValid())?He({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Q.toNow=function(t){return this.to(Ne(),t)},Q.get=function(t){return S(this[t=Y(t)])?this[t]():this},Q.invalidAt=function(){return f(this).overflow},Q.isAfter=function(t,e){return t=k(t)?t:Ne(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=Y(e)||"millisecond")?this.valueOf()>t.valueOf():t.valueOf()<this.clone().startOf(e).valueOf())},Q.isBefore=function(t,e){return t=k(t)?t:Ne(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=Y(e)||"millisecond")?this.valueOf()<t.valueOf():this.clone().endOf(e).valueOf()<t.valueOf())},Q.isBetween=function(t,e,n,i){return t=k(t)?t:Ne(t),e=k(e)?e:Ne(e),!!(this.isValid()&&t.isValid()&&e.isValid())&&("("===(i=i||"()")[0]?this.isAfter(t,n):!this.isBefore(t,n))&&(")"===i[1]?this.isBefore(e,n):!this.isAfter(e,n))},Q.isSame=function(t,e){return t=k(t)?t:Ne(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=Y(e)||"millisecond")?this.valueOf()===t.valueOf():(t=t.valueOf(),this.clone().startOf(e).valueOf()<=t&&t<=this.clone().endOf(e).valueOf()))},Q.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},Q.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},Q.isValid=function(){return g(this)},Q.lang=Zt,Q.locale=Je,Q.localeData=tn,Q.max=rt,Q.min=it,Q.parsingFlags=function(){return d({},f(this))},Q.set=function(t,e){if("object"==typeof t)for(var n=function(t){var e,n=[];for(e in t)s(t,e)&&n.push({unit:e,priority:U[e]});return n.sort((function(t,e){return t.priority-e.priority})),n}(t=z(t)),i=n.length,r=0;r<i;r++)this[n[r].unit](t[n[r].unit]);else if(S(this[t=Y(t)]))return this[t](e);return this},Q.startOf=function(t){var e,n;if(void 0===(t=Y(t))||"millisecond"===t||!this.isValid())return this;switch(n=this._isUTC?sn:an,t){case"year":e=n(this.year(),0,1);break;case"quarter":e=n(this.year(),this.month()-this.month()%3,1);break;case"month":e=n(this.year(),this.month(),1);break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":e=n(this.year(),this.month(),this.date());break;case"hour":e=this._d.valueOf(),e-=rn(e+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":e=this._d.valueOf(),e-=rn(e,6e4);break;case"second":e=this._d.valueOf(),e-=rn(e,1e3)}return this._d.setTime(e),i.updateOffset(this,!0),this},Q.subtract=Gt,Q.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},Q.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},Q.toDate=function(){return new Date(this.valueOf())},Q.toISOString=function(t){if(!this.isValid())return null;var e=(t=!0!==t)?this.clone().utc():this;return e.year()<0||9999<e.year()?R(e,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):S(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",R(e,"Z")):R(e,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Q.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t,e="moment",n="";return this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",n="Z"),e="["+e+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(e+t+"-MM-DD[T]HH:mm:ss.SSS"+n+'[")]')},"undefined"!=typeof Symbol&&null!=Symbol.for&&(Q[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),Q.toJSON=function(){return this.isValid()?this.toISOString():null},Q.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Q.unix=function(){return Math.floor(this.valueOf()/1e3)},Q.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Q.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Q.eraName=function(){for(var t,e=this.localeData().eras(),n=0,i=e.length;n<i;++n){if(t=this.clone().startOf("day").valueOf(),e[n].since<=t&&t<=e[n].until)return e[n].name;if(e[n].until<=t&&t<=e[n].since)return e[n].name}return""},Q.eraNarrow=function(){for(var t,e=this.localeData().eras(),n=0,i=e.length;n<i;++n){if(t=this.clone().startOf("day").valueOf(),e[n].since<=t&&t<=e[n].until)return e[n].narrow;if(e[n].until<=t&&t<=e[n].since)return e[n].narrow}return""},Q.eraAbbr=function(){for(var t,e=this.localeData().eras(),n=0,i=e.length;n<i;++n){if(t=this.clone().startOf("day").valueOf(),e[n].since<=t&&t<=e[n].until)return e[n].abbr;if(e[n].until<=t&&t<=e[n].since)return e[n].abbr}return""},Q.eraYear=function(){for(var t,e,n=this.localeData().eras(),r=0,a=n.length;r<a;++r)if(t=n[r].since<=n[r].until?1:-1,e=this.clone().startOf("day").valueOf(),n[r].since<=e&&e<=n[r].until||n[r].until<=e&&e<=n[r].since)return(this.year()-i(n[r].since).year())*t+n[r].offset;return this.year()},Q.year=jt,Q.isLeapYear=function(){return H(this.year())},Q.weekYear=function(t){return hn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Q.isoWeekYear=function(t){return hn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Q.quarter=Q.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Q.month=Rt,Q.daysInMonth=function(){return Lt(this.year(),this.month())},Q.week=Q.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},Q.isoWeek=Q.isoWeeks=function(t){var e=Ht(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},Q.weeksInYear=function(){var t=this.localeData()._week;return qt(this.year(),t.dow,t.doy)},Q.weeksInWeekYear=function(){var t=this.localeData()._week;return qt(this.weekYear(),t.dow,t.doy)},Q.isoWeeksInYear=function(){return qt(this.year(),1,4)},Q.isoWeeksInISOWeekYear=function(){return qt(this.isoWeekYear(),1,4)},Q.date=st,Q.day=Q.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e,n,i=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(e=t,n=this.localeData(),t="string"!=typeof e?e:isNaN(e)?"number"==typeof(e=n.weekdaysParse(e))?e:null:parseInt(e,10),this.add(t-i,"d")):i},Q.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},Q.isoWeekday=function(t){return this.isValid()?null!=t?(e=t,n=this.localeData(),n="string"==typeof e?n.weekdaysParse(e)%7||7:isNaN(e)?null:e,this.day(this.day()%7?n:n-7)):this.day()||7:null!=t?this:NaN;var e,n},Q.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},Q.hour=Q.hours=dt,Q.minute=Q.minutes=tt,Q.second=Q.seconds=ot,Q.millisecond=Q.milliseconds=et,Q.utcOffset=function(t,e,n){var r,a=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null==t)return this._isUTC?a:Ye(this);if("string"==typeof t){if(null===(t=Pe(ut,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(r=Ye(this)),this._offset=t,this._isUTC=!0,null!=r&&this.add(r,"m"),a!==t&&(!e||this._changeInProgress?Xe(this,He(t-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,i.updateOffset(this,!0),this._changeInProgress=null)),this},Q.utc=function(t){return this.utcOffset(0,t)},Q.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ye(this),"m")),this},Q.parseZone=function(){var t;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(t=Pe(ht,this._i))?this.utcOffset(t):this.utcOffset(0,!0)),this},Q.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Ne(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Q.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Q.isLocal=function(){return!!this.isValid()&&!this._isUTC},Q.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Q.isUtc=ze,Q.isUTC=ze,Q.zoneAbbr=function(){return this._isUTC?"UTC":""},Q.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Q.dates=T("dates accessor is deprecated. Use date instead.",st),Q.months=T("months accessor is deprecated. Use month instead",Rt),Q.years=T("years accessor is deprecated. Use year instead",jt),Q.zone=T("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?(this.utcOffset(t="string"!=typeof t?-t:t,e),this):-this.utcOffset()})),Q.isDSTShifted=T("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!c(this._isDSTShifted))return this._isDSTShifted;var t,e={};return x(e,this),(e=De(e))._a?(t=(e._isUTC?p:Ne)(e._a),this._isDSTShifted=this.isValid()&&0<function(t,e,n){for(var i=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),a=0,s=0;s<i;s++)(n&&t[s]!==e[s]||!n&&V(t[s])!==V(e[s]))&&a++;return a+r}(e._a,t.toArray())):this._isDSTShifted=!1,this._isDSTShifted})),(K=D.prototype).calendar=function(t,e,n){return S(t=this._calendar[t]||this._calendar.sameElse)?t.call(e,n):t},K.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.match(O).map((function(t){return"MMMM"===t||"MM"===t||"DD"===t||"dddd"===t?t.slice(1):t})).join(""),this._longDateFormat[t])},K.invalidDate=function(){return this._invalidDate},K.ordinal=function(t){return this._ordinal.replace("%d",t)},K.preparse=dn,K.postformat=dn,K.relativeTime=function(t,e,n,i){var r=this._relativeTime[n];return S(r)?r(t,e,n,i):r.replace(/%d/i,t)},K.pastFuture=function(t,e){return S(t=this._relativeTime[0<t?"future":"past"])?t(e):t.replace(/%s/i,e)},K.set=function(t){var e,n;for(n in t)s(t,n)&&(S(e=t[n])?this[n]=e:this["_"+n]=e);this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},K.eras=function(t,e){for(var n,r=this._eras||pe("en")._eras,a=0,s=r.length;a<s;++a)switch("string"==typeof r[a].since&&(n=i(r[a].since).startOf("day"),r[a].since=n.valueOf()),typeof r[a].until){case"undefined":r[a].until=1/0;break;case"string":n=i(r[a].until).startOf("day").valueOf(),r[a].until=n.valueOf()}return r},K.erasParse=function(t,e,n){var i,r,a,s,o,c=this.eras();for(t=t.toUpperCase(),i=0,r=c.length;i<r;++i)if(a=c[i].name.toUpperCase(),s=c[i].abbr.toUpperCase(),o=c[i].narrow.toUpperCase(),n)switch(e){case"N":case"NN":case"NNN":if(s===t)return c[i];break;case"NNNN":if(a===t)return c[i];break;case"NNNNN":if(o===t)return c[i]}else if(0<=[a,s,o].indexOf(t))return c[i]},K.erasConvertYear=function(t,e){var n=t.since<=t.until?1:-1;return void 0===e?i(t.since).year():i(t.since).year()+(e-t.offset)*n},K.erasAbbrRegex=function(t){return s(this,"_erasAbbrRegex")||cn.call(this),t?this._erasAbbrRegex:this._erasRegex},K.erasNameRegex=function(t){return s(this,"_erasNameRegex")||cn.call(this),t?this._erasNameRegex:this._erasRegex},K.erasNarrowRegex=function(t){return s(this,"_erasNarrowRegex")||cn.call(this),t?this._erasNarrowRegex:this._erasRegex},K.months=function(t,e){return t?(r(this._months)?this._months:this._months[(this._months.isFormat||Bt).test(e)?"format":"standalone"])[t.month()]:r(this._months)?this._months:this._months.standalone},K.monthsShort=function(t,e){return t?(r(this._monthsShort)?this._monthsShort:this._monthsShort[Bt.test(e)?"format":"standalone"])[t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},K.monthsParse=function(t,e,n){var i,r;if(this._monthsParseExact)return function(t,e,n){var i,r,a;if(t=t.toLocaleLowerCase(),!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)a=p([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(a,"").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(a,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(r=xt.call(this._shortMonthsParse,t))?r:null:-1!==(r=xt.call(this._longMonthsParse,t))?r:null:"MMM"===e?-1!==(r=xt.call(this._shortMonthsParse,t))||-1!==(r=xt.call(this._longMonthsParse,t))?r:null:-1!==(r=xt.call(this._longMonthsParse,t))||-1!==(r=xt.call(this._shortMonthsParse,t))?r:null}.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(r=p([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},K.monthsRegex=function(t){return this._monthsParseExact?(s(this,"_monthsRegex")||$t.call(this),t?this._monthsStrictRegex:this._monthsRegex):(s(this,"_monthsRegex")||(this._monthsRegex=It),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},K.monthsShortRegex=function(t){return this._monthsParseExact?(s(this,"_monthsRegex")||$t.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(s(this,"_monthsShortRegex")||(this._monthsShortRegex=Mt),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},K.week=function(t){return Ht(t,this._week.dow,this._week.doy).week},K.firstDayOfYear=function(){return this._week.doy},K.firstDayOfWeek=function(){return this._week.dow},K.weekdays=function(t,e){return e=r(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"],!0===t?Vt(e,this._week.dow):t?e[t.day()]:e},K.weekdaysMin=function(t){return!0===t?Vt(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},K.weekdaysShort=function(t){return!0===t?Vt(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},K.weekdaysParse=function(t,e,n){var i,r;if(this._weekdaysParseExact)return function(t,e,n){var i,r,a;if(t=t.toLocaleLowerCase(),!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)a=p([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(r=xt.call(this._weekdaysParse,t))?r:null:"ddd"===e?-1!==(r=xt.call(this._shortWeekdaysParse,t))?r:null:-1!==(r=xt.call(this._minWeekdaysParse,t))?r:null:"dddd"===e?-1!==(r=xt.call(this._weekdaysParse,t))||-1!==(r=xt.call(this._shortWeekdaysParse,t))||-1!==(r=xt.call(this._minWeekdaysParse,t))?r:null:"ddd"===e?-1!==(r=xt.call(this._shortWeekdaysParse,t))||-1!==(r=xt.call(this._weekdaysParse,t))||-1!==(r=xt.call(this._minWeekdaysParse,t))?r:null:-1!==(r=xt.call(this._minWeekdaysParse,t))||-1!==(r=xt.call(this._weekdaysParse,t))||-1!==(r=xt.call(this._shortWeekdaysParse,t))?r:null}.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=p([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},K.weekdaysRegex=function(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||te.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(s(this,"_weekdaysRegex")||(this._weekdaysRegex=Qt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},K.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||te.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(s(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Kt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},K.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||te.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(s(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Jt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},K.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},K.meridiem=function(t,e,n){return 11<t?n?"pm":"PM":n?"am":"AM"},ue("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===V(t%100/10)?"th":1==e?"st":2==e?"nd":3==e?"rd":"th")}}),i.lang=T("moment.lang is deprecated. Use moment.locale instead.",ue),i.langData=T("moment.langData is deprecated. Use moment.localeData instead.",pe);var yn=Math.abs;function mn(t,e,n,i){return e=He(e,n),t._milliseconds+=i*e._milliseconds,t._days+=i*e._days,t._months+=i*e._months,t._bubble()}function bn(t){return t<0?Math.floor(t):Math.ceil(t)}function _n(t){return 4800*t/146097}function xn(t){return 146097*t/4800}function vn(t){return function(){return this.as(t)}}function kn(t){return function(){return this.isValid()?this._data[t]:NaN}}at=vn("ms"),J=vn("s"),Nt=vn("m"),rt=vn("h"),it=vn("d"),Gt=vn("w"),dt=vn("M"),tt=vn("Q"),ot=vn("y"),et=kn("milliseconds"),st=kn("seconds"),jt=kn("minutes"),K=kn("hours");var wn=kn("days"),Tn=kn("months"),Cn=kn("years"),En=Math.round,Sn={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function An(t,e,n,i){var r=He(t).abs(),a=En(r.as("s")),s=En(r.as("m")),o=En(r.as("h")),c=En(r.as("d")),l=En(r.as("M")),h=En(r.as("w"));return r=En(r.as("y")),a=(a<=n.ss?["s",a]:a<n.s&&["ss",a])||s<=1&&["m"]||s<n.m&&["mm",s]||o<=1&&["h"]||o<n.h&&["hh",o]||c<=1&&["d"]||c<n.d&&["dd",c],(a=(a=null!=n.w?a||h<=1&&["w"]||h<n.w&&["ww",h]:a)||l<=1&&["M"]||l<n.M&&["MM",l]||r<=1&&["y"]||["yy",r])[2]=e,a[3]=0<+t,a[4]=i,function(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}.apply(null,a)}var Dn=Math.abs;function Ln(t){return(0<t)-(t<0)||+t}function Nn(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i,r,a,s,o=Dn(this._milliseconds)/1e3,c=Dn(this._days),l=Dn(this._months),h=this.asSeconds();return h?(t=q(o/60),e=q(t/60),o%=60,t%=60,n=q(l/12),l%=12,i=o?o.toFixed(3).replace(/\.?0+$/,""):"",r=Ln(this._months)!==Ln(h)?"-":"",a=Ln(this._days)!==Ln(h)?"-":"",s=Ln(this._milliseconds)!==Ln(h)?"-":"",(h<0?"-":"")+"P"+(n?r+n+"Y":"")+(l?r+l+"M":"")+(c?a+c+"D":"")+(e||t||o?"T":"")+(e?s+e+"H":"")+(t?s+t+"M":"")+(o?s+i+"S":"")):"P0D"}var On=Me.prototype;return On.isValid=function(){return this._isValid},On.abs=function(){var t=this._data;return this._milliseconds=yn(this._milliseconds),this._days=yn(this._days),this._months=yn(this._months),t.milliseconds=yn(t.milliseconds),t.seconds=yn(t.seconds),t.minutes=yn(t.minutes),t.hours=yn(t.hours),t.months=yn(t.months),t.years=yn(t.years),this},On.add=function(t,e){return mn(this,t,e,1)},On.subtract=function(t,e){return mn(this,t,e,-1)},On.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=Y(t))||"quarter"===t||"year"===t)switch(e=this._days+i/864e5,n=this._months+_n(e),t){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(e=this._days+Math.round(xn(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},On.asMilliseconds=at,On.asSeconds=J,On.asMinutes=Nt,On.asHours=rt,On.asDays=it,On.asWeeks=Gt,On.asMonths=dt,On.asQuarters=tt,On.asYears=ot,On.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*V(this._months/12):NaN},On._bubble=function(){var t=this._milliseconds,e=this._days,n=this._months,i=this._data;return 0<=t&&0<=e&&0<=n||t<=0&&e<=0&&n<=0||(t+=864e5*bn(xn(n)+e),n=e=0),i.milliseconds=t%1e3,t=q(t/1e3),i.seconds=t%60,t=q(t/60),i.minutes=t%60,t=q(t/60),i.hours=t%24,e+=q(t/24),n+=t=q(_n(e)),e-=bn(xn(t)),t=q(n/12),n%=12,i.days=e,i.months=n,i.years=t,this},On.clone=function(){return He(this)},On.get=function(t){return t=Y(t),this.isValid()?this[t+"s"]():NaN},On.milliseconds=et,On.seconds=st,On.minutes=jt,On.hours=K,On.days=wn,On.weeks=function(){return q(this.days()/7)},On.months=Tn,On.years=Cn,On.humanize=function(t,e){if(!this.isValid())return this.localeData().invalidDate();var n=!1,i=Sn;return"object"==typeof t&&(e=t,t=!1),"boolean"==typeof t&&(n=t),"object"==typeof e&&(i=Object.assign({},Sn,e),null!=e.s&&null==e.ss&&(i.ss=e.s-1)),e=An(this,!n,i,t=this.localeData()),n&&(e=t.pastFuture(+this,e)),t.postformat(e)},On.toISOString=Nn,On.toString=Nn,On.toJSON=Nn,On.locale=Je,On.localeData=tn,On.toIsoString=T("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Nn),On.lang=Zt,F("X",0,0,"unix"),F("x",0,0,"valueOf"),pt("x",lt),pt("X",/[+-]?\d+(\.\d{1,3})?/),bt("X",(function(t,e,n){n._d=new Date(1e3*parseFloat(t))})),bt("x",(function(t,e,n){n._d=new Date(V(t))})),i.version="2.29.4",e=Ne,i.fn=Q,i.min=function(){return Oe("isBefore",[].slice.call(arguments,0))},i.max=function(){return Oe("isAfter",[].slice.call(arguments,0))},i.now=function(){return Date.now?Date.now():+new Date},i.utc=p,i.unix=function(t){return Ne(1e3*t)},i.months=function(t,e){return fn(t,e,"months")},i.isDate=h,i.locale=ue,i.invalid=y,i.duration=He,i.isMoment=k,i.weekdays=function(t,e,n){return gn(t,e,n,"weekdays")},i.parseZone=function(){return Ne.apply(null,arguments).parseZone()},i.localeData=pe,i.isDuration=Ie,i.monthsShort=function(t,e){return fn(t,e,"monthsShort")},i.weekdaysMin=function(t,e,n){return gn(t,e,n,"weekdaysMin")},i.defineLocale=de,i.updateLocale=function(t,e){var n,i;return null!=e?(i=ae,null!=se[t]&&null!=se[t].parentLocale?se[t].set(A(se[t]._config,e)):(e=A(i=null!=(n=he(t))?n._config:i,e),null==n&&(e.abbr=t),(i=new D(e)).parentLocale=se[t],se[t]=i),ue(t)):null!=se[t]&&(null!=se[t].parentLocale?(se[t]=se[t].parentLocale,t===ue()&&ue(t)):null!=se[t]&&delete se[t]),se[t]},i.locales=function(){return L(se)},i.weekdaysShort=function(t,e,n){return gn(t,e,n,"weekdaysShort")},i.normalizeUnits=Y,i.relativeTimeRounding=function(t){return void 0===t?En:"function"==typeof t&&(En=t,!0)},i.relativeTimeThreshold=function(t,e){return void 0!==Sn[t]&&(void 0===e?Sn[t]:(Sn[t]=e,"s"===t&&(Sn.ss=e-1),!0))},i.calendarFormat=function(t,e){return(t=t.diff(e,"days",!0))<-6?"sameElse":t<-1?"lastWeek":t<0?"lastDay":t<1?"sameDay":t<2?"nextDay":t<7?"nextWeek":"sameElse"},i.prototype=Q,i.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},i}()},7594:(t,e)=>{function n(t){let e,n=[];for(let i of t.split(",").map((t=>t.trim())))if(/^-?\d+$/.test(i))n.push(parseInt(i,10));else if(e=i.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[t,i,r,a]=e;if(i&&a){i=parseInt(i),a=parseInt(a);const t=i<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=t);for(let e=i;e!==a;e+=t)n.push(e)}}return n}e.default=n,t.exports=n}}]); \ No newline at end of file diff --git a/assets/js/8126.c500ccde.js b/assets/js/8126.c500ccde.js new file mode 100644 index 000000000..92eacfd98 --- /dev/null +++ b/assets/js/8126.c500ccde.js @@ -0,0 +1,2 @@ +/*! For license information please see 8126.c500ccde.js.LICENSE.txt */ +(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8126],{17967:(t,e)=>{"use strict";e.N=void 0;var n=/^([^\w]*)(javascript|data|vbscript)/im,i=/&#(\w+)(^\w|;)?/g,r=/&(newline|tab);/gi,a=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,s=/^.+(:|:)/gim,o=[".","/"];e.N=function(t){var e,c=(e=t||"",e.replace(i,(function(t,e){return String.fromCharCode(e)}))).replace(r,"").replace(a,"").trim();if(!c)return"about:blank";if(function(t){return o.indexOf(t[0])>-1}(c))return c;var l=c.match(s);if(!l)return c;var h=l[0];return n.test(h)?"about:blank":c}},3905:(t,e,n)=>{"use strict";n.d(e,{Zo:()=>h,kt:()=>p});var i=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function s(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?a(Object(n),!0).forEach((function(e){r(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function o(t,e){if(null==t)return{};var n,i,r=function(t,e){if(null==t)return{};var n,i,r={},a=Object.keys(t);for(i=0;i<a.length;i++)n=a[i],e.indexOf(n)>=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i<a.length;i++)n=a[i],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var c=i.createContext({}),l=function(t){var e=i.useContext(c),n=e;return t&&(n="function"==typeof t?t(e):s(s({},e),t)),n},h=function(t){var e=l(t.components);return i.createElement(c.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return i.createElement(i.Fragment,{},e)}},d=i.forwardRef((function(t,e){var n=t.components,r=t.mdxType,a=t.originalType,c=t.parentName,h=o(t,["components","mdxType","originalType","parentName"]),d=l(n),p=r,f=d["".concat(c,".").concat(p)]||d[p]||u[p]||a;return n?i.createElement(f,s(s({ref:e},h),{},{components:n})):i.createElement(f,s({ref:e},h))}));function p(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var a=n.length,s=new Array(a);s[0]=d;var o={};for(var c in e)hasOwnProperty.call(e,c)&&(o[c]=e[c]);o.originalType=t,o.mdxType="string"==typeof t?t:r,s[1]=o;for(var l=2;l<a;l++)s[l]=n[l];return i.createElement.apply(null,s)}return i.createElement.apply(null,n)}d.displayName="MDXCreateElement"},84881:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(67294),r=n(95999),a=n(35281),s=n(87462),o=n(86010);const c="iconEdit_Z9Sw";function l(t){let{className:e,...n}=t;return i.createElement("svg",(0,s.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(c,e),"aria-hidden":"true"},n),i.createElement("g",null,i.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function h(t){let{editUrl:e}=t;return i.createElement("a",{href:e,target:"_blank",rel:"noreferrer noopener",className:a.k.common.editThisPage},i.createElement(l,null),i.createElement(r.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},92503:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var i=n(87462),r=n(67294),a=n(86010),s=n(95999),o=n(86668),c=n(39960);const l="anchorWithStickyNavbar_LWe7",h="anchorWithHideOnScrollNavbar_WYt5";function u(t){let{as:e,id:n,...u}=t;const{navbar:{hideOnScroll:d}}=(0,o.L)();if("h1"===e||!n)return r.createElement(e,(0,i.Z)({},u,{id:void 0}));const p=(0,s.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return r.createElement(e,(0,i.Z)({},u,{className:(0,a.Z)("anchor",d?h:l,u.className),id:n}),u.children,r.createElement(c.Z,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p},"\u200b"))}},4155:(t,e,n)=>{"use strict";n.d(e,{Z:()=>IL});var i=n(67294),r=n(3905),a=n(87462),s=n(35742);var o=n(72389),l=n(86010),h=n(92949),u=n(86668);function d(){const{prism:t}=(0,u.L)(),{colorMode:e}=(0,h.I)(),n=t.theme,i=t.darkTheme||n;return"dark"===e?i:n}var p=n(35281),f=n(87594),g=n.n(f);const y=/title=(?<quote>["'])(?<title>.*?)\1/,m=/\{(?<range>[\d,-]+)\}/,b={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function _(t,e){const n=t.map((t=>{const{start:n,end:i}=b[t];return`(?:${n}\\s*(${e.flatMap((t=>[t.line,t.block?.start,t.block?.end].filter(Boolean))).join("|")})\\s*${i})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function x(t,e){let n=t.replace(/\n$/,"");const{language:i,magicComments:r,metastring:a}=e;if(a&&m.test(a)){const t=a.match(m).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const e=r[0].className,i=g()(t).filter((t=>t>0)).map((t=>[t-1,[e]]));return{lineClassNames:Object.fromEntries(i),code:n}}if(void 0===i)return{lineClassNames:{},code:n};const s=function(t,e){switch(t){case"js":case"javascript":case"ts":case"typescript":return _(["js","jsBlock"],e);case"jsx":case"tsx":return _(["js","jsBlock","jsx"],e);case"html":return _(["js","jsBlock","html"],e);case"python":case"py":case"bash":return _(["bash"],e);case"markdown":case"md":return _(["html","jsx","bash"],e);default:return _(Object.keys(b),e)}}(i,r),o=n.split("\n"),c=Object.fromEntries(r.map((t=>[t.className,{start:0,range:""}]))),l=Object.fromEntries(r.filter((t=>t.line)).map((t=>{let{className:e,line:n}=t;return[n,e]}))),h=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.start,e]}))),u=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.end,e]})));for(let p=0;p<o.length;){const t=o[p].match(s);if(!t){p+=1;continue}const e=t.slice(1).find((t=>void 0!==t));l[e]?c[l[e]].range+=`${p},`:h[e]?c[h[e]].start=p:u[e]&&(c[u[e]].range+=`${c[u[e]].start}-${p-1},`),o.splice(p,1)}n=o.join("\n");const d={};return Object.entries(c).forEach((t=>{let[e,{range:n}]=t;g()(n).forEach((t=>{d[t]??=[],d[t].push(e)}))})),{lineClassNames:d,code:n}}const v="codeBlockContainer_Ckt0";function k(t){let{as:e,...n}=t;const r=function(t){const e={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(t.plain).forEach((t=>{let[i,r]=t;const a=e[i];a&&"string"==typeof r&&(n[a]=r)})),n}(d());return i.createElement(e,(0,a.Z)({},n,{style:r,className:(0,l.Z)(n.className,v,p.k.common.codeBlock)}))}const w={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function T(t){let{children:e,className:n}=t;return i.createElement(k,{as:"pre",tabIndex:0,className:(0,l.Z)(w.codeBlockStandalone,"thin-scrollbar",n)},i.createElement("code",{className:w.codeBlockLines},e))}var C=n(902);const E={attributes:!0,characterData:!0,childList:!0,subtree:!0};function S(t,e){const[n,r]=(0,i.useState)(),a=(0,i.useCallback)((()=>{r(t.current?.closest("[role=tabpanel][hidden]"))}),[t,r]);(0,i.useEffect)((()=>{a()}),[a]),function(t,e,n){void 0===n&&(n=E);const r=(0,C.zX)(e),a=(0,C.Ql)(n);(0,i.useEffect)((()=>{const e=new MutationObserver(r);return t&&e.observe(t,a),()=>e.disconnect()}),[t,r,a])}(n,(t=>{t.forEach((t=>{"attributes"===t.type&&"hidden"===t.attributeName&&(e(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const A={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var D={Prism:n(87410).Z,theme:A};function L(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function N(){return N=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},N.apply(this,arguments)}var O=/\r\n|\r|\n/,B=function(t){0===t.length?t.push({types:["plain"],content:"\n",empty:!0}):1===t.length&&""===t[0].content&&(t[0].content="\n",t[0].empty=!0)},M=function(t,e){var n=t.length;return n>0&&t[n-1]===e?t:t.concat(e)},I=function(t,e){var n=t.plain,i=Object.create(null),r=t.styles.reduce((function(t,n){var i=n.languages,r=n.style;return i&&!i.includes(e)||n.types.forEach((function(e){var n=N({},t[e],r);t[e]=n})),t}),i);return r.root=n,r.plain=N({},n,{backgroundColor:null}),r};function F(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&-1===e.indexOf(i)&&(n[i]=t[i]);return n}var R=function(t){function e(){for(var e=this,n=[],i=arguments.length;i--;)n[i]=arguments[i];t.apply(this,n),L(this,"getThemeDict",(function(t){if(void 0!==e.themeDict&&t.theme===e.prevTheme&&t.language===e.prevLanguage)return e.themeDict;e.prevTheme=t.theme,e.prevLanguage=t.language;var n=t.theme?I(t.theme,t.language):void 0;return e.themeDict=n})),L(this,"getLineProps",(function(t){var n=t.key,i=t.className,r=t.style,a=N({},F(t,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),s=e.getThemeDict(e.props);return void 0!==s&&(a.style=s.plain),void 0!==r&&(a.style=void 0!==a.style?N({},a.style,r):r),void 0!==n&&(a.key=n),i&&(a.className+=" "+i),a})),L(this,"getStyleForToken",(function(t){var n=t.types,i=t.empty,r=n.length,a=e.getThemeDict(e.props);if(void 0!==a){if(1===r&&"plain"===n[0])return i?{display:"inline-block"}:void 0;if(1===r&&!i)return a[n[0]];var s=i?{display:"inline-block"}:{},o=n.map((function(t){return a[t]}));return Object.assign.apply(Object,[s].concat(o))}})),L(this,"getTokenProps",(function(t){var n=t.key,i=t.className,r=t.style,a=t.token,s=N({},F(t,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:e.getStyleForToken(a),key:void 0});return void 0!==r&&(s.style=void 0!==s.style?N({},s.style,r):r),void 0!==n&&(s.key=n),i&&(s.className+=" "+i),s})),L(this,"tokenize",(function(t,e,n,i){var r={code:e,grammar:n,language:i,tokens:[]};t.hooks.run("before-tokenize",r);var a=r.tokens=t.tokenize(r.code,r.grammar,r.language);return t.hooks.run("after-tokenize",r),a}))}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.render=function(){var t=this.props,e=t.Prism,n=t.language,i=t.code,r=t.children,a=this.getThemeDict(this.props),s=e.languages[n],o=function(t){for(var e=[[]],n=[t],i=[0],r=[t.length],a=0,s=0,o=[],c=[o];s>-1;){for(;(a=i[s]++)<r[s];){var l=void 0,h=e[s],u=n[s][a];if("string"==typeof u?(h=s>0?h:["plain"],l=u):(h=M(h,u.type),u.alias&&(h=M(h,u.alias)),l=u.content),"string"==typeof l){var d=l.split(O),p=d.length;o.push({types:h,content:d[0]});for(var f=1;f<p;f++)B(o),c.push(o=[]),o.push({types:h,content:d[f]})}else s++,e.push(h),n.push(l),i.push(0),r.push(l.length)}s--,e.pop(),n.pop(),i.pop(),r.pop()}return B(o),c}(void 0!==s?this.tokenize(e,i,s,n):[i]);return r({tokens:o,className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},e}(i.Component);const $=R,P="codeLine_lJS_",j="codeLineNumber_Tfdd",Y="codeLineContent_feaV";function z(t){let{line:e,classNames:n,showLineNumbers:r,getLineProps:s,getTokenProps:o}=t;1===e.length&&"\n"===e[0].content&&(e[0].content="");const c=s({line:e,className:(0,l.Z)(n,r&&P)}),h=e.map(((t,e)=>i.createElement("span",(0,a.Z)({key:e},o({token:t,key:e})))));return i.createElement("span",c,r?i.createElement(i.Fragment,null,i.createElement("span",{className:j}),i.createElement("span",{className:Y},h)):h,i.createElement("br",null))}var U=n(95999);const W={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function H(t){let{code:e,className:n}=t;const[r,a]=(0,i.useState)(!1),s=(0,i.useRef)(void 0),o=(0,i.useCallback)((()=>{!function(t,e){let{target:n=document.body}=void 0===e?{}:e;const i=document.createElement("textarea"),r=document.activeElement;i.value=t,i.setAttribute("readonly",""),i.style.contain="strict",i.style.position="absolute",i.style.left="-9999px",i.style.fontSize="12pt";const a=document.getSelection();let s=!1;a.rangeCount>0&&(s=a.getRangeAt(0)),n.append(i),i.select(),i.selectionStart=0,i.selectionEnd=t.length;let o=!1;try{o=document.execCommand("copy")}catch{}i.remove(),s&&(a.removeAllRanges(),a.addRange(s)),r&&r.focus()}(e),a(!0),s.current=window.setTimeout((()=>{a(!1)}),1e3)}),[e]);return(0,i.useEffect)((()=>()=>window.clearTimeout(s.current)),[]),i.createElement("button",{type:"button","aria-label":r?(0,U.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,U.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,U.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,l.Z)("clean-btn",n,W.copyButton,r&&W.copyButtonCopied),onClick:o},i.createElement("span",{className:W.copyButtonIcons,"aria-hidden":"true"},i.createElement("svg",{className:W.copyButtonIcon,viewBox:"0 0 24 24"},i.createElement("path",{d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})),i.createElement("svg",{className:W.copyButtonSuccessIcon,viewBox:"0 0 24 24"},i.createElement("path",{d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))))}const q="wordWrapButtonIcon_Bwma",V="wordWrapButtonEnabled_EoeP";function G(t){let{className:e,onClick:n,isEnabled:r}=t;const a=(0,U.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return i.createElement("button",{type:"button",onClick:n,className:(0,l.Z)("clean-btn",e,r&&V),"aria-label":a,title:a},i.createElement("svg",{className:q,viewBox:"0 0 24 24","aria-hidden":"true"},i.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})))}function X(t){let{children:e,className:n="",metastring:r,title:s,showLineNumbers:o,language:c}=t;const{prism:{defaultLanguage:h,magicComments:p}}=(0,u.L)(),f=c??function(t){const e=t.split(" ").find((t=>t.startsWith("language-")));return e?.replace(/language-/,"")}(n)??h,g=d(),m=function(){const[t,e]=(0,i.useState)(!1),[n,r]=(0,i.useState)(!1),a=(0,i.useRef)(null),s=(0,i.useCallback)((()=>{const n=a.current.querySelector("code");t?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),e((t=>!t))}),[a,t]),o=(0,i.useCallback)((()=>{const{scrollWidth:t,clientWidth:e}=a.current,n=t>e||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return S(a,o),(0,i.useEffect)((()=>{o()}),[t,o]),(0,i.useEffect)((()=>(window.addEventListener("resize",o,{passive:!0}),()=>{window.removeEventListener("resize",o)})),[o]),{codeBlockRef:a,isEnabled:t,isCodeScrollable:n,toggle:s}}(),b=function(t){return t?.match(y)?.groups.title??""}(r)||s,{lineClassNames:_,code:v}=x(e,{metastring:r,language:f,magicComments:p}),T=o??function(t){return Boolean(t?.includes("showLineNumbers"))}(r);return i.createElement(k,{as:"div",className:(0,l.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&i.createElement("div",{className:w.codeBlockTitle},b),i.createElement("div",{className:w.codeBlockContent},i.createElement($,(0,a.Z)({},D,{theme:g,code:v,language:f??"text"}),(t=>{let{className:e,tokens:n,getLineProps:r,getTokenProps:a}=t;return i.createElement("pre",{tabIndex:0,ref:m.codeBlockRef,className:(0,l.Z)(e,w.codeBlock,"thin-scrollbar")},i.createElement("code",{className:(0,l.Z)(w.codeBlockLines,T&&w.codeBlockLinesWithNumbering)},n.map(((t,e)=>i.createElement(z,{key:e,line:t,getLineProps:r,getTokenProps:a,classNames:_[e],showLineNumbers:T})))))})),i.createElement("div",{className:w.buttonGroup},(m.isEnabled||m.isCodeScrollable)&&i.createElement(G,{className:w.codeButton,onClick:()=>m.toggle(),isEnabled:m.isEnabled}),i.createElement(H,{className:w.codeButton,code:v}))))}function Z(t){let{children:e,...n}=t;const r=(0,o.Z)(),s=function(t){return i.Children.toArray(t).some((t=>(0,i.isValidElement)(t)))?t:Array.isArray(t)?t.join(""):t}(e),c="string"==typeof s?X:T;return i.createElement(c,(0,a.Z)({key:String(r)},n),s)}var Q=n(39960);var K=n(86043);const J="details_lb9f",tt="isBrowser_bmU9",et="collapsibleContent_i85q";function nt(t){return!!t&&("SUMMARY"===t.tagName||nt(t.parentElement))}function it(t,e){return!!t&&(t===e||it(t.parentElement,e))}function rt(t){let{summary:e,children:n,...r}=t;const s=(0,o.Z)(),c=(0,i.useRef)(null),{collapsed:h,setCollapsed:u}=(0,K.u)({initialState:!r.open}),[d,p]=(0,i.useState)(r.open);return i.createElement("details",(0,a.Z)({},r,{ref:c,open:d,"data-collapsed":h,className:(0,l.Z)(J,s&&tt,r.className),onMouseDown:t=>{nt(t.target)&&t.detail>1&&t.preventDefault()},onClick:t=>{t.stopPropagation();const e=t.target;nt(e)&&it(e,c.current)&&(t.preventDefault(),h?(u(!1),p(!0)):u(!0))}}),e??i.createElement("summary",null,"Details"),i.createElement(K.z,{lazy:!1,collapsed:h,disableSSRStyle:!0,onCollapseTransitionEnd:t=>{u(t),p(!t)}},i.createElement("div",{className:et},n)))}const at="details_b_Ee";function st(t){let{...e}=t;return i.createElement(rt,(0,a.Z)({},e,{className:(0,l.Z)("alert alert--info",at,e.className)}))}var ot=n(92503);function ct(t){return i.createElement(ot.Z,t)}const lt="containsTaskList_mC6p";const ht="img_ev3q";const ut="admonition_LlT9",dt="admonitionHeading_tbUL",pt="admonitionIcon_kALy",ft="admonitionContent_S0QG";const gt={note:{infimaClassName:"secondary",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:i.createElement(U.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:i.createElement(U.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:i.createElement(U.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:i.createElement(U.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 16 16"},i.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:i.createElement(U.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},yt={secondary:"note",important:"info",success:"tip",warning:"danger"};function mt(t){const{mdxAdmonitionTitle:e,rest:n}=function(t){const e=i.Children.toArray(t),n=e.find((t=>i.isValidElement(t)&&"mdxAdmonitionTitle"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return{mdxAdmonitionTitle:n,rest:r}}(t.children);return{...t,title:t.title??e,children:n}}function bt(t){let{children:e,fallback:n}=t;return(0,o.Z)()?i.createElement(i.Fragment,null,e?.()):n??null}var _t=n(11941),xt=n(17967);function vt(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n<i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n<r||void 0===n&&r>=r)&&(n=r)}return n}function kt(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n>i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n>r||void 0===n&&r>=r)&&(n=r)}return n}function wt(t){return t}var Tt=1e-6;function Ct(t){return"translate("+t+",0)"}function Et(t){return"translate(0,"+t+")"}function St(t){return e=>+t(e)}function At(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function Dt(){return!this.__axis}function Lt(t,e){var n=[],i=null,r=null,a=6,s=6,o=3,c="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,l=1===t||4===t?-1:1,h=4===t||2===t?"x":"y",u=1===t||3===t?Ct:Et;function d(d){var p=null==i?e.ticks?e.ticks.apply(e,n):e.domain():i,f=null==r?e.tickFormat?e.tickFormat.apply(e,n):wt:r,g=Math.max(a,0)+o,y=e.range(),m=+y[0]+c,b=+y[y.length-1]+c,_=(e.bandwidth?At:St)(e.copy(),c),x=d.selection?d.selection():d,v=x.selectAll(".domain").data([null]),k=x.selectAll(".tick").data(p,e).order(),w=k.exit(),T=k.enter().append("g").attr("class","tick"),C=k.select("line"),E=k.select("text");v=v.merge(v.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),k=k.merge(T),C=C.merge(T.append("line").attr("stroke","currentColor").attr(h+"2",l*a)),E=E.merge(T.append("text").attr("fill","currentColor").attr(h,l*g).attr("dy",1===t?"0em":3===t?"0.71em":"0.32em")),d!==x&&(v=v.transition(d),k=k.transition(d),C=C.transition(d),E=E.transition(d),w=w.transition(d).attr("opacity",Tt).attr("transform",(function(t){return isFinite(t=_(t))?u(t+c):this.getAttribute("transform")})),T.attr("opacity",Tt).attr("transform",(function(t){var e=this.parentNode.__axis;return u((e&&isFinite(e=e(t))?e:_(t))+c)}))),w.remove(),v.attr("d",4===t||2===t?s?"M"+l*s+","+m+"H"+c+"V"+b+"H"+l*s:"M"+c+","+m+"V"+b:s?"M"+m+","+l*s+"V"+c+"H"+b+"V"+l*s:"M"+m+","+c+"H"+b),k.attr("opacity",1).attr("transform",(function(t){return u(_(t)+c)})),C.attr(h+"2",l*a),E.attr(h,l*g).text(f),x.filter(Dt).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===t?"start":4===t?"end":"middle"),x.each((function(){this.__axis=_}))}return d.scale=function(t){return arguments.length?(e=t,d):e},d.ticks=function(){return n=Array.from(arguments),d},d.tickArguments=function(t){return arguments.length?(n=null==t?[]:Array.from(t),d):n.slice()},d.tickValues=function(t){return arguments.length?(i=null==t?null:Array.from(t),d):i&&i.slice()},d.tickFormat=function(t){return arguments.length?(r=t,d):r},d.tickSize=function(t){return arguments.length?(a=s=+t,d):a},d.tickSizeInner=function(t){return arguments.length?(a=+t,d):a},d.tickSizeOuter=function(t){return arguments.length?(s=+t,d):s},d.tickPadding=function(t){return arguments.length?(o=+t,d):o},d.offset=function(t){return arguments.length?(c=+t,d):c},d}function Nt(){}function Ot(t){return null==t?Nt:function(){return this.querySelector(t)}}function Bt(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}function Mt(){return[]}function It(t){return null==t?Mt:function(){return this.querySelectorAll(t)}}function Ft(t){return function(){return this.matches(t)}}function Rt(t){return function(e){return e.matches(t)}}var $t=Array.prototype.find;function Pt(){return this.firstElementChild}var jt=Array.prototype.filter;function Yt(){return Array.from(this.children)}function zt(t){return new Array(t.length)}function Ut(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function Wt(t){return function(){return t}}function Ht(t,e,n,i,r,a){for(var s,o=0,c=e.length,l=a.length;o<l;++o)(s=e[o])?(s.__data__=a[o],i[o]=s):n[o]=new Ut(t,a[o]);for(;o<c;++o)(s=e[o])&&(r[o]=s)}function qt(t,e,n,i,r,a,s){var o,c,l,h=new Map,u=e.length,d=a.length,p=new Array(u);for(o=0;o<u;++o)(c=e[o])&&(p[o]=l=s.call(c,c.__data__,o,e)+"",h.has(l)?r[o]=c:h.set(l,c));for(o=0;o<d;++o)l=s.call(t,a[o],o,a)+"",(c=h.get(l))?(i[o]=c,c.__data__=a[o],h.delete(l)):n[o]=new Ut(t,a[o]);for(o=0;o<u;++o)(c=e[o])&&h.get(p[o])===c&&(r[o]=c)}function Vt(t){return t.__data__}function Gt(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function Xt(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}Ut.prototype={constructor:Ut,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var Zt="http://www.w3.org/1999/xhtml";const Qt={svg:"http://www.w3.org/2000/svg",xhtml:Zt,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Kt(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Qt.hasOwnProperty(e)?{space:Qt[e],local:t}:t}function Jt(t){return function(){this.removeAttribute(t)}}function te(t){return function(){this.removeAttributeNS(t.space,t.local)}}function ee(t,e){return function(){this.setAttribute(t,e)}}function ne(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function ie(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function re(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function ae(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function se(t){return function(){this.style.removeProperty(t)}}function oe(t,e,n){return function(){this.style.setProperty(t,e,n)}}function ce(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}function le(t,e){return t.style.getPropertyValue(e)||ae(t).getComputedStyle(t,null).getPropertyValue(e)}function he(t){return function(){delete this[t]}}function ue(t,e){return function(){this[t]=e}}function de(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function pe(t){return t.trim().split(/^|\s+/)}function fe(t){return t.classList||new ge(t)}function ge(t){this._node=t,this._names=pe(t.getAttribute("class")||"")}function ye(t,e){for(var n=fe(t),i=-1,r=e.length;++i<r;)n.add(e[i])}function me(t,e){for(var n=fe(t),i=-1,r=e.length;++i<r;)n.remove(e[i])}function be(t){return function(){ye(this,t)}}function _e(t){return function(){me(this,t)}}function xe(t,e){return function(){(e.apply(this,arguments)?ye:me)(this,t)}}function ve(){this.textContent=""}function ke(t){return function(){this.textContent=t}}function we(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function Te(){this.innerHTML=""}function Ce(t){return function(){this.innerHTML=t}}function Ee(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function Se(){this.nextSibling&&this.parentNode.appendChild(this)}function Ae(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function De(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===Zt&&e.documentElement.namespaceURI===Zt?e.createElement(t):e.createElementNS(n,t)}}function Le(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Ne(t){var e=Kt(t);return(e.local?Le:De)(e)}function Oe(){return null}function Be(){var t=this.parentNode;t&&t.removeChild(this)}function Me(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function Ie(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function Fe(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function Re(t){return function(){var e=this.__on;if(e){for(var n,i=0,r=-1,a=e.length;i<a;++i)n=e[i],t.type&&n.type!==t.type||n.name!==t.name?e[++r]=n:this.removeEventListener(n.type,n.listener,n.options);++r?e.length=r:delete this.__on}}}function $e(t,e,n){return function(){var i,r=this.__on,a=function(t){return function(e){t.call(this,e,this.__data__)}}(e);if(r)for(var s=0,o=r.length;s<o;++s)if((i=r[s]).type===t.type&&i.name===t.name)return this.removeEventListener(i.type,i.listener,i.options),this.addEventListener(i.type,i.listener=a,i.options=n),void(i.value=e);this.addEventListener(t.type,a,n),i={type:t.type,name:t.name,value:e,listener:a,options:n},r?r.push(i):this.__on=[i]}}function Pe(t,e,n){var i=ae(t),r=i.CustomEvent;"function"==typeof r?r=new r(e,n):(r=i.document.createEvent("Event"),n?(r.initEvent(e,n.bubbles,n.cancelable),r.detail=n.detail):r.initEvent(e,!1,!1)),t.dispatchEvent(r)}function je(t,e){return function(){return Pe(this,t,e)}}function Ye(t,e){return function(){return Pe(this,t,e.apply(this,arguments))}}ge.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var ze=[null];function Ue(t,e){this._groups=t,this._parents=e}function We(){return new Ue([[document.documentElement]],ze)}Ue.prototype=We.prototype={constructor:Ue,select:function(t){"function"!=typeof t&&(t=Ot(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s,o=e[r],c=o.length,l=i[r]=new Array(c),h=0;h<c;++h)(a=o[h])&&(s=t.call(a,a.__data__,h,o))&&("__data__"in a&&(s.__data__=a.__data__),l[h]=s);return new Ue(i,this._parents)},selectAll:function(t){t="function"==typeof t?function(t){return function(){return Bt(t.apply(this,arguments))}}(t):It(t);for(var e=this._groups,n=e.length,i=[],r=[],a=0;a<n;++a)for(var s,o=e[a],c=o.length,l=0;l<c;++l)(s=o[l])&&(i.push(t.call(s,s.__data__,l,o)),r.push(s));return new Ue(i,r)},selectChild:function(t){return this.select(null==t?Pt:function(t){return function(){return $t.call(this.children,t)}}("function"==typeof t?t:Rt(t)))},selectChildren:function(t){return this.selectAll(null==t?Yt:function(t){return function(){return jt.call(this.children,t)}}("function"==typeof t?t:Rt(t)))},filter:function(t){"function"!=typeof t&&(t=Ft(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new Ue(i,this._parents)},data:function(t,e){if(!arguments.length)return Array.from(this,Vt);var n=e?qt:Ht,i=this._parents,r=this._groups;"function"!=typeof t&&(t=Wt(t));for(var a=r.length,s=new Array(a),o=new Array(a),c=new Array(a),l=0;l<a;++l){var h=i[l],u=r[l],d=u.length,p=Gt(t.call(h,h&&h.__data__,l,i)),f=p.length,g=o[l]=new Array(f),y=s[l]=new Array(f),m=c[l]=new Array(d);n(h,u,g,y,m,p,e);for(var b,_,x=0,v=0;x<f;++x)if(b=g[x]){for(x>=v&&(v=x+1);!(_=y[v])&&++v<f;);b._next=_||null}}return(s=new Ue(s,i))._enter=o,s._exit=c,s},enter:function(){return new Ue(this._enter||this._groups.map(zt),this._parents)},exit:function(){return new Ue(this._exit||this._groups.map(zt),this._parents)},join:function(t,e,n){var i=this.enter(),r=this,a=this.exit();return"function"==typeof t?(i=t(i))&&(i=i.selection()):i=i.append(t+""),null!=e&&(r=e(r))&&(r=r.selection()),null==n?a.remove():n(a),i&&r?i.merge(r).order():r},merge:function(t){for(var e=t.selection?t.selection():t,n=this._groups,i=e._groups,r=n.length,a=i.length,s=Math.min(r,a),o=new Array(r),c=0;c<s;++c)for(var l,h=n[c],u=i[c],d=h.length,p=o[c]=new Array(d),f=0;f<d;++f)(l=h[f]||u[f])&&(p[f]=l);for(;c<r;++c)o[c]=n[c];return new Ue(o,this._parents)},selection:function(){return this},order:function(){for(var t=this._groups,e=-1,n=t.length;++e<n;)for(var i,r=t[e],a=r.length-1,s=r[a];--a>=0;)(i=r[a])&&(s&&4^i.compareDocumentPosition(s)&&s.parentNode.insertBefore(i,s),s=i);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=Xt);for(var n=this._groups,i=n.length,r=new Array(i),a=0;a<i;++a){for(var s,o=n[a],c=o.length,l=r[a]=new Array(c),h=0;h<c;++h)(s=o[h])&&(l[h]=s);l.sort(e)}return new Ue(r,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i=t[e],r=0,a=i.length;r<a;++r){var s=i[r];if(s)return s}return null},size:function(){let t=0;for(const e of this)++t;return t},empty:function(){return!this.node()},each:function(t){for(var e=this._groups,n=0,i=e.length;n<i;++n)for(var r,a=e[n],s=0,o=a.length;s<o;++s)(r=a[s])&&t.call(r,r.__data__,s,a);return this},attr:function(t,e){var n=Kt(t);if(arguments.length<2){var i=this.node();return n.local?i.getAttributeNS(n.space,n.local):i.getAttribute(n)}return this.each((null==e?n.local?te:Jt:"function"==typeof e?n.local?re:ie:n.local?ne:ee)(n,e))},style:function(t,e,n){return arguments.length>1?this.each((null==e?se:"function"==typeof e?ce:oe)(t,e,null==n?"":n)):le(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?he:"function"==typeof e?de:ue)(t,e)):this.node()[t]},classed:function(t,e){var n=pe(t+"");if(arguments.length<2){for(var i=fe(this.node()),r=-1,a=n.length;++r<a;)if(!i.contains(n[r]))return!1;return!0}return this.each(("function"==typeof e?xe:e?be:_e)(n,e))},text:function(t){return arguments.length?this.each(null==t?ve:("function"==typeof t?we:ke)(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?Te:("function"==typeof t?Ee:Ce)(t)):this.node().innerHTML},raise:function(){return this.each(Se)},lower:function(){return this.each(Ae)},append:function(t){var e="function"==typeof t?t:Ne(t);return this.select((function(){return this.appendChild(e.apply(this,arguments))}))},insert:function(t,e){var n="function"==typeof t?t:Ne(t),i=null==e?Oe:"function"==typeof e?e:Ot(e);return this.select((function(){return this.insertBefore(n.apply(this,arguments),i.apply(this,arguments)||null)}))},remove:function(){return this.each(Be)},clone:function(t){return this.select(t?Ie:Me)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,e,n){var i,r,a=Fe(t+""),s=a.length;if(!(arguments.length<2)){for(o=e?$e:Re,i=0;i<s;++i)this.each(o(a[i],e,n));return this}var o=this.node().__on;if(o)for(var c,l=0,h=o.length;l<h;++l)for(i=0,c=o[l];i<s;++i)if((r=a[i]).type===c.type&&r.name===c.name)return c.value},dispatch:function(t,e){return this.each(("function"==typeof e?Ye:je)(t,e))},[Symbol.iterator]:function*(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i,r=t[e],a=0,s=r.length;a<s;++a)(i=r[a])&&(yield i)}};const He=We;var qe={value:()=>{}};function Ve(){for(var t,e=0,n=arguments.length,i={};e<n;++e){if(!(t=arguments[e]+"")||t in i||/[\s.]/.test(t))throw new Error("illegal type: "+t);i[t]=[]}return new Ge(i)}function Ge(t){this._=t}function Xe(t,e){return t.trim().split(/^|\s+/).map((function(t){var n="",i=t.indexOf(".");if(i>=0&&(n=t.slice(i+1),t=t.slice(0,i)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function Ze(t,e){for(var n,i=0,r=t.length;i<r;++i)if((n=t[i]).name===e)return n.value}function Qe(t,e,n){for(var i=0,r=t.length;i<r;++i)if(t[i].name===e){t[i]=qe,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=n&&t.push({name:e,value:n}),t}Ge.prototype=Ve.prototype={constructor:Ge,on:function(t,e){var n,i=this._,r=Xe(t+"",i),a=-1,s=r.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++a<s;)if(n=(t=r[a]).type)i[n]=Qe(i[n],t.name,e);else if(null==e)for(n in i)i[n]=Qe(i[n],t.name,null);return this}for(;++a<s;)if((n=(t=r[a]).type)&&(n=Ze(i[n],t.name)))return n},copy:function(){var t={},e=this._;for(var n in e)t[n]=e[n].slice();return new Ge(t)},call:function(t,e){if((n=arguments.length-2)>0)for(var n,i,r=new Array(n),a=0;a<n;++a)r[a]=arguments[a+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(a=0,n=(i=this._[t]).length;a<n;++a)i[a].value.apply(e,r)},apply:function(t,e,n){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var i=this._[t],r=0,a=i.length;r<a;++r)i[r].value.apply(e,n)}};const Ke=Ve;var Je,tn,en=0,nn=0,rn=0,an=0,sn=0,on=0,cn="object"==typeof performance&&performance.now?performance:Date,ln="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function hn(){return sn||(ln(un),sn=cn.now()+on)}function un(){sn=0}function dn(){this._call=this._time=this._next=null}function pn(t,e,n){var i=new dn;return i.restart(t,e,n),i}function fn(){sn=(an=cn.now())+on,en=nn=0;try{!function(){hn(),++en;for(var t,e=Je;e;)(t=sn-e._time)>=0&&e._call.call(void 0,t),e=e._next;--en}()}finally{en=0,function(){var t,e,n=Je,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Je=e);tn=t,yn(i)}(),sn=0}}function gn(){var t=cn.now(),e=t-an;e>1e3&&(on-=e,an=t)}function yn(t){en||(nn&&(nn=clearTimeout(nn)),t-sn>24?(t<1/0&&(nn=setTimeout(fn,t-cn.now()-on)),rn&&(rn=clearInterval(rn))):(rn||(an=cn.now(),rn=setInterval(gn,1e3)),en=1,ln(fn)))}function mn(t,e,n){var i=new dn;return e=null==e?0:+e,i.restart((n=>{i.stop(),t(n+e)}),e,n),i}dn.prototype=pn.prototype={constructor:dn,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?hn():+n)+(null==e?0:+e),this._next||tn===this||(tn?tn._next=this:Je=this,tn=this),this._call=t,this._time=n,yn()},stop:function(){this._call&&(this._call=null,this._time=1/0,yn())}};var bn=Ke("start","end","cancel","interrupt"),_n=[];function xn(t,e,n,i,r,a){var s=t.__transition;if(s){if(n in s)return}else t.__transition={};!function(t,e,n){var i,r=t.__transition;function a(t){n.state=1,n.timer.restart(s,n.delay,n.time),n.delay<=t&&s(t-n.delay)}function s(a){var l,h,u,d;if(1!==n.state)return c();for(l in r)if((d=r[l]).name===n.name){if(3===d.state)return mn(s);4===d.state?(d.state=6,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete r[l]):+l<e&&(d.state=6,d.timer.stop(),d.on.call("cancel",t,t.__data__,d.index,d.group),delete r[l])}if(mn((function(){3===n.state&&(n.state=4,n.timer.restart(o,n.delay,n.time),o(a))})),n.state=2,n.on.call("start",t,t.__data__,n.index,n.group),2===n.state){for(n.state=3,i=new Array(u=n.tween.length),l=0,h=-1;l<u;++l)(d=n.tween[l].value.call(t,t.__data__,n.index,n.group))&&(i[++h]=d);i.length=h+1}}function o(e){for(var r=e<n.duration?n.ease.call(null,e/n.duration):(n.timer.restart(c),n.state=5,1),a=-1,s=i.length;++a<s;)i[a].call(t,r);5===n.state&&(n.on.call("end",t,t.__data__,n.index,n.group),c())}function c(){for(var i in n.state=6,n.timer.stop(),delete r[e],r)return;delete t.__transition}r[e]=n,n.timer=pn(a,0,n.time)}(t,n,{name:e,index:i,group:r,on:bn,tween:_n,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:0})}function vn(t,e){var n=wn(t,e);if(n.state>0)throw new Error("too late; already scheduled");return n}function kn(t,e){var n=wn(t,e);if(n.state>3)throw new Error("too late; already running");return n}function wn(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Tn(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var Cn,En=180/Math.PI,Sn={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function An(t,e,n,i,r,a){var s,o,c;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(c=t*n+e*i)&&(n-=t*c,i-=e*c),(o=Math.sqrt(n*n+i*i))&&(n/=o,i/=o,c/=o),t*i<e*n&&(t=-t,e=-e,c=-c,s=-s),{translateX:r,translateY:a,rotate:Math.atan2(e,t)*En,skewX:Math.atan(c)*En,scaleX:s,scaleY:o}}function Dn(t,e,n,i){function r(t){return t.length?t.pop()+" ":""}return function(a,s){var o=[],c=[];return a=t(a),s=t(s),function(t,i,r,a,s,o){if(t!==r||i!==a){var c=s.push("translate(",null,e,null,n);o.push({i:c-4,x:Tn(t,r)},{i:c-2,x:Tn(i,a)})}else(r||a)&&s.push("translate("+r+e+a+n)}(a.translateX,a.translateY,s.translateX,s.translateY,o,c),function(t,e,n,a){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(r(n)+"rotate(",null,i)-2,x:Tn(t,e)})):e&&n.push(r(n)+"rotate("+e+i)}(a.rotate,s.rotate,o,c),function(t,e,n,a){t!==e?a.push({i:n.push(r(n)+"skewX(",null,i)-2,x:Tn(t,e)}):e&&n.push(r(n)+"skewX("+e+i)}(a.skewX,s.skewX,o,c),function(t,e,n,i,a,s){if(t!==n||e!==i){var o=a.push(r(a)+"scale(",null,",",null,")");s.push({i:o-4,x:Tn(t,n)},{i:o-2,x:Tn(e,i)})}else 1===n&&1===i||a.push(r(a)+"scale("+n+","+i+")")}(a.scaleX,a.scaleY,s.scaleX,s.scaleY,o,c),a=s=null,function(t){for(var e,n=-1,i=c.length;++n<i;)o[(e=c[n]).i]=e.x(t);return o.join("")}}}var Ln=Dn((function(t){const e=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?Sn:An(e.a,e.b,e.c,e.d,e.e,e.f)}),"px, ","px)","deg)"),Nn=Dn((function(t){return null==t?Sn:(Cn||(Cn=document.createElementNS("http://www.w3.org/2000/svg","g")),Cn.setAttribute("transform",t),(t=Cn.transform.baseVal.consolidate())?An((t=t.matrix).a,t.b,t.c,t.d,t.e,t.f):Sn)}),", ",")",")");function On(t,e){var n,i;return function(){var r=kn(this,t),a=r.tween;if(a!==n)for(var s=0,o=(i=n=a).length;s<o;++s)if(i[s].name===e){(i=i.slice()).splice(s,1);break}r.tween=i}}function Bn(t,e,n){var i,r;if("function"!=typeof n)throw new Error;return function(){var a=kn(this,t),s=a.tween;if(s!==i){r=(i=s).slice();for(var o={name:e,value:n},c=0,l=r.length;c<l;++c)if(r[c].name===e){r[c]=o;break}c===l&&r.push(o)}a.tween=r}}function Mn(t,e,n){var i=t._id;return t.each((function(){var t=kn(this,i);(t.value||(t.value={}))[e]=n.apply(this,arguments)})),function(t){return wn(t,i).value[e]}}function In(t,e,n){t.prototype=e.prototype=n,n.constructor=t}function Fn(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n}function Rn(){}var $n=.7,Pn=1/$n,jn="\\s*([+-]?\\d+)\\s*",Yn="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",zn="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Un=/^#([0-9a-f]{3,8})$/,Wn=new RegExp(`^rgb\\(${jn},${jn},${jn}\\)$`),Hn=new RegExp(`^rgb\\(${zn},${zn},${zn}\\)$`),qn=new RegExp(`^rgba\\(${jn},${jn},${jn},${Yn}\\)$`),Vn=new RegExp(`^rgba\\(${zn},${zn},${zn},${Yn}\\)$`),Gn=new RegExp(`^hsl\\(${Yn},${zn},${zn}\\)$`),Xn=new RegExp(`^hsla\\(${Yn},${zn},${zn},${Yn}\\)$`),Zn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function Qn(){return this.rgb().formatHex()}function Kn(){return this.rgb().formatRgb()}function Jn(t){var e,n;return t=(t+"").trim().toLowerCase(),(e=Un.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?ti(e):3===n?new ri(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?ei(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?ei(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Wn.exec(t))?new ri(e[1],e[2],e[3],1):(e=Hn.exec(t))?new ri(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=qn.exec(t))?ei(e[1],e[2],e[3],e[4]):(e=Vn.exec(t))?ei(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Gn.exec(t))?hi(e[1],e[2]/100,e[3]/100,1):(e=Xn.exec(t))?hi(e[1],e[2]/100,e[3]/100,e[4]):Zn.hasOwnProperty(t)?ti(Zn[t]):"transparent"===t?new ri(NaN,NaN,NaN,0):null}function ti(t){return new ri(t>>16&255,t>>8&255,255&t,1)}function ei(t,e,n,i){return i<=0&&(t=e=n=NaN),new ri(t,e,n,i)}function ni(t){return t instanceof Rn||(t=Jn(t)),t?new ri((t=t.rgb()).r,t.g,t.b,t.opacity):new ri}function ii(t,e,n,i){return 1===arguments.length?ni(t):new ri(t,e,n,null==i?1:i)}function ri(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function ai(){return`#${li(this.r)}${li(this.g)}${li(this.b)}`}function si(){const t=oi(this.opacity);return`${1===t?"rgb(":"rgba("}${ci(this.r)}, ${ci(this.g)}, ${ci(this.b)}${1===t?")":`, ${t})`}`}function oi(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function ci(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function li(t){return((t=ci(t))<16?"0":"")+t.toString(16)}function hi(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new di(t,e,n,i)}function ui(t){if(t instanceof di)return new di(t.h,t.s,t.l,t.opacity);if(t instanceof Rn||(t=Jn(t)),!t)return new di;if(t instanceof di)return t;var e=(t=t.rgb()).r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),s=NaN,o=a-r,c=(a+r)/2;return o?(s=e===a?(n-i)/o+6*(n<i):n===a?(i-e)/o+2:(e-n)/o+4,o/=c<.5?a+r:2-a-r,s*=60):o=c>0&&c<1?0:s,new di(s,o,c,t.opacity)}function di(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function pi(t){return(t=(t||0)%360)<0?t+360:t}function fi(t){return Math.max(0,Math.min(1,t||0))}function gi(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function yi(t,e,n,i,r){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*n+(1+3*t+3*a-3*s)*i+s*r)/6}In(Rn,Jn,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Qn,formatHex:Qn,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return ui(this).formatHsl()},formatRgb:Kn,toString:Kn}),In(ri,ii,Fn(Rn,{brighter(t){return t=null==t?Pn:Math.pow(Pn,t),new ri(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?$n:Math.pow($n,t),new ri(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new ri(ci(this.r),ci(this.g),ci(this.b),oi(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:ai,formatHex:ai,formatHex8:function(){return`#${li(this.r)}${li(this.g)}${li(this.b)}${li(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:si,toString:si})),In(di,(function(t,e,n,i){return 1===arguments.length?ui(t):new di(t,e,n,null==i?1:i)}),Fn(Rn,{brighter(t){return t=null==t?Pn:Math.pow(Pn,t),new di(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?$n:Math.pow($n,t),new di(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new ri(gi(t>=240?t-240:t+120,r,i),gi(t,r,i),gi(t<120?t+240:t-120,r,i),this.opacity)},clamp(){return new di(pi(this.h),fi(this.s),fi(this.l),oi(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=oi(this.opacity);return`${1===t?"hsl(":"hsla("}${pi(this.h)}, ${100*fi(this.s)}%, ${100*fi(this.l)}%${1===t?")":`, ${t})`}`}}));const mi=t=>()=>t;function bi(t,e){return function(n){return t+n*e}}function _i(t){return 1==(t=+t)?xi:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}(e,n,t):mi(isNaN(e)?n:e)}}function xi(t,e){var n=e-t;return n?bi(t,n):mi(isNaN(t)?e:t)}const vi=function t(e){var n=_i(e);function i(t,e){var i=n((t=ii(t)).r,(e=ii(e)).r),r=n(t.g,e.g),a=n(t.b,e.b),s=xi(t.opacity,e.opacity);return function(e){return t.r=i(e),t.g=r(e),t.b=a(e),t.opacity=s(e),t+""}}return i.gamma=t,i}(1);function ki(t){return function(e){var n,i,r=e.length,a=new Array(r),s=new Array(r),o=new Array(r);for(n=0;n<r;++n)i=ii(e[n]),a[n]=i.r||0,s[n]=i.g||0,o[n]=i.b||0;return a=t(a),s=t(s),o=t(o),i.opacity=1,function(t){return i.r=a(t),i.g=s(t),i.b=o(t),i+""}}}ki((function(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),r=t[i],a=t[i+1],s=i>0?t[i-1]:2*r-a,o=i<e-1?t[i+2]:2*a-r;return yi((n-i/e)*e,s,r,a,o)}})),ki((function(t){var e=t.length;return function(n){var i=Math.floor(((n%=1)<0?++n:n)*e),r=t[(i+e-1)%e],a=t[i%e],s=t[(i+1)%e],o=t[(i+2)%e];return yi((n-i/e)*e,r,a,s,o)}}));var wi=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Ti=new RegExp(wi.source,"g");function Ci(t,e){var n,i,r,a=wi.lastIndex=Ti.lastIndex=0,s=-1,o=[],c=[];for(t+="",e+="";(n=wi.exec(t))&&(i=Ti.exec(e));)(r=i.index)>a&&(r=e.slice(a,r),o[s]?o[s]+=r:o[++s]=r),(n=n[0])===(i=i[0])?o[s]?o[s]+=i:o[++s]=i:(o[++s]=null,c.push({i:s,x:Tn(n,i)})),a=Ti.lastIndex;return a<e.length&&(r=e.slice(a),o[s]?o[s]+=r:o[++s]=r),o.length<2?c[0]?function(t){return function(e){return t(e)+""}}(c[0].x):function(t){return function(){return t}}(e):(e=c.length,function(t){for(var n,i=0;i<e;++i)o[(n=c[i]).i]=n.x(t);return o.join("")})}function Ei(t,e){var n;return("number"==typeof e?Tn:e instanceof Jn?vi:(n=Jn(e))?(e=n,vi):Ci)(t,e)}function Si(t){return function(){this.removeAttribute(t)}}function Ai(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Di(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttribute(t);return s===a?null:s===i?r:r=e(i=s,n)}}function Li(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttributeNS(t.space,t.local);return s===a?null:s===i?r:r=e(i=s,n)}}function Ni(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttribute(t))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttribute(t)}}function Oi(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttributeNS(t.space,t.local))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttributeNS(t.space,t.local)}}function Bi(t,e){return function(n){this.setAttribute(t,e.call(this,n))}}function Mi(t,e){return function(n){this.setAttributeNS(t.space,t.local,e.call(this,n))}}function Ii(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&Mi(t,r)),n}return r._value=e,r}function Fi(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&Bi(t,r)),n}return r._value=e,r}function Ri(t,e){return function(){vn(this,t).delay=+e.apply(this,arguments)}}function $i(t,e){return e=+e,function(){vn(this,t).delay=e}}function Pi(t,e){return function(){kn(this,t).duration=+e.apply(this,arguments)}}function ji(t,e){return e=+e,function(){kn(this,t).duration=e}}function Yi(t,e){if("function"!=typeof e)throw new Error;return function(){kn(this,t).ease=e}}function zi(t,e,n){var i,r,a=function(t){return(t+"").trim().split(/^|\s+/).every((function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?vn:kn;return function(){var s=a(this,t),o=s.on;o!==i&&(r=(i=o).copy()).on(e,n),s.on=r}}var Ui=He.prototype.constructor;function Wi(t){return function(){this.style.removeProperty(t)}}function Hi(t,e,n){return function(i){this.style.setProperty(t,e.call(this,i),n)}}function qi(t,e,n){var i,r;function a(){var a=e.apply(this,arguments);return a!==r&&(i=(r=a)&&Hi(t,a,n)),i}return a._value=e,a}function Vi(t){return function(e){this.textContent=t.call(this,e)}}function Gi(t){var e,n;function i(){var i=t.apply(this,arguments);return i!==n&&(e=(n=i)&&Vi(i)),e}return i._value=t,i}var Xi=0;function Zi(t,e,n,i){this._groups=t,this._parents=e,this._name=n,this._id=i}function Qi(){return++Xi}var Ki=He.prototype;Zi.prototype=function(t){return He().transition(t)}.prototype={constructor:Zi,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=Ot(t));for(var i=this._groups,r=i.length,a=new Array(r),s=0;s<r;++s)for(var o,c,l=i[s],h=l.length,u=a[s]=new Array(h),d=0;d<h;++d)(o=l[d])&&(c=t.call(o,o.__data__,d,l))&&("__data__"in o&&(c.__data__=o.__data__),u[d]=c,xn(u[d],e,n,d,u,wn(o,n)));return new Zi(a,this._parents,e,n)},selectAll:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=It(t));for(var i=this._groups,r=i.length,a=[],s=[],o=0;o<r;++o)for(var c,l=i[o],h=l.length,u=0;u<h;++u)if(c=l[u]){for(var d,p=t.call(c,c.__data__,u,l),f=wn(c,n),g=0,y=p.length;g<y;++g)(d=p[g])&&xn(d,e,n,g,p,f);a.push(p),s.push(c)}return new Zi(a,s,e,n)},selectChild:Ki.selectChild,selectChildren:Ki.selectChildren,filter:function(t){"function"!=typeof t&&(t=Ft(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new Zi(i,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,n=t._groups,i=e.length,r=n.length,a=Math.min(i,r),s=new Array(i),o=0;o<a;++o)for(var c,l=e[o],h=n[o],u=l.length,d=s[o]=new Array(u),p=0;p<u;++p)(c=l[p]||h[p])&&(d[p]=c);for(;o<i;++o)s[o]=e[o];return new Zi(s,this._parents,this._name,this._id)},selection:function(){return new Ui(this._groups,this._parents)},transition:function(){for(var t=this._name,e=this._id,n=Qi(),i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)if(s=o[l]){var h=wn(s,e);xn(s,t,n,l,o,{time:h.time+h.delay+h.duration,delay:0,duration:h.duration,ease:h.ease})}return new Zi(i,this._parents,t,n)},call:Ki.call,nodes:Ki.nodes,node:Ki.node,size:Ki.size,empty:Ki.empty,each:Ki.each,on:function(t,e){var n=this._id;return arguments.length<2?wn(this.node(),n).on.on(t):this.each(zi(n,t,e))},attr:function(t,e){var n=Kt(t),i="transform"===n?Nn:Ei;return this.attrTween(t,"function"==typeof e?(n.local?Oi:Ni)(n,i,Mn(this,"attr."+t,e)):null==e?(n.local?Ai:Si)(n):(n.local?Li:Di)(n,i,e))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var i=Kt(t);return this.tween(n,(i.local?Ii:Fi)(i,e))},style:function(t,e,n){var i="transform"==(t+="")?Ln:Ei;return null==e?this.styleTween(t,function(t,e){var n,i,r;return function(){var a=le(this,t),s=(this.style.removeProperty(t),le(this,t));return a===s?null:a===n&&s===i?r:r=e(n=a,i=s)}}(t,i)).on("end.style."+t,Wi(t)):"function"==typeof e?this.styleTween(t,function(t,e,n){var i,r,a;return function(){var s=le(this,t),o=n(this),c=o+"";return null==o&&(this.style.removeProperty(t),c=o=le(this,t)),s===c?null:s===i&&c===r?a:(r=c,a=e(i=s,o))}}(t,i,Mn(this,"style."+t,e))).each(function(t,e){var n,i,r,a,s="style."+e,o="end."+s;return function(){var c=kn(this,t),l=c.on,h=null==c.value[s]?a||(a=Wi(e)):void 0;l===n&&r===h||(i=(n=l).copy()).on(o,r=h),c.on=i}}(this._id,t)):this.styleTween(t,function(t,e,n){var i,r,a=n+"";return function(){var s=le(this,t);return s===a?null:s===i?r:r=e(i=s,n)}}(t,i,e),n).on("end.style."+t,null)},styleTween:function(t,e,n){var i="style."+(t+="");if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;return this.tween(i,qi(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(Mn(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,Gi(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var i,r=wn(this.node(),n).tween,a=0,s=r.length;a<s;++a)if((i=r[a]).name===t)return i.value;return null}return this.each((null==e?On:Bn)(n,t,e))},delay:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?Ri:$i)(e,t)):wn(this.node(),e).delay},duration:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?Pi:ji)(e,t)):wn(this.node(),e).duration},ease:function(t){var e=this._id;return arguments.length?this.each(Yi(e,t)):wn(this.node(),e).ease},easeVarying:function(t){if("function"!=typeof t)throw new Error;return this.each(function(t,e){return function(){var n=e.apply(this,arguments);if("function"!=typeof n)throw new Error;kn(this,t).ease=n}}(this._id,t))},end:function(){var t,e,n=this,i=n._id,r=n.size();return new Promise((function(a,s){var o={value:s},c={value:function(){0==--r&&a()}};n.each((function(){var n=kn(this,i),r=n.on;r!==t&&((e=(t=r).copy())._.cancel.push(o),e._.interrupt.push(o),e._.end.push(c)),n.on=e})),0===r&&a()}))},[Symbol.iterator]:Ki[Symbol.iterator]};var Ji={time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}};function tr(t,e){for(var n;!(n=t.__transition)||!(n=n[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return n}He.prototype.interrupt=function(t){return this.each((function(){!function(t,e){var n,i,r,a=t.__transition,s=!0;if(a){for(r in e=null==e?null:e+"",a)(n=a[r]).name===e?(i=n.state>2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(i?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[r]):s=!1;s&&delete t.__transition}}(this,t)}))},He.prototype.transition=function(t){var e,n;t instanceof Zi?(e=t._id,t=t._name):(e=Qi(),(n=Ji).time=hn(),t=null==t?null:t+"");for(var i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)(s=o[l])&&xn(s,t,e,l,o,n||tr(s,e));return new Zi(i,this._parents,t,e)};const{abs:er,max:nr,min:ir}=Math;function rr(t){return[+t[0],+t[1]]}function ar(t){return[rr(t[0]),rr(t[1])]}["w","e"].map(sr),["n","s"].map(sr),["n","w","e","s","nw","ne","sw","se"].map(sr);function sr(t){return{type:t}}function or(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function cr(t){return(e,n)=>function(t,e){return fetch(t,e).then(or)}(e,n).then((e=>(new DOMParser).parseFromString(e,t)))}cr("application/xml");cr("text/html"),cr("image/svg+xml");const lr=Math.PI/180,hr=180/Math.PI,ur=.96422,dr=.82521,pr=4/29,fr=6/29,gr=3*fr*fr;function yr(t){if(t instanceof mr)return new mr(t.l,t.a,t.b,t.opacity);if(t instanceof Tr)return Cr(t);t instanceof ri||(t=ni(t));var e,n,i=vr(t.r),r=vr(t.g),a=vr(t.b),s=br((.2225045*i+.7168786*r+.0606169*a)/1);return i===r&&r===a?e=n=s:(e=br((.4360747*i+.3850649*r+.1430804*a)/ur),n=br((.0139322*i+.0971045*r+.7141733*a)/dr)),new mr(116*s-16,500*(e-s),200*(s-n),t.opacity)}function mr(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function br(t){return t>.008856451679035631?Math.pow(t,1/3):t/gr+pr}function _r(t){return t>fr?t*t*t:gr*(t-pr)}function xr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function vr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function kr(t){if(t instanceof Tr)return new Tr(t.h,t.c,t.l,t.opacity);if(t instanceof mr||(t=yr(t)),0===t.a&&0===t.b)return new Tr(NaN,0<t.l&&t.l<100?0:NaN,t.l,t.opacity);var e=Math.atan2(t.b,t.a)*hr;return new Tr(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function wr(t,e,n,i){return 1===arguments.length?kr(t):new Tr(t,e,n,null==i?1:i)}function Tr(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}function Cr(t){if(isNaN(t.h))return new mr(t.l,0,0,t.opacity);var e=t.h*lr;return new mr(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}function Er(t){return function(e,n){var i=t((e=wr(e)).h,(n=wr(n)).h),r=xi(e.c,n.c),a=xi(e.l,n.l),s=xi(e.opacity,n.opacity);return function(t){return e.h=i(t),e.c=r(t),e.l=a(t),e.opacity=s(t),e+""}}}In(mr,(function(t,e,n,i){return 1===arguments.length?yr(t):new mr(t,e,n,null==i?1:i)}),Fn(Rn,{brighter(t){return new mr(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker(t){return new mr(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return new ri(xr(3.1338561*(e=ur*_r(e))-1.6168667*(t=1*_r(t))-.4906146*(n=dr*_r(n))),xr(-.9787684*e+1.9161415*t+.033454*n),xr(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}})),In(Tr,wr,Fn(Rn,{brighter(t){return new Tr(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker(t){return new Tr(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb(){return Cr(this).rgb()}}));const Sr=Er((function(t,e){var n=e-t;return n?bi(t,n>180||n<-180?n-360*Math.round(n/360):n):mi(isNaN(t)?e:t)}));Er(xi);const Ar=Math.sqrt(50),Dr=Math.sqrt(10),Lr=Math.sqrt(2);function Nr(t,e,n){const i=(e-t)/Math.max(0,n),r=Math.floor(Math.log10(i)),a=i/Math.pow(10,r),s=a>=Ar?10:a>=Dr?5:a>=Lr?2:1;let o,c,l;return r<0?(l=Math.pow(10,-r)/s,o=Math.round(t*l),c=Math.round(e*l),o/l<t&&++o,c/l>e&&--c,l=-l):(l=Math.pow(10,r)*s,o=Math.round(t/l),c=Math.round(e/l),o*l<t&&++o,c*l>e&&--c),c<o&&.5<=n&&n<2?Nr(t,e,2*n):[o,c,l]}function Or(t,e,n){return Nr(t=+t,e=+e,n=+n)[2]}function Br(t,e,n){n=+n;const i=(e=+e)<(t=+t),r=i?Or(e,t,n):Or(t,e,n);return(i?-1:1)*(r<0?1/-r:r)}function Mr(t,e){return null==t||null==e?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function Ir(t,e){return null==t||null==e?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function Fr(t){let e,n,i;function r(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<0?r=e+1:a=e}while(r<a)}return r}return 2!==t.length?(e=Mr,n=(e,n)=>Mr(t(e),n),i=(e,n)=>t(e)-n):(e=t===Mr||t===Ir?t:Rr,n=t,i=t),{left:r,center:function(t,e,n=0,a=t.length){const s=r(t,e,n,a-1);return s>n&&i(t[s-1],e)>-i(t[s],e)?s-1:s},right:function(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<=0?r=e+1:a=e}while(r<a)}return r}}}function Rr(){return 0}const $r=Fr(Mr),Pr=$r.right,jr=($r.left,Fr((function(t){return null===t?NaN:+t})).center,Pr);function Yr(t,e){var n,i=e?e.length:0,r=t?Math.min(i,t.length):0,a=new Array(r),s=new Array(i);for(n=0;n<r;++n)a[n]=Hr(t[n],e[n]);for(;n<i;++n)s[n]=e[n];return function(t){for(n=0;n<r;++n)s[n]=a[n](t);return s}}function zr(t,e){var n=new Date;return t=+t,e=+e,function(i){return n.setTime(t*(1-i)+e*i),n}}function Ur(t,e){var n,i={},r={};for(n in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)n in t?i[n]=Hr(t[n],e[n]):r[n]=e[n];return function(t){for(n in i)r[n]=i[n](t);return r}}function Wr(t,e){e||(e=[]);var n,i=t?Math.min(e.length,t.length):0,r=e.slice();return function(a){for(n=0;n<i;++n)r[n]=t[n]*(1-a)+e[n]*a;return r}}function Hr(t,e){var n,i,r=typeof e;return null==e||"boolean"===r?mi(e):("number"===r?Tn:"string"===r?(n=Jn(e))?(e=n,vi):Ci:e instanceof Jn?vi:e instanceof Date?zr:(i=e,!ArrayBuffer.isView(i)||i instanceof DataView?Array.isArray(e)?Yr:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?Ur:Tn:Wr))(t,e)}function qr(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}}function Vr(t){return+t}var Gr=[0,1];function Xr(t){return t}function Zr(t,e){return(e-=t=+t)?function(n){return(n-t)/e}:(n=isNaN(e)?NaN:.5,function(){return n});var n}function Qr(t,e,n){var i=t[0],r=t[1],a=e[0],s=e[1];return r<i?(i=Zr(r,i),a=n(s,a)):(i=Zr(i,r),a=n(a,s)),function(t){return a(i(t))}}function Kr(t,e,n){var i=Math.min(t.length,e.length)-1,r=new Array(i),a=new Array(i),s=-1;for(t[i]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++s<i;)r[s]=Zr(t[s],t[s+1]),a[s]=n(e[s],e[s+1]);return function(e){var n=jr(t,e,1,i)-1;return a[n](r[n](e))}}function Jr(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function ta(){var t,e,n,i,r,a,s=Gr,o=Gr,c=Hr,l=Xr;function h(){var t,e,n,c=Math.min(s.length,o.length);return l!==Xr&&(t=s[0],e=s[c-1],t>e&&(n=t,t=e,e=n),l=function(n){return Math.max(t,Math.min(e,n))}),i=c>2?Kr:Qr,r=a=null,u}function u(e){return null==e||isNaN(e=+e)?n:(r||(r=i(s.map(t),o,c)))(t(l(e)))}return u.invert=function(n){return l(e((a||(a=i(o,s.map(t),Tn)))(n)))},u.domain=function(t){return arguments.length?(s=Array.from(t,Vr),h()):s.slice()},u.range=function(t){return arguments.length?(o=Array.from(t),h()):o.slice()},u.rangeRound=function(t){return o=Array.from(t),c=qr,h()},u.clamp=function(t){return arguments.length?(l=!!t||Xr,h()):l!==Xr},u.interpolate=function(t){return arguments.length?(c=t,h()):c},u.unknown=function(t){return arguments.length?(n=t,u):n},function(n,i){return t=n,e=i,h()}}function ea(){return ta()(Xr,Xr)}function na(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}var ia,ra=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function aa(t){if(!(e=ra.exec(t)))throw new Error("invalid format: "+t);var e;return new sa({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function sa(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function oa(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}function ca(t){return(t=oa(Math.abs(t)))?t[1]:NaN}function la(t,e){var n=oa(t,e);if(!n)return t+"";var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")}aa.prototype=sa.prototype,sa.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const ha={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>la(100*t,e),r:la,s:function(t,e){var n=oa(t,e);if(!n)return t+"";var i=n[0],r=n[1],a=r-(ia=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,s=i.length;return a===s?i:a>s?i+new Array(a-s+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+oa(t,Math.max(0,e+a-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function ua(t){return t}var da,pa,fa,ga=Array.prototype.map,ya=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"];function ma(t){var e,n,i=void 0===t.grouping||void 0===t.thousands?ua:(e=ga.call(t.grouping,Number),n=t.thousands+"",function(t,i){for(var r=t.length,a=[],s=0,o=e[0],c=0;r>0&&o>0&&(c+o+1>i&&(o=Math.max(1,i-c)),a.push(t.substring(r-=o,r+o)),!((c+=o+1)>i));)o=e[s=(s+1)%e.length];return a.reverse().join(n)}),r=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",o=void 0===t.numerals?ua:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(ga.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",l=void 0===t.minus?"\u2212":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function u(t){var e=(t=aa(t)).fill,n=t.align,u=t.sign,d=t.symbol,p=t.zero,f=t.width,g=t.comma,y=t.precision,m=t.trim,b=t.type;"n"===b?(g=!0,b="g"):ha[b]||(void 0===y&&(y=12),m=!0,b="g"),(p||"0"===e&&"="===n)&&(p=!0,e="0",n="=");var _="$"===d?r:"#"===d&&/[boxX]/.test(b)?"0"+b.toLowerCase():"",x="$"===d?a:/[%p]/.test(b)?c:"",v=ha[b],k=/[defgprs%]/.test(b);function w(t){var r,a,c,d=_,w=x;if("c"===b)w=v(t)+w,t="";else{var T=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:v(Math.abs(t),y),m&&(t=function(t){t:for(var e,n=t.length,i=1,r=-1;i<n;++i)switch(t[i]){case".":r=e=i;break;case"0":0===r&&(r=i),e=i;break;default:if(!+t[i])break t;r>0&&(r=0)}return r>0?t.slice(0,r)+t.slice(e+1):t}(t)),T&&0==+t&&"+"!==u&&(T=!1),d=(T?"("===u?u:l:"-"===u||"("===u?"":u)+d,w=("s"===b?ya[8+ia/3]:"")+w+(T&&"("===u?")":""),k)for(r=-1,a=t.length;++r<a;)if(48>(c=t.charCodeAt(r))||c>57){w=(46===c?s+t.slice(r+1):t.slice(r))+w,t=t.slice(0,r);break}}g&&!p&&(t=i(t,1/0));var C=d.length+t.length+w.length,E=C<f?new Array(f-C+1).join(e):"";switch(g&&p&&(t=i(E+t,E.length?f-w.length:1/0),E=""),n){case"<":t=d+t+w+E;break;case"=":t=d+E+t+w;break;case"^":t=E.slice(0,C=E.length>>1)+d+t+w+E.slice(C);break;default:t=E+d+t+w}return o(t)}return y=void 0===y?6:/[gprs]/.test(b)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),w.toString=function(){return t+""},w}return{format:u,formatPrefix:function(t,e){var n=u(((t=aa(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(ca(e)/3))),r=Math.pow(10,-i),a=ya[8+i/3];return function(t){return n(r*t)+a}}}}function ba(t,e,n,i){var r,a=Br(t,e,n);switch((i=aa(null==i?",f":i)).type){case"s":var s=Math.max(Math.abs(t),Math.abs(e));return null!=i.precision||isNaN(r=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(ca(e)/3)))-ca(Math.abs(t)))}(a,s))||(i.precision=r),fa(i,s);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(r=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ca(e)-ca(t))+1}(a,Math.max(Math.abs(t),Math.abs(e))))||(i.precision=r-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(r=function(t){return Math.max(0,-ca(Math.abs(t)))}(a))||(i.precision=r-2*("%"===i.type))}return pa(i)}function _a(t){var e=t.domain;return t.ticks=function(t){var n=e();return function(t,e,n){if(!((n=+n)>0))return[];if((t=+t)==(e=+e))return[t];const i=e<t,[r,a,s]=i?Nr(e,t,n):Nr(t,e,n);if(!(a>=r))return[];const o=a-r+1,c=new Array(o);if(i)if(s<0)for(let l=0;l<o;++l)c[l]=(a-l)/-s;else for(let l=0;l<o;++l)c[l]=(a-l)*s;else if(s<0)for(let l=0;l<o;++l)c[l]=(r+l)/-s;else for(let l=0;l<o;++l)c[l]=(r+l)*s;return c}(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var i=e();return ba(i[0],i[i.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var i,r,a=e(),s=0,o=a.length-1,c=a[s],l=a[o],h=10;for(l<c&&(r=c,c=l,l=r,r=s,s=o,o=r);h-- >0;){if((r=Or(c,l,n))===i)return a[s]=c,a[o]=l,e(a);if(r>0)c=Math.floor(c/r)*r,l=Math.ceil(l/r)*r;else{if(!(r<0))break;c=Math.ceil(c*r)/r,l=Math.floor(l*r)/r}i=r}return t},t}function xa(){var t=ea();return t.copy=function(){return Jr(t,xa())},na.apply(t,arguments),_a(t)}da=ma({thousands:",",grouping:[3],currency:["$",""]}),pa=da.format,fa=da.formatPrefix;class va extends Map{constructor(t,e=Ea){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[n,i]of t)this.set(n,i)}get(t){return super.get(wa(this,t))}has(t){return super.has(wa(this,t))}set(t,e){return super.set(Ta(this,t),e)}delete(t){return super.delete(Ca(this,t))}}class ka extends Set{constructor(t,e=Ea){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const n of t)this.add(n)}has(t){return super.has(wa(this,t))}add(t){return super.add(Ta(this,t))}delete(t){return super.delete(Ca(this,t))}}function wa({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):n}function Ta({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):(t.set(i,n),n)}function Ca({_intern:t,_key:e},n){const i=e(n);return t.has(i)&&(n=t.get(i),t.delete(i)),n}function Ea(t){return null!==t&&"object"==typeof t?t.valueOf():t}const Sa=Symbol("implicit");function Aa(){var t=new va,e=[],n=[],i=Sa;function r(r){let a=t.get(r);if(void 0===a){if(i!==Sa)return i;t.set(r,a=e.push(r)-1)}return n[a%n.length]}return r.domain=function(n){if(!arguments.length)return e.slice();e=[],t=new va;for(const i of n)t.has(i)||t.set(i,e.push(i)-1);return r},r.range=function(t){return arguments.length?(n=Array.from(t),r):n.slice()},r.unknown=function(t){return arguments.length?(i=t,r):i},r.copy=function(){return Aa(e,n).unknown(i)},na.apply(r,arguments),r}const Da=1e3,La=6e4,Na=36e5,Oa=864e5,Ba=6048e5,Ma=2592e6,Ia=31536e6,Fa=new Date,Ra=new Date;function $a(t,e,n,i){function r(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return r.floor=e=>(t(e=new Date(+e)),e),r.ceil=n=>(t(n=new Date(n-1)),e(n,1),t(n),n),r.round=t=>{const e=r(t),n=r.ceil(t);return t-e<n-t?e:n},r.offset=(t,n)=>(e(t=new Date(+t),null==n?1:Math.floor(n)),t),r.range=(n,i,a)=>{const s=[];if(n=r.ceil(n),a=null==a?1:Math.floor(a),!(n<i&&a>0))return s;let o;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o<n&&n<i);return s},r.filter=n=>$a((e=>{if(e>=e)for(;t(e),!n(e);)e.setTime(e-1)}),((t,i)=>{if(t>=t)if(i<0)for(;++i<=0;)for(;e(t,-1),!n(t););else for(;--i>=0;)for(;e(t,1),!n(t););})),n&&(r.count=(e,i)=>(Fa.setTime(+e),Ra.setTime(+i),t(Fa),t(Ra),Math.floor(n(Fa,Ra))),r.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?r.filter(i?e=>i(e)%t==0:e=>r.count(0,e)%t==0):r:null)),r}const Pa=$a((()=>{}),((t,e)=>{t.setTime(+t+e)}),((t,e)=>e-t));Pa.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?$a((e=>{e.setTime(Math.floor(e/t)*t)}),((e,n)=>{e.setTime(+e+n*t)}),((e,n)=>(n-e)/t)):Pa:null);Pa.range;const ja=$a((t=>{t.setTime(t-t.getMilliseconds())}),((t,e)=>{t.setTime(+t+e*Da)}),((t,e)=>(e-t)/Da),(t=>t.getUTCSeconds())),Ya=(ja.range,$a((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Da)}),((t,e)=>{t.setTime(+t+e*La)}),((t,e)=>(e-t)/La),(t=>t.getMinutes()))),za=(Ya.range,$a((t=>{t.setUTCSeconds(0,0)}),((t,e)=>{t.setTime(+t+e*La)}),((t,e)=>(e-t)/La),(t=>t.getUTCMinutes()))),Ua=(za.range,$a((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Da-t.getMinutes()*La)}),((t,e)=>{t.setTime(+t+e*Na)}),((t,e)=>(e-t)/Na),(t=>t.getHours()))),Wa=(Ua.range,$a((t=>{t.setUTCMinutes(0,0,0)}),((t,e)=>{t.setTime(+t+e*Na)}),((t,e)=>(e-t)/Na),(t=>t.getUTCHours()))),Ha=(Wa.range,$a((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*La)/Oa),(t=>t.getDate()-1))),qa=(Ha.range,$a((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/Oa),(t=>t.getUTCDate()-1))),Va=(qa.range,$a((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/Oa),(t=>Math.floor(t/Oa))));Va.range;function Ga(t){return $a((e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),((t,e)=>{t.setDate(t.getDate()+7*e)}),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*La)/Ba))}const Xa=Ga(0),Za=Ga(1),Qa=Ga(2),Ka=Ga(3),Ja=Ga(4),ts=Ga(5),es=Ga(6);Xa.range,Za.range,Qa.range,Ka.range,Ja.range,ts.range,es.range;function ns(t){return $a((e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)}),((t,e)=>(e-t)/Ba))}const is=ns(0),rs=ns(1),as=ns(2),ss=ns(3),os=ns(4),cs=ns(5),ls=ns(6),hs=(is.range,rs.range,as.range,ss.range,os.range,cs.range,ls.range,$a((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,e)=>{t.setMonth(t.getMonth()+e)}),((t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())),(t=>t.getMonth()))),us=(hs.range,$a((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)}),((t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth()))),ds=(us.range,$a((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,e)=>{t.setFullYear(t.getFullYear()+e)}),((t,e)=>e.getFullYear()-t.getFullYear()),(t=>t.getFullYear())));ds.every=t=>isFinite(t=Math.floor(t))&&t>0?$a((e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,n)=>{e.setFullYear(e.getFullYear()+n*t)})):null;ds.range;const ps=$a((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)}),((t,e)=>e.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));ps.every=t=>isFinite(t=Math.floor(t))&&t>0?$a((e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null;ps.range;function fs(t,e,n,i,r,a){const s=[[ja,1,Da],[ja,5,5e3],[ja,15,15e3],[ja,30,3e4],[a,1,La],[a,5,3e5],[a,15,9e5],[a,30,18e5],[r,1,Na],[r,3,108e5],[r,6,216e5],[r,12,432e5],[i,1,Oa],[i,2,1728e5],[n,1,Ba],[e,1,Ma],[e,3,7776e6],[t,1,Ia]];function o(e,n,i){const r=Math.abs(n-e)/i,a=Fr((([,,t])=>t)).right(s,r);if(a===s.length)return t.every(Br(e/Ia,n/Ia,i));if(0===a)return Pa.every(Math.max(Br(e,n,i),1));const[o,c]=s[r/s[a-1][2]<s[a][2]/r?a-1:a];return o.every(c)}return[function(t,e,n){const i=e<t;i&&([t,e]=[e,t]);const r=n&&"function"==typeof n.range?n:o(t,e,n),a=r?r.range(t,+e+1):[];return i?a.reverse():a},o]}const[gs,ys]=fs(ps,us,is,Va,Wa,za),[ms,bs]=fs(ds,hs,Xa,Ha,Ua,Ya);function _s(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function xs(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function vs(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}var ks,ws,Ts={"-":"",_:" ",0:"0"},Cs=/^\s*\d+/,Es=/^%/,Ss=/[\\^$*+?|[\]().{}]/g;function As(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",a=r.length;return i+(a<n?new Array(n-a+1).join(e)+r:r)}function Ds(t){return t.replace(Ss,"\\$&")}function Ls(t){return new RegExp("^(?:"+t.map(Ds).join("|")+")","i")}function Ns(t){return new Map(t.map(((t,e)=>[t.toLowerCase(),e])))}function Os(t,e,n){var i=Cs.exec(e.slice(n,n+1));return i?(t.w=+i[0],n+i[0].length):-1}function Bs(t,e,n){var i=Cs.exec(e.slice(n,n+1));return i?(t.u=+i[0],n+i[0].length):-1}function Ms(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.U=+i[0],n+i[0].length):-1}function Is(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.V=+i[0],n+i[0].length):-1}function Fs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.W=+i[0],n+i[0].length):-1}function Rs(t,e,n){var i=Cs.exec(e.slice(n,n+4));return i?(t.y=+i[0],n+i[0].length):-1}function $s(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.y=+i[0]+(+i[0]>68?1900:2e3),n+i[0].length):-1}function Ps(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function js(t,e,n){var i=Cs.exec(e.slice(n,n+1));return i?(t.q=3*i[0]-3,n+i[0].length):-1}function Ys(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function zs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function Us(t,e,n){var i=Cs.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function Ws(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function Hs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function qs(t,e,n){var i=Cs.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function Vs(t,e,n){var i=Cs.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function Gs(t,e,n){var i=Cs.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function Xs(t,e,n){var i=Es.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function Zs(t,e,n){var i=Cs.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function Qs(t,e,n){var i=Cs.exec(e.slice(n));return i?(t.s=+i[0],n+i[0].length):-1}function Ks(t,e){return As(t.getDate(),e,2)}function Js(t,e){return As(t.getHours(),e,2)}function to(t,e){return As(t.getHours()%12||12,e,2)}function eo(t,e){return As(1+Ha.count(ds(t),t),e,3)}function no(t,e){return As(t.getMilliseconds(),e,3)}function io(t,e){return no(t,e)+"000"}function ro(t,e){return As(t.getMonth()+1,e,2)}function ao(t,e){return As(t.getMinutes(),e,2)}function so(t,e){return As(t.getSeconds(),e,2)}function oo(t){var e=t.getDay();return 0===e?7:e}function co(t,e){return As(Xa.count(ds(t)-1,t),e,2)}function lo(t){var e=t.getDay();return e>=4||0===e?Ja(t):Ja.ceil(t)}function ho(t,e){return t=lo(t),As(Ja.count(ds(t),t)+(4===ds(t).getDay()),e,2)}function uo(t){return t.getDay()}function po(t,e){return As(Za.count(ds(t)-1,t),e,2)}function fo(t,e){return As(t.getFullYear()%100,e,2)}function go(t,e){return As((t=lo(t)).getFullYear()%100,e,2)}function yo(t,e){return As(t.getFullYear()%1e4,e,4)}function mo(t,e){var n=t.getDay();return As((t=n>=4||0===n?Ja(t):Ja.ceil(t)).getFullYear()%1e4,e,4)}function bo(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+As(e/60|0,"0",2)+As(e%60,"0",2)}function _o(t,e){return As(t.getUTCDate(),e,2)}function xo(t,e){return As(t.getUTCHours(),e,2)}function vo(t,e){return As(t.getUTCHours()%12||12,e,2)}function ko(t,e){return As(1+qa.count(ps(t),t),e,3)}function wo(t,e){return As(t.getUTCMilliseconds(),e,3)}function To(t,e){return wo(t,e)+"000"}function Co(t,e){return As(t.getUTCMonth()+1,e,2)}function Eo(t,e){return As(t.getUTCMinutes(),e,2)}function So(t,e){return As(t.getUTCSeconds(),e,2)}function Ao(t){var e=t.getUTCDay();return 0===e?7:e}function Do(t,e){return As(is.count(ps(t)-1,t),e,2)}function Lo(t){var e=t.getUTCDay();return e>=4||0===e?os(t):os.ceil(t)}function No(t,e){return t=Lo(t),As(os.count(ps(t),t)+(4===ps(t).getUTCDay()),e,2)}function Oo(t){return t.getUTCDay()}function Bo(t,e){return As(rs.count(ps(t)-1,t),e,2)}function Mo(t,e){return As(t.getUTCFullYear()%100,e,2)}function Io(t,e){return As((t=Lo(t)).getUTCFullYear()%100,e,2)}function Fo(t,e){return As(t.getUTCFullYear()%1e4,e,4)}function Ro(t,e){var n=t.getUTCDay();return As((t=n>=4||0===n?os(t):os.ceil(t)).getUTCFullYear()%1e4,e,4)}function $o(){return"+0000"}function Po(){return"%"}function jo(t){return+t}function Yo(t){return Math.floor(+t/1e3)}function zo(t){return new Date(t)}function Uo(t){return t instanceof Date?+t:+new Date(+t)}function Wo(t,e,n,i,r,a,s,o,c,l){var h=ea(),u=h.invert,d=h.domain,p=l(".%L"),f=l(":%S"),g=l("%I:%M"),y=l("%I %p"),m=l("%a %d"),b=l("%b %d"),_=l("%B"),x=l("%Y");function v(t){return(c(t)<t?p:o(t)<t?f:s(t)<t?g:a(t)<t?y:i(t)<t?r(t)<t?m:b:n(t)<t?_:x)(t)}return h.invert=function(t){return new Date(u(t))},h.domain=function(t){return arguments.length?d(Array.from(t,Uo)):d().map(zo)},h.ticks=function(e){var n=d();return t(n[0],n[n.length-1],null==e?10:e)},h.tickFormat=function(t,e){return null==e?v:l(e)},h.nice=function(t){var n=d();return t&&"function"==typeof t.range||(t=e(n[0],n[n.length-1],null==t?10:t)),t?d(function(t,e){var n,i=0,r=(t=t.slice()).length-1,a=t[i],s=t[r];return s<a&&(n=i,i=r,r=n,n=a,a=s,s=n),t[i]=e.floor(a),t[r]=e.ceil(s),t}(n,t)):h},h.copy=function(){return Jr(h,Wo(t,e,n,i,r,a,s,o,c,l))},h}function Ho(t){return"string"==typeof t?new Ue([[document.querySelector(t)]],[document.documentElement]):new Ue([[t]],ze)}function qo(t){return"string"==typeof t?new Ue([document.querySelectorAll(t)],[document.documentElement]):new Ue([Bt(t)],ze)}function Vo(t){return function(){return t}}!function(t){ks=function(t){var e=t.dateTime,n=t.date,i=t.time,r=t.periods,a=t.days,s=t.shortDays,o=t.months,c=t.shortMonths,l=Ls(r),h=Ns(r),u=Ls(a),d=Ns(a),p=Ls(s),f=Ns(s),g=Ls(o),y=Ns(o),m=Ls(c),b=Ns(c),_={a:function(t){return s[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return o[t.getMonth()]},c:null,d:Ks,e:Ks,f:io,g:go,G:mo,H:Js,I:to,j:eo,L:no,m:ro,M:ao,p:function(t){return r[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:jo,s:Yo,S:so,u:oo,U:co,V:ho,w:uo,W:po,x:null,X:null,y:fo,Y:yo,Z:bo,"%":Po},x={a:function(t){return s[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return o[t.getUTCMonth()]},c:null,d:_o,e:_o,f:To,g:Io,G:Ro,H:xo,I:vo,j:ko,L:wo,m:Co,M:Eo,p:function(t){return r[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:jo,s:Yo,S:So,u:Ao,U:Do,V:No,w:Oo,W:Bo,x:null,X:null,y:Mo,Y:Fo,Z:$o,"%":Po},v={a:function(t,e,n){var i=p.exec(e.slice(n));return i?(t.w=f.get(i[0].toLowerCase()),n+i[0].length):-1},A:function(t,e,n){var i=u.exec(e.slice(n));return i?(t.w=d.get(i[0].toLowerCase()),n+i[0].length):-1},b:function(t,e,n){var i=m.exec(e.slice(n));return i?(t.m=b.get(i[0].toLowerCase()),n+i[0].length):-1},B:function(t,e,n){var i=g.exec(e.slice(n));return i?(t.m=y.get(i[0].toLowerCase()),n+i[0].length):-1},c:function(t,n,i){return T(t,e,n,i)},d:zs,e:zs,f:Gs,g:$s,G:Rs,H:Ws,I:Ws,j:Us,L:Vs,m:Ys,M:Hs,p:function(t,e,n){var i=l.exec(e.slice(n));return i?(t.p=h.get(i[0].toLowerCase()),n+i[0].length):-1},q:js,Q:Zs,s:Qs,S:qs,u:Bs,U:Ms,V:Is,w:Os,W:Fs,x:function(t,e,i){return T(t,n,e,i)},X:function(t,e,n){return T(t,i,e,n)},y:$s,Y:Rs,Z:Ps,"%":Xs};function k(t,e){return function(n){var i,r,a,s=[],o=-1,c=0,l=t.length;for(n instanceof Date||(n=new Date(+n));++o<l;)37===t.charCodeAt(o)&&(s.push(t.slice(c,o)),null!=(r=Ts[i=t.charAt(++o)])?i=t.charAt(++o):r="e"===i?" ":"0",(a=e[i])&&(i=a(n,r)),s.push(i),c=o+1);return s.push(t.slice(c,o)),s.join("")}}function w(t,e){return function(n){var i,r,a=vs(1900,void 0,1);if(T(a,t,n+="",0)!=n.length)return null;if("Q"in a)return new Date(a.Q);if("s"in a)return new Date(1e3*a.s+("L"in a?a.L:0));if(e&&!("Z"in a)&&(a.Z=0),"p"in a&&(a.H=a.H%12+12*a.p),void 0===a.m&&(a.m="q"in a?a.q:0),"V"in a){if(a.V<1||a.V>53)return null;"w"in a||(a.w=1),"Z"in a?(r=(i=xs(vs(a.y,0,1))).getUTCDay(),i=r>4||0===r?rs.ceil(i):rs(i),i=qa.offset(i,7*(a.V-1)),a.y=i.getUTCFullYear(),a.m=i.getUTCMonth(),a.d=i.getUTCDate()+(a.w+6)%7):(r=(i=_s(vs(a.y,0,1))).getDay(),i=r>4||0===r?Za.ceil(i):Za(i),i=Ha.offset(i,7*(a.V-1)),a.y=i.getFullYear(),a.m=i.getMonth(),a.d=i.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),r="Z"in a?xs(vs(a.y,0,1)).getUTCDay():_s(vs(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(r+5)%7:a.w+7*a.U-(r+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,xs(a)):_s(a)}}function T(t,e,n,i){for(var r,a,s=0,o=e.length,c=n.length;s<o;){if(i>=c)return-1;if(37===(r=e.charCodeAt(s++))){if(r=e.charAt(s++),!(a=v[r in Ts?e.charAt(s++):r])||(i=a(t,n,i))<0)return-1}else if(r!=n.charCodeAt(i++))return-1}return i}return _.x=k(n,_),_.X=k(i,_),_.c=k(e,_),x.x=k(n,x),x.X=k(i,x),x.c=k(e,x),{format:function(t){var e=k(t+="",_);return e.toString=function(){return t},e},parse:function(t){var e=w(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=k(t+="",x);return e.toString=function(){return t},e},utcParse:function(t){var e=w(t+="",!0);return e.toString=function(){return t},e}}}(t),ws=ks.format,ks.parse,ks.utcFormat,ks.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});const Go=Math.abs,Xo=Math.atan2,Zo=Math.cos,Qo=Math.max,Ko=Math.min,Jo=Math.sin,tc=Math.sqrt,ec=1e-12,nc=Math.PI,ic=nc/2,rc=2*nc;function ac(t){return t>1?0:t<-1?nc:Math.acos(t)}function sc(t){return t>=1?ic:t<=-1?-ic:Math.asin(t)}const oc=Math.PI,cc=2*oc,lc=1e-6,hc=cc-lc;function uc(t){this._+=t[0];for(let e=1,n=t.length;e<n;++e)this._+=arguments[e]+t[e]}class dc{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==t?uc:function(t){let e=Math.floor(t);if(!(e>=0))throw new Error(`invalid digits: ${t}`);if(e>15)return uc;const n=10**e;return function(t){this._+=t[0];for(let e=1,i=t.length;e<i;++e)this._+=Math.round(arguments[e]*n)/n+t[e]}}(t)}moveTo(t,e){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,e){this._append`L${this._x1=+t},${this._y1=+e}`}quadraticCurveTo(t,e,n,i){this._append`Q${+t},${+e},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(t,e,n,i,r,a){this._append`C${+t},${+e},${+n},${+i},${this._x1=+r},${this._y1=+a}`}arcTo(t,e,n,i,r){if(t=+t,e=+e,n=+n,i=+i,(r=+r)<0)throw new Error(`negative radius: ${r}`);let a=this._x1,s=this._y1,o=n-t,c=i-e,l=a-t,h=s-e,u=l*l+h*h;if(null===this._x1)this._append`M${this._x1=t},${this._y1=e}`;else if(u>lc)if(Math.abs(h*o-c*l)>lc&&r){let d=n-a,p=i-s,f=o*o+c*c,g=d*d+p*p,y=Math.sqrt(f),m=Math.sqrt(u),b=r*Math.tan((oc-Math.acos((f+u-g)/(2*y*m)))/2),_=b/m,x=b/y;Math.abs(_-1)>lc&&this._append`L${t+_*l},${e+_*h}`,this._append`A${r},${r},0,0,${+(h*d>l*p)},${this._x1=t+x*o},${this._y1=e+x*c}`}else this._append`L${this._x1=t},${this._y1=e}`;else;}arc(t,e,n,i,r,a){if(t=+t,e=+e,a=!!a,(n=+n)<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(i),o=n*Math.sin(i),c=t+s,l=e+o,h=1^a,u=a?i-r:r-i;null===this._x1?this._append`M${c},${l}`:(Math.abs(this._x1-c)>lc||Math.abs(this._y1-l)>lc)&&this._append`L${c},${l}`,n&&(u<0&&(u=u%cc+cc),u>hc?this._append`A${n},${n},0,1,${h},${t-s},${e-o}A${n},${n},0,1,${h},${this._x1=c},${this._y1=l}`:u>lc&&this._append`A${n},${n},0,${+(u>=oc)},${h},${this._x1=t+n*Math.cos(r)},${this._y1=e+n*Math.sin(r)}`)}rect(t,e,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function pc(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(null==n)e=null;else{const t=Math.floor(n);if(!(t>=0))throw new RangeError(`invalid digits: ${n}`);e=t}return t},()=>new dc(e)}function fc(t){return t.innerRadius}function gc(t){return t.outerRadius}function yc(t){return t.startAngle}function mc(t){return t.endAngle}function bc(t){return t&&t.padAngle}function _c(t,e,n,i,r,a,s,o){var c=n-t,l=i-e,h=s-r,u=o-a,d=u*c-h*l;if(!(d*d<ec))return[t+(d=(h*(e-a)-u*(t-r))/d)*c,e+d*l]}function xc(t,e,n,i,r,a,s){var o=t-n,c=e-i,l=(s?a:-a)/tc(o*o+c*c),h=l*c,u=-l*o,d=t+h,p=e+u,f=n+h,g=i+u,y=(d+f)/2,m=(p+g)/2,b=f-d,_=g-p,x=b*b+_*_,v=r-a,k=d*g-f*p,w=(_<0?-1:1)*tc(Qo(0,v*v*x-k*k)),T=(k*_-b*w)/x,C=(-k*b-_*w)/x,E=(k*_+b*w)/x,S=(-k*b+_*w)/x,A=T-y,D=C-m,L=E-y,N=S-m;return A*A+D*D>L*L+N*N&&(T=E,C=S),{cx:T,cy:C,x01:-h,y01:-u,x11:T*(r/v-1),y11:C*(r/v-1)}}function vc(){var t=fc,e=gc,n=Vo(0),i=null,r=yc,a=mc,s=bc,o=null,c=pc(l);function l(){var l,h,u=+t.apply(this,arguments),d=+e.apply(this,arguments),p=r.apply(this,arguments)-ic,f=a.apply(this,arguments)-ic,g=Go(f-p),y=f>p;if(o||(o=l=c()),d<u&&(h=d,d=u,u=h),d>ec)if(g>rc-ec)o.moveTo(d*Zo(p),d*Jo(p)),o.arc(0,0,d,p,f,!y),u>ec&&(o.moveTo(u*Zo(f),u*Jo(f)),o.arc(0,0,u,f,p,y));else{var m,b,_=p,x=f,v=p,k=f,w=g,T=g,C=s.apply(this,arguments)/2,E=C>ec&&(i?+i.apply(this,arguments):tc(u*u+d*d)),S=Ko(Go(d-u)/2,+n.apply(this,arguments)),A=S,D=S;if(E>ec){var L=sc(E/u*Jo(C)),N=sc(E/d*Jo(C));(w-=2*L)>ec?(v+=L*=y?1:-1,k-=L):(w=0,v=k=(p+f)/2),(T-=2*N)>ec?(_+=N*=y?1:-1,x-=N):(T=0,_=x=(p+f)/2)}var O=d*Zo(_),B=d*Jo(_),M=u*Zo(k),I=u*Jo(k);if(S>ec){var F,R=d*Zo(x),$=d*Jo(x),P=u*Zo(v),j=u*Jo(v);if(g<nc)if(F=_c(O,B,P,j,R,$,M,I)){var Y=O-F[0],z=B-F[1],U=R-F[0],W=$-F[1],H=1/Jo(ac((Y*U+z*W)/(tc(Y*Y+z*z)*tc(U*U+W*W)))/2),q=tc(F[0]*F[0]+F[1]*F[1]);A=Ko(S,(u-q)/(H-1)),D=Ko(S,(d-q)/(H+1))}else A=D=0}T>ec?D>ec?(m=xc(P,j,O,B,d,D,y),b=xc(R,$,M,I,d,D,y),o.moveTo(m.cx+m.x01,m.cy+m.y01),D<S?o.arc(m.cx,m.cy,D,Xo(m.y01,m.x01),Xo(b.y01,b.x01),!y):(o.arc(m.cx,m.cy,D,Xo(m.y01,m.x01),Xo(m.y11,m.x11),!y),o.arc(0,0,d,Xo(m.cy+m.y11,m.cx+m.x11),Xo(b.cy+b.y11,b.cx+b.x11),!y),o.arc(b.cx,b.cy,D,Xo(b.y11,b.x11),Xo(b.y01,b.x01),!y))):(o.moveTo(O,B),o.arc(0,0,d,_,x,!y)):o.moveTo(O,B),u>ec&&w>ec?A>ec?(m=xc(M,I,R,$,u,-A,y),b=xc(O,B,P,j,u,-A,y),o.lineTo(m.cx+m.x01,m.cy+m.y01),A<S?o.arc(m.cx,m.cy,A,Xo(m.y01,m.x01),Xo(b.y01,b.x01),!y):(o.arc(m.cx,m.cy,A,Xo(m.y01,m.x01),Xo(m.y11,m.x11),!y),o.arc(0,0,u,Xo(m.cy+m.y11,m.cx+m.x11),Xo(b.cy+b.y11,b.cx+b.x11),y),o.arc(b.cx,b.cy,A,Xo(b.y11,b.x11),Xo(b.y01,b.x01),!y))):o.arc(0,0,u,k,v,y):o.lineTo(M,I)}else o.moveTo(0,0);if(o.closePath(),l)return o=null,l+""||null}return l.centroid=function(){var n=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,i=(+r.apply(this,arguments)+ +a.apply(this,arguments))/2-nc/2;return[Zo(i)*n,Jo(i)*n]},l.innerRadius=function(e){return arguments.length?(t="function"==typeof e?e:Vo(+e),l):t},l.outerRadius=function(t){return arguments.length?(e="function"==typeof t?t:Vo(+t),l):e},l.cornerRadius=function(t){return arguments.length?(n="function"==typeof t?t:Vo(+t),l):n},l.padRadius=function(t){return arguments.length?(i=null==t?null:"function"==typeof t?t:Vo(+t),l):i},l.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Vo(+t),l):r},l.endAngle=function(t){return arguments.length?(a="function"==typeof t?t:Vo(+t),l):a},l.padAngle=function(t){return arguments.length?(s="function"==typeof t?t:Vo(+t),l):s},l.context=function(t){return arguments.length?(o=null==t?null:t,l):o},l}Array.prototype.slice;function kc(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function wc(t){this._context=t}function Tc(t){return new wc(t)}function Cc(t){return t[0]}function Ec(t){return t[1]}function Sc(t,e){var n=Vo(!0),i=null,r=Tc,a=null,s=pc(o);function o(o){var c,l,h,u=(o=kc(o)).length,d=!1;for(null==i&&(a=r(h=s())),c=0;c<=u;++c)!(c<u&&n(l=o[c],c,o))===d&&((d=!d)?a.lineStart():a.lineEnd()),d&&a.point(+t(l,c,o),+e(l,c,o));if(h)return a=null,h+""||null}return t="function"==typeof t?t:void 0===t?Cc:Vo(t),e="function"==typeof e?e:void 0===e?Ec:Vo(e),o.x=function(e){return arguments.length?(t="function"==typeof e?e:Vo(+e),o):t},o.y=function(t){return arguments.length?(e="function"==typeof t?t:Vo(+t),o):e},o.defined=function(t){return arguments.length?(n="function"==typeof t?t:Vo(!!t),o):n},o.curve=function(t){return arguments.length?(r=t,null!=i&&(a=r(i)),o):r},o.context=function(t){return arguments.length?(null==t?i=a=null:a=r(i=t),o):i},o}function Ac(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function Dc(t){return t}function Lc(){}function Nc(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function Oc(t){this._context=t}function Bc(t){return new Oc(t)}function Mc(t){this._context=t}function Ic(t){this._context=t}function Fc(t){this._context=t}function Rc(t){return t<0?-1:1}function $c(t,e,n){var i=t._x1-t._x0,r=e-t._x1,a=(t._y1-t._y0)/(i||r<0&&-0),s=(n-t._y1)/(r||i<0&&-0),o=(a*r+s*i)/(i+r);return(Rc(a)+Rc(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(o))||0}function Pc(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function jc(t,e,n){var i=t._x0,r=t._y0,a=t._x1,s=t._y1,o=(a-i)/3;t._context.bezierCurveTo(i+o,r+o*e,a-o,s-o*n,a,s)}function Yc(t){this._context=t}function zc(t){this._context=new Uc(t)}function Uc(t){this._context=t}function Wc(t){this._context=t}function Hc(t){var e,n,i=t.length-1,r=new Array(i),a=new Array(i),s=new Array(i);for(r[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e<i-1;++e)r[e]=1,a[e]=4,s[e]=4*t[e]+2*t[e+1];for(r[i-1]=2,a[i-1]=7,s[i-1]=8*t[i-1]+t[i],e=1;e<i;++e)n=r[e]/a[e-1],a[e]-=n,s[e]-=n*s[e-1];for(r[i-1]=s[i-1]/a[i-1],e=i-2;e>=0;--e)r[e]=(s[e]-r[e+1])/a[e];for(a[i-1]=(t[i]+r[i-1])/2,e=0;e<i-1;++e)a[e]=2*t[e+1]-r[e+1];return[r,a]}function qc(t,e){this._context=t,this._t=e}function Vc(t,e,n){this.k=t,this.x=e,this.y=n}wc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}},Oc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Nc(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Nc(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Mc.prototype={areaStart:Lc,areaEnd:Lc,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Nc(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Ic.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:Nc(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Fc.prototype={areaStart:Lc,areaEnd:Lc,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}},Yc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:jc(this,this._t0,Pc(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(e=+e,(t=+t)!==this._x1||e!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,jc(this,Pc(this,n=$c(this,t,e)),n);break;default:jc(this,this._t0,n=$c(this,t,e))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}},(zc.prototype=Object.create(Yc.prototype)).point=function(t,e){Yc.prototype.point.call(this,e,t)},Uc.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,i,r,a){this._context.bezierCurveTo(e,t,i,n,a,r)}},Wc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),2===n)this._context.lineTo(t[1],e[1]);else for(var i=Hc(t),r=Hc(e),a=0,s=1;s<n;++a,++s)this._context.bezierCurveTo(i[0][a],r[0][a],i[1][a],r[1][a],t[s],e[s]);(this._line||0!==this._line&&1===n)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(t,e){this._x.push(+t),this._y.push(+e)}},qc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&2===this._point&&this._context.lineTo(this._x,this._y),(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}},Vc.prototype={constructor:Vc,scale:function(t){return 1===t?this:new Vc(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new Vc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};new Vc(1,0,0);Vc.prototype;var Gc=n(27856);const Xc={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:t=>t>=255?255:t<0?0:t,g:t=>t>=255?255:t<0?0:t,b:t=>t>=255?255:t<0?0:t,h:t=>t%360,s:t=>t>=100?100:t<0?0:t,l:t=>t>=100?100:t<0?0:t,a:t=>t>=1?1:t<0?0:t},toLinear:t=>{const e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:(t,e,n)=>(n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t),hsl2rgb:({h:t,s:e,l:n},i)=>{if(!e)return 2.55*n;t/=360,e/=100;const r=(n/=100)<.5?n*(1+e):n+e-n*e,a=2*n-r;switch(i){case"r":return 255*Xc.hue2rgb(a,r,t+1/3);case"g":return 255*Xc.hue2rgb(a,r,t);case"b":return 255*Xc.hue2rgb(a,r,t-1/3)}},rgb2hsl:({r:t,g:e,b:n},i)=>{t/=255,e/=255,n/=255;const r=Math.max(t,e,n),a=Math.min(t,e,n),s=(r+a)/2;if("l"===i)return 100*s;if(r===a)return 0;const o=r-a;if("s"===i)return 100*(s>.5?o/(2-r-a):o/(r+a));switch(r){case t:return 60*((e-n)/o+(e<n?6:0));case e:return 60*((n-t)/o+2);case n:return 60*((t-e)/o+4);default:return-1}}},Zc={clamp:(t,e,n)=>e>n?Math.min(e,Math.max(n,t)):Math.min(n,Math.max(e,t)),round:t=>Math.round(1e10*t)/1e10},Qc={dec2hex:t=>{const e=Math.round(t).toString(16);return e.length>1?e:`0${e}`}},Kc={channel:Xc,lang:Zc,unit:Qc},Jc={};for(let c=0;c<=255;c++)Jc[c]=Kc.unit.dec2hex(c);const tl=0,el=1,nl=2;const il=class{constructor(){this.type=tl}get(){return this.type}set(t){if(this.type&&this.type!==t)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=t}reset(){this.type=tl}is(t){return this.type===t}};const rl=class{constructor(t,e){this.color=e,this.changed=!1,this.data=t,this.type=new il}set(t,e){return this.color=e,this.changed=!1,this.data=t,this.type.type=tl,this}_ensureHSL(){const t=this.data,{h:e,s:n,l:i}=t;void 0===e&&(t.h=Kc.channel.rgb2hsl(t,"h")),void 0===n&&(t.s=Kc.channel.rgb2hsl(t,"s")),void 0===i&&(t.l=Kc.channel.rgb2hsl(t,"l"))}_ensureRGB(){const t=this.data,{r:e,g:n,b:i}=t;void 0===e&&(t.r=Kc.channel.hsl2rgb(t,"r")),void 0===n&&(t.g=Kc.channel.hsl2rgb(t,"g")),void 0===i&&(t.b=Kc.channel.hsl2rgb(t,"b"))}get r(){const t=this.data,e=t.r;return this.type.is(nl)||void 0===e?(this._ensureHSL(),Kc.channel.hsl2rgb(t,"r")):e}get g(){const t=this.data,e=t.g;return this.type.is(nl)||void 0===e?(this._ensureHSL(),Kc.channel.hsl2rgb(t,"g")):e}get b(){const t=this.data,e=t.b;return this.type.is(nl)||void 0===e?(this._ensureHSL(),Kc.channel.hsl2rgb(t,"b")):e}get h(){const t=this.data,e=t.h;return this.type.is(el)||void 0===e?(this._ensureRGB(),Kc.channel.rgb2hsl(t,"h")):e}get s(){const t=this.data,e=t.s;return this.type.is(el)||void 0===e?(this._ensureRGB(),Kc.channel.rgb2hsl(t,"s")):e}get l(){const t=this.data,e=t.l;return this.type.is(el)||void 0===e?(this._ensureRGB(),Kc.channel.rgb2hsl(t,"l")):e}get a(){return this.data.a}set r(t){this.type.set(el),this.changed=!0,this.data.r=t}set g(t){this.type.set(el),this.changed=!0,this.data.g=t}set b(t){this.type.set(el),this.changed=!0,this.data.b=t}set h(t){this.type.set(nl),this.changed=!0,this.data.h=t}set s(t){this.type.set(nl),this.changed=!0,this.data.s=t}set l(t){this.type.set(nl),this.changed=!0,this.data.l=t}set a(t){this.changed=!0,this.data.a=t}},al=new rl({r:0,g:0,b:0,a:0},"transparent"),sl={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:t=>{if(35!==t.charCodeAt(0))return;const e=t.match(sl.re);if(!e)return;const n=e[1],i=parseInt(n,16),r=n.length,a=r%4==0,s=r>4,o=s?1:17,c=s?8:4,l=a?0:-1,h=s?255:15;return al.set({r:(i>>c*(l+3)&h)*o,g:(i>>c*(l+2)&h)*o,b:(i>>c*(l+1)&h)*o,a:a?(i&h)*o/255:1},t)},stringify:t=>{const{r:e,g:n,b:i,a:r}=t;return r<1?`#${Jc[Math.round(e)]}${Jc[Math.round(n)]}${Jc[Math.round(i)]}${Jc[Math.round(255*r)]}`:`#${Jc[Math.round(e)]}${Jc[Math.round(n)]}${Jc[Math.round(i)]}`}},ol=sl,cl={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:t=>{const e=t.match(cl.hueRe);if(e){const[,t,n]=e;switch(n){case"grad":return Kc.channel.clamp.h(.9*parseFloat(t));case"rad":return Kc.channel.clamp.h(180*parseFloat(t)/Math.PI);case"turn":return Kc.channel.clamp.h(360*parseFloat(t))}}return Kc.channel.clamp.h(parseFloat(t))},parse:t=>{const e=t.charCodeAt(0);if(104!==e&&72!==e)return;const n=t.match(cl.re);if(!n)return;const[,i,r,a,s,o]=n;return al.set({h:cl._hue2deg(i),s:Kc.channel.clamp.s(parseFloat(r)),l:Kc.channel.clamp.l(parseFloat(a)),a:s?Kc.channel.clamp.a(o?parseFloat(s)/100:parseFloat(s)):1},t)},stringify:t=>{const{h:e,s:n,l:i,a:r}=t;return r<1?`hsla(${Kc.lang.round(e)}, ${Kc.lang.round(n)}%, ${Kc.lang.round(i)}%, ${r})`:`hsl(${Kc.lang.round(e)}, ${Kc.lang.round(n)}%, ${Kc.lang.round(i)}%)`}},ll=cl,hl={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:t=>{t=t.toLowerCase();const e=hl.colors[t];if(e)return ol.parse(e)},stringify:t=>{const e=ol.stringify(t);for(const n in hl.colors)if(hl.colors[n]===e)return n}},ul=hl,dl={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:t=>{const e=t.charCodeAt(0);if(114!==e&&82!==e)return;const n=t.match(dl.re);if(!n)return;const[,i,r,a,s,o,c,l,h]=n;return al.set({r:Kc.channel.clamp.r(r?2.55*parseFloat(i):parseFloat(i)),g:Kc.channel.clamp.g(s?2.55*parseFloat(a):parseFloat(a)),b:Kc.channel.clamp.b(c?2.55*parseFloat(o):parseFloat(o)),a:l?Kc.channel.clamp.a(h?parseFloat(l)/100:parseFloat(l)):1},t)},stringify:t=>{const{r:e,g:n,b:i,a:r}=t;return r<1?`rgba(${Kc.lang.round(e)}, ${Kc.lang.round(n)}, ${Kc.lang.round(i)}, ${Kc.lang.round(r)})`:`rgb(${Kc.lang.round(e)}, ${Kc.lang.round(n)}, ${Kc.lang.round(i)})`}},pl=dl,fl={format:{keyword:ul,hex:ol,rgb:pl,rgba:pl,hsl:ll,hsla:ll},parse:t=>{if("string"!=typeof t)return t;const e=ol.parse(t)||pl.parse(t)||ll.parse(t)||ul.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},stringify:t=>!t.changed&&t.color?t.color:t.type.is(nl)||void 0===t.data.r?ll.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?pl.stringify(t):ol.stringify(t)},gl=fl,yl=(t,e)=>{const n=gl.parse(t);for(const i in e)n[i]=Kc.channel.clamp[i](e[i]);return gl.stringify(n)},ml=(t,e)=>{const n=gl.parse(t),i={};for(const r in e)e[r]&&(i[r]=n[r]+e[r]);return yl(t,i)},bl=(t,e,n=0,i=1)=>{if("number"!=typeof t)return yl(t,{a:e});const r=al.set({r:Kc.channel.clamp.r(t),g:Kc.channel.clamp.g(e),b:Kc.channel.clamp.b(n),a:Kc.channel.clamp.a(i)});return gl.stringify(r)},_l=(t,e,n=50)=>{const{r:i,g:r,b:a,a:s}=gl.parse(t),{r:o,g:c,b:l,a:h}=gl.parse(e),u=n/100,d=2*u-1,p=s-h,f=((d*p==-1?d:(d+p)/(1+d*p))+1)/2,g=1-f;return bl(i*f+o*g,r*f+c*g,a*f+l*g,s*u+h*(1-u))},xl=(t,e=100)=>{const n=gl.parse(t);return n.r=255-n.r,n.g=255-n.g,n.b=255-n.b,_l(n,t,e)},vl=(t,e,n)=>{const i=gl.parse(t),r=i[e],a=Kc.channel.clamp[e](r+n);return r!==a&&(i[e]=a),gl.stringify(i)},kl=(t,e)=>vl(t,"l",-e),wl=(t,e)=>vl(t,"l",e);const Tl="object"==typeof global&&global&&global.Object===Object&&global;var Cl="object"==typeof self&&self&&self.Object===Object&&self;const El=Tl||Cl||Function("return this")();const Sl=El.Symbol;var Al=Object.prototype,Dl=Al.hasOwnProperty,Ll=Al.toString,Nl=Sl?Sl.toStringTag:void 0;const Ol=function(t){var e=Dl.call(t,Nl),n=t[Nl];try{t[Nl]=void 0;var i=!0}catch(a){}var r=Ll.call(t);return i&&(e?t[Nl]=n:delete t[Nl]),r};var Bl=Object.prototype.toString;const Ml=function(t){return Bl.call(t)};var Il=Sl?Sl.toStringTag:void 0;const Fl=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":Il&&Il in Object(t)?Ol(t):Ml(t)};const Rl=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)};const $l=function(t){if(!Rl(t))return!1;var e=Fl(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e};const Pl=El["__core-js_shared__"];var jl,Yl=(jl=/[^.]+$/.exec(Pl&&Pl.keys&&Pl.keys.IE_PROTO||""))?"Symbol(src)_1."+jl:"";const zl=function(t){return!!Yl&&Yl in t};var Ul=Function.prototype.toString;const Wl=function(t){if(null!=t){try{return Ul.call(t)}catch(e){}try{return t+""}catch(e){}}return""};var Hl=/^\[object .+?Constructor\]$/,ql=Function.prototype,Vl=Object.prototype,Gl=ql.toString,Xl=Vl.hasOwnProperty,Zl=RegExp("^"+Gl.call(Xl).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const Ql=function(t){return!(!Rl(t)||zl(t))&&($l(t)?Zl:Hl).test(Wl(t))};const Kl=function(t,e){return null==t?void 0:t[e]};const Jl=function(t,e){var n=Kl(t,e);return Ql(n)?n:void 0};const th=Jl(Object,"create");const eh=function(){this.__data__=th?th(null):{},this.size=0};const nh=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e};var ih=Object.prototype.hasOwnProperty;const rh=function(t){var e=this.__data__;if(th){var n=e[t];return"__lodash_hash_undefined__"===n?void 0:n}return ih.call(e,t)?e[t]:void 0};var ah=Object.prototype.hasOwnProperty;const sh=function(t){var e=this.__data__;return th?void 0!==e[t]:ah.call(e,t)};const oh=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=th&&void 0===e?"__lodash_hash_undefined__":e,this};function ch(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}ch.prototype.clear=eh,ch.prototype.delete=nh,ch.prototype.get=rh,ch.prototype.has=sh,ch.prototype.set=oh;const lh=ch;const hh=function(){this.__data__=[],this.size=0};const uh=function(t,e){return t===e||t!=t&&e!=e};const dh=function(t,e){for(var n=t.length;n--;)if(uh(t[n][0],e))return n;return-1};var ph=Array.prototype.splice;const fh=function(t){var e=this.__data__,n=dh(e,t);return!(n<0)&&(n==e.length-1?e.pop():ph.call(e,n,1),--this.size,!0)};const gh=function(t){var e=this.__data__,n=dh(e,t);return n<0?void 0:e[n][1]};const yh=function(t){return dh(this.__data__,t)>-1};const mh=function(t,e){var n=this.__data__,i=dh(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this};function bh(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}bh.prototype.clear=hh,bh.prototype.delete=fh,bh.prototype.get=gh,bh.prototype.has=yh,bh.prototype.set=mh;const _h=bh;const xh=Jl(El,"Map");const vh=function(){this.size=0,this.__data__={hash:new lh,map:new(xh||_h),string:new lh}};const kh=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t};const wh=function(t,e){var n=t.__data__;return kh(e)?n["string"==typeof e?"string":"hash"]:n.map};const Th=function(t){var e=wh(this,t).delete(t);return this.size-=e?1:0,e};const Ch=function(t){return wh(this,t).get(t)};const Eh=function(t){return wh(this,t).has(t)};const Sh=function(t,e){var n=wh(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this};function Ah(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}Ah.prototype.clear=vh,Ah.prototype.delete=Th,Ah.prototype.get=Ch,Ah.prototype.has=Eh,Ah.prototype.set=Sh;const Dh=Ah;function Lh(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var i=arguments,r=e?e.apply(this,i):i[0],a=n.cache;if(a.has(r))return a.get(r);var s=t.apply(this,i);return n.cache=a.set(r,s)||a,s};return n.cache=new(Lh.Cache||Dh),n}Lh.Cache=Dh;const Nh=Lh;var Oh="comm",Bh="rule",Mh="decl",Ih=Math.abs,Fh=String.fromCharCode;Object.assign;function Rh(t){return t.trim()}function $h(t,e,n){return t.replace(e,n)}function Ph(t,e){return t.indexOf(e)}function jh(t,e){return 0|t.charCodeAt(e)}function Yh(t,e,n){return t.slice(e,n)}function zh(t){return t.length}function Uh(t){return t.length}function Wh(t,e){return e.push(t),t}function Hh(t,e){for(var n="",i=Uh(t),r=0;r<i;r++)n+=e(t[r],r,t,e)||"";return n}function qh(t,e,n,i){switch(t.type){case"@import":case Mh:return t.return=t.return||t.value;case Oh:return"";case"@keyframes":return t.return=t.value+"{"+Hh(t.children,i)+"}";case Bh:t.value=t.props.join(",")}return zh(n=Hh(t.children,i))?t.return=t.value+"{"+n+"}":""}var Vh=1,Gh=1,Xh=0,Zh=0,Qh=0,Kh="";function Jh(t,e,n,i,r,a,s){return{value:t,root:e,parent:n,type:i,props:r,children:a,line:Vh,column:Gh,length:s,return:""}}function tu(){return Qh=Zh>0?jh(Kh,--Zh):0,Gh--,10===Qh&&(Gh=1,Vh--),Qh}function eu(){return Qh=Zh<Xh?jh(Kh,Zh++):0,Gh++,10===Qh&&(Gh=1,Vh++),Qh}function nu(){return jh(Kh,Zh)}function iu(){return Zh}function ru(t,e){return Yh(Kh,t,e)}function au(t){switch(t){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function su(t){return Vh=Gh=1,Xh=zh(Kh=t),Zh=0,[]}function ou(t){return Kh="",t}function cu(t){return Rh(ru(Zh-1,uu(91===t?t+2:40===t?t+1:t)))}function lu(t){for(;(Qh=nu())&&Qh<33;)eu();return au(t)>2||au(Qh)>3?"":" "}function hu(t,e){for(;--e&&eu()&&!(Qh<48||Qh>102||Qh>57&&Qh<65||Qh>70&&Qh<97););return ru(t,iu()+(e<6&&32==nu()&&32==eu()))}function uu(t){for(;eu();)switch(Qh){case t:return Zh;case 34:case 39:34!==t&&39!==t&&uu(Qh);break;case 40:41===t&&uu(t);break;case 92:eu()}return Zh}function du(t,e){for(;eu()&&t+Qh!==57&&(t+Qh!==84||47!==nu()););return"/*"+ru(e,Zh-1)+"*"+Fh(47===t?t:eu())}function pu(t){for(;!au(nu());)eu();return ru(t,Zh)}function fu(t){return ou(gu("",null,null,null,[""],t=su(t),0,[0],t))}function gu(t,e,n,i,r,a,s,o,c){for(var l=0,h=0,u=s,d=0,p=0,f=0,g=1,y=1,m=1,b=0,_="",x=r,v=a,k=i,w=_;y;)switch(f=b,b=eu()){case 40:if(108!=f&&58==jh(w,u-1)){-1!=Ph(w+=$h(cu(b),"&","&\f"),"&\f")&&(m=-1);break}case 34:case 39:case 91:w+=cu(b);break;case 9:case 10:case 13:case 32:w+=lu(f);break;case 92:w+=hu(iu()-1,7);continue;case 47:switch(nu()){case 42:case 47:Wh(mu(du(eu(),iu()),e,n),c);break;default:w+="/"}break;case 123*g:o[l++]=zh(w)*m;case 125*g:case 59:case 0:switch(b){case 0:case 125:y=0;case 59+h:p>0&&zh(w)-u&&Wh(p>32?bu(w+";",i,n,u-1):bu($h(w," ","")+";",i,n,u-2),c);break;case 59:w+=";";default:if(Wh(k=yu(w,e,n,l,h,r,o,_,x=[],v=[],u),a),123===b)if(0===h)gu(w,e,k,k,x,a,u,o,v);else switch(99===d&&110===jh(w,3)?100:d){case 100:case 109:case 115:gu(t,k,k,i&&Wh(yu(t,k,k,0,0,r,o,_,r,x=[],u),v),r,v,u,o,i?x:v);break;default:gu(w,k,k,k,[""],v,0,o,v)}}l=h=p=0,g=m=1,_=w="",u=s;break;case 58:u=1+zh(w),p=f;default:if(g<1)if(123==b)--g;else if(125==b&&0==g++&&125==tu())continue;switch(w+=Fh(b),b*g){case 38:m=h>0?1:(w+="\f",-1);break;case 44:o[l++]=(zh(w)-1)*m,m=1;break;case 64:45===nu()&&(w+=cu(eu())),d=nu(),h=u=zh(_=w+=pu(iu())),b++;break;case 45:45===f&&2==zh(w)&&(g=0)}}return a}function yu(t,e,n,i,r,a,s,o,c,l,h){for(var u=r-1,d=0===r?a:[""],p=Uh(d),f=0,g=0,y=0;f<i;++f)for(var m=0,b=Yh(t,u+1,u=Ih(g=s[f])),_=t;m<p;++m)(_=Rh(g>0?d[m]+" "+b:$h(b,/&\f/g,d[m])))&&(c[y++]=_);return Jh(t,e,n,0===r?Bh:o,c,l,h)}function mu(t,e,n){return Jh(t,e,n,Oh,Fh(Qh),Yh(t,2,-2),0)}function bu(t,e,n,i){return Jh(t,e,n,Mh,Yh(t,0,i),Yh(t,i+1,-1),i)}const _u=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i&&!1!==e(t[n],n,t););return t};const xu=function(t){return function(e,n,i){for(var r=-1,a=Object(e),s=i(e),o=s.length;o--;){var c=s[t?o:++r];if(!1===n(a[c],c,a))break}return e}};const vu=xu();const ku=function(t,e){for(var n=-1,i=Array(t);++n<t;)i[n]=e(n);return i};const wu=function(t){return null!=t&&"object"==typeof t};const Tu=function(t){return wu(t)&&"[object Arguments]"==Fl(t)};var Cu=Object.prototype,Eu=Cu.hasOwnProperty,Su=Cu.propertyIsEnumerable,Au=Tu(function(){return arguments}())?Tu:function(t){return wu(t)&&Eu.call(t,"callee")&&!Su.call(t,"callee")};const Du=Au;const Lu=Array.isArray;const Nu=function(){return!1};var Ou="object"==typeof exports&&exports&&!exports.nodeType&&exports,Bu=Ou&&"object"==typeof module&&module&&!module.nodeType&&module,Mu=Bu&&Bu.exports===Ou?El.Buffer:void 0;const Iu=(Mu?Mu.isBuffer:void 0)||Nu;var Fu=/^(?:0|[1-9]\d*)$/;const Ru=function(t,e){var n=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==n||"symbol"!=n&&Fu.test(t))&&t>-1&&t%1==0&&t<e};const $u=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991};var Pu={};Pu["[object Float32Array]"]=Pu["[object Float64Array]"]=Pu["[object Int8Array]"]=Pu["[object Int16Array]"]=Pu["[object Int32Array]"]=Pu["[object Uint8Array]"]=Pu["[object Uint8ClampedArray]"]=Pu["[object Uint16Array]"]=Pu["[object Uint32Array]"]=!0,Pu["[object Arguments]"]=Pu["[object Array]"]=Pu["[object ArrayBuffer]"]=Pu["[object Boolean]"]=Pu["[object DataView]"]=Pu["[object Date]"]=Pu["[object Error]"]=Pu["[object Function]"]=Pu["[object Map]"]=Pu["[object Number]"]=Pu["[object Object]"]=Pu["[object RegExp]"]=Pu["[object Set]"]=Pu["[object String]"]=Pu["[object WeakMap]"]=!1;const ju=function(t){return wu(t)&&$u(t.length)&&!!Pu[Fl(t)]};const Yu=function(t){return function(e){return t(e)}};var zu="object"==typeof exports&&exports&&!exports.nodeType&&exports,Uu=zu&&"object"==typeof module&&module&&!module.nodeType&&module,Wu=Uu&&Uu.exports===zu&&Tl.process,Hu=function(){try{var t=Uu&&Uu.require&&Uu.require("util").types;return t||Wu&&Wu.binding&&Wu.binding("util")}catch(e){}}();const qu=Hu;var Vu=qu&&qu.isTypedArray;const Gu=Vu?Yu(Vu):ju;var Xu=Object.prototype.hasOwnProperty;const Zu=function(t,e){var n=Lu(t),i=!n&&Du(t),r=!n&&!i&&Iu(t),a=!n&&!i&&!r&&Gu(t),s=n||i||r||a,o=s?ku(t.length,String):[],c=o.length;for(var l in t)!e&&!Xu.call(t,l)||s&&("length"==l||r&&("offset"==l||"parent"==l)||a&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||Ru(l,c))||o.push(l);return o};var Qu=Object.prototype;const Ku=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||Qu)};const Ju=function(t,e){return function(n){return t(e(n))}};const td=Ju(Object.keys,Object);var ed=Object.prototype.hasOwnProperty;const nd=function(t){if(!Ku(t))return td(t);var e=[];for(var n in Object(t))ed.call(t,n)&&"constructor"!=n&&e.push(n);return e};const id=function(t){return null!=t&&$u(t.length)&&!$l(t)};const rd=function(t){return id(t)?Zu(t):nd(t)};const ad=function(t,e){return t&&vu(t,e,rd)};const sd=function(t,e){return function(n,i){if(null==n)return n;if(!id(n))return t(n,i);for(var r=n.length,a=e?r:-1,s=Object(n);(e?a--:++a<r)&&!1!==i(s[a],a,s););return n}}(ad);const od=function(t){return t};const cd=function(t){return"function"==typeof t?t:od};const ld=function(t,e){return(Lu(t)?_u:sd)(t,cd(e))};const hd=function(t,e){for(var n=-1,i=null==t?0:t.length,r=Array(i);++n<i;)r[n]=e(t[n],n,t);return r};const ud=function(t){return"symbol"==typeof t||wu(t)&&"[object Symbol]"==Fl(t)};var dd=Sl?Sl.prototype:void 0,pd=dd?dd.toString:void 0;const fd=function t(e){if("string"==typeof e)return e;if(Lu(e))return hd(e,t)+"";if(ud(e))return pd?pd.call(e):"";var n=e+"";return"0"==n&&1/e==-Infinity?"-0":n};const gd=function(t){return null==t?"":fd(t)};var yd=0;const md=function(t){var e=++yd;return gd(t)+e};var bd=Object.prototype.hasOwnProperty;const _d=function(t,e){return null!=t&&bd.call(t,e)};var xd=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,vd=/^\w*$/;const kd=function(t,e){if(Lu(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!ud(t))||(vd.test(t)||!xd.test(t)||null!=e&&t in Object(e))};var wd=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Td=/\\(\\)?/g,Cd=function(t){var e=Nh(t,(function(t){return 500===n.size&&n.clear(),t})),n=e.cache;return e}((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(wd,(function(t,n,i,r){e.push(i?r.replace(Td,"$1"):n||t)})),e}));const Ed=Cd;const Sd=function(t,e){return Lu(t)?t:kd(t,e)?[t]:Ed(gd(t))};const Ad=function(t){if("string"==typeof t||ud(t))return t;var e=t+"";return"0"==e&&1/t==-Infinity?"-0":e};const Dd=function(t,e,n){for(var i=-1,r=(e=Sd(e,t)).length,a=!1;++i<r;){var s=Ad(e[i]);if(!(a=null!=t&&n(t,s)))break;t=t[s]}return a||++i!=r?a:!!(r=null==t?0:t.length)&&$u(r)&&Ru(s,r)&&(Lu(t)||Du(t))};const Ld=function(t,e){return null!=t&&Dd(t,e,_d)};const Nd=function(t){return function(){return t}};const Od=function(t,e){for(var n=-1,i=e.length,r=t.length;++n<i;)t[r+n]=e[n];return t};var Bd=Sl?Sl.isConcatSpreadable:void 0;const Md=function(t){return Lu(t)||Du(t)||!!(Bd&&t&&t[Bd])};const Id=function t(e,n,i,r,a){var s=-1,o=e.length;for(i||(i=Md),a||(a=[]);++s<o;){var c=e[s];n>0&&i(c)?n>1?t(c,n-1,i,r,a):Od(a,c):r||(a[a.length]=c)}return a};const Fd=function(t){return(null==t?0:t.length)?Id(t,1):[]};const Rd=function(){this.__data__=new _h,this.size=0};const $d=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n};const Pd=function(t){return this.__data__.get(t)};const jd=function(t){return this.__data__.has(t)};const Yd=function(t,e){var n=this.__data__;if(n instanceof _h){var i=n.__data__;if(!xh||i.length<199)return i.push([t,e]),this.size=++n.size,this;n=this.__data__=new Dh(i)}return n.set(t,e),this.size=n.size,this};function zd(t){var e=this.__data__=new _h(t);this.size=e.size}zd.prototype.clear=Rd,zd.prototype.delete=$d,zd.prototype.get=Pd,zd.prototype.has=jd,zd.prototype.set=Yd;const Ud=zd;const Wd=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const Hd=function(t){return this.__data__.has(t)};function qd(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new Dh;++e<n;)this.add(t[e])}qd.prototype.add=qd.prototype.push=Wd,qd.prototype.has=Hd;const Vd=qd;const Gd=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i;)if(e(t[n],n,t))return!0;return!1};const Xd=function(t,e){return t.has(e)};const Zd=function(t,e,n,i,r,a){var s=1&n,o=t.length,c=e.length;if(o!=c&&!(s&&c>o))return!1;var l=a.get(t),h=a.get(e);if(l&&h)return l==e&&h==t;var u=-1,d=!0,p=2&n?new Vd:void 0;for(a.set(t,e),a.set(e,t);++u<o;){var f=t[u],g=e[u];if(i)var y=s?i(g,f,u,e,t,a):i(f,g,u,t,e,a);if(void 0!==y){if(y)continue;d=!1;break}if(p){if(!Gd(e,(function(t,e){if(!Xd(p,e)&&(f===t||r(f,t,n,i,a)))return p.push(e)}))){d=!1;break}}else if(f!==g&&!r(f,g,n,i,a)){d=!1;break}}return a.delete(t),a.delete(e),d};const Qd=El.Uint8Array;const Kd=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,i){n[++e]=[i,t]})),n};const Jd=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n};var tp=Sl?Sl.prototype:void 0,ep=tp?tp.valueOf:void 0;const np=function(t,e,n,i,r,a,s){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!a(new Qd(t),new Qd(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return uh(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var o=Kd;case"[object Set]":var c=1&i;if(o||(o=Jd),t.size!=e.size&&!c)return!1;var l=s.get(t);if(l)return l==e;i|=2,s.set(t,e);var h=Zd(o(t),o(e),i,r,a,s);return s.delete(t),h;case"[object Symbol]":if(ep)return ep.call(t)==ep.call(e)}return!1};const ip=function(t,e,n){var i=e(t);return Lu(t)?i:Od(i,n(t))};const rp=function(t,e){for(var n=-1,i=null==t?0:t.length,r=0,a=[];++n<i;){var s=t[n];e(s,n,t)&&(a[r++]=s)}return a};const ap=function(){return[]};var sp=Object.prototype.propertyIsEnumerable,op=Object.getOwnPropertySymbols,cp=op?function(t){return null==t?[]:(t=Object(t),rp(op(t),(function(e){return sp.call(t,e)})))}:ap;const lp=cp;const hp=function(t){return ip(t,rd,lp)};var up=Object.prototype.hasOwnProperty;const dp=function(t,e,n,i,r,a){var s=1&n,o=hp(t),c=o.length;if(c!=hp(e).length&&!s)return!1;for(var l=c;l--;){var h=o[l];if(!(s?h in e:up.call(e,h)))return!1}var u=a.get(t),d=a.get(e);if(u&&d)return u==e&&d==t;var p=!0;a.set(t,e),a.set(e,t);for(var f=s;++l<c;){var g=t[h=o[l]],y=e[h];if(i)var m=s?i(y,g,h,e,t,a):i(g,y,h,t,e,a);if(!(void 0===m?g===y||r(g,y,n,i,a):m)){p=!1;break}f||(f="constructor"==h)}if(p&&!f){var b=t.constructor,_=e.constructor;b==_||!("constructor"in t)||!("constructor"in e)||"function"==typeof b&&b instanceof b&&"function"==typeof _&&_ instanceof _||(p=!1)}return a.delete(t),a.delete(e),p};const pp=Jl(El,"DataView");const fp=Jl(El,"Promise");const gp=Jl(El,"Set");const yp=Jl(El,"WeakMap");var mp="[object Map]",bp="[object Promise]",_p="[object Set]",xp="[object WeakMap]",vp="[object DataView]",kp=Wl(pp),wp=Wl(xh),Tp=Wl(fp),Cp=Wl(gp),Ep=Wl(yp),Sp=Fl;(pp&&Sp(new pp(new ArrayBuffer(1)))!=vp||xh&&Sp(new xh)!=mp||fp&&Sp(fp.resolve())!=bp||gp&&Sp(new gp)!=_p||yp&&Sp(new yp)!=xp)&&(Sp=function(t){var e=Fl(t),n="[object Object]"==e?t.constructor:void 0,i=n?Wl(n):"";if(i)switch(i){case kp:return vp;case wp:return mp;case Tp:return bp;case Cp:return _p;case Ep:return xp}return e});const Ap=Sp;var Dp="[object Arguments]",Lp="[object Array]",Np="[object Object]",Op=Object.prototype.hasOwnProperty;const Bp=function(t,e,n,i,r,a){var s=Lu(t),o=Lu(e),c=s?Lp:Ap(t),l=o?Lp:Ap(e),h=(c=c==Dp?Np:c)==Np,u=(l=l==Dp?Np:l)==Np,d=c==l;if(d&&Iu(t)){if(!Iu(e))return!1;s=!0,h=!1}if(d&&!h)return a||(a=new Ud),s||Gu(t)?Zd(t,e,n,i,r,a):np(t,e,c,n,i,r,a);if(!(1&n)){var p=h&&Op.call(t,"__wrapped__"),f=u&&Op.call(e,"__wrapped__");if(p||f){var g=p?t.value():t,y=f?e.value():e;return a||(a=new Ud),r(g,y,n,i,a)}}return!!d&&(a||(a=new Ud),dp(t,e,n,i,r,a))};const Mp=function t(e,n,i,r,a){return e===n||(null==e||null==n||!wu(e)&&!wu(n)?e!=e&&n!=n:Bp(e,n,i,r,t,a))};const Ip=function(t,e,n,i){var r=n.length,a=r,s=!i;if(null==t)return!a;for(t=Object(t);r--;){var o=n[r];if(s&&o[2]?o[1]!==t[o[0]]:!(o[0]in t))return!1}for(;++r<a;){var c=(o=n[r])[0],l=t[c],h=o[1];if(s&&o[2]){if(void 0===l&&!(c in t))return!1}else{var u=new Ud;if(i)var d=i(l,h,c,t,e,u);if(!(void 0===d?Mp(h,l,3,i,u):d))return!1}}return!0};const Fp=function(t){return t==t&&!Rl(t)};const Rp=function(t){for(var e=rd(t),n=e.length;n--;){var i=e[n],r=t[i];e[n]=[i,r,Fp(r)]}return e};const $p=function(t,e){return function(n){return null!=n&&(n[t]===e&&(void 0!==e||t in Object(n)))}};const Pp=function(t){var e=Rp(t);return 1==e.length&&e[0][2]?$p(e[0][0],e[0][1]):function(n){return n===t||Ip(n,t,e)}};const jp=function(t,e){for(var n=0,i=(e=Sd(e,t)).length;null!=t&&n<i;)t=t[Ad(e[n++])];return n&&n==i?t:void 0};const Yp=function(t,e,n){var i=null==t?void 0:jp(t,e);return void 0===i?n:i};const zp=function(t,e){return null!=t&&e in Object(t)};const Up=function(t,e){return null!=t&&Dd(t,e,zp)};const Wp=function(t,e){return kd(t)&&Fp(e)?$p(Ad(t),e):function(n){var i=Yp(n,t);return void 0===i&&i===e?Up(n,t):Mp(e,i,3)}};const Hp=function(t){return function(e){return null==e?void 0:e[t]}};const qp=function(t){return function(e){return jp(e,t)}};const Vp=function(t){return kd(t)?Hp(Ad(t)):qp(t)};const Gp=function(t){return"function"==typeof t?t:null==t?od:"object"==typeof t?Lu(t)?Wp(t[0],t[1]):Pp(t):Vp(t)};const Xp=function(t,e){var n=-1,i=id(t)?Array(t.length):[];return sd(t,(function(t,r,a){i[++n]=e(t,r,a)})),i};const Zp=function(t,e){return(Lu(t)?hd:Xp)(t,Gp(e,3))};var Qp=Math.ceil,Kp=Math.max;const Jp=function(t,e,n,i){for(var r=-1,a=Kp(Qp((e-t)/(n||1)),0),s=Array(a);a--;)s[i?a:++r]=t,t+=n;return s};const tf=function(t,e,n){if(!Rl(n))return!1;var i=typeof e;return!!("number"==i?id(n)&&Ru(e,n.length):"string"==i&&e in n)&&uh(n[e],t)};var ef=/\s/;const nf=function(t){for(var e=t.length;e--&&ef.test(t.charAt(e)););return e};var rf=/^\s+/;const af=function(t){return t?t.slice(0,nf(t)+1).replace(rf,""):t};var sf=/^[-+]0x[0-9a-f]+$/i,of=/^0b[01]+$/i,cf=/^0o[0-7]+$/i,lf=parseInt;const hf=function(t){if("number"==typeof t)return t;if(ud(t))return NaN;if(Rl(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Rl(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=af(t);var n=of.test(t);return n||cf.test(t)?lf(t.slice(2),n?2:8):sf.test(t)?NaN:+t};var uf=1/0;const df=function(t){return t?(t=hf(t))===uf||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0};const pf=function(t){return function(e,n,i){return i&&"number"!=typeof i&&tf(e,n,i)&&(n=i=void 0),e=df(e),void 0===n?(n=e,e=0):n=df(n),i=void 0===i?e<n?1:-1:df(i),Jp(e,n,i,t)}};const ff=pf();const gf=function(t,e){var n=[];return sd(t,(function(t,i,r){e(t,i,r)&&n.push(t)})),n};const yf=function(t,e){return(Lu(t)?rp:gf)(t,Gp(e,3))};var mf=Object.prototype.hasOwnProperty;const bf=function(t){if(null==t)return!0;if(id(t)&&(Lu(t)||"string"==typeof t||"function"==typeof t.splice||Iu(t)||Gu(t)||Du(t)))return!t.length;var e=Ap(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(Ku(t))return!nd(t).length;for(var n in t)if(mf.call(t,n))return!1;return!0};const _f=function(t){return void 0===t};const xf=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)};var vf=Math.max;const kf=function(t,e,n){return e=vf(void 0===e?t.length-1:e,0),function(){for(var i=arguments,r=-1,a=vf(i.length-e,0),s=Array(a);++r<a;)s[r]=i[e+r];r=-1;for(var o=Array(e+1);++r<e;)o[r]=i[r];return o[e]=n(s),xf(t,this,o)}};const wf=function(){try{var t=Jl(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();var Tf=wf?function(t,e){return wf(t,"toString",{configurable:!0,enumerable:!1,value:Nd(e),writable:!0})}:od;const Cf=Tf;var Ef=Date.now;const Sf=function(t){var e=0,n=0;return function(){var i=Ef(),r=16-(i-n);if(n=i,r>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(Cf);const Af=function(t,e){return Sf(kf(t,e,od),t+"")};const Df=function(t,e,n,i){for(var r=t.length,a=n+(i?1:-1);i?a--:++a<r;)if(e(t[a],a,t))return a;return-1};const Lf=function(t){return t!=t};const Nf=function(t,e,n){for(var i=n-1,r=t.length;++i<r;)if(t[i]===e)return i;return-1};const Of=function(t,e,n){return e==e?Nf(t,e,n):Df(t,Lf,n)};const Bf=function(t,e){return!!(null==t?0:t.length)&&Of(t,e,0)>-1};const Mf=function(t,e,n){for(var i=-1,r=null==t?0:t.length;++i<r;)if(n(e,t[i]))return!0;return!1};const If=function(){};var Ff=gp&&1/Jd(new gp([,-0]))[1]==1/0?function(t){return new gp(t)}:If;const Rf=Ff;const $f=function(t,e,n){var i=-1,r=Bf,a=t.length,s=!0,o=[],c=o;if(n)s=!1,r=Mf;else if(a>=200){var l=e?null:Rf(t);if(l)return Jd(l);s=!1,r=Xd,c=new Vd}else c=e?[]:o;t:for(;++i<a;){var h=t[i],u=e?e(h):h;if(h=n||0!==h?h:0,s&&u==u){for(var d=c.length;d--;)if(c[d]===u)continue t;e&&c.push(u),o.push(h)}else r(c,u,n)||(c!==o&&c.push(u),o.push(h))}return o};const Pf=function(t){return wu(t)&&id(t)};const jf=Af((function(t){return $f(Id(t,1,Pf,!0))}));const Yf=function(t,e){return hd(e,(function(e){return t[e]}))};const zf=function(t){return null==t?[]:Yf(t,rd(t))};const Uf=function(t,e,n,i){var r=-1,a=null==t?0:t.length;for(i&&a&&(n=t[++r]);++r<a;)n=e(n,t[r],r,t);return n};const Wf=function(t,e,n,i,r){return r(t,(function(t,r,a){n=i?(i=!1,t):e(n,t,r,a)})),n};const Hf=function(t,e,n){var i=Lu(t)?Uf:Wf,r=arguments.length<3;return i(t,Gp(e,4),n,r,sd)};var qf="\0";class Vf{constructor(t={}){this._isDirected=!Ld(t,"directed")||t.directed,this._isMultigraph=!!Ld(t,"multigraph")&&t.multigraph,this._isCompound=!!Ld(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=Nd(void 0),this._defaultEdgeLabelFn=Nd(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(t){return this._label=t,this}graph(){return this._label}setDefaultNodeLabel(t){return $l(t)||(t=Nd(t)),this._defaultNodeLabelFn=t,this}nodeCount(){return this._nodeCount}nodes(){return rd(this._nodes)}sources(){var t=this;return yf(this.nodes(),(function(e){return bf(t._in[e])}))}sinks(){var t=this;return yf(this.nodes(),(function(e){return bf(t._out[e])}))}setNodes(t,e){var n=arguments,i=this;return ld(t,(function(t){n.length>1?i.setNode(t,e):i.setNode(t)})),this}setNode(t,e){return Ld(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]=qf,this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)}node(t){return this._nodes[t]}hasNode(t){return Ld(this._nodes,t)}removeNode(t){var e=this;if(Ld(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],ld(this.children(t),(function(t){e.setParent(t)})),delete this._children[t]),ld(rd(this._in[t]),n),delete this._in[t],delete this._preds[t],ld(rd(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this}setParent(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(_f(e))e=qf;else{for(var n=e+="";!_f(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this}_removeFromParentsChildList(t){delete this._children[this._parent[t]][t]}parent(t){if(this._isCompound){var e=this._parent[t];if(e!==qf)return e}}children(t){if(_f(t)&&(t=qf),this._isCompound){var e=this._children[t];if(e)return rd(e)}else{if(t===qf)return this.nodes();if(this.hasNode(t))return[]}}predecessors(t){var e=this._preds[t];if(e)return rd(e)}successors(t){var e=this._sucs[t];if(e)return rd(e)}neighbors(t){var e=this.predecessors(t);if(e)return jf(e,this.successors(t))}isLeaf(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length}filterNodes(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var n=this;ld(this._nodes,(function(n,i){t(i)&&e.setNode(i,n)})),ld(this._edgeObjs,(function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,n.edge(t))}));var i={};function r(t){var a=n.parent(t);return void 0===a||e.hasNode(a)?(i[t]=a,a):a in i?i[a]:r(a)}return this._isCompound&&ld(e.nodes(),(function(t){e.setParent(t,r(t))})),e}setDefaultEdgeLabel(t){return $l(t)||(t=Nd(t)),this._defaultEdgeLabelFn=t,this}edgeCount(){return this._edgeCount}edges(){return zf(this._edgeObjs)}setPath(t,e){var n=this,i=arguments;return Hf(t,(function(t,r){return i.length>1?n.setEdge(t,r,e):n.setEdge(t,r),r})),this}setEdge(){var t,e,n,i,r=!1,a=arguments[0];"object"==typeof a&&null!==a&&"v"in a?(t=a.v,e=a.w,n=a.name,2===arguments.length&&(i=arguments[1],r=!0)):(t=a,e=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],r=!0)),t=""+t,e=""+e,_f(n)||(n=""+n);var s=Zf(this._isDirected,t,e,n);if(Ld(this._edgeLabels,s))return r&&(this._edgeLabels[s]=i),this;if(!_f(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[s]=r?i:this._defaultEdgeLabelFn(t,e,n);var o=function(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}var o={v:r,w:a};i&&(o.name=i);return o}(this._isDirected,t,e,n);return t=o.v,e=o.w,Object.freeze(o),this._edgeObjs[s]=o,Gf(this._preds[e],t),Gf(this._sucs[t],e),this._in[e][s]=o,this._out[t][s]=o,this._edgeCount++,this}edge(t,e,n){var i=1===arguments.length?Qf(this._isDirected,arguments[0]):Zf(this._isDirected,t,e,n);return this._edgeLabels[i]}hasEdge(t,e,n){var i=1===arguments.length?Qf(this._isDirected,arguments[0]):Zf(this._isDirected,t,e,n);return Ld(this._edgeLabels,i)}removeEdge(t,e,n){var i=1===arguments.length?Qf(this._isDirected,arguments[0]):Zf(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],Xf(this._preds[e],t),Xf(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this}inEdges(t,e){var n=this._in[t];if(n){var i=zf(n);return e?yf(i,(function(t){return t.v===e})):i}}outEdges(t,e){var n=this._out[t];if(n){var i=zf(n);return e?yf(i,(function(t){return t.w===e})):i}}nodeEdges(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}}function Gf(t,e){t[e]?t[e]++:t[e]=1}function Xf(t,e){--t[e]||delete t[e]}function Zf(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}return r+"\x01"+a+"\x01"+(_f(i)?"\0":i)}function Qf(t,e){return Zf(t,e.v,e.w,e.name)}Vf.prototype._nodeCount=0,Vf.prototype._edgeCount=0;class Kf{constructor(){var t={};t._next=t._prev=t,this._sentinel=t}dequeue(){var t=this._sentinel,e=t._prev;if(e!==t)return Jf(e),e}enqueue(t){var e=this._sentinel;t._prev&&t._next&&Jf(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e}toString(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,tg)),n=n._prev;return"["+t.join(", ")+"]"}}function Jf(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function tg(t,e){if("_next"!==t&&"_prev"!==t)return e}var eg=Nd(1);function ng(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new Vf,i=0,r=0;ld(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),ld(t.edges(),(function(t){var a=n.edge(t.v,t.w)||0,s=e(t),o=a+s;n.setEdge(t.v,t.w,o),r=Math.max(r,n.node(t.v).out+=s),i=Math.max(i,n.node(t.w).in+=s)}));var a=ff(r+i+3).map((function(){return new Kf})),s=i+1;return ld(n.nodes(),(function(t){rg(a,s,n.node(t))})),{graph:n,buckets:a,zeroIdx:s}}(t,e||eg),i=function(t,e,n){var i,r=[],a=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)ig(t,e,n,i);for(;i=a.dequeue();)ig(t,e,n,i);if(t.nodeCount())for(var o=e.length-2;o>0;--o)if(i=e[o].dequeue()){r=r.concat(ig(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return Fd(Zp(i,(function(e){return t.outEdges(e.v,e.w)})),!0)}function ig(t,e,n,i,r){var a=r?[]:void 0;return ld(t.inEdges(i.v),(function(i){var s=t.edge(i),o=t.node(i.v);r&&a.push({v:i.v,w:i.w}),o.out-=s,rg(e,n,o)})),ld(t.outEdges(i.v),(function(i){var r=t.edge(i),a=i.w,s=t.node(a);s.in-=r,rg(e,n,s)})),t.removeNode(i.v),a}function rg(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}function ag(t){var e="greedy"===t.graph().acyclicer?ng(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},i={};function r(a){Ld(i,a)||(i[a]=!0,n[a]=!0,ld(t.outEdges(a),(function(t){Ld(n,t.w)?e.push(t):r(t.w)})),delete n[a])}return ld(t.nodes(),r),e}(t);ld(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,md("rev"))}))}const sg=function(t,e,n){"__proto__"==e&&wf?wf(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n};const og=function(t,e,n){(void 0!==n&&!uh(t[e],n)||void 0===n&&!(e in t))&&sg(t,e,n)};var cg="object"==typeof exports&&exports&&!exports.nodeType&&exports,lg=cg&&"object"==typeof module&&module&&!module.nodeType&&module,hg=lg&&lg.exports===cg?El.Buffer:void 0,ug=hg?hg.allocUnsafe:void 0;const dg=function(t,e){if(e)return t.slice();var n=t.length,i=ug?ug(n):new t.constructor(n);return t.copy(i),i};const pg=function(t){var e=new t.constructor(t.byteLength);return new Qd(e).set(new Qd(t)),e};const fg=function(t,e){var n=e?pg(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)};const gg=function(t,e){var n=-1,i=t.length;for(e||(e=Array(i));++n<i;)e[n]=t[n];return e};var yg=Object.create,mg=function(){function t(){}return function(e){if(!Rl(e))return{};if(yg)return yg(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();const bg=mg;const _g=Ju(Object.getPrototypeOf,Object);const xg=function(t){return"function"!=typeof t.constructor||Ku(t)?{}:bg(_g(t))};var vg=Function.prototype,kg=Object.prototype,wg=vg.toString,Tg=kg.hasOwnProperty,Cg=wg.call(Object);const Eg=function(t){if(!wu(t)||"[object Object]"!=Fl(t))return!1;var e=_g(t);if(null===e)return!0;var n=Tg.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&wg.call(n)==Cg};const Sg=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};var Ag=Object.prototype.hasOwnProperty;const Dg=function(t,e,n){var i=t[e];Ag.call(t,e)&&uh(i,n)&&(void 0!==n||e in t)||sg(t,e,n)};const Lg=function(t,e,n,i){var r=!n;n||(n={});for(var a=-1,s=e.length;++a<s;){var o=e[a],c=i?i(n[o],t[o],o,n,t):void 0;void 0===c&&(c=t[o]),r?sg(n,o,c):Dg(n,o,c)}return n};const Ng=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e};var Og=Object.prototype.hasOwnProperty;const Bg=function(t){if(!Rl(t))return Ng(t);var e=Ku(t),n=[];for(var i in t)("constructor"!=i||!e&&Og.call(t,i))&&n.push(i);return n};const Mg=function(t){return id(t)?Zu(t,!0):Bg(t)};const Ig=function(t){return Lg(t,Mg(t))};const Fg=function(t,e,n,i,r,a,s){var o=Sg(t,n),c=Sg(e,n),l=s.get(c);if(l)og(t,n,l);else{var h=a?a(o,c,n+"",t,e,s):void 0,u=void 0===h;if(u){var d=Lu(c),p=!d&&Iu(c),f=!d&&!p&&Gu(c);h=c,d||p||f?Lu(o)?h=o:Pf(o)?h=gg(o):p?(u=!1,h=dg(c,!0)):f?(u=!1,h=fg(c,!0)):h=[]:Eg(c)||Du(c)?(h=o,Du(o)?h=Ig(o):Rl(o)&&!$l(o)||(h=xg(c))):u=!1}u&&(s.set(c,h),r(h,c,i,a,s),s.delete(c)),og(t,n,h)}};const Rg=function t(e,n,i,r,a){e!==n&&vu(n,(function(s,o){if(a||(a=new Ud),Rl(s))Fg(e,n,o,i,t,r,a);else{var c=r?r(Sg(e,o),s,o+"",e,n,a):void 0;void 0===c&&(c=s),og(e,o,c)}}),Mg)};const $g=function(t){return Af((function(e,n){var i=-1,r=n.length,a=r>1?n[r-1]:void 0,s=r>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(r--,a):void 0,s&&tf(n[0],n[1],s)&&(a=r<3?void 0:a,r=1),e=Object(e);++i<r;){var o=n[i];o&&t(e,o,i,a)}return e}))};var Pg=$g((function(t,e,n){Rg(t,e,n)}));const jg=Pg;const Yg=function(t,e,n,i){if(!Rl(t))return t;for(var r=-1,a=(e=Sd(e,t)).length,s=a-1,o=t;null!=o&&++r<a;){var c=Ad(e[r]),l=n;if("__proto__"===c||"constructor"===c||"prototype"===c)return t;if(r!=s){var h=o[c];void 0===(l=i?i(h,c,o):void 0)&&(l=Rl(h)?h:Ru(e[r+1])?[]:{})}Dg(o,c,l),o=o[c]}return t};const zg=function(t,e,n){for(var i=-1,r=e.length,a={};++i<r;){var s=e[i],o=jp(t,s);n(o,s)&&Yg(a,Sd(s,t),o)}return a};const Ug=function(t,e){return zg(t,e,(function(e,n){return Up(t,n)}))};var Wg=function(t){return Sf(kf(t,void 0,Fd),t+"")}((function(t,e){return null==t?{}:Ug(t,e)}));const Hg=Wg;var qg=Object.prototype,Vg=qg.hasOwnProperty,Gg=Af((function(t,e){t=Object(t);var n=-1,i=e.length,r=i>2?e[2]:void 0;for(r&&tf(e[0],e[1],r)&&(i=1);++n<i;)for(var a=e[n],s=Mg(a),o=-1,c=s.length;++o<c;){var l=s[o],h=t[l];(void 0===h||uh(h,qg[l])&&!Vg.call(t,l))&&(t[l]=a[l])}return t}));const Xg=Gg;const Zg=function(t,e,n){for(var i=-1,r=t.length;++i<r;){var a=t[i],s=e(a);if(null!=s&&(void 0===o?s==s&&!ud(s):n(s,o)))var o=s,c=a}return c};const Qg=function(t,e){return t>e};const Kg=function(t){return t&&t.length?Zg(t,od,Qg):void 0};const Jg=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0};const ty=function(t,e){var n={};return e=Gp(e,3),ad(t,(function(t,i,r){sg(n,i,e(t,i,r))})),n};const ey=function(t,e){return t<e};const ny=function(t){return t&&t.length?Zg(t,od,ey):void 0};const iy=function(){return El.Date.now()};function ry(t,e,n,i){var r;do{r=md(i)}while(t.hasNode(r));return n.dummy=e,t.setNode(r,n),r}function ay(t){var e=new Vf({multigraph:t.isMultigraph()}).setGraph(t.graph());return ld(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),ld(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e}function sy(t,e){var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;if(!s&&!o)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=l*s/o,i=l):(s<0&&(c=-c),n=c,i=c*o/s),{x:r+n,y:a+i}}function oy(t){var e=Zp(ff(ly(t)+1),(function(){return[]}));return ld(t.nodes(),(function(n){var i=t.node(n),r=i.rank;_f(r)||(e[r][i.order]=n)})),e}function cy(t,e,n,i){var r={width:0,height:0};return arguments.length>=4&&(r.rank=n,r.order=i),ry(t,"border",r,e)}function ly(t){return Kg(Zp(t.nodes(),(function(e){var n=t.node(e).rank;if(!_f(n))return n})))}function hy(t,e){var n=iy();try{return e()}finally{console.log(t+" time: "+(iy()-n)+"ms")}}function uy(t,e){return e()}function dy(t,e,n,i,r,a){var s={width:0,height:0,rank:a,borderType:e},o=r[e][a-1],c=ry(t,"border",s,n);r[e][a]=c,t.setParent(c,i),o&&t.setEdge(o,c,{weight:1})}function py(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){ld(t.nodes(),(function(e){yy(t.node(e))})),ld(t.edges(),(function(e){var n=t.edge(e);ld(n.points,yy),Ld(n,"y")&&yy(n)}))}(t),"lr"!==e&&"rl"!==e||(!function(t){ld(t.nodes(),(function(e){my(t.node(e))})),ld(t.edges(),(function(e){var n=t.edge(e);ld(n.points,my),Ld(n,"x")&&my(n)}))}(t),fy(t))}function fy(t){ld(t.nodes(),(function(e){gy(t.node(e))})),ld(t.edges(),(function(e){gy(t.edge(e))}))}function gy(t){var e=t.width;t.width=t.height,t.height=e}function yy(t){t.y=-t.y}function my(t){var e=t.x;t.x=t.y,t.y=e}function by(t){var e=ry(t,"root",{},"_root"),n=function(t){var e={};function n(i,r){var a=t.children(i);a&&a.length&&ld(a,(function(t){n(t,r+1)})),e[i]=r}return ld(t.children(),(function(t){n(t,1)})),e}(t),i=Kg(zf(n))-1,r=2*i+1;t.graph().nestingRoot=e,ld(t.edges(),(function(e){t.edge(e).minlen*=r}));var a=function(t){return Hf(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;ld(t.children(),(function(s){_y(t,e,r,a,i,n,s)})),t.graph().nodeRankFactor=r}function _y(t,e,n,i,r,a,s){var o=t.children(s);if(o.length){var c=cy(t,"_bt"),l=cy(t,"_bb"),h=t.node(s);t.setParent(c,s),h.borderTop=c,t.setParent(l,s),h.borderBottom=l,ld(o,(function(o){_y(t,e,n,i,r,a,o);var h=t.node(o),u=h.borderTop?h.borderTop:o,d=h.borderBottom?h.borderBottom:o,p=h.borderTop?i:2*i,f=u!==d?1:r-a[s]+1;t.setEdge(c,u,{weight:p,minlen:f,nestingEdge:!0}),t.setEdge(d,l,{weight:p,minlen:f,nestingEdge:!0})})),t.parent(s)||t.setEdge(e,c,{weight:0,minlen:r+a[s]})}else s!==e&&t.setEdge(e,s,{weight:0,minlen:n})}const xy=function(t,e){return t&&Lg(e,rd(e),t)};const vy=function(t,e){return t&&Lg(e,Mg(e),t)};const ky=function(t,e){return Lg(t,lp(t),e)};var wy=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)Od(e,lp(t)),t=_g(t);return e}:ap;const Ty=wy;const Cy=function(t,e){return Lg(t,Ty(t),e)};const Ey=function(t){return ip(t,Mg,Ty)};var Sy=Object.prototype.hasOwnProperty;const Ay=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&Sy.call(t,"index")&&(n.index=t.index,n.input=t.input),n};const Dy=function(t,e){var n=e?pg(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)};var Ly=/\w*$/;const Ny=function(t){var e=new t.constructor(t.source,Ly.exec(t));return e.lastIndex=t.lastIndex,e};var Oy=Sl?Sl.prototype:void 0,By=Oy?Oy.valueOf:void 0;const My=function(t){return By?Object(By.call(t)):{}};const Iy=function(t,e,n){var i=t.constructor;switch(e){case"[object ArrayBuffer]":return pg(t);case"[object Boolean]":case"[object Date]":return new i(+t);case"[object DataView]":return Dy(t,n);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return fg(t,n);case"[object Map]":case"[object Set]":return new i;case"[object Number]":case"[object String]":return new i(t);case"[object RegExp]":return Ny(t);case"[object Symbol]":return My(t)}};const Fy=function(t){return wu(t)&&"[object Map]"==Ap(t)};var Ry=qu&&qu.isMap;const $y=Ry?Yu(Ry):Fy;const Py=function(t){return wu(t)&&"[object Set]"==Ap(t)};var jy=qu&&qu.isSet;const Yy=jy?Yu(jy):Py;var zy="[object Arguments]",Uy="[object Function]",Wy="[object Object]",Hy={};Hy[zy]=Hy["[object Array]"]=Hy["[object ArrayBuffer]"]=Hy["[object DataView]"]=Hy["[object Boolean]"]=Hy["[object Date]"]=Hy["[object Float32Array]"]=Hy["[object Float64Array]"]=Hy["[object Int8Array]"]=Hy["[object Int16Array]"]=Hy["[object Int32Array]"]=Hy["[object Map]"]=Hy["[object Number]"]=Hy["[object Object]"]=Hy["[object RegExp]"]=Hy["[object Set]"]=Hy["[object String]"]=Hy["[object Symbol]"]=Hy["[object Uint8Array]"]=Hy["[object Uint8ClampedArray]"]=Hy["[object Uint16Array]"]=Hy["[object Uint32Array]"]=!0,Hy["[object Error]"]=Hy[Uy]=Hy["[object WeakMap]"]=!1;const qy=function t(e,n,i,r,a,s){var o,c=1&n,l=2&n,h=4&n;if(i&&(o=a?i(e,r,a,s):i(e)),void 0!==o)return o;if(!Rl(e))return e;var u=Lu(e);if(u){if(o=Ay(e),!c)return gg(e,o)}else{var d=Ap(e),p=d==Uy||"[object GeneratorFunction]"==d;if(Iu(e))return dg(e,c);if(d==Wy||d==zy||p&&!a){if(o=l||p?{}:xg(e),!c)return l?Cy(e,vy(o,e)):ky(e,xy(o,e))}else{if(!Hy[d])return a?e:{};o=Iy(e,d,c)}}s||(s=new Ud);var f=s.get(e);if(f)return f;s.set(e,o),Yy(e)?e.forEach((function(r){o.add(t(r,n,i,r,e,s))})):$y(e)&&e.forEach((function(r,a){o.set(a,t(r,n,i,a,e,s))}));var g=u?void 0:(h?l?Ey:hp:l?Mg:rd)(e);return _u(g||e,(function(r,a){g&&(r=e[a=r]),Dg(o,a,t(r,n,i,a,e,s))})),o};const Vy=function(t){return qy(t,5)};function Gy(t,e,n){var i=function(t){var e;for(;t.hasNode(e=md("_root")););return e}(t),r=new Vf({compound:!0}).setGraph({root:i}).setDefaultNodeLabel((function(e){return t.node(e)}));return ld(t.nodes(),(function(a){var s=t.node(a),o=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(r.setNode(a),r.setParent(a,o||i),ld(t[n](a),(function(e){var n=e.v===a?e.w:e.v,i=r.edge(n,a),s=_f(i)?0:i.weight;r.setEdge(n,a,{weight:t.edge(e).weight+s})})),Ld(s,"minRank")&&r.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))})),r}const Xy=function(t,e,n){for(var i=-1,r=t.length,a=e.length,s={};++i<r;){var o=i<a?e[i]:void 0;n(s,t[i],o)}return s};const Zy=function(t,e){return Xy(t||[],e||[],Dg)};const Qy=function(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t};const Ky=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,r=t==t,a=ud(t),s=void 0!==e,o=null===e,c=e==e,l=ud(e);if(!o&&!l&&!a&&t>e||a&&s&&c&&!o&&!l||i&&s&&c||!n&&c||!r)return 1;if(!i&&!a&&!l&&t<e||l&&n&&r&&!i&&!a||o&&n&&r||!s&&r||!c)return-1}return 0};const Jy=function(t,e,n){for(var i=-1,r=t.criteria,a=e.criteria,s=r.length,o=n.length;++i<s;){var c=Ky(r[i],a[i]);if(c)return i>=o?c:c*("desc"==n[i]?-1:1)}return t.index-e.index};const tm=function(t,e,n){e=e.length?hd(e,(function(t){return Lu(t)?function(e){return jp(e,1===t.length?t[0]:t)}:t})):[od];var i=-1;e=hd(e,Yu(Gp));var r=Xp(t,(function(t,n,r){return{criteria:hd(e,(function(e){return e(t)})),index:++i,value:t}}));return Qy(r,(function(t,e){return Jy(t,e,n)}))};const em=Af((function(t,e){if(null==t)return[];var n=e.length;return n>1&&tf(t,e[0],e[1])?e=[]:n>2&&tf(e[0],e[1],e[2])&&(e=[e[0]]),tm(t,Id(e,1),[])}));function nm(t,e){for(var n=0,i=1;i<e.length;++i)n+=im(t,e[i-1],e[i]);return n}function im(t,e,n){for(var i=Zy(n,Zp(n,(function(t,e){return e}))),r=Fd(Zp(e,(function(e){return em(Zp(t.outEdges(e),(function(e){return{pos:i[e.w],weight:t.edge(e).weight}})),"pos")})),!0),a=1;a<n.length;)a<<=1;var s=2*a-1;a-=1;var o=Zp(new Array(s),(function(){return 0})),c=0;return ld(r.forEach((function(t){var e=t.pos+a;o[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=o[e+1]),o[e=e-1>>1]+=t.weight;c+=t.weight*n}))),c}function rm(t,e){var n={};return ld(t,(function(t,e){var i=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};_f(t.barycenter)||(i.barycenter=t.barycenter,i.weight=t.weight)})),ld(e.edges(),(function(t){var e=n[t.v],i=n[t.w];_f(e)||_f(i)||(i.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(_f(e.barycenter)||_f(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function i(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var r=t.pop();e.push(r),ld(r.in.reverse(),n(r)),ld(r.out,i(r))}return Zp(yf(e,(function(t){return!t.merged})),(function(t){return Hg(t,["vs","i","barycenter","weight"])}))}(yf(n,(function(t){return!t.indegree})))}function am(t,e){var n,i=function(t,e){var n={lhs:[],rhs:[]};return ld(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n}(t,(function(t){return Ld(t,"barycenter")})),r=i.lhs,a=em(i.rhs,(function(t){return-t.i})),s=[],o=0,c=0,l=0;r.sort((n=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:n?e.i-t.i:t.i-e.i})),l=sm(s,a,l),ld(r,(function(t){l+=t.vs.length,s.push(t.vs),o+=t.barycenter*t.weight,c+=t.weight,l=sm(s,a,l)}));var h={vs:Fd(s,!0)};return c&&(h.barycenter=o/c,h.weight=c),h}function sm(t,e,n){for(var i;e.length&&(i=Jg(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}function om(t,e,n,i){var r=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,o=a?a.borderRight:void 0,c={};s&&(r=yf(r,(function(t){return t!==s&&t!==o})));var l=function(t,e){return Zp(e,(function(e){var n=t.inEdges(e);if(n.length){var i=Hf(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:i.sum/i.weight,weight:i.weight}}return{v:e}}))}(t,r);ld(l,(function(e){if(t.children(e.v).length){var r=om(t,e.v,n,i);c[e.v]=r,Ld(r,"barycenter")&&(s=r,_f((a=e).barycenter)?(a.barycenter=s.barycenter,a.weight=s.weight):(a.barycenter=(a.barycenter*a.weight+s.barycenter*s.weight)/(a.weight+s.weight),a.weight+=s.weight))}var a,s}));var h=rm(l,n);!function(t,e){ld(t,(function(t){t.vs=Fd(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(h,c);var u=am(h,i);if(s&&(u.vs=Fd([s,u.vs,o],!0),t.predecessors(s).length)){var d=t.node(t.predecessors(s)[0]),p=t.node(t.predecessors(o)[0]);Ld(u,"barycenter")||(u.barycenter=0,u.weight=0),u.barycenter=(u.barycenter*u.weight+d.order+p.order)/(u.weight+2),u.weight+=2}return u}function cm(t){var e=ly(t),n=lm(t,ff(1,e+1),"inEdges"),i=lm(t,ff(e-1,-1,-1),"outEdges"),r=function(t){var e={},n=yf(t.nodes(),(function(e){return!t.children(e).length})),i=Kg(Zp(n,(function(e){return t.node(e).rank}))),r=Zp(ff(i+1),(function(){return[]})),a=em(n,(function(e){return t.node(e).rank}));return ld(a,(function n(i){if(!Ld(e,i)){e[i]=!0;var a=t.node(i);r[a.rank].push(i),ld(t.successors(i),n)}})),r}(t);um(t,r);for(var a,s=Number.POSITIVE_INFINITY,o=0,c=0;c<4;++o,++c){hm(o%2?n:i,o%4>=2);var l=nm(t,r=oy(t));l<s&&(c=0,a=Vy(r),s=l)}um(t,a)}function lm(t,e,n){return Zp(e,(function(e){return Gy(t,e,n)}))}function hm(t,e){var n=new Vf;ld(t,(function(t){var i=t.graph().root,r=om(t,i,n,e);ld(r.vs,(function(e,n){t.node(e).order=n})),function(t,e,n){var i,r={};ld(n,(function(n){for(var a,s,o=t.parent(n);o;){if((a=t.parent(o))?(s=r[a],r[a]=o):(s=i,i=o),s&&s!==o)return void e.setEdge(s,o);o=a}}))}(t,n,r.vs)}))}function um(t,e){ld(e,(function(e){ld(e,(function(e,n){t.node(e).order=n}))}))}function dm(t){var e=function(t){var e={},n=0;function i(r){var a=n;ld(t.children(r),i),e[r]={low:a,lim:n++}}return ld(t.children(),i),e}(t);ld(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,a=function(t,e,n,i){var r,a,s=[],o=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));a=r,r=i;for(;(r=t.parent(r))!==a;)o.push(r);return{path:s.concat(o.reverse()),lca:a}}(t,e,r.v,r.w),s=a.path,o=a.lca,c=0,l=s[c],h=!0;n!==r.w;){if(i=t.node(n),h){for(;(l=s[c])!==o&&t.node(l).maxRank<i.rank;)c++;l===o&&(h=!1)}if(!h){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}const pm=function(t){return function(e,n,i){var r=Object(e);if(!id(e)){var a=Gp(n,3);e=rd(e),n=function(t){return a(r[t],t,r)}}var s=t(e,n,i);return s>-1?r[a?e[s]:s]:void 0}};const fm=function(t){var e=df(t),n=e%1;return e==e?n?e-n:e:0};var gm=Math.max;const ym=function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var r=null==n?0:fm(n);return r<0&&(r=gm(i+r,0)),Df(t,Gp(e,3),r)};const mm=pm(ym);const bm=function(t,e){return t&&t.length?Zg(t,Gp(e,2),ey):void 0};const _m=function(t,e){return null==t?t:vu(t,cd(e),Mg)};function xm(t,e){var n={};return Hf(e,(function(e,i){var r=0,a=0,s=e.length,o=Jg(i);return ld(i,(function(e,c){var l=function(t,e){if(t.node(e).dummy)return mm(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),h=l?t.node(l).order:s;(l||e===o)&&(ld(i.slice(a,c+1),(function(e){ld(t.predecessors(e),(function(i){var a=t.node(i),s=a.order;!(s<r||h<s)||a.dummy&&t.node(e).dummy||vm(n,i,e)}))})),a=c+1,r=h)})),i})),n}function vm(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function km(t,e,n){if(e>n){var i=e;e=n,n=i}return Ld(t[e],n)}function wm(t,e,n,i,r){var a={},s=function(t,e,n,i){var r=new Vf,a=t.graph(),s=function(t,e,n){return function(i,r,a){var s,o=i.node(r),c=i.node(a),l=0;if(l+=o.width/2,Ld(o,"labelpos"))switch(o.labelpos.toLowerCase()){case"l":s=-o.width/2;break;case"r":s=o.width/2}if(s&&(l+=n?s:-s),s=0,l+=(o.dummy?e:t)/2,l+=(c.dummy?e:t)/2,l+=c.width/2,Ld(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":s=c.width/2;break;case"r":s=-c.width/2}return s&&(l+=n?s:-s),s=0,l}}(a.nodesep,a.edgesep,i);return ld(e,(function(e){var i;ld(e,(function(e){var a=n[e];if(r.setNode(a),i){var o=n[i],c=r.edge(o,a);r.setEdge(o,a,Math.max(s(t,e,i),c||0))}i=e}))})),r}(t,e,n,r),o=r?"borderLeft":"borderRight";function c(t,e){for(var n=s.nodes(),i=n.pop(),r={};i;)r[i]?t(i):(r[i]=!0,n.push(i),n=n.concat(e(i))),i=n.pop()}return c((function(t){a[t]=s.inEdges(t).reduce((function(t,e){return Math.max(t,a[e.v]+s.edge(e))}),0)}),s.predecessors.bind(s)),c((function(e){var n=s.outEdges(e).reduce((function(t,e){return Math.min(t,a[e.w]-s.edge(e))}),Number.POSITIVE_INFINITY),i=t.node(e);n!==Number.POSITIVE_INFINITY&&i.borderType!==o&&(a[e]=Math.max(a[e],n))}),s.successors.bind(s)),ld(i,(function(t){a[t]=a[n[t]]})),a}function Tm(t){var e,n=oy(t),i=jg(xm(t,n),function(t,e){var n={};function i(e,i,r,a,s){var o;ld(ff(i,r),(function(i){o=e[i],t.node(o).dummy&&ld(t.predecessors(o),(function(e){var i=t.node(e);i.dummy&&(i.order<a||i.order>s)&&vm(n,e,o)}))}))}return Hf(e,(function(e,n){var r,a=-1,s=0;return ld(n,(function(o,c){if("border"===t.node(o).dummy){var l=t.predecessors(o);l.length&&(r=t.node(l[0]).order,i(n,s,c,a,r),s=c,a=r)}i(n,s,n.length,r,e.length)})),n})),n}(t,n)),r={};ld(["u","d"],(function(a){e="u"===a?n:zf(n).reverse(),ld(["l","r"],(function(n){"r"===n&&(e=Zp(e,(function(t){return zf(t).reverse()})));var s=("u"===a?t.predecessors:t.successors).bind(t),o=function(t,e,n,i){var r={},a={},s={};return ld(e,(function(t){ld(t,(function(t,e){r[t]=t,a[t]=t,s[t]=e}))})),ld(e,(function(t){var e=-1;ld(t,(function(t){var o=i(t);if(o.length){o=em(o,(function(t){return s[t]}));for(var c=(o.length-1)/2,l=Math.floor(c),h=Math.ceil(c);l<=h;++l){var u=o[l];a[t]===t&&e<s[u]&&!km(n,t,u)&&(a[u]=t,a[t]=r[t]=r[u],e=s[u])}}}))})),{root:r,align:a}}(0,e,i,s),c=wm(t,e,o.root,o.align,"r"===n);"r"===n&&(c=ty(c,(function(t){return-t}))),r[a+n]=c}))}));var a=function(t,e){return bm(zf(e),(function(e){var n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;return _m(e,(function(e,r){var a=function(t,e){return t.node(e).width}(t,r)/2;n=Math.max(e+a,n),i=Math.min(e-a,i)})),n-i}))}(t,r);return function(t,e){var n=zf(e),i=ny(n),r=Kg(n);ld(["u","d"],(function(n){ld(["l","r"],(function(a){var s,o=n+a,c=t[o];if(c!==e){var l=zf(c);(s="l"===a?i-ny(l):r-Kg(l))&&(t[o]=ty(c,(function(t){return t+s})))}}))}))}(r,a),function(t,e){return ty(t.ul,(function(n,i){if(e)return t[e.toLowerCase()][i];var r=em(Zp(t,i));return(r[1]+r[2])/2}))}(r,t.graph().align)}function Cm(t){(function(t){var e=oy(t),n=t.graph().ranksep,i=0;ld(e,(function(e){var r=Kg(Zp(e,(function(e){return t.node(e).height})));ld(e,(function(e){t.node(e).y=i+r/2})),i+=r+n}))})(t=ay(t)),ld(Tm(t),(function(e,n){t.node(n).x=e}))}function Em(t,e){var n=e&&e.debugTiming?hy:uy;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new Vf({multigraph:!0,compound:!0}),n=Fm(t.graph());return e.setGraph(jg({},Am,Im(n,Sm),Hg(n,Dm))),ld(t.nodes(),(function(n){var i=Fm(t.node(n));e.setNode(n,Xg(Im(i,Lm),Nm)),e.setParent(n,t.parent(n))})),ld(t.edges(),(function(n){var i=Fm(t.edge(n));e.setEdge(n,jg({},Bm,Im(i,Om),Hg(i,Mm)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,ld(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){ld(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){ag(t)})),e(" nestingGraph.run",(function(){by(t)})),e(" rank",(function(){!function(t){switch(t.graph().ranker){case"network-simplex":default:db(t);break;case"tight-tree":!function(t){Rm(t),Pm(t)}(t);break;case"longest-path":ub(t)}}(ay(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};ry(t,"edge-proxy",r,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){!function(t){var e=ny(Zp(t.nodes(),(function(e){return t.node(e).rank}))),n=[];ld(t.nodes(),(function(i){var r=t.node(i).rank-e;n[r]||(n[r]=[]),n[r].push(i)}));var i=0,r=t.graph().nodeRankFactor;ld(n,(function(e,n){_f(e)&&n%r!=0?--i:i&&ld(e,(function(e){t.node(e).rank+=i}))}))}(t)})),e(" nestingGraph.cleanup",(function(){!function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,ld(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}(t)})),e(" normalizeRanks",(function(){!function(t){var e=ny(Zp(t.nodes(),(function(e){return t.node(e).rank})));ld(t.nodes(),(function(n){var i=t.node(n);Ld(i,"rank")&&(i.rank-=e)}))}(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;ld(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=Kg(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){ld(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){!function(t){t.graph().dummyChains=[],ld(t.edges(),(function(e){!function(t,e){var n,i,r,a=e.v,s=t.node(a).rank,o=e.w,c=t.node(o).rank,l=e.name,h=t.edge(e),u=h.labelRank;if(c===s+1)return;for(t.removeEdge(e),r=0,++s;s<c;++r,++s)h.points=[],n=ry(t,"edge",i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:s},"_d"),s===u&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(a,n,{weight:h.weight},l),0===r&&t.graph().dummyChains.push(n),a=n;t.setEdge(a,o,{weight:h.weight},l)}(t,e)}))}(t)})),e(" parentDummyChains",(function(){dm(t)})),e(" addBorderSegments",(function(){!function(t){ld(t.children(),(function e(n){var i=t.children(n),r=t.node(n);if(i.length&&ld(i,e),Ld(r,"minRank")){r.borderLeft=[],r.borderRight=[];for(var a=r.minRank,s=r.maxRank+1;a<s;++a)dy(t,"borderLeft","_bl",n,r,a),dy(t,"borderRight","_br",n,r,a)}}))}(t)})),e(" order",(function(){cm(t)})),e(" insertSelfEdges",(function(){!function(t){var e=oy(t);ld(e,(function(e){var n=0;ld(e,(function(e,i){var r=t.node(e);r.order=i+n,ld(r.selfEdges,(function(e){ry(t,"selfedge",{width:e.label.width,height:e.label.height,rank:r.rank,order:i+ ++n,e:e.e,label:e.label},"_se")})),delete r.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){!function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||fy(t)}(t)})),e(" position",(function(){Cm(t)})),e(" positionSelfEdges",(function(){!function(t){ld(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,a=i.y,s=n.x-r,o=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:a-o},{x:r+5*s/6,y:a-o},{x:r+s,y:a},{x:r+5*s/6,y:a+o},{x:r+2*s/3,y:a+o}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){ld(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),r=t.node(n.borderBottom),a=t.node(Jg(n.borderLeft)),s=t.node(Jg(n.borderRight));n.width=Math.abs(s.x-a.x),n.height=Math.abs(r.y-i.y),n.x=a.x+n.width/2,n.y=i.y+n.height/2}})),ld(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){!function(t){ld(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);if(Ld(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){py(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,i=Number.POSITIVE_INFINITY,r=0,a=t.graph(),s=a.marginx||0,o=a.marginy||0;function c(t){var a=t.x,s=t.y,o=t.width,c=t.height;e=Math.min(e,a-o/2),n=Math.max(n,a+o/2),i=Math.min(i,s-c/2),r=Math.max(r,s+c/2)}ld(t.nodes(),(function(e){c(t.node(e))})),ld(t.edges(),(function(e){var n=t.edge(e);Ld(n,"x")&&c(n)})),e-=s,i-=o,ld(t.nodes(),(function(n){var r=t.node(n);r.x-=e,r.y-=i})),ld(t.edges(),(function(n){var r=t.edge(n);ld(r.points,(function(t){t.x-=e,t.y-=i})),Ld(r,"x")&&(r.x-=e),Ld(r,"y")&&(r.y-=i)})),a.width=n-e+s,a.height=r-i+o}(t)})),e(" assignNodeIntersects",(function(){!function(t){ld(t.edges(),(function(e){var n,i,r=t.edge(e),a=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=a),r.points.unshift(sy(a,n)),r.points.push(sy(s,i))}))}(t)})),e(" reversePoints",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){!function(t){ld(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){ld(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),ld(t.edges(),(function(n){var i=t.edge(n),r=e.edge(n);i.points=r.points,Ld(r,"x")&&(i.x=r.x,i.y=r.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))}var Sm=["nodesep","edgesep","ranksep","marginx","marginy"],Am={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},Dm=["acyclicer","ranker","rankdir","align"],Lm=["width","height"],Nm={width:0,height:0},Om=["minlen","weight","width","height","labeloffset"],Bm={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},Mm=["labelpos"];function Im(t,e){return ty(Hg(t,e),Number)}function Fm(t){var e={};return ld(t,(function(t,n){e[n.toLowerCase()]=t})),e}function Rm(t){var e={};ld(t.sources(),(function n(i){var r=t.node(i);if(Ld(e,i))return r.rank;e[i]=!0;var a=ny(Zp(t.outEdges(i),(function(e){return n(e.w)-t.edge(e).minlen})));return a!==Number.POSITIVE_INFINITY&&null!=a||(a=0),r.rank=a}))}function $m(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}function Pm(t){var e,n,i=new Vf({directed:!1}),r=t.nodes()[0],a=t.nodeCount();for(i.setNode(r,{});jm(i,t)<a;)e=Ym(i,t),n=i.hasNode(e.v)?$m(t,e):-$m(t,e),zm(i,t,n);return i}function jm(t,e){return ld(t.nodes(),(function n(i){ld(e.nodeEdges(i),(function(r){var a=r.v,s=i===a?r.w:a;t.hasNode(s)||$m(e,r)||(t.setNode(s,{}),t.setEdge(i,s,{}),n(s))}))})),t.nodeCount()}function Ym(t,e){return bm(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return $m(e,n)}))}function zm(t,e,n){ld(t.nodes(),(function(t){e.node(t).rank+=n}))}Nd(1);Nd(1);Hp("length");RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var Um="[\\ud800-\\udfff]",Wm="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Hm="\\ud83c[\\udffb-\\udfff]",qm="[^\\ud800-\\udfff]",Vm="(?:\\ud83c[\\udde6-\\uddff]){2}",Gm="[\\ud800-\\udbff][\\udc00-\\udfff]",Xm="(?:"+Wm+"|"+Hm+")"+"?",Zm="[\\ufe0e\\ufe0f]?",Qm=Zm+Xm+("(?:\\u200d(?:"+[qm,Vm,Gm].join("|")+")"+Zm+Xm+")*"),Km="(?:"+[qm+Wm+"?",Wm,Vm,Gm,Um].join("|")+")";RegExp(Hm+"(?="+Hm+")|"+Km+Qm,"g");function Jm(){}function tb(t,e,n){Lu(e)||(e=[e]);var i=(t.isDirected()?t.successors:t.neighbors).bind(t),r=[],a={};return ld(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);eb(t,e,"post"===n,a,i,r)})),r}function eb(t,e,n,i,r,a){Ld(i,e)||(i[e]=!0,n||a.push(e),ld(r(e),(function(e){eb(t,e,n,i,r,a)})),n&&a.push(e))}function nb(t){t=function(t){var e=(new Vf).setGraph(t.graph());return ld(t.nodes(),(function(n){e.setNode(n,t.node(n))})),ld(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e}(t),Rm(t);var e,n=Pm(t);for(ab(n),ib(n,t);e=ob(n);)lb(n,t,e,cb(n,t,e))}function ib(t,e){var n=function(t,e){return tb(t,e,"post")}(t,t.nodes());n=n.slice(0,n.length-1),ld(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=rb(t,e,n)}(t,e,n)}))}function rb(t,e,n){var i=t.node(n).parent,r=!0,a=e.edge(n,i),s=0;return a||(r=!1,a=e.edge(i,n)),s=a.weight,ld(e.nodeEdges(n),(function(a){var o,c,l=a.v===n,h=l?a.w:a.v;if(h!==i){var u=l===r,d=e.edge(a).weight;if(s+=u?d:-d,o=n,c=h,t.hasEdge(o,c)){var p=t.edge(n,h).cutvalue;s+=u?-p:p}}})),s}function ab(t,e){arguments.length<2&&(e=t.nodes()[0]),sb(t,{},1,e)}function sb(t,e,n,i,r){var a=n,s=t.node(i);return e[i]=!0,ld(t.neighbors(i),(function(r){Ld(e,r)||(n=sb(t,e,n,r,i))})),s.low=a,s.lim=n++,r?s.parent=r:delete s.parent,n}function ob(t){return mm(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function cb(t,e,n){var i=n.v,r=n.w;e.hasEdge(i,r)||(i=n.w,r=n.v);var a=t.node(i),s=t.node(r),o=a,c=!1;a.lim>s.lim&&(o=s,c=!0);var l=yf(e.edges(),(function(e){return c===hb(t,t.node(e.v),o)&&c!==hb(t,t.node(e.w),o)}));return bm(l,(function(t){return $m(e,t)}))}function lb(t,e,n,i){var r=n.v,a=n.w;t.removeEdge(r,a),t.setEdge(i.v,i.w,{}),ab(t),ib(t,e),function(t,e){var n=mm(t.nodes(),(function(t){return!e.node(t).parent})),i=function(t,e){return tb(t,e,"pre")}(t,n);i=i.slice(1),ld(i,(function(n){var i=t.node(n).parent,r=e.edge(n,i),a=!1;r||(r=e.edge(i,n),a=!0),e.node(n).rank=e.node(i).rank+(a?r.minlen:-r.minlen)}))}(t,e)}function hb(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}Jm.prototype=new Error,nb.initLowLimValues=ab,nb.initCutValues=ib,nb.calcCutValue=rb,nb.leaveEdge=ob,nb.enterEdge=cb,nb.exchangeEdges=lb;var ub=Rm;function db(t){nb(t)}const pb=function(t){return qy(t,4)};function fb(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:gb(t),edges:yb(t)};return _f(t.graph())||(e.value=pb(t.graph())),e}function gb(t){return Zp(t.nodes(),(function(e){var n=t.node(e),i=t.parent(e),r={v:e};return _f(n)||(r.value=n),_f(i)||(r.parent=i),r}))}function yb(t){return Zp(t.edges(),(function(e){var n=t.edge(e),i={v:e.v,w:e.w};return _f(e.name)||(i.name=e.name),_f(n)||(i.value=n),i}))}const mb={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let bb;const _b=new Uint8Array(16);function xb(){if(!bb&&(bb="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!bb))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return bb(_b)}const vb=[];for(let c=0;c<256;++c)vb.push((c+256).toString(16).slice(1));function kb(t,e=0){return(vb[t[e+0]]+vb[t[e+1]]+vb[t[e+2]]+vb[t[e+3]]+"-"+vb[t[e+4]]+vb[t[e+5]]+"-"+vb[t[e+6]]+vb[t[e+7]]+"-"+vb[t[e+8]]+vb[t[e+9]]+"-"+vb[t[e+10]]+vb[t[e+11]]+vb[t[e+12]]+vb[t[e+13]]+vb[t[e+14]]+vb[t[e+15]]).toLowerCase()}const wb=function(t,e,n){if(mb.randomUUID&&!e&&!t)return mb.randomUUID();const i=(t=t||{}).random||(t.rng||xb)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,e){n=n||0;for(let t=0;t<16;++t)e[n+t]=i[t];return e}return kb(i)};function Tb(t,e){e&&t.attr("style",e)}function Cb(t,e){var n=t.append("foreignObject").attr("width","100000"),i=n.append("xhtml:div");i.attr("xmlns","http://www.w3.org/1999/xhtml");var r=e.label;switch(typeof r){case"function":i.insert(r);break;case"object":i.insert((function(){return r}));break;default:i.html(r)}Tb(i,e.labelStyle),i.style("display","inline-block"),i.style("white-space","nowrap");var a=i.node().getBoundingClientRect();return n.attr("width",a.width).attr("height",a.height),n}var Eb=Object.defineProperty,Sb=(t,e,n)=>(((t,e,n)=>{e in t?Eb(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n})(t,"symbol"!=typeof e?e+"":e,n),n);const Ab={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},Db={trace:(...t)=>{},debug:(...t)=>{},info:(...t)=>{},warn:(...t)=>{},error:(...t)=>{},fatal:(...t)=>{}},Lb=function(t="fatal"){let e=Ab.fatal;"string"==typeof t?(t=t.toLowerCase())in Ab&&(e=Ab[t]):"number"==typeof t&&(e=t),Db.trace=()=>{},Db.debug=()=>{},Db.info=()=>{},Db.warn=()=>{},Db.error=()=>{},Db.fatal=()=>{},e<=Ab.fatal&&(Db.fatal=console.error?console.error.bind(console,Nb("FATAL"),"color: orange"):console.log.bind(console,"\x1b[35m",Nb("FATAL"))),e<=Ab.error&&(Db.error=console.error?console.error.bind(console,Nb("ERROR"),"color: orange"):console.log.bind(console,"\x1b[31m",Nb("ERROR"))),e<=Ab.warn&&(Db.warn=console.warn?console.warn.bind(console,Nb("WARN"),"color: orange"):console.log.bind(console,"\x1b[33m",Nb("WARN"))),e<=Ab.info&&(Db.info=console.info?console.info.bind(console,Nb("INFO"),"color: lightblue"):console.log.bind(console,"\x1b[34m",Nb("INFO"))),e<=Ab.debug&&(Db.debug=console.debug?console.debug.bind(console,Nb("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Nb("DEBUG"))),e<=Ab.trace&&(Db.trace=console.debug?console.debug.bind(console,Nb("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Nb("TRACE")))},Nb=t=>`%c${_t().format("ss.SSS")} : ${t} : `,Ob=t=>Gc.sanitize(t),Bb=(t,e)=>{var n;if(!1!==(null==(n=e.flowchart)?void 0:n.htmlLabels)){const n=e.securityLevel;"antiscript"===n||"strict"===n?t=Ob(t):"loose"!==n&&(t=(t=(t=Rb(t)).replace(/</g,"<").replace(/>/g,">")).replace(/=/g,"="),t=Fb(t))}return t},Mb=(t,e)=>t?t=e.dompurifyConfig?Gc.sanitize(Bb(t,e),e.dompurifyConfig).toString():Gc.sanitize(Bb(t,e),{FORBID_TAGS:["style"]}).toString():t,Ib=/<br\s*\/?>/gi,Fb=t=>t.replace(/#br#/g,"<br/>"),Rb=t=>t.replace(Ib,"#br#"),$b=t=>!1!==t&&!["false","null","0"].includes(String(t).trim().toLowerCase()),Pb=function(t){let e=t;return t.includes("~")?(e=e.replace(/~([^~].*)/,"<$1"),e=e.replace(/~([^~]*)$/,">$1"),Pb(e)):e},jb={getRows:t=>{if(!t)return[""];return Rb(t).replace(/\\n/g,"#br#").split("#br#")},sanitizeText:Mb,sanitizeTextOrArray:(t,e)=>"string"==typeof t?Mb(t,e):t.flat().map((t=>Mb(t,e))),hasBreaks:t=>Ib.test(t),splitBreaks:t=>t.split(Ib),lineBreakRegex:Ib,removeScript:Ob,getUrl:t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=e.replaceAll(/\(/g,"\\("),e=e.replaceAll(/\)/g,"\\)")),e},evaluate:$b},Yb=(t,e)=>ml(t,e?{s:-40,l:10}:{s:-40,l:-10}),zb="#ffffff",Ub="#f2f2f2";class Wb{constructor(){this.background="#f4f4f4",this.darkMode=!1,this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||ml(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||ml(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Yb(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Yb(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||xl(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||xl(this.tertiaryColor),this.lineColor=this.lineColor||xl(this.background),this.textColor=this.textColor||this.primaryTextColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?kl(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||"grey",this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||kl(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||xl(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||wl(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330}),this.darkMode)for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],75);else for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||xl(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this.darkMode?this["cScalePeer"+t]=this["cScalePeer"+t]||wl(this["cScale"+t],10):this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||this.labelTextColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;this.classText=this.classText||this.textColor,this.fillType0=this.fillType0||this.primaryColor,this.fillType1=this.fillType1||this.secondaryColor,this.fillType2=this.fillType2||ml(this.primaryColor,{h:64}),this.fillType3=this.fillType3||ml(this.secondaryColor,{h:64}),this.fillType4=this.fillType4||ml(this.primaryColor,{h:-64}),this.fillType5=this.fillType5||ml(this.secondaryColor,{h:-64}),this.fillType6=this.fillType6||ml(this.primaryColor,{h:128}),this.fillType7=this.fillType7||ml(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||ml(this.primaryColor,{l:-10}),this.pie5=this.pie5||ml(this.secondaryColor,{l:-10}),this.pie6=this.pie6||ml(this.tertiaryColor,{l:-10}),this.pie7=this.pie7||ml(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||ml(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||ml(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||ml(this.primaryColor,{h:60,l:-20}),this.pie11=this.pie11||ml(this.primaryColor,{h:-60,l:-20}),this.pie12=this.pie12||ml(this.primaryColor,{h:120,l:-10}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?kl(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||ml(this.primaryColor,{h:-30}),this.git4=this.git4||ml(this.primaryColor,{h:-60}),this.git5=this.git5||ml(this.primaryColor,{h:-90}),this.git6=this.git6||ml(this.primaryColor,{h:60}),this.git7=this.git7||ml(this.primaryColor,{h:120}),this.darkMode?(this.git0=wl(this.git0,25),this.git1=wl(this.git1,25),this.git2=wl(this.git2,25),this.git3=wl(this.git3,25),this.git4=wl(this.git4,25),this.git5=wl(this.git5,25),this.git6=wl(this.git6,25),this.git7=wl(this.git7,25)):(this.git0=kl(this.git0,25),this.git1=kl(this.git1,25),this.git2=kl(this.git2,25),this.git3=kl(this.git3,25),this.git4=kl(this.git4,25),this.git5=kl(this.git5,25),this.git6=kl(this.git6,25),this.git7=kl(this.git7,25)),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.branchLabelColor=this.branchLabelColor||(this.darkMode?"black":this.labelTextColor),this.gitBranchLabel0=this.gitBranchLabel0||this.branchLabelColor,this.gitBranchLabel1=this.gitBranchLabel1||this.branchLabelColor,this.gitBranchLabel2=this.gitBranchLabel2||this.branchLabelColor,this.gitBranchLabel3=this.gitBranchLabel3||this.branchLabelColor,this.gitBranchLabel4=this.gitBranchLabel4||this.branchLabelColor,this.gitBranchLabel5=this.gitBranchLabel5||this.branchLabelColor,this.gitBranchLabel6=this.gitBranchLabel6||this.branchLabelColor,this.gitBranchLabel7=this.gitBranchLabel7||this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class Hb{constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=wl(this.primaryColor,16),this.tertiaryColor=ml(this.primaryColor,{h:-160}),this.primaryBorderColor=xl(this.background),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.tertiaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=wl(xl("#323D47"),10),this.lineColor="calculated",this.border1="#81B1DB",this.border2=bl(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=kl("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.taskBorderColor=bl(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=bl(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=wl(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=wl(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.mainContrastColor,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=wl(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||xl(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScalePeer"+t]=this["cScalePeer"+t]||wl(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.classText=this.primaryTextColor,this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?kl(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=wl(this.secondaryColor,20),this.git1=wl(this.pie2||this.secondaryColor,20),this.git2=wl(this.pie3||this.tertiaryColor,20),this.git3=wl(this.pie4||ml(this.primaryColor,{h:-30}),20),this.git4=wl(this.pie5||ml(this.primaryColor,{h:-60}),20),this.git5=wl(this.pie6||ml(this.primaryColor,{h:-90}),10),this.git6=wl(this.pie7||ml(this.primaryColor,{h:60}),10),this.git7=wl(this.pie8||ml(this.primaryColor,{h:120}),20),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||wl(this.background,12),this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||wl(this.background,2)}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class qb{constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=ml(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=ml(this.primaryColor,{h:-160}),this.primaryBorderColor=Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.tertiaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#e8e8e8",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=bl(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||kl(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||kl(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||ml(this["cScale"+t],{h:180});if(this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor,"calculated"!==this.labelTextColor){this.cScaleLabel0=this.cScaleLabel0||xl(this.labelTextColor),this.cScaleLabel3=this.cScaleLabel3||xl(this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.labelTextColor}this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.textColor,this.edgeLabelBackground=this.labelBackground,this.actorBorder=wl(this.border1,23),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.signalColor=this.textColor,this.signalTextColor=this.textColor,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||ml(this.tertiaryColor,{l:-40}),this.pie4=this.pie4||ml(this.primaryColor,{l:-10}),this.pie5=this.pie5||ml(this.secondaryColor,{l:-30}),this.pie6=this.pie6||ml(this.tertiaryColor,{l:-20}),this.pie7=this.pie7||ml(this.primaryColor,{h:60,l:-20}),this.pie8=this.pie8||ml(this.primaryColor,{h:-60,l:-40}),this.pie9=this.pie9||ml(this.primaryColor,{h:120,l:-40}),this.pie10=this.pie10||ml(this.primaryColor,{h:60,l:-40}),this.pie11=this.pie11||ml(this.primaryColor,{h:-90,l:-40}),this.pie12=this.pie12||ml(this.primaryColor,{h:120,l:-30}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.labelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||ml(this.primaryColor,{h:-30}),this.git4=this.git4||ml(this.primaryColor,{h:-60}),this.git5=this.git5||ml(this.primaryColor,{h:-90}),this.git6=this.git6||ml(this.primaryColor,{h:60}),this.git7=this.git7||ml(this.primaryColor,{h:120}),this.darkMode?(this.git0=wl(this.git0,25),this.git1=wl(this.git1,25),this.git2=wl(this.git2,25),this.git3=wl(this.git3,25),this.git4=wl(this.git4,25),this.git5=wl(this.git5,25),this.git6=wl(this.git6,25),this.git7=wl(this.git7,25)):(this.git0=kl(this.git0,25),this.git1=kl(this.git1,25),this.git2=kl(this.git2,25),this.git3=kl(this.git3,25),this.git4=kl(this.git4,25),this.git5=kl(this.git5,25),this.git6=kl(this.git6,25),this.git7=kl(this.git7,25)),this.gitInv0=this.gitInv0||kl(xl(this.git0),25),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.gitBranchLabel0=this.gitBranchLabel0||xl(this.labelTextColor),this.gitBranchLabel1=this.gitBranchLabel1||this.labelTextColor,this.gitBranchLabel2=this.gitBranchLabel2||this.labelTextColor,this.gitBranchLabel3=this.gitBranchLabel3||xl(this.labelTextColor),this.gitBranchLabel4=this.gitBranchLabel4||this.labelTextColor,this.gitBranchLabel5=this.gitBranchLabel5||this.labelTextColor,this.gitBranchLabel6=this.gitBranchLabel6||this.labelTextColor,this.gitBranchLabel7=this.gitBranchLabel7||this.labelTextColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class Vb{constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=wl("#cde498",10),this.primaryBorderColor=Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.primaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||ml(this.primaryColor,{h:30}),this.cScale4=this.cScale4||ml(this.primaryColor,{h:60}),this.cScale5=this.cScale5||ml(this.primaryColor,{h:90}),this.cScale6=this.cScale6||ml(this.primaryColor,{h:120}),this.cScale7=this.cScale7||ml(this.primaryColor,{h:150}),this.cScale8=this.cScale8||ml(this.primaryColor,{h:210}),this.cScale9=this.cScale9||ml(this.primaryColor,{h:270}),this.cScale10=this.cScale10||ml(this.primaryColor,{h:300}),this.cScale11=this.cScale11||ml(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||kl(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||kl(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=kl(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||ml(this["cScale"+t],{h:180});this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.actorBorder=kl(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskBorderColor=this.border1,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||ml(this.primaryColor,{l:-30}),this.pie5=this.pie5||ml(this.secondaryColor,{l:-30}),this.pie6=this.pie6||ml(this.tertiaryColor,{h:40,l:-40}),this.pie7=this.pie7||ml(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||ml(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||ml(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||ml(this.primaryColor,{h:60,l:-50}),this.pie11=this.pie11||ml(this.primaryColor,{h:-60,l:-50}),this.pie12=this.pie12||ml(this.primaryColor,{h:120,l:-50}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||ml(this.primaryColor,{h:-30}),this.git4=this.git4||ml(this.primaryColor,{h:-60}),this.git5=this.git5||ml(this.primaryColor,{h:-90}),this.git6=this.git6||ml(this.primaryColor,{h:60}),this.git7=this.git7||ml(this.primaryColor,{h:120}),this.darkMode?(this.git0=wl(this.git0,25),this.git1=wl(this.git1,25),this.git2=wl(this.git2,25),this.git3=wl(this.git3,25),this.git4=wl(this.git4,25),this.git5=wl(this.git5,25),this.git6=wl(this.git6,25),this.git7=wl(this.git7,25)):(this.git0=kl(this.git0,25),this.git1=kl(this.git1,25),this.git2=kl(this.git2,25),this.git3=kl(this.git3,25),this.git4=kl(this.git4,25),this.git5=kl(this.git5,25),this.git6=kl(this.git6,25),this.git7=kl(this.git7,25)),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}class Gb{constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=wl(this.contrast,55),this.background="#ffffff",this.tertiaryColor=ml(this.primaryColor,{h:-160}),this.primaryBorderColor=Yb(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yb(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yb(this.tertiaryColor,this.darkMode),this.primaryTextColor=xl(this.primaryColor),this.secondaryTextColor=xl(this.secondaryColor),this.tertiaryTextColor=xl(this.tertiaryColor),this.lineColor=xl(this.background),this.textColor=xl(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=wl(this.contrast,55),this.border2=this.contrast,this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||xl(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this.darkMode?this["cScalePeer"+t]=this["cScalePeer"+t]||wl(this["cScale"+t],10):this["cScalePeer"+t]=this["cScalePeer"+t]||kl(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor),this.cScaleLabel0=this.cScaleLabel0||this.cScale1,this.cScaleLabel2=this.cScaleLabel2||this.cScale1;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.text,this.actorBorder=wl(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.lineColor,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.sectionBkgColor=wl(this.contrast,30),this.sectionBkgColor2=wl(this.contrast,30),this.taskBorderColor=kl(this.contrast,10),this.taskBkgColor=this.contrast,this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor=this.text,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.gridColor=wl(this.border1,30),this.doneTaskBkgColor=this.done,this.doneTaskBorderColor=this.lineColor,this.critBkgColor=this.critical,this.critBorderColor=kl(this.critBkgColor,10),this.todayLineColor=this.critBkgColor,this.transitionColor=this.transitionColor||"#000",this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f4f4f4",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.stateBorder=this.stateBorder||"#000",this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#222",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=ml(this.primaryColor,{h:64}),this.fillType3=ml(this.secondaryColor,{h:64}),this.fillType4=ml(this.primaryColor,{h:-64}),this.fillType5=ml(this.secondaryColor,{h:-64}),this.fillType6=ml(this.primaryColor,{h:128}),this.fillType7=ml(this.secondaryColor,{h:128});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pie12=this.pie0,this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=kl(this.pie1,25)||this.primaryColor,this.git1=this.pie2||this.secondaryColor,this.git2=this.pie3||this.tertiaryColor,this.git3=this.pie4||ml(this.primaryColor,{h:-30}),this.git4=this.pie5||ml(this.primaryColor,{h:-60}),this.git5=this.pie6||ml(this.primaryColor,{h:-90}),this.git6=this.pie7||ml(this.primaryColor,{h:60}),this.git7=this.pie8||ml(this.primaryColor,{h:120}),this.gitInv0=this.gitInv0||xl(this.git0),this.gitInv1=this.gitInv1||xl(this.git1),this.gitInv2=this.gitInv2||xl(this.git2),this.gitInv3=this.gitInv3||xl(this.git3),this.gitInv4=this.gitInv4||xl(this.git4),this.gitInv5=this.gitInv5||xl(this.git5),this.gitInv6=this.gitInv6||xl(this.git6),this.gitInv7=this.gitInv7||xl(this.git7),this.branchLabelColor=this.branchLabelColor||this.labelTextColor,this.gitBranchLabel0=this.branchLabelColor,this.gitBranchLabel1="white",this.gitBranchLabel2=this.branchLabelColor,this.gitBranchLabel3="white",this.gitBranchLabel4=this.branchLabelColor,this.gitBranchLabel5=this.branchLabelColor,this.gitBranchLabel6=this.branchLabelColor,this.gitBranchLabel7=this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zb,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ub}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}const Xb={base:{getThemeVariables:t=>{const e=new Wb;return e.calculate(t),e}},dark:{getThemeVariables:t=>{const e=new Hb;return e.calculate(t),e}},default:{getThemeVariables:t=>{const e=new qb;return e.calculate(t),e}},forest:{getThemeVariables:t=>{const e=new Vb;return e.calculate(t),e}},neutral:{getThemeVariables:t=>{const e=new Gb;return e.calculate(t),e}}},Zb={theme:"default",themeVariables:Xb.default.getThemeVariables(),themeCSS:void 0,maxTextSize:5e4,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize"],deterministicIds:!1,deterministicIDSeed:void 0,flowchart:{titleTopMargin:25,diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},sequence:{hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20,messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},noteFont:function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},actorFont:function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}}},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",tickInterval:void 0,useMaxWidth:!0,topAxis:!1,useWidth:void 0},journey:{diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},class:{titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},state:{titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},er:{titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,stroke:"gray",fill:"honeydew",fontSize:12,useMaxWidth:!0},pie:{useWidth:void 0,useMaxWidth:!0},requirement:{useWidth:void 0,useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},gitGraph:{titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0},c4:{useWidth:void 0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,useMaxWidth:!0,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,personFont:function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},external_personFont:function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},systemFont:function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},external_systemFont:function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},system_dbFont:function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},external_system_dbFont:function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},system_queueFont:function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},external_system_queueFont:function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},containerFont:function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},external_containerFont:function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},container_dbFont:function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},external_container_dbFont:function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},container_queueFont:function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},external_container_queueFont:function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},componentFont:function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},external_componentFont:function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},component_dbFont:function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},external_component_dbFont:function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},component_queueFont:function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},external_component_queueFont:function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},boundaryFont:function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},fontSize:16};Zb.class&&(Zb.class.arrowMarkerAbsolute=Zb.arrowMarkerAbsolute),Zb.gitGraph&&(Zb.gitGraph.arrowMarkerAbsolute=Zb.arrowMarkerAbsolute);const Qb=(t,e="")=>Object.keys(t).reduce(((n,i)=>Array.isArray(t[i])?n:"object"==typeof t[i]&&null!==t[i]?[...n,e+i,...Qb(t[i],"")]:[...n,e+i]),[]),Kb=Qb(Zb,""),Jb=Zb;function t_(t){return null==t}var e_=function(t,e){var n,i="";for(n=0;n<e;n+=1)i+=t;return i},n_=function(t){return 0===t&&Number.NEGATIVE_INFINITY===1/t},i_={isNothing:t_,isObject:function(t){return"object"==typeof t&&null!==t},toArray:function(t){return Array.isArray(t)?t:t_(t)?[]:[t]},repeat:e_,isNegativeZero:n_,extend:function(t,e){var n,i,r,a;if(e)for(n=0,i=(a=Object.keys(e)).length;n<i;n+=1)t[r=a[n]]=e[r];return t}};function r_(t,e){var n="",i=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(n+='in "'+t.mark.name+'" '),n+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(n+="\n\n"+t.mark.snippet),i+" "+n):i}function a_(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=r_(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}a_.prototype=Object.create(Error.prototype),a_.prototype.constructor=a_,a_.prototype.toString=function(t){return this.name+": "+r_(this,t)};var s_=a_;function o_(t,e,n,i,r){var a="",s="",o=Math.floor(r/2)-1;return i-e>o&&(e=i-o+(a=" ... ").length),n-i>o&&(n=i+o-(s=" ...").length),{str:a+t.slice(e,n).replace(/\t/g,"\u2192")+s,pos:i-e+a.length}}function c_(t,e){return i_.repeat(" ",e-t.length)+t}var l_=function(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),"number"!=typeof e.indent&&(e.indent=1),"number"!=typeof e.linesBefore&&(e.linesBefore=3),"number"!=typeof e.linesAfter&&(e.linesAfter=2);for(var n,i=/\r?\n|\r|\0/g,r=[0],a=[],s=-1;n=i.exec(t.buffer);)a.push(n.index),r.push(n.index+n[0].length),t.position<=n.index&&s<0&&(s=r.length-2);s<0&&(s=r.length-1);var o,c,l="",h=Math.min(t.line+e.linesAfter,a.length).toString().length,u=e.maxLength-(e.indent+h+3);for(o=1;o<=e.linesBefore&&!(s-o<0);o++)c=o_(t.buffer,r[s-o],a[s-o],t.position-(r[s]-r[s-o]),u),l=i_.repeat(" ",e.indent)+c_((t.line-o+1).toString(),h)+" | "+c.str+"\n"+l;for(c=o_(t.buffer,r[s],a[s],t.position,u),l+=i_.repeat(" ",e.indent)+c_((t.line+1).toString(),h)+" | "+c.str+"\n",l+=i_.repeat("-",e.indent+h+3+c.pos)+"^\n",o=1;o<=e.linesAfter&&!(s+o>=a.length);o++)c=o_(t.buffer,r[s+o],a[s+o],t.position-(r[s]-r[s+o]),u),l+=i_.repeat(" ",e.indent)+c_((t.line+o+1).toString(),h)+" | "+c.str+"\n";return l.replace(/\n$/,"")},h_=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],u_=["scalar","sequence","mapping"];var d_=function(t,e){var n,i;if(e=e||{},Object.keys(e).forEach((function(e){if(-1===h_.indexOf(e))throw new s_('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')})),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=(n=e.styleAliases||null,i={},null!==n&&Object.keys(n).forEach((function(t){n[t].forEach((function(e){i[String(e)]=t}))})),i),-1===u_.indexOf(this.kind))throw new s_('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')};function p_(t,e){var n=[];return t[e].forEach((function(t){var e=n.length;n.forEach((function(n,i){n.tag===t.tag&&n.kind===t.kind&&n.multi===t.multi&&(e=i)})),n[e]=t})),n}function f_(t){return this.extend(t)}f_.prototype.extend=function(t){var e=[],n=[];if(t instanceof d_)n.push(t);else if(Array.isArray(t))n=n.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new s_("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(n=n.concat(t.explicit))}e.forEach((function(t){if(!(t instanceof d_))throw new s_("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(t.loadKind&&"scalar"!==t.loadKind)throw new s_("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(t.multi)throw new s_("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(t){if(!(t instanceof d_))throw new s_("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var i=Object.create(f_.prototype);return i.implicit=(this.implicit||[]).concat(e),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=p_(i,"implicit"),i.compiledExplicit=p_(i,"explicit"),i.compiledTypeMap=function(){var t,e,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(t){t.multi?(n.multi[t.kind].push(t),n.multi.fallback.push(t)):n[t.kind][t.tag]=n.fallback[t.tag]=t}for(t=0,e=arguments.length;t<e;t+=1)arguments[t].forEach(i);return n}(i.compiledImplicit,i.compiledExplicit),i};var g_=f_,y_=new d_("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return null!==t?t:""}}),m_=new d_("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return null!==t?t:[]}}),b_=new d_("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return null!==t?t:{}}}),__=new g_({explicit:[y_,m_,b_]});var x_=new d_("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(t){if(null===t)return!0;var e=t.length;return 1===e&&"~"===t||4===e&&("null"===t||"Null"===t||"NULL"===t)},construct:function(){return null},predicate:function(t){return null===t},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});var v_=new d_("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e=t.length;return 4===e&&("true"===t||"True"===t||"TRUE"===t)||5===e&&("false"===t||"False"===t||"FALSE"===t)},construct:function(t){return"true"===t||"True"===t||"TRUE"===t},predicate:function(t){return"[object Boolean]"===Object.prototype.toString.call(t)},represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"});function k_(t){return 48<=t&&t<=55}function w_(t){return 48<=t&&t<=57}var T_=new d_("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=t.length,r=0,a=!1;if(!i)return!1;if("-"!==(e=t[r])&&"+"!==e||(e=t[++r]),"0"===e){if(r+1===i)return!0;if("b"===(e=t[++r])){for(r++;r<i;r++)if("_"!==(e=t[r])){if("0"!==e&&"1"!==e)return!1;a=!0}return a&&"_"!==e}if("x"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!(48<=(n=t.charCodeAt(r))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;a=!0}return a&&"_"!==e}if("o"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!k_(t.charCodeAt(r)))return!1;a=!0}return a&&"_"!==e}}if("_"===e)return!1;for(;r<i;r++)if("_"!==(e=t[r])){if(!w_(t.charCodeAt(r)))return!1;a=!0}return!(!a||"_"===e)},construct:function(t){var e,n=t,i=1;if(-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),"-"!==(e=n[0])&&"+"!==e||("-"===e&&(i=-1),e=(n=n.slice(1))[0]),"0"===n)return 0;if("0"===e){if("b"===n[1])return i*parseInt(n.slice(2),2);if("x"===n[1])return i*parseInt(n.slice(2),16);if("o"===n[1])return i*parseInt(n.slice(2),8)}return i*parseInt(n,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&t%1==0&&!i_.isNegativeZero(t)},represent:{binary:function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),C_=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var E_=/^[-+]?[0-9]+e/;var S_=new d_("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(t){return null!==t&&!(!C_.test(t)||"_"===t[t.length-1])},construct:function(t){var e,n;return n="-"===(e=t.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),".inf"===e?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:n*parseFloat(e,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&(t%1!=0||i_.isNegativeZero(t))},represent:function(t,e){var n;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(i_.isNegativeZero(t))return"-0.0";return n=t.toString(10),E_.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"}),A_=__.extend({implicit:[x_,v_,T_,S_]}),D_=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),L_=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var N_=new d_("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(t){return null!==t&&(null!==D_.exec(t)||null!==L_.exec(t))},construct:function(t){var e,n,i,r,a,s,o,c,l=0,h=null;if(null===(e=D_.exec(t))&&(e=L_.exec(t)),null===e)throw new Error("Date resolve error");if(n=+e[1],i=+e[2]-1,r=+e[3],!e[4])return new Date(Date.UTC(n,i,r));if(a=+e[4],s=+e[5],o=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(h=6e4*(60*+e[10]+ +(e[11]||0)),"-"===e[9]&&(h=-h)),c=new Date(Date.UTC(n,i,r,a,s,o,l)),h&&c.setTime(c.getTime()-h),c},instanceOf:Date,represent:function(t){return t.toISOString()}});var O_=new d_("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(t){return"<<"===t||null===t}}),B_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var M_=new d_("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=0,r=t.length,a=B_;for(n=0;n<r;n++)if(!((e=a.indexOf(t.charAt(n)))>64)){if(e<0)return!1;i+=6}return i%8==0},construct:function(t){var e,n,i=t.replace(/[\r\n=]/g,""),r=i.length,a=B_,s=0,o=[];for(e=0;e<r;e++)e%4==0&&e&&(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)),s=s<<6|a.indexOf(i.charAt(e));return 0===(n=r%4*6)?(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)):18===n?(o.push(s>>10&255),o.push(s>>2&255)):12===n&&o.push(s>>4&255),new Uint8Array(o)},predicate:function(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)},represent:function(t){var e,n,i="",r=0,a=t.length,s=B_;for(e=0;e<a;e++)e%3==0&&e&&(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]),r=(r<<8)+t[e];return 0===(n=a%3)?(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]):2===n?(i+=s[r>>10&63],i+=s[r>>4&63],i+=s[r<<2&63],i+=s[64]):1===n&&(i+=s[r>>2&63],i+=s[r<<4&63],i+=s[64],i+=s[64]),i}}),I_=Object.prototype.hasOwnProperty,F_=Object.prototype.toString;var R_=new d_("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=[],o=t;for(e=0,n=o.length;e<n;e+=1){if(i=o[e],a=!1,"[object Object]"!==F_.call(i))return!1;for(r in i)if(I_.call(i,r)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==s.indexOf(r))return!1;s.push(r)}return!0},construct:function(t){return null!==t?t:[]}}),$_=Object.prototype.toString;var P_=new d_("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1){if(i=s[e],"[object Object]"!==$_.call(i))return!1;if(1!==(r=Object.keys(i)).length)return!1;a[e]=[r[0],i[r[0]]]}return!0},construct:function(t){if(null===t)return[];var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1)i=s[e],r=Object.keys(i),a[e]=[r[0],i[r[0]]];return a}}),j_=Object.prototype.hasOwnProperty;var Y_=new d_("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(t){if(null===t)return!0;var e,n=t;for(e in n)if(j_.call(n,e)&&null!==n[e])return!1;return!0},construct:function(t){return null!==t?t:{}}}),z_=A_.extend({implicit:[N_,O_],explicit:[M_,R_,P_,Y_]}),U_=Object.prototype.hasOwnProperty,W_=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,H_=/[\x85\u2028\u2029]/,q_=/[,\[\]\{\}]/,V_=/^(?:!|!!|![a-z\-]+!)$/i,G_=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function X_(t){return Object.prototype.toString.call(t)}function Z_(t){return 10===t||13===t}function Q_(t){return 9===t||32===t}function K_(t){return 9===t||32===t||10===t||13===t}function J_(t){return 44===t||91===t||93===t||123===t||125===t}function tx(t){var e;return 48<=t&&t<=57?t-48:97<=(e=32|t)&&e<=102?e-97+10:-1}function ex(t){return 48===t?"\0":97===t?"\x07":98===t?"\b":116===t||9===t?"\t":110===t?"\n":118===t?"\v":102===t?"\f":114===t?"\r":101===t?"\x1b":32===t?" ":34===t?'"':47===t?"/":92===t?"\\":78===t?"\x85":95===t?"\xa0":76===t?"\u2028":80===t?"\u2029":""}function nx(t){return t<=65535?String.fromCharCode(t):String.fromCharCode(55296+(t-65536>>10),56320+(t-65536&1023))}for(var ix=new Array(256),rx=new Array(256),ax=0;ax<256;ax++)ix[ax]=ex(ax)?1:0,rx[ax]=ex(ax);function sx(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||z_,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ox(t,e){var n={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return n.snippet=l_(n),new s_(e,n)}function cx(t,e){throw ox(t,e)}function lx(t,e){t.onWarning&&t.onWarning.call(null,ox(t,e))}var hx={YAML:function(t,e,n){var i,r,a;null!==t.version&&cx(t,"duplication of %YAML directive"),1!==n.length&&cx(t,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&cx(t,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),a=parseInt(i[2],10),1!==r&&cx(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=a<2,1!==a&&2!==a&&lx(t,"unsupported YAML version of the document")},TAG:function(t,e,n){var i,r;2!==n.length&&cx(t,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],V_.test(i)||cx(t,"ill-formed tag handle (first argument) of the TAG directive"),U_.call(t.tagMap,i)&&cx(t,'there is a previously declared suffix for "'+i+'" tag handle'),G_.test(r)||cx(t,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(a){cx(t,"tag prefix is malformed: "+r)}t.tagMap[i]=r}};function ux(t,e,n,i){var r,a,s,o;if(e<n){if(o=t.input.slice(e,n),i)for(r=0,a=o.length;r<a;r+=1)9===(s=o.charCodeAt(r))||32<=s&&s<=1114111||cx(t,"expected valid JSON character");else W_.test(o)&&cx(t,"the stream contains non-printable characters");t.result+=o}}function dx(t,e,n,i){var r,a,s,o;for(i_.isObject(n)||cx(t,"cannot merge mappings; the provided source object is unacceptable"),s=0,o=(r=Object.keys(n)).length;s<o;s+=1)a=r[s],U_.call(e,a)||(e[a]=n[a],i[a]=!0)}function px(t,e,n,i,r,a,s,o,c){var l,h;if(Array.isArray(r))for(l=0,h=(r=Array.prototype.slice.call(r)).length;l<h;l+=1)Array.isArray(r[l])&&cx(t,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===X_(r[l])&&(r[l]="[object Object]");if("object"==typeof r&&"[object Object]"===X_(r)&&(r="[object Object]"),r=String(r),null===e&&(e={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(a))for(l=0,h=a.length;l<h;l+=1)dx(t,e,a[l],n);else dx(t,e,a,n);else t.json||U_.call(n,r)||!U_.call(e,r)||(t.line=s||t.line,t.lineStart=o||t.lineStart,t.position=c||t.position,cx(t,"duplicated mapping key")),"__proto__"===r?Object.defineProperty(e,r,{configurable:!0,enumerable:!0,writable:!0,value:a}):e[r]=a,delete n[r];return e}function fx(t){var e;10===(e=t.input.charCodeAt(t.position))?t.position++:13===e?(t.position++,10===t.input.charCodeAt(t.position)&&t.position++):cx(t,"a line break is expected"),t.line+=1,t.lineStart=t.position,t.firstTabInLine=-1}function gx(t,e,n){for(var i=0,r=t.input.charCodeAt(t.position);0!==r;){for(;Q_(r);)9===r&&-1===t.firstTabInLine&&(t.firstTabInLine=t.position),r=t.input.charCodeAt(++t.position);if(e&&35===r)do{r=t.input.charCodeAt(++t.position)}while(10!==r&&13!==r&&0!==r);if(!Z_(r))break;for(fx(t),r=t.input.charCodeAt(t.position),i++,t.lineIndent=0;32===r;)t.lineIndent++,r=t.input.charCodeAt(++t.position)}return-1!==n&&0!==i&&t.lineIndent<n&&lx(t,"deficient indentation"),i}function yx(t){var e,n=t.position;return!(45!==(e=t.input.charCodeAt(n))&&46!==e||e!==t.input.charCodeAt(n+1)||e!==t.input.charCodeAt(n+2)||(n+=3,0!==(e=t.input.charCodeAt(n))&&!K_(e)))}function mx(t,e){1===e?t.result+=" ":e>1&&(t.result+=i_.repeat("\n",e-1))}function bx(t,e){var n,i,r=t.tag,a=t.anchor,s=[],o=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=s),i=t.input.charCodeAt(t.position);0!==i&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,cx(t,"tab characters must not be used in indentation")),45===i)&&K_(t.input.charCodeAt(t.position+1));)if(o=!0,t.position++,gx(t,!0,-1)&&t.lineIndent<=e)s.push(null),i=t.input.charCodeAt(t.position);else if(n=t.line,vx(t,e,3,!1,!0),s.push(t.result),gx(t,!0,-1),i=t.input.charCodeAt(t.position),(t.line===n||t.lineIndent>e)&&0!==i)cx(t,"bad indentation of a sequence entry");else if(t.lineIndent<e)break;return!!o&&(t.tag=r,t.anchor=a,t.kind="sequence",t.result=s,!0)}function _x(t){var e,n,i,r,a=!1,s=!1;if(33!==(r=t.input.charCodeAt(t.position)))return!1;if(null!==t.tag&&cx(t,"duplication of a tag property"),60===(r=t.input.charCodeAt(++t.position))?(a=!0,r=t.input.charCodeAt(++t.position)):33===r?(s=!0,n="!!",r=t.input.charCodeAt(++t.position)):n="!",e=t.position,a){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&62!==r);t.position<t.length?(i=t.input.slice(e,t.position),r=t.input.charCodeAt(++t.position)):cx(t,"unexpected end of the stream within a verbatim tag")}else{for(;0!==r&&!K_(r);)33===r&&(s?cx(t,"tag suffix cannot contain exclamation marks"):(n=t.input.slice(e-1,t.position+1),V_.test(n)||cx(t,"named tag handle cannot contain such characters"),s=!0,e=t.position+1)),r=t.input.charCodeAt(++t.position);i=t.input.slice(e,t.position),q_.test(i)&&cx(t,"tag suffix cannot contain flow indicator characters")}i&&!G_.test(i)&&cx(t,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch(o){cx(t,"tag name is malformed: "+i)}return a?t.tag=i:U_.call(t.tagMap,n)?t.tag=t.tagMap[n]+i:"!"===n?t.tag="!"+i:"!!"===n?t.tag="tag:yaml.org,2002:"+i:cx(t,'undeclared tag handle "'+n+'"'),!0}function xx(t){var e,n;if(38!==(n=t.input.charCodeAt(t.position)))return!1;for(null!==t.anchor&&cx(t,"duplication of an anchor property"),n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!K_(n)&&!J_(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&cx(t,"name of an anchor node must contain at least one character"),t.anchor=t.input.slice(e,t.position),!0}function vx(t,e,n,i,r){var a,s,o,c,l,h,u,d,p,f=1,g=!1,y=!1;if(null!==t.listener&&t.listener("open",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,a=s=o=4===n||3===n,i&&gx(t,!0,-1)&&(g=!0,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)),1===f)for(;_x(t)||xx(t);)gx(t,!0,-1)?(g=!0,o=a,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)):o=!1;if(o&&(o=g||r),1!==f&&4!==n||(d=1===n||2===n?e:e+1,p=t.position-t.lineStart,1===f?o&&(bx(t,p)||function(t,e,n){var i,r,a,s,o,c,l,h=t.tag,u=t.anchor,d={},p=Object.create(null),f=null,g=null,y=null,m=!1,b=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=d),l=t.input.charCodeAt(t.position);0!==l;){if(m||-1===t.firstTabInLine||(t.position=t.firstTabInLine,cx(t,"tab characters must not be used in indentation")),i=t.input.charCodeAt(t.position+1),a=t.line,63!==l&&58!==l||!K_(i)){if(s=t.line,o=t.lineStart,c=t.position,!vx(t,n,2,!1,!0))break;if(t.line===a){for(l=t.input.charCodeAt(t.position);Q_(l);)l=t.input.charCodeAt(++t.position);if(58===l)K_(l=t.input.charCodeAt(++t.position))||cx(t,"a whitespace character is expected after the key-value separator within a block mapping"),m&&(px(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!1,r=!1,f=t.tag,g=t.result;else{if(!b)return t.tag=h,t.anchor=u,!0;cx(t,"can not read an implicit mapping pair; a colon is missed")}}else{if(!b)return t.tag=h,t.anchor=u,!0;cx(t,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===l?(m&&(px(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!0,r=!0):m?(m=!1,r=!0):cx(t,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),t.position+=1,l=i;if((t.line===a||t.lineIndent>e)&&(m&&(s=t.line,o=t.lineStart,c=t.position),vx(t,e,4,!0,r)&&(m?g=t.result:y=t.result),m||(px(t,d,p,f,g,y,s,o,c),f=g=y=null),gx(t,!0,-1),l=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&0!==l)cx(t,"bad indentation of a mapping entry");else if(t.lineIndent<e)break}return m&&px(t,d,p,f,g,null,s,o,c),b&&(t.tag=h,t.anchor=u,t.kind="mapping",t.result=d),b}(t,p,d))||function(t,e){var n,i,r,a,s,o,c,l,h,u,d,p,f=!0,g=t.tag,y=t.anchor,m=Object.create(null);if(91===(p=t.input.charCodeAt(t.position)))s=93,l=!1,a=[];else{if(123!==p)return!1;s=125,l=!0,a={}}for(null!==t.anchor&&(t.anchorMap[t.anchor]=a),p=t.input.charCodeAt(++t.position);0!==p;){if(gx(t,!0,e),(p=t.input.charCodeAt(t.position))===s)return t.position++,t.tag=g,t.anchor=y,t.kind=l?"mapping":"sequence",t.result=a,!0;f?44===p&&cx(t,"expected the node content, but found ','"):cx(t,"missed comma between flow collection entries"),d=null,o=c=!1,63===p&&K_(t.input.charCodeAt(t.position+1))&&(o=c=!0,t.position++,gx(t,!0,e)),n=t.line,i=t.lineStart,r=t.position,vx(t,e,1,!1,!0),u=t.tag,h=t.result,gx(t,!0,e),p=t.input.charCodeAt(t.position),!c&&t.line!==n||58!==p||(o=!0,p=t.input.charCodeAt(++t.position),gx(t,!0,e),vx(t,e,1,!1,!0),d=t.result),l?px(t,a,m,u,h,d,n,i,r):o?a.push(px(t,null,m,u,h,d,n,i,r)):a.push(h),gx(t,!0,e),44===(p=t.input.charCodeAt(t.position))?(f=!0,p=t.input.charCodeAt(++t.position)):f=!1}cx(t,"unexpected end of the stream within a flow collection")}(t,d)?y=!0:(s&&function(t,e){var n,i,r,a,s,o=1,c=!1,l=!1,h=e,u=0,d=!1;if(124===(a=t.input.charCodeAt(t.position)))i=!1;else{if(62!==a)return!1;i=!0}for(t.kind="scalar",t.result="";0!==a;)if(43===(a=t.input.charCodeAt(++t.position))||45===a)1===o?o=43===a?3:2:cx(t,"repeat of a chomping mode identifier");else{if(!((r=48<=(s=a)&&s<=57?s-48:-1)>=0))break;0===r?cx(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?cx(t,"repeat of an indentation width identifier"):(h=e+r-1,l=!0)}if(Q_(a)){do{a=t.input.charCodeAt(++t.position)}while(Q_(a));if(35===a)do{a=t.input.charCodeAt(++t.position)}while(!Z_(a)&&0!==a)}for(;0!==a;){for(fx(t),t.lineIndent=0,a=t.input.charCodeAt(t.position);(!l||t.lineIndent<h)&&32===a;)t.lineIndent++,a=t.input.charCodeAt(++t.position);if(!l&&t.lineIndent>h&&(h=t.lineIndent),Z_(a))u++;else{if(t.lineIndent<h){3===o?t.result+=i_.repeat("\n",c?1+u:u):1===o&&c&&(t.result+="\n");break}for(i?Q_(a)?(d=!0,t.result+=i_.repeat("\n",c?1+u:u)):d?(d=!1,t.result+=i_.repeat("\n",u+1)):0===u?c&&(t.result+=" "):t.result+=i_.repeat("\n",u):t.result+=i_.repeat("\n",c?1+u:u),c=!0,l=!0,u=0,n=t.position;!Z_(a)&&0!==a;)a=t.input.charCodeAt(++t.position);ux(t,n,t.position,!1)}}return!0}(t,d)||function(t,e){var n,i,r;if(39!==(n=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,i=r=t.position;0!==(n=t.input.charCodeAt(t.position));)if(39===n){if(ux(t,i,t.position,!0),39!==(n=t.input.charCodeAt(++t.position)))return!0;i=t.position,t.position++,r=t.position}else Z_(n)?(ux(t,i,r,!0),mx(t,gx(t,!1,e)),i=r=t.position):t.position===t.lineStart&&yx(t)?cx(t,"unexpected end of the document within a single quoted scalar"):(t.position++,r=t.position);cx(t,"unexpected end of the stream within a single quoted scalar")}(t,d)||function(t,e){var n,i,r,a,s,o,c;if(34!==(o=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;0!==(o=t.input.charCodeAt(t.position));){if(34===o)return ux(t,n,t.position,!0),t.position++,!0;if(92===o){if(ux(t,n,t.position,!0),Z_(o=t.input.charCodeAt(++t.position)))gx(t,!1,e);else if(o<256&&ix[o])t.result+=rx[o],t.position++;else if((s=120===(c=o)?2:117===c?4:85===c?8:0)>0){for(r=s,a=0;r>0;r--)(s=tx(o=t.input.charCodeAt(++t.position)))>=0?a=(a<<4)+s:cx(t,"expected hexadecimal character");t.result+=nx(a),t.position++}else cx(t,"unknown escape sequence");n=i=t.position}else Z_(o)?(ux(t,n,i,!0),mx(t,gx(t,!1,e)),n=i=t.position):t.position===t.lineStart&&yx(t)?cx(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}cx(t,"unexpected end of the stream within a double quoted scalar")}(t,d)?y=!0:!function(t){var e,n,i;if(42!==(i=t.input.charCodeAt(t.position)))return!1;for(i=t.input.charCodeAt(++t.position),e=t.position;0!==i&&!K_(i)&&!J_(i);)i=t.input.charCodeAt(++t.position);return t.position===e&&cx(t,"name of an alias node must contain at least one character"),n=t.input.slice(e,t.position),U_.call(t.anchorMap,n)||cx(t,'unidentified alias "'+n+'"'),t.result=t.anchorMap[n],gx(t,!0,-1),!0}(t)?function(t,e,n){var i,r,a,s,o,c,l,h,u=t.kind,d=t.result;if(K_(h=t.input.charCodeAt(t.position))||J_(h)||35===h||38===h||42===h||33===h||124===h||62===h||39===h||34===h||37===h||64===h||96===h)return!1;if((63===h||45===h)&&(K_(i=t.input.charCodeAt(t.position+1))||n&&J_(i)))return!1;for(t.kind="scalar",t.result="",r=a=t.position,s=!1;0!==h;){if(58===h){if(K_(i=t.input.charCodeAt(t.position+1))||n&&J_(i))break}else if(35===h){if(K_(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&yx(t)||n&&J_(h))break;if(Z_(h)){if(o=t.line,c=t.lineStart,l=t.lineIndent,gx(t,!1,-1),t.lineIndent>=e){s=!0,h=t.input.charCodeAt(t.position);continue}t.position=a,t.line=o,t.lineStart=c,t.lineIndent=l;break}}s&&(ux(t,r,a,!1),mx(t,t.line-o),r=a=t.position,s=!1),Q_(h)||(a=t.position+1),h=t.input.charCodeAt(++t.position)}return ux(t,r,a,!1),!!t.result||(t.kind=u,t.result=d,!1)}(t,d,1===n)&&(y=!0,null===t.tag&&(t.tag="?")):(y=!0,null===t.tag&&null===t.anchor||cx(t,"alias node should not have any properties")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===f&&(y=o&&bx(t,p))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if("?"===t.tag){for(null!==t.result&&"scalar"!==t.kind&&cx(t,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+t.kind+'"'),c=0,l=t.implicitTypes.length;c<l;c+=1)if((u=t.implicitTypes[c]).resolve(t.result)){t.result=u.construct(t.result),t.tag=u.tag,null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);break}}else if("!"!==t.tag){if(U_.call(t.typeMap[t.kind||"fallback"],t.tag))u=t.typeMap[t.kind||"fallback"][t.tag];else for(u=null,c=0,l=(h=t.typeMap.multi[t.kind||"fallback"]).length;c<l;c+=1)if(t.tag.slice(0,h[c].tag.length)===h[c].tag){u=h[c];break}u||cx(t,"unknown tag !<"+t.tag+">"),null!==t.result&&u.kind!==t.kind&&cx(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+u.kind+'", not "'+t.kind+'"'),u.resolve(t.result,t.tag)?(t.result=u.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):cx(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return null!==t.listener&&t.listener("close",t),null!==t.tag||null!==t.anchor||y}function kx(t){var e,n,i,r,a=t.position,s=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(r=t.input.charCodeAt(t.position))&&(gx(t,!0,-1),r=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==r));){for(s=!0,r=t.input.charCodeAt(++t.position),e=t.position;0!==r&&!K_(r);)r=t.input.charCodeAt(++t.position);for(i=[],(n=t.input.slice(e,t.position)).length<1&&cx(t,"directive name must not be less than one character in length");0!==r;){for(;Q_(r);)r=t.input.charCodeAt(++t.position);if(35===r){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&!Z_(r));break}if(Z_(r))break;for(e=t.position;0!==r&&!K_(r);)r=t.input.charCodeAt(++t.position);i.push(t.input.slice(e,t.position))}0!==r&&fx(t),U_.call(hx,n)?hx[n](t,n,i):lx(t,'unknown document directive "'+n+'"')}gx(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,gx(t,!0,-1)):s&&cx(t,"directives end mark is expected"),vx(t,t.lineIndent-1,4,!1,!0),gx(t,!0,-1),t.checkLineBreaks&&H_.test(t.input.slice(a,t.position))&&lx(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&yx(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,gx(t,!0,-1)):t.position<t.length-1&&cx(t,"end of the stream or a document separator is expected")}function wx(t,e){e=e||{},0!==(t=String(t)).length&&(10!==t.charCodeAt(t.length-1)&&13!==t.charCodeAt(t.length-1)&&(t+="\n"),65279===t.charCodeAt(0)&&(t=t.slice(1)));var n=new sx(t,e),i=t.indexOf("\0");for(-1!==i&&(n.position=i,cx(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)kx(n);return n.documents}var Tx=__,Cx={loadAll:function(t,e,n){null!==e&&"object"==typeof e&&void 0===n&&(n=e,e=null);var i=wx(t,n);if("function"!=typeof e)return i;for(var r=0,a=i.length;r<a;r+=1)e(i[r])},load:function(t,e){var n=wx(t,e);if(0!==n.length){if(1===n.length)return n[0];throw new s_("expected a single document in the stream, but found more")}}}.load;const Ex=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s;const Sx=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Ax=/\s*%%.*\n/gm,Dx={},Lx=function(t,e){t=t.replace(Ex,"").replace(Sx,"").replace(Ax,"\n");for(const[n,{detector:i}]of Object.entries(Dx)){if(i(t,e))return n}throw new Error(`No diagram type detected for text: ${t}`)},Nx=(t,e,n)=>{if(Dx[t])throw new Error(`Detector with key ${t} already exists`);Dx[t]={detector:e,loader:n},Db.debug(`Detector with key ${t} added${n?" with loader":""}`)},Ox=function(t,e,n){const{depth:i,clobber:r}=Object.assign({depth:2,clobber:!1},n);return Array.isArray(e)&&!Array.isArray(t)?(e.forEach((e=>Ox(t,e,n))),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach((e=>{t.includes(e)||t.push(e)})),t):void 0===t||i<=0?null!=t&&"object"==typeof t&&"object"==typeof e?Object.assign(t,e):e:(void 0!==e&&"object"==typeof t&&"object"==typeof e&&Object.keys(e).forEach((n=>{"object"!=typeof e[n]||void 0!==t[n]&&"object"!=typeof t[n]?(r||"object"!=typeof t[n]&&"object"!=typeof e[n])&&(t[n]=e[n]):(void 0===t[n]&&(t[n]=Array.isArray(e[n])?[]:{}),t[n]=Ox(t[n],e[n],{depth:i-1,clobber:r}))})),t)},Bx=Ox,Mx={curveBasis:Bc,curveBasisClosed:function(t){return new Mc(t)},curveBasisOpen:function(t){return new Ic(t)},curveLinear:Tc,curveLinearClosed:function(t){return new Fc(t)},curveMonotoneX:function(t){return new Yc(t)},curveMonotoneY:function(t){return new zc(t)},curveNatural:function(t){return new Wc(t)},curveStep:function(t){return new qc(t,.5)},curveStepAfter:function(t){return new qc(t,1)},curveStepBefore:function(t){return new qc(t,0)}},Ix=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Fx=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Rx=function(t,e=null){try{const n=new RegExp(`[%]{2}(?![{]${Fx.source})(?=[}][%]{2}).*\n`,"ig");let i;t=t.trim().replace(n,"").replace(/'/gm,'"'),Db.debug(`Detecting diagram directive${null!==e?" type:"+e:""} based on the text:${t}`);const r=[];for(;null!==(i=Ix.exec(t));)if(i.index===Ix.lastIndex&&Ix.lastIndex++,i&&!e||e&&i[1]&&i[1].match(e)||e&&i[2]&&i[2].match(e)){const t=i[1]?i[1]:i[2],e=i[3]?i[3].trim():i[4]?JSON.parse(i[4].trim()):null;r.push({type:t,args:e})}return 0===r.length&&r.push({type:t,args:null}),1===r.length?r[0]:r}catch(n){return Db.error(`ERROR: ${n.message} - Unable to parse directive\n ${null!==e?" type:"+e:""} based on the text:${t}`),{type:null,args:null}}};function $x(t,e){if(!t)return e;const n=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return Mx[n]||e}function Px(t,e){return t&&e?Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)):0}function jx(t){let e="",n="";for(const i of t)void 0!==i&&(i.startsWith("color:")||i.startsWith("text-align:")?n=n+i+";":e=e+i+";");return{style:e,labelStyle:n}}let Yx=0;const zx=()=>(Yx++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Yx);const Ux=t=>function(t){let e="";const n="0123456789abcdef",i=n.length;for(let r=0;r<t;r++)e+=n.charAt(Math.floor(Math.random()*i));return e}(t.length),Wx=function(t,e){const n=e.text.replace(jb.lineBreakRegex," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",e.fontSize),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),void 0!==e.class&&i.attr("class",e.class);const r=i.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.attr("fill",e.fill),r.text(n),i},Hx=Nh(((t,e,n)=>{if(!t)return t;if(n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"<br/>"},n),jb.lineBreakRegex.test(t))return t;const i=t.split(" "),r=[];let a="";return i.forEach(((t,s)=>{const o=Gx(`${t} `,n),c=Gx(a,n);if(o>e){const{hyphenatedStrings:i,remainingWord:s}=qx(t,e,"-",n);r.push(a,...i),a=s}else c+o>=e?(r.push(a),a=t):a=[a,t].filter(Boolean).join(" ");s+1===i.length&&r.push(a)})),r.filter((t=>""!==t)).join(n.joinWith)}),((t,e,n)=>`${t}${e}${n.fontSize}${n.fontWeight}${n.fontFamily}${n.joinWith}`)),qx=Nh(((t,e,n="-",i)=>{i=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},i);const r=[...t],a=[];let s="";return r.forEach(((t,o)=>{const c=`${s}${t}`;if(Gx(c,i)>=e){const t=o+1,e=r.length===t,i=`${c}${n}`;a.push(e?c:i),s=""}else s=c})),{hyphenatedStrings:a,remainingWord:s}}),((t,e,n="-",i)=>`${t}${e}${n}${i.fontSize}${i.fontWeight}${i.fontFamily}`));function Vx(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:15},e),Xx(t,e).height}function Gx(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e),Xx(t,e).width}const Xx=Nh(((t,e)=>{e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e);const{fontSize:n,fontFamily:i,fontWeight:r}=e;if(!t)return{width:0,height:0};const a=["sans-serif",i],s=t.split(jb.lineBreakRegex),o=[],c=Ho("body");if(!c.remove)return{width:0,height:0,lineHeight:0};const l=c.append("svg");for(const h of a){let t=0;const e={width:0,height:0,lineHeight:0};for(const i of s){const a={x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0};a.text=i;const s=Wx(l,a).style("font-size",n).style("font-weight",r).style("font-family",h),o=(s._groups||s)[0][0].getBBox();e.width=Math.round(Math.max(e.width,o.width)),t=Math.round(o.height),e.height+=t,e.lineHeight=Math.round(Math.max(e.lineHeight,t))}o.push(e)}l.remove();return o[isNaN(o[1].height)||isNaN(o[1].width)||isNaN(o[1].lineHeight)||o[0].height>o[1].height&&o[0].width>o[1].width&&o[0].lineHeight>o[1].lineHeight?0:1]}),((t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`));let Zx;const Qx=t=>{if(Db.debug("directiveSanitizer called with",t),"object"==typeof t&&(t.length?t.forEach((t=>Qx(t))):Object.keys(t).forEach((e=>{Db.debug("Checking key",e),e.startsWith("__")&&(Db.debug("sanitize deleting __ option",e),delete t[e]),e.includes("proto")&&(Db.debug("sanitize deleting proto option",e),delete t[e]),e.includes("constr")&&(Db.debug("sanitize deleting constr option",e),delete t[e]),e.includes("themeCSS")&&(Db.debug("sanitizing themeCss option"),t[e]=Kx(t[e])),e.includes("fontFamily")&&(Db.debug("sanitizing fontFamily option"),t[e]=Kx(t[e])),e.includes("altFontFamily")&&(Db.debug("sanitizing altFontFamily option"),t[e]=Kx(t[e])),Kb.includes(e)?"object"==typeof t[e]&&(Db.debug("sanitize deleting object",e),Qx(t[e])):(Db.debug("sanitize deleting option",e),delete t[e])}))),t.themeVariables){const e=Object.keys(t.themeVariables);for(const n of e){const e=t.themeVariables[n];e&&e.match&&!e.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[n]="")}}Db.debug("After sanitization",t)},Kx=t=>{let e=0,n=0;for(const i of t){if(e<n)return"{ /* ERROR: Unbalanced CSS */ }";"{"===i?e++:"}"===i&&n++}return e!==n?"{ /* ERROR: Unbalanced CSS */ }":t};function Jx(t){return"str"in t}const tv={assignWithDepth:Bx,wrapLabel:Hx,calculateTextHeight:Vx,calculateTextWidth:Gx,calculateTextDimensions:Xx,detectInit:function(t,e){const n=Rx(t,/(?:init\b)|(?:initialize\b)/);let i={};if(Array.isArray(n)){const t=n.map((t=>t.args));Qx(t),i=Bx(i,[...t])}else i=n.args;if(i){let n=Lx(t,e);["config"].forEach((t=>{void 0!==i[t]&&("flowchart-v2"===n&&(n="flowchart"),i[n]=i[t],delete i[t])}))}return i},detectDirective:Rx,isSubstringInArray:function(t,e){for(const[n,i]of e.entries())if(i.match(t))return n;return-1},interpolateToCurve:$x,calcLabelPosition:function(t){return 1===t.length?t[0]:function(t){let e,n=0;t.forEach((t=>{n+=Px(t,e),e=t}));let i,r=n/2;return e=void 0,t.forEach((t=>{if(e&&!i){const n=Px(t,e);if(n<r)r-=n;else{const a=r/n;a<=0&&(i=e),a>=1&&(i={x:t.x,y:t.y}),a>0&&a<1&&(i={x:(1-a)*e.x+a*t.x,y:(1-a)*e.y+a*t.y})}}e=t})),i}(t)},calcCardinalityPosition:(t,e,n)=>{let i;Db.info(`our points ${JSON.stringify(e)}`),e[0]!==n&&(e=e.reverse());let r,a=25;i=void 0,e.forEach((t=>{if(i&&!r){const e=Px(t,i);if(e<a)a-=e;else{const n=a/e;n<=0&&(r=i),n>=1&&(r={x:t.x,y:t.y}),n>0&&n<1&&(r={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const s=t?10:5,o=Math.atan2(e[0].y-r.y,e[0].x-r.x),c={x:0,y:0};return c.x=Math.sin(o)*s+(e[0].x+r.x)/2,c.y=-Math.cos(o)*s+(e[0].y+r.y)/2,c},calcTerminalLabelPosition:function(t,e,n){let i,r=JSON.parse(JSON.stringify(n));Db.info("our points",r),"start_left"!==e&&"start_right"!==e&&(r=r.reverse()),r.forEach((t=>{i=t}));let a,s=25+t;i=void 0,r.forEach((t=>{if(i&&!a){const e=Px(t,i);if(e<s)s-=e;else{const n=s/e;n<=0&&(a=i),n>=1&&(a={x:t.x,y:t.y}),n>0&&n<1&&(a={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const o=10+.5*t,c=Math.atan2(r[0].y-a.y,r[0].x-a.x),l={x:0,y:0};return l.x=Math.sin(c)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2,"start_left"===e&&(l.x=Math.sin(c+Math.PI)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c+Math.PI)*o+(r[0].y+a.y)/2),"end_right"===e&&(l.x=Math.sin(c-Math.PI)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c-Math.PI)*o+(r[0].y+a.y)/2-5),"end_left"===e&&(l.x=Math.sin(c)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2-5),l},formatUrl:function(t,e){const n=t.trim();if(n)return"loose"!==e.securityLevel?(0,xt.N)(n):n},getStylesFromArray:jx,generateId:zx,random:Ux,runFunc:(t,...e)=>{const n=t.split("."),i=n.length-1,r=n[i];let a=window;for(let s=0;s<i;s++)if(a=a[n[s]],!a)return;a[r](...e)},entityDecode:function(t){return Zx=Zx||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),Zx.innerHTML=t,unescape(Zx.textContent)},initIdGenerator:class{constructor(t,e){this.deterministic=t,this.seed=e,this.count=e?e.length:0}next(){return this.deterministic?this.count++:Date.now()}},directiveSanitizer:Qx,sanitizeCss:Kx,insertTitle:(t,e,n,i)=>{if(!i)return;const r=t.node().getBBox();t.append("text").text(i).attr("x",r.x+r.width/2).attr("y",-n).attr("class",e)}},ev="9.3.0",nv=Object.freeze(Jb);let iv,rv=Bx({},nv),av=[],sv=Bx({},nv);const ov=(t,e)=>{let n=Bx({},t),i={};for(const r of e)uv(r),i=Bx(i,r);if(n=Bx(n,i),i.theme&&i.theme in Xb){const t=Bx({},iv),e=Bx(t.themeVariables||{},i.themeVariables);n.theme&&n.theme in Xb&&(n.themeVariables=Xb[n.theme].getThemeVariables(e))}return sv=n,yv(sv),sv},cv=()=>Bx({},rv),lv=t=>(yv(t),Bx(sv,t),hv()),hv=()=>Bx({},sv),uv=t=>{var e;["secure",...null!=(e=rv.secure)?e:[]].forEach((e=>{void 0!==t[e]&&(Db.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])})),Object.keys(t).forEach((e=>{0===e.indexOf("__")&&delete t[e]})),Object.keys(t).forEach((e=>{"string"==typeof t[e]&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],"object"==typeof t[e]&&uv(t[e])}))},dv=t=>{t.fontFamily&&(t.themeVariables&&t.themeVariables.fontFamily||(t.themeVariables={fontFamily:t.fontFamily})),av.push(t),ov(rv,av)},pv=(t=rv)=>{av=[],ov(t,av)};var fv=(t=>(t.LAZY_LOAD_DEPRECATED="The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.",t))(fv||{});const gv={},yv=t=>{var e;t&&((t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&(gv[e="LAZY_LOAD_DEPRECATED"]||(Db.warn(fv[e]),gv[e]=!0)))},mv=function(t,e,n,i){const r=function(t,e,n){let i=new Map;return n?(i.set("width","100%"),i.set("style",`max-width: ${e}px;`)):(i.set("height",t),i.set("width",e)),i}(e,n,i);!function(t,e){for(let n of e)t.attr(n[0],n[1])}(t,r)},bv=function(t,e,n,i){const r=e.node().getBBox(),a=r.width,s=r.height;Db.info(`SVG bounds: ${a}x${s}`,r);let o=0,c=0;Db.info(`Graph bounds: ${o}x${c}`,t),o=a+2*n,c=s+2*n,Db.info(`Calculated bounds: ${o}x${c}`),mv(e,c,o,i);const l=`${r.x-n} ${r.y-n} ${r.width+2*n} ${r.height+2*n}`;e.attr("viewBox",l)},_v=t=>`g.classGroup text {\n fill: ${t.nodeBorder};\n fill: ${t.classText};\n stroke: none;\n font-family: ${t.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.nodeLabel, .edgeLabel {\n color: ${t.classText};\n}\n.edgeLabel .label rect {\n fill: ${t.mainBkg};\n}\n.label text {\n fill: ${t.classText};\n}\n.edgeLabel .label span {\n background: ${t.mainBkg};\n}\n\n.classTitle {\n font-weight: bolder;\n}\n.node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${t.nodeBorder};\n stroke: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${t.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${t.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.dashed-line{\n stroke-dasharray: 3;\n}\n\n.dotted-line{\n stroke-dasharray: 1 2;\n}\n\n#compositionStart, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopStart, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopEnd, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n.edgeTerminals {\n font-size: 11px;\n}\n\n.classTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,xv=t=>`\n .entityBox {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxOdd {\n fill: ${t.attributeBackgroundColorOdd};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxEven {\n fill: ${t.attributeBackgroundColorEven};\n stroke: ${t.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${t.tertiaryColor};\n opacity: 0.7;\n background-color: ${t.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .relationshipLine {\n stroke: ${t.lineColor};\n }\n\n .entityTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n } \n`,vv=()=>"",kv=t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n .cluster-label text {\n fill: ${t.titleColor};\n }\n .cluster-label span {\n color: ${t.titleColor};\n }\n\n .label text,span {\n fill: ${t.nodeTextColor||t.textColor};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n\n .cluster rect {\n fill: ${t.clusterBkg};\n stroke: ${t.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n .cluster span {\n color: ${t.titleColor};\n }\n /* .cluster div {\n color: ${t.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n`,wv=t=>`\n .mermaid-main-font {\n font-family: "trebuchet ms", verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n .exclude-range {\n fill: ${t.excludeBkgColor};\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${t.sectionBkgColor};\n }\n\n .section2 {\n fill: ${t.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${t.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n // text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${t.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n text {\n font-family: ${t.fontFamily};\n fill: ${t.textColor};\n }\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${t.todayLineColor};\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n // .taskText:not([font-size]) {\n // font-size: ${t.ganttFontSize};\n // }\n\n .taskTextOutsideRight {\n fill: ${t.taskTextDarkColor};\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n .taskTextOutsideLeft {\n fill: ${t.taskTextDarkColor};\n text-anchor: end;\n // font-size: ${t.ganttFontSize};\n }\n\n /* Special case clickable */\n .task.clickable {\n cursor: pointer;\n }\n .taskText.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ${t.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${t.taskBkgColor};\n stroke: ${t.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${t.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${t.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${t.activeTaskBkgColor};\n stroke: ${t.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${t.doneTaskBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor} ;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n`,Tv=()=>"",Cv=t=>`\n .pieCircle{\n stroke: ${t.pieStrokeColor};\n stroke-width : ${t.pieStrokeWidth};\n opacity : ${t.pieOpacity};\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${t.pieTitleTextSize};\n fill: ${t.pieTitleTextColor};\n font-family: ${t.fontFamily};\n }\n .slice {\n font-family: ${t.fontFamily};\n fill: ${t.pieSectionTextColor};\n font-size:${t.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${t.pieLegendTextColor};\n font-family: ${t.fontFamily};\n font-size: ${t.pieLegendTextSize};\n }\n`,Ev=t=>`\n\n marker {\n fill: ${t.relationColor};\n stroke: ${t.relationColor};\n }\n\n marker.cross {\n stroke: ${t.lineColor};\n }\n\n svg {\n font-family: ${t.fontFamily};\n font-size: ${t.fontSize};\n }\n\n .reqBox {\n fill: ${t.requirementBackground};\n fill-opacity: 100%;\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n \n .reqTitle, .reqLabel{\n fill: ${t.requirementTextColor};\n }\n .reqLabelBox {\n fill: ${t.relationLabelBackground};\n fill-opacity: 100%;\n }\n\n .req-title-line {\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n .relationshipLine {\n stroke: ${t.relationColor};\n stroke-width: 1;\n }\n .relationshipLabel {\n fill: ${t.relationLabelColor};\n }\n\n`,Sv=t=>`.actor {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${t.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${t.actorLineColor};\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${t.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${t.signalColor};\n }\n\n #arrowhead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .sequenceNumber {\n fill: ${t.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${t.signalColor};\n }\n\n #crosshead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .messageText {\n fill: ${t.signalTextColor};\n stroke: none;\n }\n\n .labelBox {\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${t.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${t.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${t.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation1 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation2 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .actorPopupMenu {\n position: absolute;\n }\n\n .actorPopupMenuPanel {\n position: absolute;\n fill: ${t.actorBkg};\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));\n}\n .actor-man line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n .actor-man circle, line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n stroke-width: 2px;\n }\n`,Av=t=>`\ndefs #statediagram-barbEnd {\n fill: ${t.transitionColor};\n stroke: ${t.transitionColor};\n }\ng.stateGroup text {\n fill: ${t.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${t.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${t.stateLabelColor};\n}\n\ng.stateGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${t.transitionColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${t.background};\n border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px\n}\n\n.state-note {\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n\n text {\n fill: ${t.noteTextColor};\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${t.labelBackgroundColor};\n opacity: 0.5;\n}\n.edgeLabel .label text {\n fill: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${t.stateLabelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node .fork-join {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node circle.state-end {\n fill: ${t.innerEndBackground};\n stroke: ${t.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${t.compositeBackground||t.background};\n // stroke: ${t.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${t.stateBkg||t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n.node polygon {\n fill: ${t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};;\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${t.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${t.compositeTitleBackground};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${t.stateLabelColor};\n}\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state .divider {\n stroke: ${t.stateBorder||t.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${t.compositeBackground||t.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.statediagram-cluster .inner {\n rx:0;\n ry:0;\n}\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${t.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${t.noteTextColor};\n}\n.statediagram .edgeLabel {\n color: red; // ${t.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${t.lineColor};\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.statediagramTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,Dv=t=>`.label {\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n color: ${t.textColor};\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ${t.textColor}\n }\n\n .legend {\n fill: ${t.textColor};\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ${t.textColor}\n }\n\n .face {\n ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"};\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ${t.fillType0?`fill: ${t.fillType0}`:""};\n }\n .task-type-1, .section-type-1 {\n ${t.fillType0?`fill: ${t.fillType1}`:""};\n }\n .task-type-2, .section-type-2 {\n ${t.fillType0?`fill: ${t.fillType2}`:""};\n }\n .task-type-3, .section-type-3 {\n ${t.fillType0?`fill: ${t.fillType3}`:""};\n }\n .task-type-4, .section-type-4 {\n ${t.fillType0?`fill: ${t.fillType4}`:""};\n }\n .task-type-5, .section-type-5 {\n ${t.fillType0?`fill: ${t.fillType5}`:""};\n }\n .task-type-6, .section-type-6 {\n ${t.fillType0?`fill: ${t.fillType6}`:""};\n }\n .task-type-7, .section-type-7 {\n ${t.fillType0?`fill: ${t.fillType7}`:""};\n }\n\n .actor-0 {\n ${t.actor0?`fill: ${t.actor0}`:""};\n }\n .actor-1 {\n ${t.actor1?`fill: ${t.actor1}`:""};\n }\n .actor-2 {\n ${t.actor2?`fill: ${t.actor2}`:""};\n }\n .actor-3 {\n ${t.actor3?`fill: ${t.actor3}`:""};\n }\n .actor-4 {\n ${t.actor4?`fill: ${t.actor4}`:""};\n }\n .actor-5 {\n ${t.actor5?`fill: ${t.actor5}`:""};\n }\n`,Lv=t=>`.person {\n stroke: ${t.personBorder};\n fill: ${t.personBkg};\n }\n`,Nv={flowchart:kv,"flowchart-v2":kv,sequence:Sv,gantt:wv,classDiagram:_v,"classDiagram-v2":_v,class:_v,stateDiagram:Av,state:Av,info:Tv,pie:Cv,er:xv,error:vv,journey:Dv,requirement:Ev,c4:Lv},Ov=(t,e,n)=>{let i="";return t in Nv&&Nv[t]?i=Nv[t](n):Db.warn(`No theme found for ${t}`),` & {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n fill: ${n.textColor}\n }\n\n /* Classes common for multiple diagrams */\n\n & .error-icon {\n fill: ${n.errorBkgColor};\n }\n & .error-text {\n fill: ${n.errorTextColor};\n stroke: ${n.errorTextColor};\n }\n\n & .edge-thickness-normal {\n stroke-width: 2px;\n }\n & .edge-thickness-thick {\n stroke-width: 3.5px\n }\n & .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n\n & .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n & .marker {\n fill: ${n.lineColor};\n stroke: ${n.lineColor};\n }\n & .marker.cross {\n stroke: ${n.lineColor};\n }\n\n & svg {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n }\n\n ${i}\n\n ${e}\n`},Bv=Db,Mv=Lb,Iv=hv,Fv=t=>Mb(t,Iv()),Rv=bv,$v={},Pv=(t,e,n)=>{if($v[t])throw new Error(`Diagram ${t} already registered.`);var i,r;$v[t]=e,n&&Nx(t,n),i=t,r=e.styles,Nv[i]=r,e.injectUtils&&e.injectUtils(Bv,Mv,Iv,Fv,Rv)},jv=t=>{if(t in $v)return $v[t];throw new Error(`Diagram ${t} not found.`)};var Yv=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,7],r=[1,5],a=[1,9],s=[1,6],o=[2,6],c=[1,16],l=[6,8,14,20,22,24,25,27,29,32,37,40,50,55],h=[8,14,20,22,24,25,27,29,32,37,40],u=[8,13,14,20,22,24,25,27,29,32,37,40],d=[1,26],p=[6,8,14,50,55],f=[8,14,55],g=[1,53],y=[1,52],m=[8,14,30,33,35,38,55],b=[1,67],_=[1,68],x=[1,69],v=[8,14,33,35,42,55],k={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,GG:6,document:7,EOF:8,":":9,DIR:10,options:11,body:12,OPT:13,NL:14,line:15,statement:16,commitStatement:17,mergeStatement:18,cherryPickStatement:19,acc_title:20,acc_title_value:21,acc_descr:22,acc_descr_value:23,acc_descr_multiline_value:24,section:25,branchStatement:26,CHECKOUT:27,ref:28,BRANCH:29,ORDER:30,NUM:31,CHERRY_PICK:32,COMMIT_ID:33,STR:34,COMMIT_TAG:35,EMPTYSTR:36,MERGE:37,COMMIT_TYPE:38,commitType:39,COMMIT:40,commit_arg:41,COMMIT_MSG:42,NORMAL:43,REVERSE:44,HIGHLIGHT:45,openDirective:46,typeDirective:47,closeDirective:48,argDirective:49,open_directive:50,type_directive:51,arg_directive:52,close_directive:53,ID:54,";":55,$accept:0,$end:1},terminals_:{2:"error",6:"GG",8:"EOF",9:":",10:"DIR",13:"OPT",14:"NL",20:"acc_title",21:"acc_title_value",22:"acc_descr",23:"acc_descr_value",24:"acc_descr_multiline_value",25:"section",27:"CHECKOUT",29:"BRANCH",30:"ORDER",31:"NUM",32:"CHERRY_PICK",33:"COMMIT_ID",34:"STR",35:"COMMIT_TAG",36:"EMPTYSTR",37:"MERGE",38:"COMMIT_TYPE",40:"COMMIT",42:"COMMIT_MSG",43:"NORMAL",44:"REVERSE",45:"HIGHLIGHT",50:"open_directive",51:"type_directive",52:"arg_directive",53:"close_directive",54:"ID",55:";"},productions_:[0,[3,2],[3,2],[3,3],[3,4],[3,5],[7,0],[7,2],[11,2],[11,1],[12,0],[12,2],[15,2],[15,1],[16,1],[16,1],[16,1],[16,2],[16,2],[16,1],[16,1],[16,1],[16,2],[26,2],[26,4],[19,3],[19,5],[19,5],[19,5],[19,5],[18,2],[18,4],[18,4],[18,4],[18,6],[18,6],[18,6],[18,6],[18,6],[18,6],[18,8],[18,8],[18,8],[18,8],[18,8],[18,8],[17,2],[17,3],[17,3],[17,5],[17,5],[17,3],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,3],[17,5],[17,5],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[41,0],[41,1],[39,1],[39,1],[39,1],[5,3],[5,5],[46,1],[47,1],[49,1],[48,1],[28,1],[28,1],[4,1],[4,1],[4,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 3:return a[o];case 4:return a[o-1];case 5:return i.setDirection(a[o-3]),a[o-1];case 7:i.setOptions(a[o-1]),this.$=a[o];break;case 8:a[o-1]+=a[o],this.$=a[o-1];break;case 10:this.$=[];break;case 11:a[o-1].push(a[o]),this.$=a[o-1];break;case 12:this.$=a[o-1];break;case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 20:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 22:i.checkout(a[o]);break;case 23:i.branch(a[o]);break;case 24:i.branch(a[o-2],a[o]);break;case 25:i.cherryPick(a[o],"",void 0);break;case 26:i.cherryPick(a[o-2],"",a[o]);break;case 27:case 29:i.cherryPick(a[o-2],"","");break;case 28:i.cherryPick(a[o],"",a[o-2]);break;case 30:i.merge(a[o],"","","");break;case 31:i.merge(a[o-2],a[o],"","");break;case 32:i.merge(a[o-2],"",a[o],"");break;case 33:i.merge(a[o-2],"","",a[o]);break;case 34:i.merge(a[o-4],a[o],"",a[o-2]);break;case 35:i.merge(a[o-4],"",a[o],a[o-2]);break;case 36:i.merge(a[o-4],"",a[o-2],a[o]);break;case 37:i.merge(a[o-4],a[o-2],a[o],"");break;case 38:i.merge(a[o-4],a[o-2],"",a[o]);break;case 39:i.merge(a[o-4],a[o],a[o-2],"");break;case 40:i.merge(a[o-6],a[o-4],a[o-2],a[o]);break;case 41:i.merge(a[o-6],a[o],a[o-4],a[o-2]);break;case 42:i.merge(a[o-6],a[o-4],a[o],a[o-2]);break;case 43:i.merge(a[o-6],a[o-2],a[o-4],a[o]);break;case 44:i.merge(a[o-6],a[o],a[o-2],a[o-4]);break;case 45:i.merge(a[o-6],a[o-2],a[o],a[o-4]);break;case 46:i.commit(a[o]);break;case 47:i.commit("","",i.commitType.NORMAL,a[o]);break;case 48:i.commit("","",a[o],"");break;case 49:i.commit("","",a[o],a[o-2]);break;case 50:i.commit("","",a[o-2],a[o]);break;case 51:i.commit("",a[o],i.commitType.NORMAL,"");break;case 52:i.commit("",a[o-2],i.commitType.NORMAL,a[o]);break;case 53:i.commit("",a[o],i.commitType.NORMAL,a[o-2]);break;case 54:i.commit("",a[o-2],a[o],"");break;case 55:i.commit("",a[o],a[o-2],"");break;case 56:i.commit("",a[o-4],a[o-2],a[o]);break;case 57:i.commit("",a[o-4],a[o],a[o-2]);break;case 58:i.commit("",a[o-2],a[o-4],a[o]);break;case 59:i.commit("",a[o],a[o-4],a[o-2]);break;case 60:i.commit("",a[o],a[o-2],a[o-4]);break;case 61:i.commit("",a[o-2],a[o],a[o-4]);break;case 62:i.commit(a[o],"",i.commitType.NORMAL,"");break;case 63:i.commit(a[o],"",i.commitType.NORMAL,a[o-2]);break;case 64:i.commit(a[o-2],"",i.commitType.NORMAL,a[o]);break;case 65:i.commit(a[o-2],"",a[o],"");break;case 66:i.commit(a[o],"",a[o-2],"");break;case 67:i.commit(a[o],a[o-2],i.commitType.NORMAL,"");break;case 68:i.commit(a[o-2],a[o],i.commitType.NORMAL,"");break;case 69:i.commit(a[o-4],"",a[o-2],a[o]);break;case 70:i.commit(a[o-4],"",a[o],a[o-2]);break;case 71:i.commit(a[o-2],"",a[o-4],a[o]);break;case 72:i.commit(a[o],"",a[o-4],a[o-2]);break;case 73:i.commit(a[o],"",a[o-2],a[o-4]);break;case 74:i.commit(a[o-2],"",a[o],a[o-4]);break;case 75:i.commit(a[o-4],a[o],a[o-2],"");break;case 76:i.commit(a[o-4],a[o-2],a[o],"");break;case 77:i.commit(a[o-2],a[o],a[o-4],"");break;case 78:i.commit(a[o],a[o-2],a[o-4],"");break;case 79:i.commit(a[o],a[o-4],a[o-2],"");break;case 80:i.commit(a[o-2],a[o-4],a[o],"");break;case 81:i.commit(a[o-4],a[o],i.commitType.NORMAL,a[o-2]);break;case 82:i.commit(a[o-4],a[o-2],i.commitType.NORMAL,a[o]);break;case 83:i.commit(a[o-2],a[o],i.commitType.NORMAL,a[o-4]);break;case 84:i.commit(a[o],a[o-2],i.commitType.NORMAL,a[o-4]);break;case 85:i.commit(a[o],a[o-4],i.commitType.NORMAL,a[o-2]);break;case 86:i.commit(a[o-2],a[o-4],i.commitType.NORMAL,a[o]);break;case 87:i.commit(a[o-6],a[o-4],a[o-2],a[o]);break;case 88:i.commit(a[o-6],a[o-4],a[o],a[o-2]);break;case 89:i.commit(a[o-6],a[o-2],a[o-4],a[o]);break;case 90:i.commit(a[o-6],a[o],a[o-4],a[o-2]);break;case 91:i.commit(a[o-6],a[o-2],a[o],a[o-4]);break;case 92:i.commit(a[o-6],a[o],a[o-2],a[o-4]);break;case 93:i.commit(a[o-4],a[o-6],a[o-2],a[o]);break;case 94:i.commit(a[o-4],a[o-6],a[o],a[o-2]);break;case 95:i.commit(a[o-2],a[o-6],a[o-4],a[o]);break;case 96:i.commit(a[o],a[o-6],a[o-4],a[o-2]);break;case 97:i.commit(a[o-2],a[o-6],a[o],a[o-4]);break;case 98:i.commit(a[o],a[o-6],a[o-2],a[o-4]);break;case 99:i.commit(a[o],a[o-4],a[o-2],a[o-6]);break;case 100:i.commit(a[o-2],a[o-4],a[o],a[o-6]);break;case 101:i.commit(a[o],a[o-2],a[o-4],a[o-6]);break;case 102:i.commit(a[o-2],a[o],a[o-4],a[o-6]);break;case 103:i.commit(a[o-4],a[o-2],a[o],a[o-6]);break;case 104:i.commit(a[o-4],a[o],a[o-2],a[o-6]);break;case 105:i.commit(a[o-2],a[o-4],a[o-6],a[o]);break;case 106:i.commit(a[o],a[o-4],a[o-6],a[o-2]);break;case 107:i.commit(a[o-2],a[o],a[o-6],a[o-4]);break;case 108:i.commit(a[o],a[o-2],a[o-6],a[o-4]);break;case 109:i.commit(a[o-4],a[o-2],a[o-6],a[o]);break;case 110:i.commit(a[o-4],a[o],a[o-6],a[o-2]);break;case 111:this.$="";break;case 112:this.$=a[o];break;case 113:this.$=i.commitType.NORMAL;break;case 114:this.$=i.commitType.REVERSE;break;case 115:this.$=i.commitType.HIGHLIGHT;break;case 118:i.parseDirective("%%{","open_directive");break;case 119:i.parseDirective(a[o],"type_directive");break;case 120:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 121:i.parseDirective("}%%","close_directive","gitGraph")}},table:[{3:1,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{1:[3]},{3:10,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{3:11,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{7:12,8:o,9:[1,13],10:[1,14],11:15,14:c},e(l,[2,124]),e(l,[2,125]),e(l,[2,126]),{47:17,51:[1,18]},{51:[2,118]},{1:[2,1]},{1:[2,2]},{8:[1,19]},{7:20,8:o,11:15,14:c},{9:[1,21]},e(h,[2,10],{12:22,13:[1,23]}),e(u,[2,9]),{9:[1,25],48:24,53:d},e([9,53],[2,119]),{1:[2,3]},{8:[1,27]},{7:28,8:o,11:15,14:c},{8:[2,7],14:[1,31],15:29,16:30,17:32,18:33,19:34,20:[1,35],22:[1,36],24:[1,37],25:[1,38],26:39,27:[1,40],29:[1,44],32:[1,43],37:[1,42],40:[1,41]},e(u,[2,8]),e(p,[2,116]),{49:45,52:[1,46]},e(p,[2,121]),{1:[2,4]},{8:[1,47]},e(h,[2,11]),{4:48,8:i,14:r,55:s},e(h,[2,13]),e(f,[2,14]),e(f,[2,15]),e(f,[2,16]),{21:[1,49]},{23:[1,50]},e(f,[2,19]),e(f,[2,20]),e(f,[2,21]),{28:51,34:g,54:y},e(f,[2,111],{41:54,33:[1,57],34:[1,59],35:[1,55],38:[1,56],42:[1,58]}),{28:60,34:g,54:y},{33:[1,61],35:[1,62]},{28:63,34:g,54:y},{48:64,53:d},{53:[2,120]},{1:[2,5]},e(h,[2,12]),e(f,[2,17]),e(f,[2,18]),e(f,[2,22]),e(m,[2,122]),e(m,[2,123]),e(f,[2,46]),{34:[1,65]},{39:66,43:b,44:_,45:x},{34:[1,70]},{34:[1,71]},e(f,[2,112]),e(f,[2,30],{33:[1,72],35:[1,74],38:[1,73]}),{34:[1,75]},{34:[1,76],36:[1,77]},e(f,[2,23],{30:[1,78]}),e(p,[2,117]),e(f,[2,47],{33:[1,80],38:[1,79],42:[1,81]}),e(f,[2,48],{33:[1,83],35:[1,82],42:[1,84]}),e(v,[2,113]),e(v,[2,114]),e(v,[2,115]),e(f,[2,51],{35:[1,85],38:[1,86],42:[1,87]}),e(f,[2,62],{33:[1,90],35:[1,88],38:[1,89]}),{34:[1,91]},{39:92,43:b,44:_,45:x},{34:[1,93]},e(f,[2,25],{35:[1,94]}),{33:[1,95]},{33:[1,96]},{31:[1,97]},{39:98,43:b,44:_,45:x},{34:[1,99]},{34:[1,100]},{34:[1,101]},{34:[1,102]},{34:[1,103]},{34:[1,104]},{39:105,43:b,44:_,45:x},{34:[1,106]},{34:[1,107]},{39:108,43:b,44:_,45:x},{34:[1,109]},e(f,[2,31],{35:[1,111],38:[1,110]}),e(f,[2,32],{33:[1,113],35:[1,112]}),e(f,[2,33],{33:[1,114],38:[1,115]}),{34:[1,116],36:[1,117]},{34:[1,118]},{34:[1,119]},e(f,[2,24]),e(f,[2,49],{33:[1,120],42:[1,121]}),e(f,[2,53],{38:[1,122],42:[1,123]}),e(f,[2,63],{33:[1,125],38:[1,124]}),e(f,[2,50],{33:[1,126],42:[1,127]}),e(f,[2,55],{35:[1,128],42:[1,129]}),e(f,[2,66],{33:[1,131],35:[1,130]}),e(f,[2,52],{38:[1,132],42:[1,133]}),e(f,[2,54],{35:[1,134],42:[1,135]}),e(f,[2,67],{35:[1,137],38:[1,136]}),e(f,[2,64],{33:[1,139],38:[1,138]}),e(f,[2,65],{33:[1,141],35:[1,140]}),e(f,[2,68],{35:[1,143],38:[1,142]}),{39:144,43:b,44:_,45:x},{34:[1,145]},{34:[1,146]},{34:[1,147]},{34:[1,148]},{39:149,43:b,44:_,45:x},e(f,[2,26]),e(f,[2,27]),e(f,[2,28]),e(f,[2,29]),{34:[1,150]},{34:[1,151]},{39:152,43:b,44:_,45:x},{34:[1,153]},{39:154,43:b,44:_,45:x},{34:[1,155]},{34:[1,156]},{34:[1,157]},{34:[1,158]},{34:[1,159]},{34:[1,160]},{34:[1,161]},{39:162,43:b,44:_,45:x},{34:[1,163]},{34:[1,164]},{34:[1,165]},{39:166,43:b,44:_,45:x},{34:[1,167]},{39:168,43:b,44:_,45:x},{34:[1,169]},{34:[1,170]},{34:[1,171]},{39:172,43:b,44:_,45:x},{34:[1,173]},e(f,[2,37],{35:[1,174]}),e(f,[2,38],{38:[1,175]}),e(f,[2,36],{33:[1,176]}),e(f,[2,39],{35:[1,177]}),e(f,[2,34],{38:[1,178]}),e(f,[2,35],{33:[1,179]}),e(f,[2,60],{42:[1,180]}),e(f,[2,73],{33:[1,181]}),e(f,[2,61],{42:[1,182]}),e(f,[2,84],{38:[1,183]}),e(f,[2,74],{33:[1,184]}),e(f,[2,83],{38:[1,185]}),e(f,[2,59],{42:[1,186]}),e(f,[2,72],{33:[1,187]}),e(f,[2,58],{42:[1,188]}),e(f,[2,78],{35:[1,189]}),e(f,[2,71],{33:[1,190]}),e(f,[2,77],{35:[1,191]}),e(f,[2,57],{42:[1,192]}),e(f,[2,85],{38:[1,193]}),e(f,[2,56],{42:[1,194]}),e(f,[2,79],{35:[1,195]}),e(f,[2,80],{35:[1,196]}),e(f,[2,86],{38:[1,197]}),e(f,[2,70],{33:[1,198]}),e(f,[2,81],{38:[1,199]}),e(f,[2,69],{33:[1,200]}),e(f,[2,75],{35:[1,201]}),e(f,[2,76],{35:[1,202]}),e(f,[2,82],{38:[1,203]}),{34:[1,204]},{39:205,43:b,44:_,45:x},{34:[1,206]},{34:[1,207]},{39:208,43:b,44:_,45:x},{34:[1,209]},{34:[1,210]},{34:[1,211]},{34:[1,212]},{39:213,43:b,44:_,45:x},{34:[1,214]},{39:215,43:b,44:_,45:x},{34:[1,216]},{34:[1,217]},{34:[1,218]},{34:[1,219]},{34:[1,220]},{34:[1,221]},{34:[1,222]},{39:223,43:b,44:_,45:x},{34:[1,224]},{34:[1,225]},{34:[1,226]},{39:227,43:b,44:_,45:x},{34:[1,228]},{39:229,43:b,44:_,45:x},{34:[1,230]},{34:[1,231]},{34:[1,232]},{39:233,43:b,44:_,45:x},e(f,[2,40]),e(f,[2,42]),e(f,[2,41]),e(f,[2,43]),e(f,[2,45]),e(f,[2,44]),e(f,[2,101]),e(f,[2,102]),e(f,[2,99]),e(f,[2,100]),e(f,[2,104]),e(f,[2,103]),e(f,[2,108]),e(f,[2,107]),e(f,[2,106]),e(f,[2,105]),e(f,[2,110]),e(f,[2,109]),e(f,[2,98]),e(f,[2,97]),e(f,[2,96]),e(f,[2,95]),e(f,[2,93]),e(f,[2,94]),e(f,[2,92]),e(f,[2,91]),e(f,[2,90]),e(f,[2,89]),e(f,[2,87]),e(f,[2,88])],defaultActions:{9:[2,118],10:[2,1],11:[2,2],19:[2,3],27:[2,4],46:[2,120],47:[2,5]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),50;case 1:return this.begin("type_directive"),51;case 2:return this.popState(),this.begin("arg_directive"),9;case 3:return this.popState(),this.popState(),53;case 4:return 52;case 5:return this.begin("acc_title"),20;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),22;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 34:case 38:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:return 14;case 13:case 14:break;case 15:return 6;case 16:return 40;case 17:return 33;case 18:return 38;case 19:return 42;case 20:return 43;case 21:return 44;case 22:return 45;case 23:return 35;case 24:return 29;case 25:return 30;case 26:return 37;case 27:return 32;case 28:return 27;case 29:case 30:return 10;case 31:return 9;case 32:return"CARET";case 33:this.begin("options");break;case 35:return 13;case 36:return 36;case 37:this.begin("string");break;case 39:return 34;case 40:return 31;case 41:return 54;case 42:return 8}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit(?=\s|$))/i,/^(?:id:)/i,/^(?:type:)/i,/^(?:msg:)/i,/^(?:NORMAL\b)/i,/^(?:REVERSE\b)/i,/^(?:HIGHLIGHT\b)/i,/^(?:tag:)/i,/^(?:branch(?=\s|$))/i,/^(?:order:)/i,/^(?:merge(?=\s|$))/i,/^(?:cherry-pick(?=\s|$))/i,/^(?:checkout(?=\s|$))/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:[ \r\n\t]+end\b)/i,/^(?:[\s\S]+(?=[ \r\n\t]+end))/i,/^(?:["]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[0-9]+(?=\s|$))/i,/^(?:\w([-\./\w]*[-\w])?)/i,/^(?:$)/i,/^(?:\s+)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},options:{rules:[34,35],inclusive:!1},string:{rules:[38,39],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,36,37,40,41,42,43],inclusive:!0}}},t);function T(){this.yy={}}return k.lexer=w,T.prototype=k,k.Parser=T,new T}();Yv.parser=Yv;const zv=Yv,Uv=t=>null!==t.match(/^\s*gitGraph/);let Wv="",Hv="",qv="";const Vv=t=>Mb(t,hv()),Gv=function(){Wv="",qv="",Hv=""},Xv=function(t){Wv=Vv(t).replace(/^\s+/g,"")},Zv=function(){return Wv||Hv},Qv=function(t){qv=Vv(t).replace(/\n\s+/g,"\n")},Kv=function(){return qv},Jv=function(t){Hv=Vv(t)},tk=function(){return Hv};let ek=hv().gitGraph.mainBranchName,nk=hv().gitGraph.mainBranchOrder,ik={},rk=null,ak={};ak[ek]={name:ek,order:nk};let sk={};sk[ek]=rk;let ok=ek,ck="LR",lk=0;function hk(){return Ux({length:7})}let uk={};const dk=function(t){if(t=jb.sanitizeText(t,hv()),void 0===sk[t]){let e=new Error('Trying to checkout branch which is not yet created. (Help try using "branch '+t+'")');throw e.hash={text:"checkout "+t,token:"checkout "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"branch '+t+'"']},e}{ok=t;const e=sk[ok];rk=ik[e]}};function pk(t,e,n){const i=t.indexOf(e);-1===i?t.push(n):t.splice(i,1,n)}function fk(t){const e=t.reduce(((t,e)=>t.seq>e.seq?t:e),t[0]);let n="";t.forEach((function(t){n+=t===e?"\t*":"\t|"}));const i=[n,e.id,e.seq];for(let r in sk)sk[r]===e.id&&i.push(r);if(Db.debug(i.join(" ")),e.parents&&2==e.parents.length){const n=ik[e.parents[0]];pk(t,e,n),t.push(ik[e.parents[1]])}else{if(0==e.parents.length)return;{const n=ik[e.parents];pk(t,e,n)}}fk(t=function(t,e){const n=Object.create(null);return t.reduce(((t,i)=>{const r=e(i);return n[r]||(n[r]=!0,t.push(i)),t}),[])}(t,(t=>t.id)))}const gk=function(){const t=Object.keys(ik).map((function(t){return ik[t]}));return t.forEach((function(t){Db.debug(t.id)})),t.sort(((t,e)=>t.seq-e.seq)),t},yk={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},mk={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().gitGraph,setDirection:function(t){ck=t},setOptions:function(t){Db.debug("options str",t),t=(t=t&&t.trim())||"{}";try{uk=JSON.parse(t)}catch(e){Db.error("error while parsing gitGraph options",e.message)}},getOptions:function(){return uk},commit:function(t,e,n,i){Db.debug("Entering commit:",t,e,n,i),e=jb.sanitizeText(e,hv()),t=jb.sanitizeText(t,hv()),i=jb.sanitizeText(i,hv());const r={id:e||lk+"-"+hk(),message:t,seq:lk++,type:n||yk.NORMAL,tag:i||"",parents:null==rk?[]:[rk.id],branch:ok};rk=r,ik[r.id]=r,sk[ok]=r.id,Db.debug("in pushCommit "+r.id)},branch:function(t,e){if(t=jb.sanitizeText(t,hv()),void 0!==sk[t]){let e=new Error('Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout '+t+'")');throw e.hash={text:"branch "+t,token:"branch "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"checkout '+t+'"']},e}sk[t]=null!=rk?rk.id:null,ak[t]={name:t,order:e?parseInt(e,10):null},dk(t),Db.debug("in createBranch")},merge:function(t,e,n,i){t=jb.sanitizeText(t,hv()),e=jb.sanitizeText(e,hv());const r=ik[sk[ok]],a=ik[sk[t]];if(ok===t){let e=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(void 0===r||!r){let e=new Error('Incorrect usage of "merge". Current branch ('+ok+")has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["commit"]},e}if(void 0===sk[t]){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") does not exist");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch "+t]},e}if(void 0===a||!a){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"commit"']},e}if(r===a){let e=new Error('Incorrect usage of "merge". Both branches have same head');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(e&&void 0!==ik[e]){let r=new Error('Incorrect usage of "merge". Commit with id:'+e+" already exists, use different custom Id");throw r.hash={text:"merge "+t+e+n+i,token:"merge "+t+e+n+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["merge "+t+" "+e+"_UNIQUE "+n+" "+i]},r}const s={id:e||lk+"-"+hk(),message:"merged branch "+t+" into "+ok,seq:lk++,parents:[null==rk?null:rk.id,sk[t]],branch:ok,type:yk.MERGE,customType:n,customId:!!e,tag:i||""};rk=s,ik[s.id]=s,sk[ok]=s.id,Db.debug(sk),Db.debug("in mergeBranch")},cherryPick:function(t,e,n){if(Db.debug("Entering cherryPick:",t,e,n),t=jb.sanitizeText(t,hv()),e=jb.sanitizeText(e,hv()),n=jb.sanitizeText(n,hv()),!t||void 0===ik[t]){let n=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}let i=ik[t],r=i.branch;if(i.type===yk.MERGE){let n=new Error('Incorrect usage of "cherryPick". Source commit should not be a merge commit');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}if(!e||void 0===ik[e]){if(r===ok){let n=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const a=ik[sk[ok]];if(void 0===a||!a){let n=new Error('Incorrect usage of "cherry-pick". Current branch ('+ok+")has no commits");throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const s={id:lk+"-"+hk(),message:"cherry-picked "+i+" into "+ok,seq:lk++,parents:[null==rk?null:rk.id,i.id],branch:ok,type:yk.CHERRY_PICK,tag:null!=n?n:"cherry-pick:"+i.id};rk=s,ik[s.id]=s,sk[ok]=s.id,Db.debug(sk),Db.debug("in cherryPick")}},checkout:dk,prettyPrint:function(){Db.debug(ik);fk([gk()[0]])},clear:function(){ik={},rk=null;let t=hv().gitGraph.mainBranchName,e=hv().gitGraph.mainBranchOrder;sk={},sk[t]=null,ak={},ak[t]={name:t,order:e},ok=t,lk=0,Gv()},getBranchesAsObjArray:function(){const t=Object.values(ak).map(((t,e)=>null!==t.order?t:{...t,order:parseFloat(`0.${e}`,10)})).sort(((t,e)=>t.order-e.order)).map((({name:t})=>({name:t})));return t},getBranches:function(){return sk},getCommits:function(){return ik},getCommitsArray:gk,getCurrentBranch:function(){return ok},getDirection:function(){return ck},getHead:function(){return rk},setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,setDiagramTitle:Jv,getDiagramTitle:tk,commitType:yk};let bk={};const _k=0,xk=1,vk=2,kk=3,wk=4;let Tk={},Ck={},Ek=[],Sk=0;const Ak=(t,e,n)=>{const i=Iv().gitGraph,r=t.append("g").attr("class","commit-bullets"),a=t.append("g").attr("class","commit-labels");let s=0;Object.keys(e).sort(((t,n)=>e[t].seq-e[n].seq)).forEach((t=>{const o=e[t],c=Tk[o.branch].pos,l=s+10;if(n){let t,e=void 0!==o.customType&&""!==o.customType?o.customType:o.type;switch(e){case _k:t="commit-normal";break;case xk:t="commit-reverse";break;case vk:t="commit-highlight";break;case kk:t="commit-merge";break;case wk:t="commit-cherry-pick";break;default:t="commit-normal"}if(e===vk){const e=r.append("rect");e.attr("x",l-10),e.attr("y",c-10),e.attr("height",20),e.attr("width",20),e.attr("class",`commit ${o.id} commit-highlight${Tk[o.branch].index%8} ${t}-outer`),r.append("rect").attr("x",l-6).attr("y",c-6).attr("height",12).attr("width",12).attr("class",`commit ${o.id} commit${Tk[o.branch].index%8} ${t}-inner`)}else if(e===wk)r.append("circle").attr("cx",l).attr("cy",c).attr("r",10).attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l-3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l+3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l+3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l-3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`);else{const n=r.append("circle");if(n.attr("cx",l),n.attr("cy",c),n.attr("r",o.type===kk?9:10),n.attr("class",`commit ${o.id} commit${Tk[o.branch].index%8}`),e===kk){const e=r.append("circle");e.attr("cx",l),e.attr("cy",c),e.attr("r",6),e.attr("class",`commit ${t} ${o.id} commit${Tk[o.branch].index%8}`)}if(e===xk){r.append("path").attr("d",`M ${l-5},${c-5}L${l+5},${c+5}M${l-5},${c+5}L${l+5},${c-5}`).attr("class",`commit ${t} ${o.id} commit${Tk[o.branch].index%8}`)}}}if(Ck[o.id]={x:s+10,y:c},n){const t=4,e=2;if(o.type!==wk&&(o.customId&&o.type===kk||o.type!==kk)&&i.showCommitLabel){const t=a.append("g"),n=t.insert("rect").attr("class","commit-label-bkg"),r=t.append("text").attr("x",s).attr("y",c+25).attr("class","commit-label").text(o.id);let l=r.node().getBBox();if(n.attr("x",s+10-l.width/2-e).attr("y",c+13.5).attr("width",l.width+2*e).attr("height",l.height+2*e),r.attr("x",s+10-l.width/2),i.rotateCommitLabel){let e=-7.5-(l.width+10)/25*9.5,n=10+l.width/25*8.5;t.attr("transform","translate("+e+", "+n+") rotate("+"-45, "+s+", "+c+")")}}if(o.tag){const n=a.insert("polygon"),i=a.append("circle"),r=a.append("text").attr("y",c-16).attr("class","tag-label").text(o.tag);let l=r.node().getBBox();r.attr("x",s+10-l.width/2);const h=l.height/2,u=c-19.2;n.attr("class","tag-label-bkg").attr("points",`\n ${s-l.width/2-t/2},${u+e}\n ${s-l.width/2-t/2},${u-e}\n ${s+10-l.width/2-t},${u-h-e}\n ${s+10+l.width/2+t},${u-h-e}\n ${s+10+l.width/2+t},${u+h+e}\n ${s+10-l.width/2-t},${u+h+e}`),i.attr("cx",s-l.width/2+t/2).attr("cy",u).attr("r",1.5).attr("class","tag-hole")}}s+=50,s>Sk&&(Sk=s)}))},Dk=(t,e,n=0)=>{const i=t+Math.abs(t-e)/2;if(n>5)return i;if(Ek.every((t=>Math.abs(t-i)>=10)))return Ek.push(i),i;const r=Math.abs(t-e);return Dk(t,e-r/5,n+1)},Lk=(t,e,n,i)=>{const r=Ck[e.id],a=Ck[n.id],s=((t,e,n)=>Object.keys(n).filter((i=>n[i].branch===e.branch&&n[i].seq>t.seq&&n[i].seq<e.seq)).length>0)(e,n,i);let o,c="",l="",h=0,u=0,d=Tk[n.branch].index;if(s){c="A 10 10, 0, 0, 0,",l="A 10 10, 0, 0, 1,",h=10,u=10,d=Tk[n.branch].index;const t=r.y<a.y?Dk(r.y,a.y):Dk(a.y,r.y);o=r.y<a.y?`M ${r.x} ${r.y} L ${r.x} ${t-h} ${c} ${r.x+u} ${t} L ${a.x-h} ${t} ${l} ${a.x} ${t+u} L ${a.x} ${a.y}`:`M ${r.x} ${r.y} L ${r.x} ${t+h} ${l} ${r.x+u} ${t} L ${a.x-h} ${t} ${c} ${a.x} ${t-u} L ${a.x} ${a.y}`}else r.y<a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Tk[n.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`),r.y>a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Tk[e.branch].index,o=`M ${r.x} ${r.y} L ${a.x-h} ${r.y} ${c} ${a.x} ${r.y-u} L ${a.x} ${a.y}`),r.y===a.y&&(d=Tk[e.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`);t.append("path").attr("d",o).attr("class","arrow arrow"+d%8)},Nk=(t,e)=>{const n=Iv().gitGraph,i=t.append("g");e.forEach(((t,e)=>{const r=e%8,a=Tk[t.name].pos,s=i.append("line");s.attr("x1",0),s.attr("y1",a),s.attr("x2",Sk),s.attr("y2",a),s.attr("class","branch branch"+r),Ek.push(a);const o=(t=>{const e=document.createElementNS("http://www.w3.org/2000/svg","text");let n=[];n="string"==typeof t?t.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(t)?t:[];for(const i of n){const t=document.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","0"),t.setAttribute("class","row"),t.textContent=i.trim(),e.appendChild(t)}return e})(t.name),c=i.insert("rect"),l=i.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+r);l.node().appendChild(o);let h=o.getBBox();c.attr("class","branchLabelBkg label"+r).attr("rx",4).attr("ry",4).attr("x",-h.width-4-(!0===n.rotateCommitLabel?30:0)).attr("y",-h.height/2+8).attr("width",h.width+18).attr("height",h.height+4),l.attr("transform","translate("+(-h.width-14-(!0===n.rotateCommitLabel?30:0))+", "+(a-h.height/2-1)+")"),c.attr("transform","translate(-19, "+(a-h.height/2)+")")}))},Ok={draw:function(t,e,n,i){var r;Tk={},Ck={},bk={},Sk=0,Ek=[];const a=Iv(),s=a.gitGraph;Db.debug("in gitgraph renderer",t+"\n","id:",e,n),bk=i.db.getCommits();const o=i.db.getBranchesAsObjArray();let c=0;o.forEach(((t,e)=>{Tk[t.name]={pos:c,index:e},c+=50+(s.rotateCommitLabel?40:0)}));const l=Ho(`[id="${e}"]`);Ak(l,bk,!1),s.showBranches&&Nk(l,o),((t,e)=>{const n=t.append("g").attr("class","commit-arrows");Object.keys(e).forEach((t=>{const i=e[t];i.parents&&i.parents.length>0&&i.parents.forEach((t=>{Lk(n,e[t],i,e)}))}))})(l,bk),Ak(l,bk,!0),tv.insertTitle(l,"gitTitleText",s.titleTopMargin,i.db.getDiagramTitle()),Rv(void 0,l,s.diagramPadding,null!=(r=s.useMaxWidth)?r:a.useMaxWidth)}},Bk=t=>`\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n ${[0,1,2,3,4,5,6,7].map((e=>`\n .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; }\n .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; }\n .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; }\n .label${e} { fill: ${t["git"+e]}; }\n .arrow${e} { stroke: ${t["git"+e]}; }\n `)).join("\n")}\n\n .branch {\n stroke-width: 1;\n stroke: ${t.lineColor};\n stroke-dasharray: 2;\n }\n .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};}\n .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; }\n .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};}\n .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; }\n .tag-hole { fill: ${t.textColor}; }\n\n .commit-merge {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n .commit-reverse {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n stroke-width: 3;\n }\n .commit-highlight-outer {\n }\n .commit-highlight-inner {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n\n .arrow { stroke-width: 8; stroke-linecap: round; fill: none}\n .gitTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n }\n`;var Mk=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,6],i=[1,7],r=[1,8],a=[1,9],s=[1,16],o=[1,11],l=[1,12],h=[1,13],u=[1,14],d=[1,15],p=[1,27],f=[1,33],g=[1,34],y=[1,35],m=[1,36],b=[1,37],_=[1,72],x=[1,73],v=[1,74],k=[1,75],w=[1,76],T=[1,77],C=[1,78],E=[1,38],S=[1,39],A=[1,40],D=[1,41],L=[1,42],N=[1,43],O=[1,44],B=[1,45],M=[1,46],I=[1,47],F=[1,48],R=[1,49],$=[1,50],P=[1,51],j=[1,52],Y=[1,53],z=[1,54],U=[1,55],W=[1,56],H=[1,57],q=[1,59],V=[1,60],G=[1,61],X=[1,62],Z=[1,63],Q=[1,64],K=[1,65],J=[1,66],tt=[1,67],et=[1,68],nt=[1,69],it=[24,52],rt=[24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],at=[15,24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],st=[1,94],ot=[1,95],ct=[1,96],lt=[1,97],ht=[15,24,52],ut=[7,8,9,10,18,22,25,26,27,28],dt=[15,24,43,52],pt=[15,24,43,52,86,87,89,90],ft=[15,43],gt=[44,46,47,48,49,50,51,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],yt={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,directive:6,direction_tb:7,direction_bt:8,direction_rl:9,direction_lr:10,graphConfig:11,openDirective:12,typeDirective:13,closeDirective:14,NEWLINE:15,":":16,argDirective:17,open_directive:18,type_directive:19,arg_directive:20,close_directive:21,C4_CONTEXT:22,statements:23,EOF:24,C4_CONTAINER:25,C4_COMPONENT:26,C4_DYNAMIC:27,C4_DEPLOYMENT:28,otherStatements:29,diagramStatements:30,otherStatement:31,title:32,accDescription:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,boundaryStatement:39,boundaryStartStatement:40,boundaryStopStatement:41,boundaryStart:42,LBRACE:43,ENTERPRISE_BOUNDARY:44,attributes:45,SYSTEM_BOUNDARY:46,BOUNDARY:47,CONTAINER_BOUNDARY:48,NODE:49,NODE_L:50,NODE_R:51,RBRACE:52,diagramStatement:53,PERSON:54,PERSON_EXT:55,SYSTEM:56,SYSTEM_DB:57,SYSTEM_QUEUE:58,SYSTEM_EXT:59,SYSTEM_EXT_DB:60,SYSTEM_EXT_QUEUE:61,CONTAINER:62,CONTAINER_DB:63,CONTAINER_QUEUE:64,CONTAINER_EXT:65,CONTAINER_EXT_DB:66,CONTAINER_EXT_QUEUE:67,COMPONENT:68,COMPONENT_DB:69,COMPONENT_QUEUE:70,COMPONENT_EXT:71,COMPONENT_EXT_DB:72,COMPONENT_EXT_QUEUE:73,REL:74,BIREL:75,REL_U:76,REL_D:77,REL_L:78,REL_R:79,REL_B:80,REL_INDEX:81,UPDATE_EL_STYLE:82,UPDATE_REL_STYLE:83,UPDATE_LAYOUT_CONFIG:84,attribute:85,STR:86,STR_KEY:87,STR_VALUE:88,ATTRIBUTE:89,ATTRIBUTE_EMPTY:90,$accept:0,$end:1},terminals_:{2:"error",7:"direction_tb",8:"direction_bt",9:"direction_rl",10:"direction_lr",15:"NEWLINE",16:":",18:"open_directive",19:"type_directive",20:"arg_directive",21:"close_directive",22:"C4_CONTEXT",24:"EOF",25:"C4_CONTAINER",26:"C4_COMPONENT",27:"C4_DYNAMIC",28:"C4_DEPLOYMENT",32:"title",33:"accDescription",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",43:"LBRACE",44:"ENTERPRISE_BOUNDARY",46:"SYSTEM_BOUNDARY",47:"BOUNDARY",48:"CONTAINER_BOUNDARY",49:"NODE",50:"NODE_L",51:"NODE_R",52:"RBRACE",54:"PERSON",55:"PERSON_EXT",56:"SYSTEM",57:"SYSTEM_DB",58:"SYSTEM_QUEUE",59:"SYSTEM_EXT",60:"SYSTEM_EXT_DB",61:"SYSTEM_EXT_QUEUE",62:"CONTAINER",63:"CONTAINER_DB",64:"CONTAINER_QUEUE",65:"CONTAINER_EXT",66:"CONTAINER_EXT_DB",67:"CONTAINER_EXT_QUEUE",68:"COMPONENT",69:"COMPONENT_DB",70:"COMPONENT_QUEUE",71:"COMPONENT_EXT",72:"COMPONENT_EXT_DB",73:"COMPONENT_EXT_QUEUE",74:"REL",75:"BIREL",76:"REL_U",77:"REL_D",78:"REL_L",79:"REL_R",80:"REL_B",81:"REL_INDEX",82:"UPDATE_EL_STYLE",83:"UPDATE_REL_STYLE",84:"UPDATE_LAYOUT_CONFIG",86:"STR",87:"STR_KEY",88:"STR_VALUE",89:"ATTRIBUTE",90:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[3,2],[5,1],[5,1],[5,1],[5,1],[4,1],[6,4],[6,6],[12,1],[13,1],[17,1],[14,1],[11,4],[11,4],[11,4],[11,4],[11,4],[23,1],[23,1],[23,2],[29,1],[29,2],[29,3],[31,1],[31,1],[31,2],[31,2],[31,1],[39,3],[40,3],[40,3],[40,4],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[41,1],[30,1],[30,2],[30,3],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,1],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[45,1],[45,2],[85,1],[85,2],[85,1],[85,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setDirection("TB");break;case 5:i.setDirection("BT");break;case 6:i.setDirection("RL");break;case 7:i.setDirection("LR");break;case 11:i.parseDirective("%%{","open_directive");break;case 12:break;case 13:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 14:i.parseDirective("}%%","close_directive","c4Context");break;case 15:case 16:case 17:case 18:case 19:i.setC4Type(a[o-3]);break;case 26:i.setTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 27:i.setAccDescription(a[o].substring(15)),this.$=a[o].substring(15);break;case 28:this.$=a[o].trim(),i.setTitle(this.$);break;case 29:case 30:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 35:case 36:a[o].splice(2,0,"ENTERPRISE"),i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 37:i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 38:a[o].splice(2,0,"CONTAINER"),i.addContainerBoundary(...a[o]),this.$=a[o];break;case 39:i.addDeploymentNode("node",...a[o]),this.$=a[o];break;case 40:i.addDeploymentNode("nodeL",...a[o]),this.$=a[o];break;case 41:i.addDeploymentNode("nodeR",...a[o]),this.$=a[o];break;case 42:i.popBoundaryParseStack();break;case 46:i.addPersonOrSystem("person",...a[o]),this.$=a[o];break;case 47:i.addPersonOrSystem("external_person",...a[o]),this.$=a[o];break;case 48:i.addPersonOrSystem("system",...a[o]),this.$=a[o];break;case 49:i.addPersonOrSystem("system_db",...a[o]),this.$=a[o];break;case 50:i.addPersonOrSystem("system_queue",...a[o]),this.$=a[o];break;case 51:i.addPersonOrSystem("external_system",...a[o]),this.$=a[o];break;case 52:i.addPersonOrSystem("external_system_db",...a[o]),this.$=a[o];break;case 53:i.addPersonOrSystem("external_system_queue",...a[o]),this.$=a[o];break;case 54:i.addContainer("container",...a[o]),this.$=a[o];break;case 55:i.addContainer("container_db",...a[o]),this.$=a[o];break;case 56:i.addContainer("container_queue",...a[o]),this.$=a[o];break;case 57:i.addContainer("external_container",...a[o]),this.$=a[o];break;case 58:i.addContainer("external_container_db",...a[o]),this.$=a[o];break;case 59:i.addContainer("external_container_queue",...a[o]),this.$=a[o];break;case 60:i.addComponent("component",...a[o]),this.$=a[o];break;case 61:i.addComponent("component_db",...a[o]),this.$=a[o];break;case 62:i.addComponent("component_queue",...a[o]),this.$=a[o];break;case 63:i.addComponent("external_component",...a[o]),this.$=a[o];break;case 64:i.addComponent("external_component_db",...a[o]),this.$=a[o];break;case 65:i.addComponent("external_component_queue",...a[o]),this.$=a[o];break;case 67:i.addRel("rel",...a[o]),this.$=a[o];break;case 68:i.addRel("birel",...a[o]),this.$=a[o];break;case 69:i.addRel("rel_u",...a[o]),this.$=a[o];break;case 70:i.addRel("rel_d",...a[o]),this.$=a[o];break;case 71:i.addRel("rel_l",...a[o]),this.$=a[o];break;case 72:i.addRel("rel_r",...a[o]),this.$=a[o];break;case 73:i.addRel("rel_b",...a[o]),this.$=a[o];break;case 74:a[o].splice(0,1),i.addRel("rel",...a[o]),this.$=a[o];break;case 75:i.updateElStyle("update_el_style",...a[o]),this.$=a[o];break;case 76:i.updateRelStyle("update_rel_style",...a[o]),this.$=a[o];break;case 77:i.updateLayoutConfig("update_layout_config",...a[o]),this.$=a[o];break;case 78:this.$=[a[o]];break;case 79:a[o].unshift(a[o-1]),this.$=a[o];break;case 80:case 82:this.$=a[o].trim();break;case 81:let t={};t[a[o-1].trim()]=a[o].trim(),this.$=t;break;case 83:this.$=""}},table:[{3:1,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[3]},{1:[2,1]},{1:[2,2]},{3:17,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[2,8]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{1:[2,7]},{13:18,19:[1,19]},{15:[1,20]},{15:[1,21]},{15:[1,22]},{15:[1,23]},{15:[1,24]},{19:[2,11]},{1:[2,3]},{14:25,16:[1,26],21:p},e([16,21],[2,12]),{23:28,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:79,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:80,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:81,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:82,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,83]},{17:84,20:[1,85]},{15:[2,14]},{24:[1,86]},e(it,[2,20],{53:32,39:58,40:70,42:71,30:87,44:_,46:x,47:v,48:k,49:w,50:T,51:C,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(it,[2,21]),e(rt,[2,23],{15:[1,88]}),e(it,[2,43],{15:[1,89]}),e(at,[2,26]),e(at,[2,27]),{35:[1,90]},{37:[1,91]},e(at,[2,30]),{45:92,85:93,86:st,87:ot,89:ct,90:lt},{45:98,85:93,86:st,87:ot,89:ct,90:lt},{45:99,85:93,86:st,87:ot,89:ct,90:lt},{45:100,85:93,86:st,87:ot,89:ct,90:lt},{45:101,85:93,86:st,87:ot,89:ct,90:lt},{45:102,85:93,86:st,87:ot,89:ct,90:lt},{45:103,85:93,86:st,87:ot,89:ct,90:lt},{45:104,85:93,86:st,87:ot,89:ct,90:lt},{45:105,85:93,86:st,87:ot,89:ct,90:lt},{45:106,85:93,86:st,87:ot,89:ct,90:lt},{45:107,85:93,86:st,87:ot,89:ct,90:lt},{45:108,85:93,86:st,87:ot,89:ct,90:lt},{45:109,85:93,86:st,87:ot,89:ct,90:lt},{45:110,85:93,86:st,87:ot,89:ct,90:lt},{45:111,85:93,86:st,87:ot,89:ct,90:lt},{45:112,85:93,86:st,87:ot,89:ct,90:lt},{45:113,85:93,86:st,87:ot,89:ct,90:lt},{45:114,85:93,86:st,87:ot,89:ct,90:lt},{45:115,85:93,86:st,87:ot,89:ct,90:lt},{45:116,85:93,86:st,87:ot,89:ct,90:lt},e(ht,[2,66]),{45:117,85:93,86:st,87:ot,89:ct,90:lt},{45:118,85:93,86:st,87:ot,89:ct,90:lt},{45:119,85:93,86:st,87:ot,89:ct,90:lt},{45:120,85:93,86:st,87:ot,89:ct,90:lt},{45:121,85:93,86:st,87:ot,89:ct,90:lt},{45:122,85:93,86:st,87:ot,89:ct,90:lt},{45:123,85:93,86:st,87:ot,89:ct,90:lt},{45:124,85:93,86:st,87:ot,89:ct,90:lt},{45:125,85:93,86:st,87:ot,89:ct,90:lt},{45:126,85:93,86:st,87:ot,89:ct,90:lt},{45:127,85:93,86:st,87:ot,89:ct,90:lt},{30:128,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:T,51:C,53:32,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,130],43:[1,129]},{45:131,85:93,86:st,87:ot,89:ct,90:lt},{45:132,85:93,86:st,87:ot,89:ct,90:lt},{45:133,85:93,86:st,87:ot,89:ct,90:lt},{45:134,85:93,86:st,87:ot,89:ct,90:lt},{45:135,85:93,86:st,87:ot,89:ct,90:lt},{45:136,85:93,86:st,87:ot,89:ct,90:lt},{45:137,85:93,86:st,87:ot,89:ct,90:lt},{24:[1,138]},{24:[1,139]},{24:[1,140]},{24:[1,141]},e(ut,[2,9]),{14:142,21:p},{21:[2,13]},{1:[2,15]},e(it,[2,22]),e(rt,[2,24],{31:31,29:143,32:f,33:g,34:y,36:m,38:b}),e(it,[2,44],{29:29,30:30,31:31,53:32,39:58,40:70,42:71,23:144,32:f,33:g,34:y,36:m,38:b,44:_,46:x,47:v,48:k,49:w,50:T,51:C,54:E,55:S,56:A,57:D,58:L,59:N,60:O,61:B,62:M,63:I,64:F,65:R,66:$,67:P,68:j,69:Y,70:z,71:U,72:W,73:H,74:q,75:V,76:G,77:X,78:Z,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(at,[2,28]),e(at,[2,29]),e(ht,[2,46]),e(dt,[2,78],{85:93,45:145,86:st,87:ot,89:ct,90:lt}),e(pt,[2,80]),{88:[1,146]},e(pt,[2,82]),e(pt,[2,83]),e(ht,[2,47]),e(ht,[2,48]),e(ht,[2,49]),e(ht,[2,50]),e(ht,[2,51]),e(ht,[2,52]),e(ht,[2,53]),e(ht,[2,54]),e(ht,[2,55]),e(ht,[2,56]),e(ht,[2,57]),e(ht,[2,58]),e(ht,[2,59]),e(ht,[2,60]),e(ht,[2,61]),e(ht,[2,62]),e(ht,[2,63]),e(ht,[2,64]),e(ht,[2,65]),e(ht,[2,67]),e(ht,[2,68]),e(ht,[2,69]),e(ht,[2,70]),e(ht,[2,71]),e(ht,[2,72]),e(ht,[2,73]),e(ht,[2,74]),e(ht,[2,75]),e(ht,[2,76]),e(ht,[2,77]),{41:147,52:[1,148]},{15:[1,149]},{43:[1,150]},e(ft,[2,35]),e(ft,[2,36]),e(ft,[2,37]),e(ft,[2,38]),e(ft,[2,39]),e(ft,[2,40]),e(ft,[2,41]),{1:[2,16]},{1:[2,17]},{1:[2,18]},{1:[2,19]},{15:[1,151]},e(rt,[2,25]),e(it,[2,45]),e(dt,[2,79]),e(pt,[2,81]),e(ht,[2,31]),e(ht,[2,42]),e(gt,[2,32]),e(gt,[2,33],{15:[1,152]}),e(ut,[2,10]),e(gt,[2,34])],defaultActions:{2:[2,1],3:[2,2],5:[2,8],6:[2,4],7:[2,5],8:[2,6],9:[2,7],16:[2,11],17:[2,3],27:[2,14],85:[2,13],86:[2,15],138:[2,16],139:[2,17],140:[2,18],141:[2,19]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},mt=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),18;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 10;case 5:return this.begin("type_directive"),19;case 6:return this.popState(),this.begin("arg_directive"),16;case 7:return this.popState(),this.popState(),21;case 8:return 20;case 9:return 32;case 10:return 33;case 11:return this.begin("acc_title"),34;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),36;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 78:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:case 21:case 75:break;case 19:c;break;case 20:return 15;case 22:return 22;case 23:return 25;case 24:return 26;case 25:return 27;case 26:return 28;case 27:return this.begin("person_ext"),55;case 28:return this.begin("person"),54;case 29:return this.begin("system_ext_queue"),61;case 30:return this.begin("system_ext_db"),60;case 31:return this.begin("system_ext"),59;case 32:return this.begin("system_queue"),58;case 33:return this.begin("system_db"),57;case 34:return this.begin("system"),56;case 35:return this.begin("boundary"),47;case 36:return this.begin("enterprise_boundary"),44;case 37:return this.begin("system_boundary"),46;case 38:return this.begin("container_ext_queue"),67;case 39:return this.begin("container_ext_db"),66;case 40:return this.begin("container_ext"),65;case 41:return this.begin("container_queue"),64;case 42:return this.begin("container_db"),63;case 43:return this.begin("container"),62;case 44:return this.begin("container_boundary"),48;case 45:return this.begin("component_ext_queue"),73;case 46:return this.begin("component_ext_db"),72;case 47:return this.begin("component_ext"),71;case 48:return this.begin("component_queue"),70;case 49:return this.begin("component_db"),69;case 50:return this.begin("component"),68;case 51:case 52:return this.begin("node"),49;case 53:return this.begin("node_l"),50;case 54:return this.begin("node_r"),51;case 55:return this.begin("rel"),74;case 56:return this.begin("birel"),75;case 57:case 58:return this.begin("rel_u"),76;case 59:case 60:return this.begin("rel_d"),77;case 61:case 62:return this.begin("rel_l"),78;case 63:case 64:return this.begin("rel_r"),79;case 65:return this.begin("rel_b"),80;case 66:return this.begin("rel_index"),81;case 67:return this.begin("update_el_style"),82;case 68:return this.begin("update_rel_style"),83;case 69:return this.begin("update_layout_config"),84;case 70:return"EOF_IN_STRUCT";case 71:return this.begin("attribute"),"ATTRIBUTE_EMPTY";case 72:this.begin("attribute");break;case 73:case 84:this.popState(),this.popState();break;case 74:case 76:return 90;case 77:this.begin("string");break;case 79:case 85:return"STR";case 80:this.begin("string_kv");break;case 81:return this.begin("string_kv_key"),"STR_KEY";case 82:this.popState(),this.begin("string_kv_value");break;case 83:return"STR_VALUE";case 86:return"LBRACE";case 87:return"RBRACE";case 88:return"SPACE";case 89:return"EOL";case 90:return 24}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},string_kv_value:{rules:[83,84],inclusive:!1},string_kv_key:{rules:[82],inclusive:!1},string_kv:{rules:[81],inclusive:!1},string:{rules:[78,79],inclusive:!1},attribute:{rules:[73,74,75,76,77,80,85],inclusive:!1},update_layout_config:{rules:[70,71,72,73],inclusive:!1},update_rel_style:{rules:[70,71,72,73],inclusive:!1},update_el_style:{rules:[70,71,72,73],inclusive:!1},rel_b:{rules:[70,71,72,73],inclusive:!1},rel_r:{rules:[70,71,72,73],inclusive:!1},rel_l:{rules:[70,71,72,73],inclusive:!1},rel_d:{rules:[70,71,72,73],inclusive:!1},rel_u:{rules:[70,71,72,73],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[70,71,72,73],inclusive:!1},node_r:{rules:[70,71,72,73],inclusive:!1},node_l:{rules:[70,71,72,73],inclusive:!1},node:{rules:[70,71,72,73],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[70,71,72,73],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[70,71,72,73],inclusive:!1},component_ext:{rules:[70,71,72,73],inclusive:!1},component_queue:{rules:[70,71,72,73],inclusive:!1},component_db:{rules:[70,71,72,73],inclusive:!1},component:{rules:[70,71,72,73],inclusive:!1},container_boundary:{rules:[70,71,72,73],inclusive:!1},container_ext_queue:{rules:[],inclusive:!1},container_ext_db:{rules:[70,71,72,73],inclusive:!1},container_ext:{rules:[70,71,72,73],inclusive:!1},container_queue:{rules:[70,71,72,73],inclusive:!1},container_db:{rules:[70,71,72,73],inclusive:!1},container:{rules:[70,71,72,73],inclusive:!1},birel:{rules:[70,71,72,73],inclusive:!1},system_boundary:{rules:[70,71,72,73],inclusive:!1},enterprise_boundary:{rules:[70,71,72,73],inclusive:!1},boundary:{rules:[70,71,72,73],inclusive:!1},system_ext_queue:{rules:[70,71,72,73],inclusive:!1},system_ext_db:{rules:[70,71,72,73],inclusive:!1},system_ext:{rules:[70,71,72,73],inclusive:!1},system_queue:{rules:[70,71,72,73],inclusive:!1},system_db:{rules:[70,71,72,73],inclusive:!1},system:{rules:[70,71,72,73],inclusive:!1},person_ext:{rules:[70,71,72,73],inclusive:!1},person:{rules:[70,71,72,73],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,86,87,88,89,90],inclusive:!0}}},t);function bt(){this.yy={}}return yt.lexer=mt,bt.prototype=yt,yt.Parser=bt,new bt}();Mk.parser=Mk;const Ik=Mk,Fk=t=>null!==t.match(/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/);let Rk=[],$k=[""],Pk="global",jk="",Yk=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],zk=[],Uk="",Wk=!1,Hk=4,qk=2;var Vk;const Gk=function(t){return null==t?Rk:Rk.filter((e=>e.parentBoundary===t))},Xk=function(){return Wk},Zk={addPersonOrSystem:function(t,e,n,i,r,a,s){if(null===e||null===n)return;let o={};const c=Rk.find((t=>t.alias===e));if(c&&e===c.alias?o=c:(o.alias=e,Rk.push(o)),o.label=null==n?{text:""}:{text:n},null==i)o.descr={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]={text:e}}else o.descr={text:i};if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.sprite=r;if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=e}else o.tags=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=e}else o.link=s;o.typeC4Shape={text:t},o.parentBoundary=Pk,o.wrap=Xk()},addPersonOrSystemBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Yk.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Yk.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"system"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=Pk,a.wrap=Xk(),jk=Pk,Pk=t,$k.push(jk)},addContainer:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Rk.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Rk.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=Xk(),c.typeC4Shape={text:t},c.parentBoundary=Pk},addContainerBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Yk.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Yk.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"container"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=Pk,a.wrap=Xk(),jk=Pk,Pk=t,$k.push(jk)},addComponent:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Rk.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Rk.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=Xk(),c.typeC4Shape={text:t},c.parentBoundary=Pk},addDeploymentNode:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Yk.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Yk.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.type={text:"node"};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.type={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.nodeType=t,c.parentBoundary=Pk,c.wrap=Xk(),jk=Pk,Pk=e,$k.push(jk)},popBoundaryParseStack:function(){Pk=jk,$k.pop(),jk=$k.pop(),$k.push(jk)},addRel:function(t,e,n,i,r,a,s,o,c){if(null==t||null==e||null==n||null==i)return;let l={};const h=zk.find((t=>t.from===e&&t.to===n));if(h?l=h:zk.push(l),l.type=t,l.from=e,l.to=n,l.label={text:i},null==r)l.techn={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];l[t]={text:e}}else l.techn={text:r};if(null==a)l.descr={text:""};else if("object"==typeof a){let[t,e]=Object.entries(a)[0];l[t]={text:e}}else l.descr={text:a};if("object"==typeof s){let[t,e]=Object.entries(s)[0];l[t]=e}else l.sprite=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];l[t]=e}else l.tags=o;if("object"==typeof c){let[t,e]=Object.entries(c)[0];l[t]=e}else l.link=c;l.wrap=Xk()},updateElStyle:function(t,e,n,i,r,a,s,o,c,l,h){let u=Rk.find((t=>t.alias===e));if(void 0!==u||(u=Yk.find((t=>t.alias===e)),void 0!==u)){if(null!=n)if("object"==typeof n){let[t,e]=Object.entries(n)[0];u[t]=e}else u.bgColor=n;if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];u[t]=e}else u.fontColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];u[t]=e}else u.borderColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];u[t]=e}else u.shadowing=a;if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];u[t]=e}else u.shape=s;if(null!=o)if("object"==typeof o){let[t,e]=Object.entries(o)[0];u[t]=e}else u.sprite=o;if(null!=c)if("object"==typeof c){let[t,e]=Object.entries(c)[0];u[t]=e}else u.techn=c;if(null!=l)if("object"==typeof l){let[t,e]=Object.entries(l)[0];u[t]=e}else u.legendText=l;if(null!=h)if("object"==typeof h){let[t,e]=Object.entries(h)[0];u[t]=e}else u.legendSprite=h}},updateRelStyle:function(t,e,n,i,r,a,s){const o=zk.find((t=>t.from===e&&t.to===n));if(void 0!==o){if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]=e}else o.textColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.lineColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=parseInt(e)}else o.offsetX=parseInt(a);if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=parseInt(e)}else o.offsetY=parseInt(s)}},updateLayoutConfig:function(t,e,n){let i=Hk,r=qk;if("object"==typeof e){const t=Object.values(e)[0];i=parseInt(t)}else i=parseInt(e);if("object"==typeof n){const t=Object.values(n)[0];r=parseInt(t)}else r=parseInt(n);i>=1&&(Hk=i),r>=1&&(qk=r)},autoWrap:Xk,setWrap:function(t){Wk=t},getC4ShapeArray:Gk,getC4Shape:function(t){return Rk.find((e=>e.alias===t))},getC4ShapeKeys:function(t){return Object.keys(Gk(t))},getBoundarys:function(t){return null==t?Yk:Yk.filter((e=>e.parentBoundary===t))},getCurrentBoundaryParse:function(){return Pk},getParentBoundaryParse:function(){return jk},getRels:function(){return zk},getTitle:function(){return Uk},getC4Type:function(){return Vk},getC4ShapeInRow:function(){return Hk},getC4BoundaryInRow:function(){return qk},setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().c4,clear:function(){Rk=[],Yk=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],jk="",Pk="global",$k=[""],zk=[],$k=[""],Uk="",Wk=!1,Hk=4,qk=2},LINETYPE:{SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},setTitle:function(t){let e=Mb(t,hv());Uk=e},setC4Type:function(t){let e=Mb(t,hv());Vk=e}},Qk=function(t,e){const n=t.append("rect");if(n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),"undefined"!==e.attrs&&null!==e.attrs)for(let i in e.attrs)n.attr(i,e.attrs[i]);return"undefined"!==e.class&&n.attr("class",e.class),n},Kk=function(t,e,n,i,r,a){const s=t.append("image");s.attr("width",e),s.attr("height",n),s.attr("x",i),s.attr("y",r);let o=a.startsWith("data:image/png;base64")?a:(0,xt.N)(a);s.attr("xlink:href",o)},Jk=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},tw=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),ew=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{fontSize:l,fontFamily:h,fontWeight:u}=c,d=t.split(jb.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,s=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").attr("dominant-baseline","middle").style("font-size",l).style("font-weight",u).style("font-family",h);s.append("tspan").attr("dy",t).text(d[p]).attr("alignment-baseline","mathematical"),i(s,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,0,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),nw=function(t,e,n){const i=t.append("g");let r=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",o={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(o={"stroke-width":1});let c={x:e.x,y:e.y,fill:r,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:o};Qk(i,c);let l=n.boundaryFont();l.fontWeight="bold",l.fontSize=l.fontSize+2,l.fontColor=s,ew(n)(e.label.text,i,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},l),e.type&&""!==e.type.text&&(l=n.boundaryFont(),l.fontColor=s,ew(n)(e.type.text,i,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},l)),e.descr&&""!==e.descr.text&&(l=n.boundaryFont(),l.fontSize=l.fontSize-2,l.fontColor=s,ew(n)(e.descr.text,i,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},l))},iw=function(t,e,n){let i=e.bgColor?e.bgColor:n[e.typeC4Shape.text+"_bg_color"],r=e.borderColor?e.borderColor:n[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="}const o=t.append("g");o.attr("class","person-man");const c=Jk();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":c.x=e.x,c.y=e.y,c.fill=i,c.width=e.width,c.height=e.height,c.style="stroke:"+r+";stroke-width:0.5;",c.rx=2.5,c.ry=2.5,Qk(o,c);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":o.append("path").attr("fill",i).attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":o.append("path").attr("fill",i).attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2))}let l=tw(n,e.typeC4Shape.text);switch(o.append("text").attr("fill",a).attr("font-family",l.fontFamily).attr("font-size",l.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":Kk(o,48,48,e.x+e.width/2-24,e.y+e.image.Y,s)}let h=n[e.typeC4Shape.text+"Font"]();return h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=a,ew(n)(e.label.text,o,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},h),h=n[e.typeC4Shape.text+"Font"](),h.fontColor=a,e.thchn&&""!==e.thchn.text?ew(n)(e.thchn.text,o,e.x,e.y+e.thchn.Y,e.width,e.height,{fill:a,"font-style":"italic"},h):e.type&&""!==e.type.text&&ew(n)(e.type.text,o,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},h),e.descr&&""!==e.descr.text&&(h=n.personFont(),h.fontColor=a,ew(n)(e.descr.text,o,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},h)),e.height},rw=(t,e,n)=>{const i=t.append("g");let r=0;for(let a of e){let t=a.textColor?a.textColor:"#444444",e=a.lineColor?a.lineColor:"#444444",s=a.offsetX?parseInt(a.offsetX):0,o=a.offsetY?parseInt(a.offsetY):0,c="";if(0===r){let t=i.append("line");t.attr("x1",a.startPoint.x),t.attr("y1",a.startPoint.y),t.attr("x2",a.endPoint.x),t.attr("y2",a.endPoint.y),t.attr("stroke-width","1"),t.attr("stroke",e),t.style("fill","none"),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)"),r=-1}else{let t=i.append("path");t.attr("fill","none").attr("stroke-width","1").attr("stroke",e).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)")}let l=n.messageFont();ew(n)(a.label.text,i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+o,a.label.width,a.label.height,{fill:t},l),a.techn&&""!==a.techn.text&&(l=n.messageFont(),ew(n)("["+a.techn.text+"]",i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+n.messageFontSize+5+o,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:t,"font-style":"italic"},l))}},aw=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},sw=function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},ow=function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},cw=function(t){const e=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);e.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),e.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},lw=function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},hw=function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},uw=function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")};xt.N;let dw=0,pw=0,fw=4,gw=2;Mk.yy=Zk;let yw={};class mw{constructor(t){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,bw(t.db.getConfig())}setData(t,e,n,i){this.nextData.startx=this.data.startx=t,this.nextData.stopx=this.data.stopx=e,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])}insert(t){this.nextData.cnt=this.nextData.cnt+1;let e=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+t.margin:this.nextData.stopx+2*t.margin,n=e+t.width,i=this.nextData.starty+2*t.margin,r=i+t.height;(e>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>fw)&&(e=this.nextData.startx+t.margin+yw.nextLinePaddingX,i=this.nextData.stopy+2*t.margin,this.nextData.stopx=n=e+t.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=r=i+t.height,this.nextData.cnt=1),t.x=e,t.y=i,this.updateVal(this.data,"startx",e,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",r,Math.max),this.updateVal(this.nextData,"startx",e,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",r,Math.max)}init(t){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},bw(t.db.getConfig())}bumpLastMargin(t){this.data.stopx+=t,this.data.stopy+=t}}const bw=function(t){Bx(yw,t),t.fontFamily&&(yw.personFontFamily=yw.systemFontFamily=yw.messageFontFamily=t.fontFamily),t.fontSize&&(yw.personFontSize=yw.systemFontSize=yw.messageFontSize=t.fontSize),t.fontWeight&&(yw.personFontWeight=yw.systemFontWeight=yw.messageFontWeight=t.fontWeight)},_w=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),xw=t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight});function vw(t,e,n,i,r){if(!e[t].width)if(n)e[t].text=Hx(e[t].text,r,i),e[t].textLines=e[t].text.split(jb.lineBreakRegex).length,e[t].width=r,e[t].height=Vx(e[t].text,i);else{let n=e[t].text.split(jb.lineBreakRegex);e[t].textLines=n.length;let r=0;e[t].height=0,e[t].width=0;for(const a of n)e[t].width=Math.max(Gx(a,i),e[t].width),r=Vx(a,i),e[t].height=e[t].height+r}}const kw=function(t,e,n){e.x=n.data.startx,e.y=n.data.starty,e.width=n.data.stopx-n.data.startx,e.height=n.data.stopy-n.data.starty,e.label.y=yw.c4ShapeMargin-35;let i=e.wrap&&yw.wrap,r=xw(yw);r.fontSize=r.fontSize+2,r.fontWeight="bold",vw("label",e,i,r,Gx(e.label.text,r)),nw(t,e,yw)},ww=function(t,e,n,i){let r=0;for(const a of i){r=0;const i=n[a];let s=_w(yw,i.typeC4Shape.text);switch(s.fontSize=s.fontSize-2,i.typeC4Shape.width=Gx("<<"+i.typeC4Shape.text+">>",s),i.typeC4Shape.height=s.fontSize+2,i.typeC4Shape.Y=yw.c4ShapePadding,r=i.typeC4Shape.Y+i.typeC4Shape.height-4,i.image={width:0,height:0,Y:0},i.typeC4Shape.text){case"person":case"external_person":i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height}i.sprite&&(i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height);let o=i.wrap&&yw.wrap,c=yw.width-2*yw.c4ShapePadding,l=_w(yw,i.typeC4Shape.text);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",vw("label",i,o,l,c),i.label.Y=r+8,r=i.label.Y+i.label.height,i.type&&""!==i.type.text){i.type.text="["+i.type.text+"]",vw("type",i,o,_w(yw,i.typeC4Shape.text),c),i.type.Y=r+5,r=i.type.Y+i.type.height}else if(i.techn&&""!==i.techn.text){i.techn.text="["+i.techn.text+"]",vw("techn",i,o,_w(yw,i.techn.text),c),i.techn.Y=r+5,r=i.techn.Y+i.techn.height}let h=r,u=i.label.width;if(i.descr&&""!==i.descr.text){vw("descr",i,o,_w(yw,i.typeC4Shape.text),c),i.descr.Y=r+20,r=i.descr.Y+i.descr.height,u=Math.max(i.label.width,i.descr.width),h=r-5*i.descr.textLines}u+=yw.c4ShapePadding,i.width=Math.max(i.width||yw.width,u,yw.width),i.height=Math.max(i.height||yw.height,h,yw.height),i.margin=i.margin||yw.c4ShapeMargin,t.insert(i),iw(e,i,yw)}t.bumpLastMargin(yw.c4ShapeMargin)};class Tw{constructor(t,e){this.x=t,this.y=e}}let Cw=function(t,e){let n=t.x,i=t.y,r=e.x,a=e.y,s=n+t.width/2,o=i+t.height/2,c=Math.abs(n-r),l=Math.abs(i-a),h=l/c,u=t.height/t.width,d=null;return i==a&&n<r?d=new Tw(n+t.width,o):i==a&&n>r?d=new Tw(n,o):n==r&&i<a?d=new Tw(s,i+t.height):n==r&&i>a&&(d=new Tw(s,i)),n>r&&i<a?d=u>=h?new Tw(n,o+h*t.width/2):new Tw(s-c/l*t.height/2,i+t.height):n<r&&i<a?d=u>=h?new Tw(n+t.width,o+h*t.width/2):new Tw(s+c/l*t.height/2,i+t.height):n<r&&i>a?d=u>=h?new Tw(n+t.width,o-h*t.width/2):new Tw(s+t.height/2*c/l,i):n>r&&i>a&&(d=u>=h?new Tw(n,o-t.width/2*h):new Tw(s-t.height/2*c/l,i)),d},Ew=function(t,e){let n={x:0,y:0};n.x=e.x+e.width/2,n.y=e.y+e.height/2;let i=Cw(t,n);return n.x=t.x+t.width/2,n.y=t.y+t.height/2,{startPoint:i,endPoint:Cw(e,n)}};function Sw(t,e,n,i,r){let a=new mw(r);a.data.widthLimit=n.data.widthLimit/Math.min(gw,i.length);for(let[s,o]of i.entries()){let i=0;o.image={width:0,height:0,Y:0},o.sprite&&(o.image.width=48,o.image.height=48,o.image.Y=i,i=o.image.Y+o.image.height);let c=o.wrap&&yw.wrap,l=xw(yw);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",vw("label",o,c,l,a.data.widthLimit),o.label.Y=i+8,i=o.label.Y+o.label.height,o.type&&""!==o.type.text){o.type.text="["+o.type.text+"]",vw("type",o,c,xw(yw),a.data.widthLimit),o.type.Y=i+5,i=o.type.Y+o.type.height}if(o.descr&&""!==o.descr.text){let t=xw(yw);t.fontSize=t.fontSize-2,vw("descr",o,c,t,a.data.widthLimit),o.descr.Y=i+20,i=o.descr.Y+o.descr.height}if(0==s||s%gw==0){let t=n.data.startx+yw.diagramMarginX,e=n.data.stopy+yw.diagramMarginY+i;a.setData(t,t,e,e)}else{let t=a.data.stopx!==a.data.startx?a.data.stopx+yw.diagramMarginX:a.data.startx,e=a.data.starty;a.setData(t,t,e,e)}a.name=o.alias;let h=r.db.getC4ShapeArray(o.alias),u=r.db.getC4ShapeKeys(o.alias);u.length>0&&ww(a,t,h,u),e=o.alias;let d=r.db.getBoundarys(e);d.length>0&&Sw(t,e,a,d,r),"global"!==o.alias&&kw(t,o,a),n.data.stopy=Math.max(a.data.stopy+yw.c4ShapeMargin,n.data.stopy),n.data.stopx=Math.max(a.data.stopx+yw.c4ShapeMargin,n.data.stopx),dw=Math.max(dw,n.data.stopx),pw=Math.max(pw,n.data.stopy)}}const Aw={drawPersonOrSystemArray:ww,drawBoundary:kw,setConf:bw,draw:function(t,e,n,i){yw=hv().c4;const r=hv().securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body");let o=i.db;i.db.setWrap(yw.wrap),fw=o.getC4ShapeInRow(),gw=o.getC4BoundaryInRow(),Db.debug(`C:${JSON.stringify(yw,null,2)}`);const c="sandbox"===r?s.select(`[id="${e}"]`):Ho(`[id="${e}"]`);hw(c),lw(c),uw(c);let l=new mw(i);l.setData(yw.diagramMarginX,yw.diagramMarginX,yw.diagramMarginY,yw.diagramMarginY),l.data.widthLimit=screen.availWidth,dw=yw.diagramMarginX,pw=yw.diagramMarginY;const h=i.db.getTitle();Sw(c,"",l,i.db.getBoundarys(""),i),aw(c),sw(c),cw(c),ow(c),function(t,e,n,i){let r=0;for(let s of e){r+=1;let t=s.wrap&&yw.wrap,e={fontFamily:(a=yw).messageFontFamily,fontSize:a.messageFontSize,fontWeight:a.messageFontWeight};"C4Dynamic"===i.db.getC4Type()&&(s.label.text=r+": "+s.label.text);let o=Gx(s.label.text,e);vw("label",s,t,e,o),s.techn&&""!==s.techn.text&&(o=Gx(s.techn.text,e),vw("techn",s,t,e,o)),s.descr&&""!==s.descr.text&&(o=Gx(s.descr.text,e),vw("descr",s,t,e,o));let c=n(s.from),l=n(s.to),h=Ew(c,l);s.startPoint=h.startPoint,s.endPoint=h.endPoint}var a;rw(t,e,yw)}(c,i.db.getRels(),i.db.getC4Shape,i),l.data.stopx=dw,l.data.stopy=pw;const u=l.data;let d=u.stopy-u.starty+2*yw.diagramMarginY;const p=u.stopx-u.startx+2*yw.diagramMarginX;h&&c.append("text").text(h).attr("x",(u.stopx-u.startx)/2-4*yw.diagramMarginX).attr("y",u.starty+yw.diagramMarginY),mv(c,d,p,yw.useMaxWidth);const f=h?60:0;c.attr("viewBox",u.startx-yw.diagramMarginX+" -"+(yw.diagramMarginY+f)+" "+p+" "+(d+f)),Db.debug("models:",u)}};var Dw=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,7],r=[1,8],a=[1,9],s=[1,10],o=[1,13],c=[1,12],l=[1,16,25],h=[1,20],u=[1,32],d=[1,33],p=[1,34],f=[1,36],g=[1,39],y=[1,37],m=[1,38],b=[1,44],_=[1,45],x=[1,40],v=[1,41],k=[1,42],w=[1,43],T=[1,48],C=[1,49],E=[1,50],S=[1,51],A=[16,25],D=[1,65],L=[1,66],N=[1,67],O=[1,68],B=[1,69],M=[1,70],I=[1,71],F=[1,80],R=[16,25,32,45,46,54,60,61,62,63,64,65,66,71,73],$=[16,25,30,32,45,46,50,54,60,61,62,63,64,65,66,71,73,88,89,90,91],P=[5,8,9,10,11,16,19,23,25],j=[54,88,89,90,91],Y=[54,65,66,88,89,90,91],z=[54,60,61,62,63,64,88,89,90,91],U=[16,25,32],W=[1,107],H={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statments:5,direction:6,directive:7,direction_tb:8,direction_bt:9,direction_rl:10,direction_lr:11,graphConfig:12,openDirective:13,typeDirective:14,closeDirective:15,NEWLINE:16,":":17,argDirective:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,CLASS_DIAGRAM:23,statements:24,EOF:25,statement:26,className:27,alphaNumToken:28,classLiteralName:29,GENERICTYPE:30,relationStatement:31,LABEL:32,classStatement:33,methodStatement:34,annotationStatement:35,clickStatement:36,cssClassStatement:37,noteStatement:38,acc_title:39,acc_title_value:40,acc_descr:41,acc_descr_value:42,acc_descr_multiline_value:43,CLASS:44,STYLE_SEPARATOR:45,STRUCT_START:46,members:47,STRUCT_STOP:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,STR:54,NOTE_FOR:55,noteText:56,NOTE:57,relationType:58,lineType:59,AGGREGATION:60,EXTENSION:61,COMPOSITION:62,DEPENDENCY:63,LOLLIPOP:64,LINE:65,DOTTED_LINE:66,CALLBACK:67,LINK:68,LINK_TARGET:69,CLICK:70,CALLBACK_NAME:71,CALLBACK_ARGS:72,HREF:73,CSSCLASS:74,commentToken:75,textToken:76,graphCodeTokens:77,textNoTagsToken:78,TAGSTART:79,TAGEND:80,"==":81,"--":82,PCT:83,DEFAULT:84,SPACE:85,MINUS:86,keywords:87,UNICODE_TEXT:88,NUM:89,ALPHA:90,BQUOTE_STR:91,$accept:0,$end:1},terminals_:{2:"error",5:"statments",8:"direction_tb",9:"direction_bt",10:"direction_rl",11:"direction_lr",16:"NEWLINE",17:":",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",23:"CLASS_DIAGRAM",25:"EOF",30:"GENERICTYPE",32:"LABEL",39:"acc_title",40:"acc_title_value",41:"acc_descr",42:"acc_descr_value",43:"acc_descr_multiline_value",44:"CLASS",45:"STYLE_SEPARATOR",46:"STRUCT_START",48:"STRUCT_STOP",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"STR",55:"NOTE_FOR",57:"NOTE",60:"AGGREGATION",61:"EXTENSION",62:"COMPOSITION",63:"DEPENDENCY",64:"LOLLIPOP",65:"LINE",66:"DOTTED_LINE",67:"CALLBACK",68:"LINK",69:"LINK_TARGET",70:"CLICK",71:"CALLBACK_NAME",72:"CALLBACK_ARGS",73:"HREF",74:"CSSCLASS",77:"graphCodeTokens",79:"TAGSTART",80:"TAGEND",81:"==",82:"--",83:"PCT",84:"DEFAULT",85:"SPACE",86:"MINUS",87:"keywords",88:"UNICODE_TEXT",89:"NUM",90:"ALPHA",91:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[3,1],[3,2],[6,1],[6,1],[6,1],[6,1],[4,1],[7,4],[7,6],[13,1],[14,1],[18,1],[15,1],[12,4],[24,1],[24,2],[24,3],[27,1],[27,1],[27,2],[27,2],[27,2],[26,1],[26,2],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,2],[26,2],[26,1],[33,2],[33,4],[33,5],[33,7],[35,4],[47,1],[47,2],[34,1],[34,2],[34,1],[34,1],[31,3],[31,4],[31,4],[31,5],[38,3],[38,2],[53,3],[53,2],[53,2],[53,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[36,3],[36,4],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[37,3],[75,1],[75,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[78,1],[78,1],[78,1],[78,1],[28,1],[28,1],[28,1],[29,1],[56,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.setDirection("TB");break;case 6:i.setDirection("BT");break;case 7:i.setDirection("RL");break;case 8:i.setDirection("LR");break;case 12:i.parseDirective("%%{","open_directive");break;case 13:i.parseDirective(a[o],"type_directive");break;case 14:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 15:i.parseDirective("}%%","close_directive","class");break;case 20:case 21:this.$=a[o];break;case 22:this.$=a[o-1]+a[o];break;case 23:case 24:this.$=a[o-1]+"~"+a[o];break;case 25:i.addRelation(a[o]);break;case 26:a[o-1].title=i.cleanupLabel(a[o]),i.addRelation(a[o-1]);break;case 35:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 36:case 37:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 38:i.addClass(a[o]);break;case 39:i.addClass(a[o-2]),i.setCssClass(a[o-2],a[o]);break;case 40:i.addClass(a[o-3]),i.addMembers(a[o-3],a[o-1]);break;case 41:i.addClass(a[o-5]),i.setCssClass(a[o-5],a[o-3]),i.addMembers(a[o-5],a[o-1]);break;case 42:i.addAnnotation(a[o],a[o-2]);break;case 43:this.$=[a[o]];break;case 44:a[o].push(a[o-1]),this.$=a[o];break;case 45:case 47:case 48:break;case 46:i.addMember(a[o-1],i.cleanupLabel(a[o]));break;case 49:this.$={id1:a[o-2],id2:a[o],relation:a[o-1],relationTitle1:"none",relationTitle2:"none"};break;case 50:this.$={id1:a[o-3],id2:a[o],relation:a[o-1],relationTitle1:a[o-2],relationTitle2:"none"};break;case 51:this.$={id1:a[o-3],id2:a[o],relation:a[o-2],relationTitle1:"none",relationTitle2:a[o-1]};break;case 52:this.$={id1:a[o-4],id2:a[o],relation:a[o-2],relationTitle1:a[o-3],relationTitle2:a[o-1]};break;case 53:i.addNote(a[o],a[o-1]);break;case 54:i.addNote(a[o]);break;case 55:this.$={type1:a[o-2],type2:a[o],lineType:a[o-1]};break;case 56:this.$={type1:"none",type2:a[o],lineType:a[o-1]};break;case 57:this.$={type1:a[o-1],type2:"none",lineType:a[o]};break;case 58:this.$={type1:"none",type2:"none",lineType:a[o]};break;case 59:this.$=i.relationType.AGGREGATION;break;case 60:this.$=i.relationType.EXTENSION;break;case 61:this.$=i.relationType.COMPOSITION;break;case 62:this.$=i.relationType.DEPENDENCY;break;case 63:this.$=i.relationType.LOLLIPOP;break;case 64:this.$=i.lineType.LINE;break;case 65:this.$=i.lineType.DOTTED_LINE;break;case 66:case 72:this.$=a[o-2],i.setClickEvent(a[o-1],a[o]);break;case 67:case 73:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 68:case 76:this.$=a[o-2],i.setLink(a[o-1],a[o]);break;case 69:case 77:this.$=a[o-3],i.setLink(a[o-2],a[o-1],a[o]);break;case 70:case 78:this.$=a[o-3],i.setLink(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 71:case 79:this.$=a[o-4],i.setLink(a[o-3],a[o-2],a[o]),i.setTooltip(a[o-3],a[o-1]);break;case 74:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 75:this.$=a[o-4],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setTooltip(a[o-3],a[o]);break;case 80:i.setCssClass(a[o-1],a[o])}},table:[{3:1,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{3:14,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[2,9]},e(l,[2,5]),e(l,[2,6]),e(l,[2,7]),e(l,[2,8]),{14:15,20:[1,16]},{16:[1,17]},{20:[2,12]},{1:[2,4]},{15:18,17:[1,19],22:h},e([17,22],[2,13]),{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:21,26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:T,89:C,90:E,91:S},{16:[1,52]},{18:53,21:[1,54]},{16:[2,15]},{25:[1,55]},{16:[1,56],25:[2,17]},e(A,[2,25],{32:[1,57]}),e(A,[2,27]),e(A,[2,28]),e(A,[2,29]),e(A,[2,30]),e(A,[2,31]),e(A,[2,32]),e(A,[2,33]),e(A,[2,34]),{40:[1,58]},{42:[1,59]},e(A,[2,37]),e(A,[2,45],{53:60,58:63,59:64,32:[1,62],54:[1,61],60:D,61:L,62:N,63:O,64:B,65:M,66:I}),{27:72,28:46,29:47,88:T,89:C,90:E,91:S},e(A,[2,47]),e(A,[2,48]),{28:73,88:T,89:C,90:E},{27:74,28:46,29:47,88:T,89:C,90:E,91:S},{27:75,28:46,29:47,88:T,89:C,90:E,91:S},{27:76,28:46,29:47,88:T,89:C,90:E,91:S},{54:[1,77]},{27:78,28:46,29:47,88:T,89:C,90:E,91:S},{54:F,56:79},e(R,[2,20],{28:46,29:47,27:81,30:[1,82],88:T,89:C,90:E,91:S}),e(R,[2,21],{30:[1,83]}),e($,[2,94]),e($,[2,95]),e($,[2,96]),e([16,25,30,32,45,46,54,60,61,62,63,64,65,66,71,73],[2,97]),e(P,[2,10]),{15:84,22:h},{22:[2,14]},{1:[2,16]},{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:85,25:[2,18],26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:T,89:C,90:E,91:S},e(A,[2,26]),e(A,[2,35]),e(A,[2,36]),{27:86,28:46,29:47,54:[1,87],88:T,89:C,90:E,91:S},{53:88,58:63,59:64,60:D,61:L,62:N,63:O,64:B,65:M,66:I},e(A,[2,46]),{59:89,65:M,66:I},e(j,[2,58],{58:90,60:D,61:L,62:N,63:O,64:B}),e(Y,[2,59]),e(Y,[2,60]),e(Y,[2,61]),e(Y,[2,62]),e(Y,[2,63]),e(z,[2,64]),e(z,[2,65]),e(A,[2,38],{45:[1,91],46:[1,92]}),{50:[1,93]},{54:[1,94]},{54:[1,95]},{71:[1,96],73:[1,97]},{28:98,88:T,89:C,90:E},{54:F,56:99},e(A,[2,54]),e(A,[2,98]),e(R,[2,22]),e(R,[2,23]),e(R,[2,24]),{16:[1,100]},{25:[2,19]},e(U,[2,49]),{27:101,28:46,29:47,88:T,89:C,90:E,91:S},{27:102,28:46,29:47,54:[1,103],88:T,89:C,90:E,91:S},e(j,[2,57],{58:104,60:D,61:L,62:N,63:O,64:B}),e(j,[2,56]),{28:105,88:T,89:C,90:E},{47:106,51:W},{27:108,28:46,29:47,88:T,89:C,90:E,91:S},e(A,[2,66],{54:[1,109]}),e(A,[2,68],{54:[1,111],69:[1,110]}),e(A,[2,72],{54:[1,112],72:[1,113]}),e(A,[2,76],{54:[1,115],69:[1,114]}),e(A,[2,80]),e(A,[2,53]),e(P,[2,11]),e(U,[2,51]),e(U,[2,50]),{27:116,28:46,29:47,88:T,89:C,90:E,91:S},e(j,[2,55]),e(A,[2,39],{46:[1,117]}),{48:[1,118]},{47:119,48:[2,43],51:W},e(A,[2,42]),e(A,[2,67]),e(A,[2,69]),e(A,[2,70],{69:[1,120]}),e(A,[2,73]),e(A,[2,74],{54:[1,121]}),e(A,[2,77]),e(A,[2,78],{69:[1,122]}),e(U,[2,52]),{47:123,51:W},e(A,[2,40]),{48:[2,44]},e(A,[2,71]),e(A,[2,75]),e(A,[2,79]),{48:[1,124]},e(A,[2,41])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],6:[2,9],13:[2,12],14:[2,4],20:[2,15],54:[2,14],55:[2,16],85:[2,19],119:[2,44]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},q=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return 8;case 2:return 9;case 3:return 10;case 4:return 11;case 5:return this.begin("type_directive"),20;case 6:return this.popState(),this.begin("arg_directive"),17;case 7:return this.popState(),this.popState(),22;case 8:return 21;case 9:case 10:case 19:case 27:break;case 11:return this.begin("acc_title"),39;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),41;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 39:case 42:case 45:case 48:case 51:case 54:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:return 16;case 20:case 21:return 23;case 22:return this.begin("struct"),46;case 23:return"EDGE_STATE";case 24:return"EOF_IN_STRUCT";case 25:return"OPEN_IN_STRUCT";case 26:return this.popState(),48;case 28:return"MEMBER";case 29:return 44;case 30:return 74;case 31:return 67;case 32:return 68;case 33:return 70;case 34:return 55;case 35:return 57;case 36:return 49;case 37:return 50;case 38:this.begin("generic");break;case 40:return"GENERICTYPE";case 41:this.begin("string");break;case 43:return"STR";case 44:this.begin("bqstring");break;case 46:return"BQUOTE_STR";case 47:this.begin("href");break;case 49:return 73;case 50:this.begin("callback_name");break;case 52:this.popState(),this.begin("callback_args");break;case 53:return 71;case 55:return 72;case 56:case 57:case 58:case 59:return 69;case 60:case 61:return 61;case 62:case 63:return 63;case 64:return 62;case 65:return 60;case 66:return 64;case 67:return 65;case 68:return 66;case 69:return 32;case 70:return 45;case 71:return 86;case 72:return"DOT";case 73:return"PLUS";case 74:return 83;case 75:case 76:return"EQUALS";case 77:return 90;case 78:return"PUNCTUATION";case 79:return 89;case 80:return 88;case 81:return 85;case 82:return 25}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:\[\*\])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[`])/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},callback_args:{rules:[54,55],inclusive:!1},callback_name:{rules:[51,52,53],inclusive:!1},href:{rules:[48,49],inclusive:!1},struct:{rules:[23,24,25,26,27,28],inclusive:!1},generic:{rules:[39,40],inclusive:!1},bqstring:{rules:[45,46],inclusive:!1},string:{rules:[42,43],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,29,30,31,32,33,34,35,36,37,38,41,44,47,50,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82],inclusive:!0}}},t);function V(){this.yy={}}return H.lexer=q,V.prototype=H,H.Parser=V,new V}();Dw.parser=Dw;const Lw=Dw,Nw=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*classDiagram/)},Ow=(t,e)=>{var n;return null!==t.match(/^\s*classDiagram/)&&"dagre-wrapper"===(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)||null!==t.match(/^\s*classDiagram-v2/)},Bw="classid-";let Mw=[],Iw={},Fw=[],Rw=0,$w=[];const Pw=t=>jb.sanitizeText(t,hv()),jw=function(t){let e="",n=t;if(t.indexOf("~")>0){let i=t.split("~");n=i[0],e=jb.sanitizeText(i[1],hv())}return{className:n,type:e}},Yw=function(t){let e=jw(t);void 0===Iw[e.className]&&(Iw[e.className]={id:e.className,type:e.type,cssClasses:[],methods:[],members:[],annotations:[],domId:Bw+e.className+"-"+Rw},Rw++)},zw=function(t){const e=Object.keys(Iw);for(const n of e)if(Iw[n].id===t)return Iw[n].domId},Uw=function(t,e){const n=jw(t).className,i=Iw[n];if("string"==typeof e){const t=e.trim();t.startsWith("<<")&&t.endsWith(">>")?i.annotations.push(Pw(t.substring(2,t.length-2))):t.indexOf(")")>0?i.methods.push(Pw(t)):t&&i.members.push(Pw(t))}},Ww=function(t,e){t.split(",").forEach((function(t){let n=t;t[0].match(/\d/)&&(n=Bw+n),void 0!==Iw[n]&&Iw[n].cssClasses.push(e)}))},Hw=function(t,e,n){const i=hv();let r=t,a=zw(r);if("loose"===i.securityLevel&&void 0!==e&&void 0!==Iw[r]){let t=[];if("string"==typeof n){t=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let e=0;e<t.length;e++){let n=t[e].trim();'"'===n.charAt(0)&&'"'===n.charAt(n.length-1)&&(n=n.substr(1,n.length-2)),t[e]=n}}0===t.length&&t.push(a),$w.push((function(){const n=document.querySelector(`[id="${a}"]`);null!==n&&n.addEventListener("click",(function(){tv.runFunc(e,...t)}),!1)}))}},qw=function(t){let e=Ho(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=Ho("body").append("div").attr("class","mermaidTooltip").style("opacity",0));Ho(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=Ho(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);Ho(this).classed("hover",!1)}))};$w.push(qw);let Vw="TB";const Gw={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,getConfig:()=>hv().class,addClass:Yw,bindFunctions:function(t){$w.forEach((function(e){e(t)}))},clear:function(){Mw=[],Iw={},Fw=[],$w=[],$w.push(qw),Gv()},getClass:function(t){return Iw[t]},getClasses:function(){return Iw},getNotes:function(){return Fw},addAnnotation:function(t,e){const n=jw(t).className;Iw[n].annotations.push(e)},addNote:function(t,e){const n={id:`note${Fw.length}`,class:e,text:t};Fw.push(n)},getRelations:function(){return Mw},addRelation:function(t){Db.debug("Adding relation: "+JSON.stringify(t)),Yw(t.id1),Yw(t.id2),t.id1=jw(t.id1).className,t.id2=jw(t.id2).className,t.relationTitle1=jb.sanitizeText(t.relationTitle1.trim(),hv()),t.relationTitle2=jb.sanitizeText(t.relationTitle2.trim(),hv()),Mw.push(t)},getDirection:()=>Vw,setDirection:t=>{Vw=t},addMember:Uw,addMembers:function(t,e){Array.isArray(e)&&(e.reverse(),e.forEach((e=>Uw(t,e))))},cleanupLabel:function(t){return":"===t.substring(0,1)?jb.sanitizeText(t.substr(1).trim(),hv()):Pw(t.trim())},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){Hw(t,e,n),Iw[t].haveCallback=!0})),Ww(t,"clickable")},setCssClass:Ww,setLink:function(t,e,n){const i=hv();t.split(",").forEach((function(t){let r=t;t[0].match(/\d/)&&(r=Bw+r),void 0!==Iw[r]&&(Iw[r].link=tv.formatUrl(e,i),"sandbox"===i.securityLevel?Iw[r].linkTarget="_top":Iw[r].linkTarget="string"==typeof n?Pw(n):"_blank")})),Ww(t,"clickable")},getTooltip:function(t){return Iw[t].tooltip},setTooltip:function(t,e){const n=hv();t.split(",").forEach((function(t){void 0!==e&&(Iw[t].tooltip=jb.sanitizeText(e,n))}))},lookUpDomId:zw,setDiagramTitle:Jv,getDiagramTitle:tk};let Xw=0;const Zw=function(t){let e=t.match(/^([#+~-])?(\w+)(~\w+~|\[])?\s+(\w+) *([$*])?$/),n=t.match(/^([#+|~-])?(\w+) *\( *(.*)\) *([$*])? *(\w*[[\]|~]*\s*\w*~?)$/);return e&&!n?Qw(e):n?Kw(n):Jw(t)},Qw=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pb(t[3].trim()):"",s=t[4]?t[4].trim():"",o=t[5]?t[5].trim():"";n=i+r+a+" "+s,e=eT(o)}catch(i){n=t}return{displayText:n,cssStyle:e}},Kw=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pb(t[3].trim()):"",s=t[4]?t[4].trim():"";n=i+r+"("+a+")"+(t[5]?" : "+Pb(t[5]).trim():""),e=eT(s)}catch(i){n=t}return{displayText:n,cssStyle:e}},Jw=function(t){let e="",n="",i="",r=t.indexOf("("),a=t.indexOf(")");if(r>1&&a>r&&a<=t.length){let s="",o="",c=t.substring(0,1);c.match(/\w/)?o=t.substring(0,r).trim():(c.match(/[#+~-]/)&&(s=c),o=t.substring(1,r).trim());const l=t.substring(r+1,a);t.substring(a+1,1),n=eT(t.substring(a+1,a+2)),e=s+o+"("+Pb(l.trim())+")",a<t.length&&(i=t.substring(a+2).trim(),""!==i&&(i=" : "+Pb(i),e+=i))}else e=Pb(t);return{displayText:e,cssStyle:n}},tT=function(t,e,n,i){let r=Zw(e);const a=t.append("tspan").attr("x",i.padding).text(r.displayText);""!==r.cssStyle&&a.attr("style",r.cssStyle),n||a.attr("dy",i.textHeight)},eT=function(t){switch(t){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}},nT=function(t,e,n,i){Db.debug("Rendering class ",e,n);const r=e.id,a={id:r,label:e.id,width:0,height:0},s=t.append("g").attr("id",i.db.lookUpDomId(r)).attr("class","classGroup");let o;o=e.link?s.append("svg:a").attr("xlink:href",e.link).attr("target",e.linkTarget).append("text").attr("y",n.textHeight+n.padding).attr("x",0):s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);let c=!0;e.annotations.forEach((function(t){const e=o.append("tspan").text("\xab"+t+"\xbb");c||e.attr("dy",n.textHeight),c=!1}));let l=e.id;void 0!==e.type&&""!==e.type&&(l+="<"+e.type+">");const h=o.append("tspan").text(l).attr("class","title");c||h.attr("dy",n.textHeight);const u=o.node().getBBox().height,d=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin/2).attr("y2",n.padding+u+n.dividerMargin/2),p=s.append("text").attr("x",n.padding).attr("y",u+n.dividerMargin+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.members.forEach((function(t){tT(p,t,c,n),c=!1}));const f=p.node().getBBox(),g=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin+f.height).attr("y2",n.padding+u+n.dividerMargin+f.height),y=s.append("text").attr("x",n.padding).attr("y",u+2*n.dividerMargin+f.height+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.methods.forEach((function(t){tT(y,t,c,n),c=!1}));const m=s.node().getBBox();var b=" ";e.cssClasses.length>0&&(b+=e.cssClasses.join(" "));const _=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",m.width+2*n.padding).attr("height",m.height+n.padding+.5*n.dividerMargin).attr("class",b).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(_-t.getBBox().width)/2)})),e.tooltip&&o.insert("title").text(e.tooltip),d.attr("x2",_),g.attr("x2",_),a.width=_,a.height=m.height+n.padding+.5*n.dividerMargin,a},iT=function(t,e,n,i,r){const a=function(t){switch(t){case r.db.relationType.AGGREGATION:return"aggregation";case r.db.relationType.EXTENSION:return"extension";case r.db.relationType.COMPOSITION:return"composition";case r.db.relationType.DEPENDENCY:return"dependency";case r.db.relationType.LOLLIPOP:return"lollipop"}};e.points=e.points.filter((t=>!Number.isNaN(t.y)));const s=e.points,o=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(Bc),c=t.append("path").attr("d",o(s)).attr("id","edge"+Xw).attr("class","relation");let l,h,u="";i.arrowMarkerAbsolute&&(u=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,u=u.replace(/\(/g,"\\("),u=u.replace(/\)/g,"\\)")),1==n.relation.lineType&&c.attr("class","relation dashed-line"),10==n.relation.lineType&&c.attr("class","relation dotted-line"),"none"!==n.relation.type1&&c.attr("marker-start","url("+u+"#"+a(n.relation.type1)+"Start)"),"none"!==n.relation.type2&&c.attr("marker-end","url("+u+"#"+a(n.relation.type2)+"End)");const d=e.points.length;let p,f,g,y,m=tv.calcLabelPosition(e.points);if(l=m.x,h=m.y,d%2!=0&&d>1){let t=tv.calcCardinalityPosition("none"!==n.relation.type1,e.points,e.points[0]),i=tv.calcCardinalityPosition("none"!==n.relation.type2,e.points,e.points[d-1]);Db.debug("cardinality_1_point "+JSON.stringify(t)),Db.debug("cardinality_2_point "+JSON.stringify(i)),p=t.x,f=t.y,g=i.x,y=i.y}if(void 0!==n.title){const e=t.append("g").attr("class","classLabel"),r=e.append("text").attr("class","label").attr("x",l).attr("y",h).attr("fill","red").attr("text-anchor","middle").text(n.title);window.label=r;const a=r.node().getBBox();e.insert("rect",":first-child").attr("class","box").attr("x",a.x-i.padding/2).attr("y",a.y-i.padding/2).attr("width",a.width+i.padding).attr("height",a.height+i.padding)}if(Db.info("Rendering relation "+JSON.stringify(n)),void 0!==n.relationTitle1&&"none"!==n.relationTitle1){t.append("g").attr("class","cardinality").append("text").attr("class","type1").attr("x",p).attr("y",f).attr("fill","black").attr("font-size","6").text(n.relationTitle1)}if(void 0!==n.relationTitle2&&"none"!==n.relationTitle2){t.append("g").attr("class","cardinality").append("text").attr("class","type2").attr("x",g).attr("y",y).attr("fill","black").attr("font-size","6").text(n.relationTitle2)}Xw++},rT=function(t,e,n,i){Db.debug("Rendering note ",e,n);const r=e.id,a={id:r,text:e.text,width:0,height:0},s=t.append("g").attr("id",r).attr("class","classGroup");let o=s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);const c=JSON.parse(`"${e.text}"`).split("\n");c.forEach((function(t){Db.debug(`Adding line: ${t}`),o.append("tspan").text(t).attr("class","title").attr("dy",n.textHeight)}));const l=s.node().getBBox(),h=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",l.width+2*n.padding).attr("height",l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(h-t.getBBox().width)/2)})),a.width=h,a.height=l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin,a};let aT={};const sT=function(t){const e=Object.entries(aT).find((e=>e[1].label===t));if(e)return e[0]},oT={draw:function(t,e,n,i){const r=hv().class;aT={},Db.info("Rendering diagram "+t);const a=hv().securityLevel;let s;"sandbox"===a&&(s=Ho("#i"+e));const o=Ho("sandbox"===a?s.nodes()[0].contentDocument.body:"body"),c=o.select(`[id='${e}']`);var l;(l=c).append("defs").append("marker").attr("id","extensionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),l.append("defs").append("marker").attr("id","extensionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z"),l.append("defs").append("marker").attr("id","compositionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","compositionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","aggregationStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","aggregationEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","dependencyStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),l.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z");const h=new Vf({multigraph:!0});h.setGraph({isMultiGraph:!0}),h.setDefaultEdgeLabel((function(){return{}}));const u=i.db.getClasses(),d=Object.keys(u);for(const m of d){const t=u[m],e=nT(c,t,r,i);aT[e.id]=e,h.setNode(e.id,e),Db.info("Org height: "+e.height)}i.db.getRelations().forEach((function(t){Db.info("tjoho"+sT(t.id1)+sT(t.id2)+JSON.stringify(t)),h.setEdge(sT(t.id1),sT(t.id2),{relation:t},t.title||"DEFAULT")}));i.db.getNotes().forEach((function(t){Db.debug(`Adding note: ${JSON.stringify(t)}`);const e=rT(c,t,r,i);aT[e.id]=e,h.setNode(e.id,e),t.class&&t.class in u&&h.setEdge(t.id,sT(t.class),{relation:{id1:t.id,id2:t.class,relation:{type1:"none",type2:"none",lineType:10}}},"DEFAULT")})),Em(h),h.nodes().forEach((function(t){void 0!==t&&void 0!==h.node(t)&&(Db.debug("Node "+t+": "+JSON.stringify(h.node(t))),o.select("#"+(i.db.lookUpDomId(t)||t)).attr("transform","translate("+(h.node(t).x-h.node(t).width/2)+","+(h.node(t).y-h.node(t).height/2)+" )"))})),h.edges().forEach((function(t){void 0!==t&&void 0!==h.edge(t)&&(Db.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(h.edge(t))),iT(c,h.edge(t),h.edge(t).relation,r,i))}));const p=c.node().getBBox(),f=p.width+40,g=p.height+40;mv(c,g,f,r.useMaxWidth);const y=`${p.x-20} ${p.y-20} ${f} ${g}`;Db.debug(`viewBox ${y}`),c.attr("viewBox",y)}},cT={extension:(t,e,n)=>{Db.trace("Making markers for ",n),t.append("defs").append("marker").attr("id",e+"-extensionStart").attr("class","marker extension "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},composition:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-compositionStart").attr("class","marker composition "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},aggregation:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},dependency:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},lollipop:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","white").attr("cx",6).attr("cy",7).attr("r",6)},point:(t,e)=>{t.append("marker").attr("id",e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",10).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",0).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},circle:(t,e)=>{t.append("marker").attr("id",e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},cross:(t,e)=>{t.append("marker").attr("id",e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},barb:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")}},lT=(t,e,n,i)=>{e.forEach((e=>{cT[e](t,n,i)}))};const hT=(t,e,n,i)=>{let r=t||"";if("object"==typeof r&&(r=r[0]),$b(hv().flowchart.htmlLabels)){r=r.replace(/\\n|\n/g,"<br />"),Db.info("vertexText"+r);let t=function(t){const e=Ho(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),n=e.append("xhtml:div"),i=t.label,r=t.isNode?"nodeLabel":"edgeLabel";var a,s;return n.html('<span class="'+r+'" '+(t.labelStyle?'style="'+t.labelStyle+'"':"")+">"+i+"</span>"),a=n,(s=t.labelStyle)&&a.attr("style",s),n.style("display","inline-block"),n.style("white-space","nowrap"),n.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}({isNode:i,label:lL(r).replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`)),labelStyle:e.replace("fill:","color:")});return t}{const t=document.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",e.replace("color:","fill:"));let i=[];i="string"==typeof r?r.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(r)?r:[];for(const e of i){const i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),n?i.setAttribute("class","title-row"):i.setAttribute("class","row"),i.textContent=e.trim(),t.appendChild(i)}return t}},uT=(t,e,n,i)=>{let r;r=n||"node default";const a=t.insert("g").attr("class",r).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",e.labelStyle);let o;o=void 0===e.labelText?"":"string"==typeof e.labelText?e.labelText:e.labelText[0];const c=s.node().appendChild(hT(Mb(lL(o),hv()),e.labelStyle,!1,i));let l=c.getBBox();if($b(hv().flowchart.htmlLabels)){const t=c.children[0],e=Ho(c);l=t.getBoundingClientRect(),e.attr("width",l.width),e.attr("height",l.height)}const h=e.padding/2;return s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),{shapeSvg:a,bbox:l,halfPadding:h,label:s}},dT=(t,e)=>{const n=e.node().getBBox();t.width=n.width,t.height=n.height};function pT(t,e,n,i){return t.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+n/2+")")}let fT={},gT={},yT={};const mT=(t,e)=>(Db.trace("In isDecendant",e," ",t," = ",gT[e].includes(t)),!!gT[e].includes(t)),bT=(t,e,n,i)=>{Db.warn("Copying children of ",t,"root",i,"data",e.node(t),i);const r=e.children(t)||[];t!==i&&r.push(t),Db.warn("Copying (nodes) clusterId",t,"nodes",r),r.forEach((r=>{if(e.children(r).length>0)bT(r,e,n,i);else{const a=e.node(r);Db.info("cp ",r," to ",i," with parent ",t),n.setNode(r,a),i!==e.parent(r)&&(Db.warn("Setting parent",r,e.parent(r)),n.setParent(r,e.parent(r))),t!==i&&r!==t?(Db.debug("Setting parent",r,t),n.setParent(r,t)):(Db.info("In copy ",t,"root",i,"data",e.node(t),i),Db.debug("Not Setting parent for node=",r,"cluster!==rootId",t!==i,"node!==clusterId",r!==t));const s=e.edges(r);Db.debug("Copying Edges",s),s.forEach((r=>{Db.info("Edge",r);const a=e.edge(r.v,r.w,r.name);Db.info("Edge data",a,i);try{((t,e)=>(Db.info("Decendants of ",e," is ",gT[e]),Db.info("Edge is ",t),t.v!==e&&t.w!==e&&(gT[e]?gT[e].includes(t.v)||mT(t.v,e)||mT(t.w,e)||gT[e].includes(t.w):(Db.debug("Tilt, ",e,",not in decendants"),!1))))(r,i)?(Db.info("Copying as ",r.v,r.w,a,r.name),n.setEdge(r.v,r.w,a,r.name),Db.info("newGraph edges ",n.edges(),n.edge(n.edges()[0]))):Db.info("Skipping copy of edge ",r.v,"--\x3e",r.w," rootId: ",i," clusterId:",t)}catch(s){Db.error(s)}}))}Db.debug("Removing node",r),e.removeNode(r)}))},_T=(t,e)=>{const n=e.children(t);let i=[...n];for(const r of n)yT[r]=t,i=[...i,..._T(r,e)];return i},xT=(t,e)=>{Db.trace("Searching",t);const n=e.children(t);if(Db.trace("Searching children of id ",t,n),n.length<1)return Db.trace("This is a valid node",t),t;for(const i of n){const n=xT(i,e);if(n)return Db.trace("Found replacement for",t," => ",n),n}},vT=t=>fT[t]&&fT[t].externalConnections&&fT[t]?fT[t].id:t,kT=(t,e)=>{if(Db.warn("extractor - ",e,fb(t),t.children("D")),e>10)return void Db.error("Bailing out");let n=t.nodes(),i=!1;for(const r of n){const e=t.children(r);i=i||e.length>0}if(i){Db.debug("Nodes = ",n,e);for(const i of n)if(Db.debug("Extracting node",i,fT,fT[i]&&!fT[i].externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),fT[i])if(!fT[i].externalConnections&&t.children(i)&&t.children(i).length>0){Db.warn("Cluster without external connections, without a parent and with children",i,e);let n="TB"===t.graph().rankdir?"LR":"TB";fT[i]&&fT[i].clusterData&&fT[i].clusterData.dir&&(n=fT[i].clusterData.dir,Db.warn("Fixing dir",fT[i].clusterData.dir,n));const r=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:n,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));Db.warn("Old graph before copy",fb(t)),bT(i,t,r,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:fT[i].clusterData,labelText:fT[i].labelText,graph:r}),Db.warn("New graph after copy node: (",i,")",fb(r)),Db.debug("Old graph after copy",fb(t))}else Db.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!fT[i].externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),Db.debug(fT);else Db.debug("Not a cluster",i,e);n=t.nodes(),Db.warn("New list of nodes",n);for(const i of n){const n=t.node(i);Db.warn(" Now next level",i,n),n.clusterNode&&kT(n.graph,e+1)}}else Db.debug("Done, no node has children",t.nodes())},wT=(t,e)=>{if(0===e.length)return[];let n=Object.assign(e);return e.forEach((e=>{const i=t.children(e),r=wT(t,i);n=[...n,...r]})),n};function TT(t,e,n,i){var r=t.x,a=t.y,s=r-i.x,o=a-i.y,c=Math.sqrt(e*e*o*o+n*n*s*s),l=Math.abs(e*n*s/c);i.x<r&&(l=-l);var h=Math.abs(e*n*o/c);return i.y<a&&(h=-h),{x:r+l,y:a+h}}function CT(t,e,n,i){var r,a,s,o,c,l,h,u,d,p,f,g,y;if(r=e.y-t.y,s=t.x-e.x,c=e.x*t.y-t.x*e.y,d=r*n.x+s*n.y+c,p=r*i.x+s*i.y+c,!(0!==d&&0!==p&&ET(d,p)||(a=i.y-n.y,o=n.x-i.x,l=i.x*n.y-n.x*i.y,h=a*t.x+o*t.y+l,u=a*e.x+o*e.y+l,0!==h&&0!==u&&ET(h,u)||0==(f=r*o-a*s))))return g=Math.abs(f/2),{x:(y=s*l-o*c)<0?(y-g)/f:(y+g)/f,y:(y=a*c-r*l)<0?(y-g)/f:(y+g)/f}}function ET(t,e){return t*e>0}const ST=(t,e)=>{var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=0===o?0:l*s/o,i=l):(s<0&&(c=-c),n=c,i=0===s?0:c*o/s),{x:r+n,y:a+i}},AT={node:function(t,e){return t.intersect(e)},circle:function(t,e,n){return TT(t,e,e,n)},ellipse:TT,polygon:function(t,e,n){var i=t.x,r=t.y,a=[],s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY;"function"==typeof e.forEach?e.forEach((function(t){s=Math.min(s,t.x),o=Math.min(o,t.y)})):(s=Math.min(s,e.x),o=Math.min(o,e.y));for(var c=i-t.width/2-s,l=r-t.height/2-o,h=0;h<e.length;h++){var u=e[h],d=e[h<e.length-1?h+1:0],p=CT(t,n,{x:c+u.x,y:l+u.y},{x:c+d.x,y:l+d.y});p&&a.push(p)}return a.length?(a.length>1&&a.sort((function(t,e){var i=t.x-n.x,r=t.y-n.y,a=Math.sqrt(i*i+r*r),s=e.x-n.x,o=e.y-n.y,c=Math.sqrt(s*s+o*o);return a<c?-1:a===c?0:1})),a[0]):t},rect:ST},DT=(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,"node "+e.classes,!0);Db.info("Classes = ",e.classes);const a=n.insert("rect",":first-child");return a.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),dT(e,a),e.intersect=function(t){return AT.rect(e,t)},n};function LT(t,e,n,i){const r=[],a=t=>{r.push(t,0)},s=t=>{r.push(0,t)};e.includes("t")?(Db.debug("add top border"),a(n)):s(n),e.includes("r")?(Db.debug("add right border"),a(i)):s(i),e.includes("b")?(Db.debug("add bottom border"),a(n)):s(n),e.includes("l")?(Db.debug("add left border"),a(i)):s(i),t.attr("stroke-dasharray",r.join(" "))}const NT=(t,e,n)=>{const i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id);let r=70,a=10;"LR"===n&&(r=10,a=70);const s=i.append("rect").attr("x",-1*r/2).attr("y",-1*a/2).attr("width",r).attr("height",a).attr("class","fork-join");return dT(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(t){return AT.rect(e,t)},i},OT={question:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding+(i.height+e.padding),a=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];Db.info("Question main (Circle)");const s=pT(n,r,r,a);return s.attr("style",e.style),dT(e,s),e.intersect=function(t){return Db.warn("Intersect called"),AT.polygon(e,a,t)},n},rect:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,"node "+e.classes,!0);Db.trace("Classes = ",e.classes);const a=n.insert("rect",":first-child"),s=i.width+e.padding,o=i.height+e.padding;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",s).attr("height",o),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(LT(a,e.props.borders,s,o),t.delete("borders")),t.forEach((t=>{Db.warn(`Unknown node property ${t}`)}))}return dT(e,a),e.intersect=function(t){return AT.rect(e,t)},n},labelRect:(t,e)=>{const{shapeSvg:n}=uT(t,e,"label",!0);Db.trace("Classes = ",e.classes);const i=n.insert("rect",":first-child");if(i.attr("width",0).attr("height",0),n.attr("class","label edgeLabel"),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(LT(i,e.props.borders,0,0),t.delete("borders")),t.forEach((t=>{Db.warn(`Unknown node property ${t}`)}))}return dT(e,i),e.intersect=function(t){return AT.rect(e,t)},n},rectWithTitle:(t,e)=>{let n;n=e.classes?"node "+e.classes:"node default";const i=t.insert("g").attr("class",n).attr("id",e.domId||e.id),r=i.insert("rect",":first-child"),a=i.insert("line"),s=i.insert("g").attr("class","label"),o=e.labelText.flat?e.labelText.flat():e.labelText;let c="";c="object"==typeof o?o[0]:o,Db.info("Label text abc79",c,o,"object"==typeof o);const l=s.node().appendChild(hT(c,e.labelStyle,!0,!0));let h={width:0,height:0};if($b(hv().flowchart.htmlLabels)){const t=l.children[0],e=Ho(l);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}Db.info("Text 2",o);const u=o.slice(1,o.length);let d=l.getBBox();const p=s.node().appendChild(hT(u.join?u.join("<br/>"):u,e.labelStyle,!0,!0));if($b(hv().flowchart.htmlLabels)){const t=p.children[0],e=Ho(p);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}const f=e.padding/2;return Ho(p).attr("transform","translate( "+(h.width>d.width?0:(d.width-h.width)/2)+", "+(d.height+f+5)+")"),Ho(l).attr("transform","translate( "+(h.width<d.width?0:-(d.width-h.width)/2)+", 0)"),h=s.node().getBBox(),s.attr("transform","translate("+-h.width/2+", "+(-h.height/2-f+3)+")"),r.attr("class","outer title-state").attr("x",-h.width/2-f).attr("y",-h.height/2-f).attr("width",h.width+e.padding).attr("height",h.height+e.padding),a.attr("class","divider").attr("x1",-h.width/2-f).attr("x2",h.width/2+f).attr("y1",-h.height/2-f+d.height+f).attr("y2",-h.height/2-f+d.height+f),dT(e,r),e.intersect=function(t){return AT.rect(e,t)},i},choice:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=[{x:0,y:14},{x:14,y:0},{x:0,y:-14},{x:-14,y:0}];return n.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(t){return AT.circle(e,14,t)},n},circle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,void 0,!0),a=n.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Db.info("Circle main"),dT(e,a),e.intersect=function(t){return Db.info("Circle intersect",e,i.width/2+r,t),AT.circle(e,i.width/2+r,t)},n},doublecircle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=uT(t,e,void 0,!0),a=n.insert("g",":first-child"),s=a.insert("circle"),o=a.insert("circle");return s.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r+5).attr("width",i.width+e.padding+10).attr("height",i.height+e.padding+10),o.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Db.info("DoubleCircle main"),dT(e,s),e.intersect=function(t){return Db.info("DoubleCircle intersect",e,i.width/2+r+5,t),AT.circle(e,i.width/2+r+5,t)},n},stadium:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.height+e.padding,a=i.width+r/4+e.padding,s=n.insert("rect",":first-child").attr("style",e.style).attr("rx",r/2).attr("ry",r/2).attr("x",-a/2).attr("y",-r/2).attr("width",a).attr("height",r);return dT(e,s),e.intersect=function(t){return AT.rect(e,t)},n},hexagon:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.height+e.padding,a=r/4,s=i.width+2*a+e.padding,o=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-r/2},{x:s-a,y:-r},{x:a,y:-r},{x:0,y:-r/2}],c=pT(n,s,r,o);return c.attr("style",e.style),dT(e,c),e.intersect=function(t){return AT.polygon(e,o,t)},n},rect_left_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-a/2,y:0},{x:r,y:0},{x:r,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return pT(n,r,a,s).attr("style",e.style),e.width=r+a,e.height=a,e.intersect=function(t){return AT.polygon(e,s,t)},n},lean_right:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},lean_left:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:2*a/6,y:0},{x:r+a/6,y:0},{x:r-2*a/6,y:-a},{x:-a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r+2*a/6,y:0},{x:r-a/6,y:-a},{x:a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},inv_trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:-2*a/6,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},rect_right_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r+a/2,y:0},{x:r,y:-a/2},{x:r+a/2,y:-a},{x:0,y:-a}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},cylinder:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=r/2,s=a/(2.5+r/50),o=i.height+s+e.padding,c="M 0,"+s+" a "+a+","+s+" 0,0,0 "+r+" 0 a "+a+","+s+" 0,0,0 "+-r+" 0 l 0,"+o+" a "+a+","+s+" 0,0,0 "+r+" 0 l 0,"+-o,l=n.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",c).attr("transform","translate("+-r/2+","+-(o/2+s)+")");return dT(e,l),e.intersect=function(t){const n=AT.rect(e,t),i=n.x-e.x;if(0!=a&&(Math.abs(i)<e.width/2||Math.abs(i)==e.width/2&&Math.abs(n.y-e.y)>e.height/2-s)){let r=s*s*(1-i*i/(a*a));0!=r&&(r=Math.sqrt(r)),r=s-r,t.y-e.y>0&&(r=-r),n.y+=r}return n},n},start:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),dT(e,i),e.intersect=function(t){return AT.circle(e,7,t)},n},end:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child"),r=n.insert("circle",":first-child");return r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),i.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),dT(e,r),e.intersect=function(t){return AT.circle(e,7,t)},n},note:DT,subroutine:(t,e)=>{const{shapeSvg:n,bbox:i}=uT(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r,y:0},{x:r,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:r+8,y:0},{x:r+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],o=pT(n,r,a,s);return o.attr("style",e.style),dT(e,o),e.intersect=function(t){return AT.polygon(e,s,t)},n},fork:NT,join:NT,class_box:(t,e)=>{const n=e.padding/2;let i;i=e.classes?"node "+e.classes:"node default";const r=t.insert("g").attr("class",i).attr("id",e.domId||e.id),a=r.insert("rect",":first-child"),s=r.insert("line"),o=r.insert("line");let c=0,l=4;const h=r.insert("g").attr("class","label");let u=0;const d=e.classData.annotations&&e.classData.annotations[0],p=e.classData.annotations[0]?"\xab"+e.classData.annotations[0]+"\xbb":"",f=h.node().appendChild(hT(p,e.labelStyle,!0,!0));let g=f.getBBox();if($b(hv().flowchart.htmlLabels)){const t=f.children[0],e=Ho(f);g=t.getBoundingClientRect(),e.attr("width",g.width),e.attr("height",g.height)}e.classData.annotations[0]&&(l+=g.height+4,c+=g.width);let y=e.classData.id;void 0!==e.classData.type&&""!==e.classData.type&&(hv().flowchart.htmlLabels?y+="<"+e.classData.type+">":y+="<"+e.classData.type+">");const m=h.node().appendChild(hT(y,e.labelStyle,!0,!0));Ho(m).attr("class","classTitle");let b=m.getBBox();if($b(hv().flowchart.htmlLabels)){const t=m.children[0],e=Ho(m);b=t.getBoundingClientRect(),e.attr("width",b.width),e.attr("height",b.height)}l+=b.height+4,b.width>c&&(c=b.width);const _=[];e.classData.members.forEach((t=>{const n=Zw(t);let i=n.displayText;hv().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=h.node().appendChild(hT(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if($b(hv().flowchart.htmlLabels)){const t=r.children[0],e=Ho(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>c&&(c=a.width),l+=a.height+4,_.push(r)})),l+=8;const x=[];if(e.classData.methods.forEach((t=>{const n=Zw(t);let i=n.displayText;hv().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=h.node().appendChild(hT(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if($b(hv().flowchart.htmlLabels)){const t=r.children[0],e=Ho(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>c&&(c=a.width),l+=a.height+4,x.push(r)})),l+=8,d){let t=(c-g.width)/2;Ho(f).attr("transform","translate( "+(-1*c/2+t)+", "+-1*l/2+")"),u=g.height+4}let v=(c-b.width)/2;return Ho(m).attr("transform","translate( "+(-1*c/2+v)+", "+(-1*l/2+u)+")"),u+=b.height+4,s.attr("class","divider").attr("x1",-c/2-n).attr("x2",c/2+n).attr("y1",-l/2-n+8+u).attr("y2",-l/2-n+8+u),u+=8,_.forEach((t=>{Ho(t).attr("transform","translate( "+-c/2+", "+(-1*l/2+u+4)+")"),u+=b.height+4})),u+=8,o.attr("class","divider").attr("x1",-c/2-n).attr("x2",c/2+n).attr("y1",-l/2-n+8+u).attr("y2",-l/2-n+8+u),u+=8,x.forEach((t=>{Ho(t).attr("transform","translate( "+-c/2+", "+(-1*l/2+u)+")"),u+=b.height+4})),a.attr("class","outer title-state").attr("x",-c/2-n).attr("y",-l/2-n).attr("width",c+e.padding).attr("height",l+e.padding),dT(e,a),e.intersect=function(t){return AT.rect(e,t)},r}};let BT={};const MT=t=>{const e=BT[t.id];Db.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");const n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-8)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},IT={rect:(t,e)=>{Db.trace("Creating subgraph rect for ",e.id,e);const n=t.insert("g").attr("class","cluster"+(e.class?" "+e.class:"")).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=r.node().appendChild(hT(e.labelText,e.labelStyle,void 0,!0));let s=a.getBBox();if($b(hv().flowchart.htmlLabels)){const t=a.children[0],e=Ho(a);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}const o=0*e.padding,c=o/2,l=e.width<=s.width+o?s.width+o:e.width;e.width<=s.width+o?e.diff=(s.width-e.width)/2-e.padding/2:e.diff=-e.padding/2,Db.trace("Data ",e,JSON.stringify(e)),i.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-l/2).attr("y",e.y-e.height/2-c).attr("width",l).attr("height",e.height+o),r.attr("transform","translate("+(e.x-s.width/2)+", "+(e.y-e.height/2)+")");const h=i.node().getBBox();return e.width=h.width,e.height=h.height,e.intersect=function(t){return ST(e,t)},n},roundedWithTitle:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=n.append("rect"),s=r.node().appendChild(hT(e.labelText,e.labelStyle,void 0,!0));let o=s.getBBox();if($b(hv().flowchart.htmlLabels)){const t=s.children[0],e=Ho(s);o=t.getBoundingClientRect(),e.attr("width",o.width),e.attr("height",o.height)}o=s.getBBox();const c=0*e.padding,l=c/2,h=e.width<=o.width+e.padding?o.width+e.padding:e.width;e.width<=o.width+e.padding?e.diff=(o.width+0*e.padding-e.width)/2:e.diff=-e.padding/2,i.attr("class","outer").attr("x",e.x-h/2-l).attr("y",e.y-e.height/2-l).attr("width",h+c).attr("height",e.height+c),a.attr("class","inner").attr("x",e.x-h/2-l).attr("y",e.y-e.height/2-l+o.height-1).attr("width",h+c).attr("height",e.height+c-o.height-3),r.attr("transform","translate("+(e.x-o.width/2)+", "+(e.y-e.height/2-e.padding/3+($b(hv().flowchart.htmlLabels)?5:3))+")");const u=i.node().getBBox();return e.height=u.height,e.intersect=function(t){return ST(e,t)},n},noteGroup:(t,e)=>{const n=t.insert("g").attr("class","note-cluster").attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+r).attr("height",e.height+r).attr("fill","none");const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(t){return ST(e,t)},n},divider:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("class","divider").attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2).attr("width",e.width+r).attr("height",e.height+r);const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.diff=-e.padding/2,e.intersect=function(t){return ST(e,t)},n}};let FT={};let RT={},$T={};function PT(t,e){hv().flowchart.htmlLabels&&t&&(t.style.width=9*e.length+"px",t.style.height="12px")}const jT=(t,e)=>{Db.warn("abc88 cutPathAtIntersect",t,e);let n=[],i=t[0],r=!1;return t.forEach((t=>{if(Db.info("abc88 checking point",t,e),((t,e)=>{const n=t.x,i=t.y,r=Math.abs(e.x-n),a=Math.abs(e.y-i),s=t.width/2,o=t.height/2;return r>=s||a>=o})(e,t)||r)Db.warn("abc88 outside",t,i),i=t,r||n.push(t);else{const a=((t,e,n)=>{Db.warn(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(e)}\n insidePoint : ${JSON.stringify(n)}\n node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);const i=t.x,r=t.y,a=Math.abs(i-n.x),s=t.width/2;let o=n.x<e.x?s-a:s+a;const c=t.height/2,l=Math.abs(e.y-n.y),h=Math.abs(e.x-n.x);if(Math.abs(r-e.y)*s>Math.abs(i-e.x)*c){let t=n.y<e.y?e.y-c-r:r-c-e.y;o=h*t/l;const i={x:n.x<e.x?n.x+o:n.x-h+o,y:n.y<e.y?n.y+l-t:n.y-l+t};return 0===o&&(i.x=e.x,i.y=e.y),0===h&&(i.x=e.x),0===l&&(i.y=e.y),Db.warn(`abc89 topp/bott calc, Q ${l}, q ${t}, R ${h}, r ${o}`,i),i}{o=n.x<e.x?e.x-s-i:i-s-e.x;let t=l*o/h,r=n.x<e.x?n.x+h-o:n.x-h+o,a=n.y<e.y?n.y+t:n.y-t;return Db.warn(`sides calc abc89, Q ${l}, q ${t}, R ${h}, r ${o}`,{_x:r,_y:a}),0===o&&(r=e.x,a=e.y),0===h&&(r=e.x),0===l&&(a=e.y),{x:r,y:a}}})(e,i,t);Db.warn("abc88 inside",t,i,a),Db.warn("abc88 intersection",a);let s=!1;n.forEach((t=>{s=s||t.x===a.x&&t.y===a.y})),n.some((t=>t.x===a.x&&t.y===a.y))?Db.warn("abc88 no intersect",a,n):n.push(a),r=!0}})),Db.warn("abc88 returning points",n),n},YT=(t,e,n,i)=>{Db.info("Graph in recursive render: XXX",fb(e),i);const r=e.graph().rankdir;Db.trace("Dir in recursive render - dir:",r);const a=t.insert("g").attr("class","root");e.nodes()?Db.info("Recursive render XXX",e.nodes()):Db.info("No nodes found for",e),e.edges().length>0&&Db.trace("Recursive edges",e.edge(e.edges()[0]));const s=a.insert("g").attr("class","clusters"),o=a.insert("g").attr("class","edgePaths"),c=a.insert("g").attr("class","edgeLabels"),l=a.insert("g").attr("class","nodes");e.nodes().forEach((function(t){const a=e.node(t);if(void 0!==i){const n=JSON.parse(JSON.stringify(i.clusterData));Db.info("Setting data for cluster XXX (",t,") ",n,i),e.setNode(i.id,n),e.parent(t)||(Db.trace("Setting parent",t,i.id),e.setParent(t,i.id,n))}if(Db.info("(Insert) Node XXX"+t+": "+JSON.stringify(e.node(t))),a&&a.clusterNode){Db.info("Cluster identified",t,a.width,e.node(t));const i=YT(l,a.graph,n,e.node(t)),r=i.elem;dT(a,r),a.diff=i.diff||0,Db.info("Node bounds (abc123)",t,a,a.width,a.x,a.y),((t,e)=>{BT[e.id]=t})(r,a),Db.warn("Recursive render complete ",r,a)}else e.children(t).length>0?(Db.info("Cluster - the non recursive path XXX",t,a.id,a,e),Db.info(xT(a.id,e)),fT[a.id]={id:xT(a.id,e),node:a}):(Db.info("Node - the non recursive path",t,a.id,a),((t,e,n)=>{let i,r;if(e.link){let a;"sandbox"===hv().securityLevel?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),i=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),r=OT[e.shape](i,e,n)}else r=OT[e.shape](t,e,n),i=r;e.tooltip&&r.attr("title",e.tooltip),e.class&&r.attr("class","node default "+e.class),BT[e.id]=i,e.haveCallback&&BT[e.id].attr("class",BT[e.id].attr("class")+" clickable")})(l,e.node(t),r))})),e.edges().forEach((function(t){const n=e.edge(t.v,t.w,t.name);Db.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t)),Db.info("Edge "+t.v+" -> "+t.w+": ",t," ",JSON.stringify(e.edge(t))),Db.info("Fix",fT,"ids:",t.v,t.w,"Translateing: ",fT[t.v],fT[t.w]),((t,e)=>{const n=hT(e.label,e.labelStyle),i=t.insert("g").attr("class","edgeLabel"),r=i.insert("g").attr("class","label");r.node().appendChild(n);let a,s=n.getBBox();if($b(hv().flowchart.htmlLabels)){const t=n.children[0],e=Ho(n);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}if(r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),RT[e.id]=i,e.width=s.width,e.height=s.height,e.startLabelLeft){const n=hT(e.startLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),$T[e.id]||($T[e.id]={}),$T[e.id].startLeft=i,PT(a,e.startLabelLeft)}if(e.startLabelRight){const n=hT(e.startLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=i.node().appendChild(n),r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),$T[e.id]||($T[e.id]={}),$T[e.id].startRight=i,PT(a,e.startLabelRight)}if(e.endLabelLeft){const n=hT(e.endLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),$T[e.id]||($T[e.id]={}),$T[e.id].endLeft=i,PT(a,e.endLabelLeft)}if(e.endLabelRight){const n=hT(e.endLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),$T[e.id]||($T[e.id]={}),$T[e.id].endRight=i,PT(a,e.endLabelRight)}})(c,n)})),e.edges().forEach((function(t){Db.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t))})),Db.info("#############################################"),Db.info("### Layout ###"),Db.info("#############################################"),Db.info(e),Em(e),Db.info("Graph after layout:",fb(e));let h=0;return(t=>wT(t,t.children()))(e).forEach((function(t){const n=e.node(t);Db.info("Position "+t+": "+JSON.stringify(e.node(t))),Db.info("Position "+t+": ("+n.x,","+n.y,") width: ",n.width," height: ",n.height),n&&n.clusterNode?MT(n):e.children(t).length>0?(((t,e)=>{Db.trace("Inserting cluster");const n=e.shape||"rect";FT[e.id]=IT[n](t,e)})(s,n),fT[n.id].node=n):MT(n)})),e.edges().forEach((function(t){const i=e.edge(t);Db.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(i),i);const r=function(t,e,n,i,r,a){let s=n.points,o=!1;const c=a.node(e.v);var l=a.node(e.w);Db.info("abc88 InsertEdge: ",n),l.intersect&&c.intersect&&(s=s.slice(1,n.points.length-1),s.unshift(c.intersect(s[0])),Db.info("Last point",s[s.length-1],l,l.intersect(s[s.length-1])),s.push(l.intersect(s[s.length-1]))),n.toCluster&&(Db.info("to cluster abc88",i[n.toCluster]),s=jT(n.points,i[n.toCluster].node),o=!0),n.fromCluster&&(Db.info("from cluster abc88",i[n.fromCluster]),s=jT(s.reverse(),i[n.fromCluster].node).reverse(),o=!0);const h=s.filter((t=>!Number.isNaN(t.y)));let u;u=("graph"===r||"flowchart"===r)&&n.curve||Bc;const d=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(u);let p;switch(n.thickness){case"normal":p="edge-thickness-normal";break;case"thick":p="edge-thickness-thick";break;default:p=""}switch(n.pattern){case"solid":p+=" edge-pattern-solid";break;case"dotted":p+=" edge-pattern-dotted";break;case"dashed":p+=" edge-pattern-dashed"}const f=t.append("path").attr("d",d(h)).attr("id",n.id).attr("class"," "+p+(n.classes?" "+n.classes:"")).attr("style",n.style);let g="";switch((hv().flowchart.arrowMarkerAbsolute||hv().state.arrowMarkerAbsolute)&&(g=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,g=g.replace(/\(/g,"\\("),g=g.replace(/\)/g,"\\)")),Db.info("arrowTypeStart",n.arrowTypeStart),Db.info("arrowTypeEnd",n.arrowTypeEnd),n.arrowTypeStart){case"arrow_cross":f.attr("marker-start","url("+g+"#"+r+"-crossStart)");break;case"arrow_point":f.attr("marker-start","url("+g+"#"+r+"-pointStart)");break;case"arrow_barb":f.attr("marker-start","url("+g+"#"+r+"-barbStart)");break;case"arrow_circle":f.attr("marker-start","url("+g+"#"+r+"-circleStart)");break;case"aggregation":f.attr("marker-start","url("+g+"#"+r+"-aggregationStart)");break;case"extension":f.attr("marker-start","url("+g+"#"+r+"-extensionStart)");break;case"composition":f.attr("marker-start","url("+g+"#"+r+"-compositionStart)");break;case"dependency":f.attr("marker-start","url("+g+"#"+r+"-dependencyStart)");break;case"lollipop":f.attr("marker-start","url("+g+"#"+r+"-lollipopStart)")}switch(n.arrowTypeEnd){case"arrow_cross":f.attr("marker-end","url("+g+"#"+r+"-crossEnd)");break;case"arrow_point":f.attr("marker-end","url("+g+"#"+r+"-pointEnd)");break;case"arrow_barb":f.attr("marker-end","url("+g+"#"+r+"-barbEnd)");break;case"arrow_circle":f.attr("marker-end","url("+g+"#"+r+"-circleEnd)");break;case"aggregation":f.attr("marker-end","url("+g+"#"+r+"-aggregationEnd)");break;case"extension":f.attr("marker-end","url("+g+"#"+r+"-extensionEnd)");break;case"composition":f.attr("marker-end","url("+g+"#"+r+"-compositionEnd)");break;case"dependency":f.attr("marker-end","url("+g+"#"+r+"-dependencyEnd)");break;case"lollipop":f.attr("marker-end","url("+g+"#"+r+"-lollipopEnd)")}let y={};return o&&(y.updatedPath=s),y.originalPath=n.points,y}(o,t,i,fT,n,e);((t,e)=>{Db.info("Moving label abc78 ",t.id,t.label,RT[t.id]);let n=e.updatedPath?e.updatedPath:e.originalPath;if(t.label){const i=RT[t.id];let r=t.x,a=t.y;if(n){const i=tv.calcLabelPosition(n);Db.info("Moving label "+t.label+" from (",r,",",a,") to (",i.x,",",i.y,") abc78"),e.updatedPath&&(r=i.x,a=i.y)}i.attr("transform","translate("+r+", "+a+")")}if(t.startLabelLeft){const e=$T[t.id].startLeft;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.startLabelRight){const e=$T[t.id].startRight;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelLeft){const e=$T[t.id].endLeft;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelRight){const e=$T[t.id].endRight;let i=t.x,r=t.y;if(n){const e=tv.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}})(i,r)})),e.nodes().forEach((function(t){const n=e.node(t);Db.info(t,n.type,n.diff),"group"===n.type&&(h=n.diff)})),{elem:a,diff:h}},zT=(t,e,n,i,r)=>{lT(t,n,i,r),BT={},RT={},$T={},FT={},gT={},yT={},fT={},Db.warn("Graph at first:",fb(e)),((t,e)=>{!t||e>10?Db.debug("Opting out, no graph "):(Db.debug("Opting in, graph "),t.nodes().forEach((function(e){t.children(e).length>0&&(Db.warn("Cluster identified",e," Replacement id in edges: ",xT(e,t)),gT[e]=_T(e,t),fT[e]={id:xT(e,t),clusterData:t.node(e)})})),t.nodes().forEach((function(e){const n=t.children(e),i=t.edges();n.length>0?(Db.debug("Cluster identified",e,gT),i.forEach((t=>{t.v!==e&&t.w!==e&&mT(t.v,e)^mT(t.w,e)&&(Db.warn("Edge: ",t," leaves cluster ",e),Db.warn("Decendants of XXX ",e,": ",gT[e]),fT[e].externalConnections=!0)}))):Db.debug("Not a cluster ",e,gT)})),t.edges().forEach((function(e){const n=t.edge(e);Db.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(e)),Db.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(t.edge(e)));let i=e.v,r=e.w;if(Db.warn("Fix XXX",fT,"ids:",e.v,e.w,"Translating: ",fT[e.v]," --- ",fT[e.w]),fT[e.v]&&fT[e.w]&&fT[e.v]===fT[e.w]){Db.warn("Fixing and trixing link to self - removing XXX",e.v,e.w,e.name),Db.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=vT(e.v),r=vT(e.w),t.removeEdge(e.v,e.w,e.name);const a=e.w+"---"+e.v;t.setNode(a,{domId:a,id:a,labelStyle:"",labelText:n.label,padding:0,shape:"labelRect",style:""});const s=JSON.parse(JSON.stringify(n)),o=JSON.parse(JSON.stringify(n));s.label="",s.arrowTypeEnd="none",o.label="",s.fromCluster=e.v,o.toCluster=e.v,t.setEdge(i,a,s,e.name+"-cyclic-special"),t.setEdge(a,r,o,e.name+"-cyclic-special")}else(fT[e.v]||fT[e.w])&&(Db.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=vT(e.v),r=vT(e.w),t.removeEdge(e.v,e.w,e.name),i!==e.v&&(n.fromCluster=e.v),r!==e.w&&(n.toCluster=e.w),Db.warn("Fix Replacing with XXX",i,r,e.name),t.setEdge(i,r,n,e.name))})),Db.warn("Adjusted Graph",fb(t)),kT(t,0),Db.trace(fT))})(e),Db.warn("Graph after:",fb(e)),YT(t,e,i)},UT=t=>jb.sanitizeText(t,hv());let WT={dividerMargin:10,padding:5,textHeight:10};function HT(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}const qT={setConf:function(t){Object.keys(t).forEach((function(e){WT[e]=t[e]}))},draw:function(t,e,n,i){Db.info("Drawing class - ",e);const r=hv().flowchart,a=hv().securityLevel;Db.info("config:",r);const s=r.nodeSpacing||50,o=r.rankSpacing||50,c=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:i.db.getDirection(),nodesep:s,ranksep:o,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}})),l=i.db.getClasses(),h=i.db.getRelations(),u=i.db.getNotes();let d;Db.info(h),function(t,e,n,i){const r=Object.keys(t);Db.info("keys:",r),Db.info(t),r.forEach((function(n){const r=t[n];let a="";r.cssClasses.length>0&&(a=a+" "+r.cssClasses.join(" "));const s={labelStyle:""};let o=void 0!==r.text?r.text:r.id,c="";r.type,c="class_box",e.setNode(r.id,{labelStyle:s.labelStyle,shape:c,labelText:UT(o),classData:r,rx:0,ry:0,class:a,style:s.style,id:r.id,domId:r.domId,tooltip:i.db.getTooltip(r.id)||"",haveCallback:r.haveCallback,link:r.link,width:"group"===r.type?500:void 0,type:r.type,padding:hv().flowchart.padding}),Db.info("setNode",{labelStyle:s.labelStyle,shape:c,labelText:o,rx:0,ry:0,class:a,style:s.style,id:r.id,width:"group"===r.type?500:void 0,type:r.type,padding:hv().flowchart.padding})}))}(l,c,0,i),function(t,e){const n=hv().flowchart;let i=0;t.forEach((function(r){i++;const a={classes:"relation"};a.pattern=1==r.relation.lineType?"dashed":"solid",a.id="id"+i,"arrow_open"===r.type?a.arrowhead="none":a.arrowhead="normal",Db.info(a,r),a.startLabelRight="none"===r.relationTitle1?"":r.relationTitle1,a.endLabelLeft="none"===r.relationTitle2?"":r.relationTitle2,a.arrowTypeStart=HT(r.relation.type1),a.arrowTypeEnd=HT(r.relation.type2);let s="",o="";if(void 0!==r.style){const t=jx(r.style);s=t.style,o=t.labelStyle}else s="fill:none";a.style=s,a.labelStyle=o,void 0!==r.interpolate?a.curve=$x(r.interpolate,Tc):void 0!==t.defaultInterpolate?a.curve=$x(t.defaultInterpolate,Tc):a.curve=$x(n.curve,Tc),r.text=r.title,void 0===r.text?void 0!==r.style&&(a.arrowheadStyle="fill: #333"):(a.arrowheadStyle="fill: #333",a.labelpos="c",hv().flowchart.htmlLabels?(a.labelType="html",a.label='<span class="edgeLabel">'+r.text+"</span>"):(a.labelType="text",a.label=r.text.replace(jb.lineBreakRegex,"\n"),void 0===r.style&&(a.style=a.style||"stroke: #333; stroke-width: 1.5px;fill:none"),a.labelStyle=a.labelStyle.replace("color:","fill:"))),e.setEdge(r.id1,r.id2,a,i)}))}(h,c),function(t,e,n,i){Db.info(t),t.forEach((function(t,r){const a=t,s="",o="";let c=a.text,l="note";if(e.setNode(a.id,{labelStyle:s,shape:l,labelText:UT(c),noteData:a,rx:0,ry:0,class:"",style:o,id:a.id,domId:a.id,tooltip:"",type:"note",padding:hv().flowchart.padding}),Db.info("setNode",{labelStyle:s,shape:l,labelText:c,rx:0,ry:0,style:o,id:a.id,type:"note",padding:hv().flowchart.padding}),!a.class||!(a.class in i))return;const h=n+r,u={classes:"relation",pattern:"dotted"};u.id=`edgeNote${h}`,u.arrowhead="none",Db.info(`Note edge: ${JSON.stringify(u)}, ${JSON.stringify(a)}`),u.startLabelRight="",u.endLabelLeft="",u.arrowTypeStart="none",u.arrowTypeEnd="none",u.style="fill:none",u.labelStyle="",u.curve=$x(WT.curve,Tc),e.setEdge(a.id,a.class,u,h)}))}(u,c,h.length+1,l),"sandbox"===a&&(d=Ho("#i"+e));const p=Ho("sandbox"===a?d.nodes()[0].contentDocument.body:"body"),f=p.select(`[id="${e}"]`),g=p.select("#"+e+" g");if(zT(g,c,["aggregation","extension","composition","dependency","lollipop"],"classDiagram",e),tv.insertTitle(f,"classTitleText",r.titleTopMargin,i.db.getDiagramTitle()),bv(c,f,r.diagramPadding,r.useMaxWidth),!r.htmlLabels){const t="sandbox"===a?d.nodes()[0].contentDocument:document,n=t.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of n){const n=e.getBBox(),i=t.createElementNS("http://www.w3.org/2000/svg","rect");i.setAttribute("rx",0),i.setAttribute("ry",0),i.setAttribute("width",n.width),i.setAttribute("height",n.height),e.insertBefore(i,e.firstChild)}}}};var VT=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,23,25,27,29,30,31,49],a=[1,17],s=[1,18],o=[1,19],c=[1,20],l=[1,21],h=[1,22],u=[1,25],d=[1,30],p=[1,31],f=[1,32],g=[1,33],y=[6,9,11,15,20,23,25,27,29,30,31,42,43,44,45,49],m=[1,45],b=[30,31,46,47],_=[4,6,9,11,23,25,27,29,30,31,49],x=[42,43,44,45],v=[22,37],k=[1,64],w={trace:function(){},yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,entityName:17,relSpec:18,role:19,BLOCK_START:20,attributes:21,BLOCK_STOP:22,title:23,title_value:24,acc_title:25,acc_title_value:26,acc_descr:27,acc_descr_value:28,acc_descr_multiline_value:29,ALPHANUM:30,ENTITY_NAME:31,attribute:32,attributeType:33,attributeName:34,attributeKeyType:35,attributeComment:36,ATTRIBUTE_WORD:37,ATTRIBUTE_KEY:38,COMMENT:39,cardinality:40,relType:41,ZERO_OR_ONE:42,ZERO_OR_MORE:43,ONE_OR_MORE:44,ONLY_ONE:45,NON_IDENTIFYING:46,IDENTIFYING:47,WORD:48,open_directive:49,type_directive:50,arg_directive:51,close_directive:52,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",20:"BLOCK_START",22:"BLOCK_STOP",23:"title",24:"title_value",25:"acc_title",26:"acc_title_value",27:"acc_descr",28:"acc_descr_value",29:"acc_descr_multiline_value",30:"ALPHANUM",31:"ENTITY_NAME",37:"ATTRIBUTE_WORD",38:"ATTRIBUTE_KEY",39:"COMMENT",42:"ZERO_OR_ONE",43:"ZERO_OR_MORE",44:"ONE_OR_MORE",45:"ONLY_ONE",46:"NON_IDENTIFYING",47:"IDENTIFYING",48:"WORD",49:"open_directive",50:"type_directive",51:"arg_directive",52:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[10,4],[10,3],[10,1],[10,2],[10,2],[10,2],[10,1],[17,1],[17,1],[21,1],[21,2],[32,2],[32,3],[32,3],[32,4],[33,1],[34,1],[35,1],[36,1],[18,3],[40,1],[40,1],[40,1],[40,1],[41,1],[41,1],[19,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:break;case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:case 20:case 41:case 28:case 29:case 30:this.$=a[o];break;case 12:i.addEntity(a[o-4]),i.addEntity(a[o-2]),i.addRelationship(a[o-4],a[o],a[o-2],a[o-3]);break;case 13:i.addEntity(a[o-3]),i.addAttributes(a[o-3],a[o-1]);break;case 14:i.addEntity(a[o-2]);break;case 15:i.addEntity(a[o]);break;case 16:case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:case 39:case 40:case 31:this.$=a[o].replace(/"/g,"");break;case 22:this.$=[a[o]];break;case 23:a[o].push(a[o-1]),this.$=a[o];break;case 24:this.$={attributeType:a[o-1],attributeName:a[o]};break;case 25:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeKeyType:a[o]};break;case 26:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeComment:a[o]};break;case 27:this.$={attributeType:a[o-3],attributeName:a[o-2],attributeKeyType:a[o-1],attributeComment:a[o]};break;case 32:this.$={cardA:a[o],relType:a[o-1],cardB:a[o-2]};break;case 33:this.$=i.Cardinality.ZERO_OR_ONE;break;case 34:this.$=i.Cardinality.ZERO_OR_MORE;break;case 35:this.$=i.Cardinality.ONE_OR_MORE;break;case 36:this.$=i.Cardinality.ONLY_ONE;break;case 37:this.$=i.Identification.NON_IDENTIFYING;break;case 38:this.$=i.Identification.IDENTIFYING;break;case 42:i.parseDirective("%%{","open_directive");break;case 43:i.parseDirective(a[o],"type_directive");break;case 44:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 45:i.parseDirective("}%%","close_directive","er")}},table:[{3:1,4:n,7:3,12:4,49:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,49:i},{13:8,50:[1,9]},{50:[2,42]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,49:i},{1:[2,2]},{14:23,15:[1,24],52:u},e([15,52],[2,43]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:15,10:26,12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,49:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),e(r,[2,15],{18:27,40:29,20:[1,28],42:d,43:p,44:f,45:g}),{24:[1,34]},{26:[1,35]},{28:[1,36]},e(r,[2,19]),e(y,[2,20]),e(y,[2,21]),{11:[1,37]},{16:38,51:[1,39]},{11:[2,45]},e(r,[2,5]),{17:40,30:l,31:h},{21:41,22:[1,42],32:43,33:44,37:m},{41:46,46:[1,47],47:[1,48]},e(b,[2,33]),e(b,[2,34]),e(b,[2,35]),e(b,[2,36]),e(r,[2,16]),e(r,[2,17]),e(r,[2,18]),e(_,[2,9]),{14:49,52:u},{52:[2,44]},{15:[1,50]},{22:[1,51]},e(r,[2,14]),{21:52,22:[2,22],32:43,33:44,37:m},{34:53,37:[1,54]},{37:[2,28]},{40:55,42:d,43:p,44:f,45:g},e(x,[2,37]),e(x,[2,38]),{11:[1,56]},{19:57,30:[1,60],31:[1,59],48:[1,58]},e(r,[2,13]),{22:[2,23]},e(v,[2,24],{35:61,36:62,38:[1,63],39:k}),e([22,37,38,39],[2,29]),e([30,31],[2,32]),e(_,[2,10]),e(r,[2,12]),e(r,[2,39]),e(r,[2,40]),e(r,[2,41]),e(v,[2,25],{36:65,39:k}),e(v,[2,26]),e([22,37,39],[2,30]),e(v,[2,31]),e(v,[2,27])],defaultActions:{5:[2,42],7:[2,2],25:[2,45],39:[2,44],45:[2,28],52:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},T=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("acc_title"),25;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),27;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.begin("open_directive"),49;case 8:return this.begin("type_directive"),50;case 9:return this.popState(),this.begin("arg_directive"),15;case 10:return this.popState(),this.popState(),52;case 11:return 51;case 12:case 13:case 15:case 21:case 26:break;case 14:return 11;case 16:return 9;case 17:return 31;case 18:return 48;case 19:return 4;case 20:return this.begin("block"),20;case 22:return 38;case 23:case 24:return 37;case 25:return 39;case 27:return this.popState(),22;case 28:case 57:return e.yytext[0];case 29:case 33:case 34:case 47:return 42;case 30:case 31:case 32:case 40:case 42:case 49:return 44;case 35:case 36:case 37:case 38:case 39:case 41:case 48:return 43;case 43:case 44:case 45:case 46:return 45;case 50:case 53:case 54:case 55:return 46;case 51:case 52:return 47;case 56:return 30;case 58:return 6}},rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK))\b)/i,/^(?:(.*?)[~](.*?)*[~])/i,/^(?:[A-Za-z][A-Za-z0-9\-_\[\]]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},open_directive:{rules:[8],inclusive:!1},type_directive:{rules:[9,10],inclusive:!1},arg_directive:{rules:[10,11],inclusive:!1},block:{rules:[21,22,23,24,25,26,27,28],inclusive:!1},INITIAL:{rules:[0,2,4,7,12,13,14,15,16,17,18,19,20,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58],inclusive:!0}}},t);function C(){this.yy={}}return w.lexer=T,C.prototype=w,w.Parser=C,new C}();VT.parser=VT;const GT=VT,XT=t=>null!==t.match(/^\s*erDiagram/);let ZT={},QT=[];const KT=function(t){return void 0===ZT[t]&&(ZT[t]={attributes:[]},Db.info("Added new entity :",t)),ZT[t]},JT={Cardinality:{ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE"},Identification:{NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().er,addEntity:KT,addAttributes:function(t,e){let n,i=KT(t);for(n=e.length-1;n>=0;n--)i.attributes.push(e[n]),Db.debug("Added attribute ",e[n].attributeName)},getEntities:()=>ZT,addRelationship:function(t,e,n,i){let r={entityA:t,roleA:e,entityB:n,relSpec:i};QT.push(r),Db.debug("Added new relationship :",r)},getRelationships:()=>QT,clear:function(){ZT={},QT=[],Gv()},setAccTitle:Xv,getAccTitle:Zv,setAccDescription:Qv,getAccDescription:Kv,setDiagramTitle:Jv,getDiagramTitle:tk},tC={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END"},eC=tC,nC=function(t,e){let n;t.append("defs").append("marker").attr("id",tC.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",tC.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,0 L21,18"),t.append("defs").append("marker").attr("id",tC.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",tC.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),n=t.append("defs").append("marker").attr("id",tC.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},iC=/[^\dA-Za-z](\W)*/g;let rC={},aC=new Map;const sC=function(t,e,n){let i;return Object.keys(e).forEach((function(r){const a=function(t="",e=""){const n=t.replace(iC,"");return`${lC(e)}${lC(n)}${wb()}`}(r,"entity");aC.set(r,a);const s=t.append("g").attr("id",a);i=void 0===i?a:i;const o="text-"+a,c=s.append("text").classed("er entityLabel",!0).attr("id",o).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","middle").style("font-family",hv().fontFamily).style("font-size",rC.fontSize+"px").text(r),{width:l,height:h}=((t,e,n)=>{const i=rC.entityPadding/3,r=rC.entityPadding/3,a=.85*rC.fontSize,s=e.node().getBBox(),o=[];let c=!1,l=!1,h=0,u=0,d=0,p=0,f=s.height+2*i,g=1;n.forEach((t=>{void 0!==t.attributeKeyType&&(c=!0),void 0!==t.attributeComment&&(l=!0)})),n.forEach((n=>{const r=`${e.node().id}-attr-${g}`;let s=0;const y=Pb(n.attributeType),m=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-type`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(y),b=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-name`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(n.attributeName),_={};_.tn=m,_.nn=b;const x=m.node().getBBox(),v=b.node().getBBox();if(h=Math.max(h,x.width),u=Math.max(u,v.width),s=Math.max(x.height,v.height),c){const e=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-key`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(n.attributeKeyType||"");_.kn=e;const i=e.node().getBBox();d=Math.max(d,i.width),s=Math.max(s,i.height)}if(l){const e=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-comment`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",hv().fontFamily).style("font-size",a+"px").text(n.attributeComment||"");_.cn=e;const i=e.node().getBBox();p=Math.max(p,i.width),s=Math.max(s,i.height)}_.height=s,o.push(_),f+=s+2*i,g+=1}));let y=4;c&&(y+=2),l&&(y+=2);const m=h+u+d+p,b={width:Math.max(rC.minEntityWidth,Math.max(s.width+2*rC.entityPadding,m+r*y)),height:n.length>0?f:Math.max(rC.minEntityHeight,s.height+2*rC.entityPadding)};if(n.length>0){const n=Math.max(0,(b.width-m-r*y)/(y/2));e.attr("transform","translate("+b.width/2+","+(i+s.height/2)+")");let a=s.height+2*i,f="attributeBoxOdd";o.forEach((e=>{const s=a+i+e.height/2;e.tn.attr("transform","translate("+r+","+s+")");const o=t.insert("rect","#"+e.tn.node().id).classed(`er ${f}`,!0).attr("x",0).attr("y",a).attr("width",h+2*r+n).attr("height",e.height+2*i),g=parseFloat(o.attr("x"))+parseFloat(o.attr("width"));e.nn.attr("transform","translate("+(g+r)+","+s+")");const y=t.insert("rect","#"+e.nn.node().id).classed(`er ${f}`,!0).attr("x",g).attr("y",a).attr("width",u+2*r+n).attr("height",e.height+2*i);let m=parseFloat(y.attr("x"))+parseFloat(y.attr("width"));if(c){e.kn.attr("transform","translate("+(m+r)+","+s+")");const o=t.insert("rect","#"+e.kn.node().id).classed(`er ${f}`,!0).attr("x",m).attr("y",a).attr("width",d+2*r+n).attr("height",e.height+2*i);m=parseFloat(o.attr("x"))+parseFloat(o.attr("width"))}l&&(e.cn.attr("transform","translate("+(m+r)+","+s+")"),t.insert("rect","#"+e.cn.node().id).classed(`er ${f}`,"true").attr("x",m).attr("y",a).attr("width",p+2*r+n).attr("height",e.height+2*i)),a+=e.height+2*i,f="attributeBoxOdd"===f?"attributeBoxEven":"attributeBoxOdd"}))}else b.height=Math.max(rC.minEntityHeight,f),e.attr("transform","translate("+b.width/2+","+b.height/2+")");return b})(s,c,e[r].attributes),u=s.insert("rect","#"+o).classed("er entityBox",!0).attr("x",0).attr("y",0).attr("width",l).attr("height",h).node().getBBox();n.setNode(a,{width:u.width,height:u.height,shape:"rect",id:a})})),i},oC=function(t){return(t.entityA+t.roleA+t.entityB).replace(/\s/g,"")};let cC=0;function lC(t=""){return t.length>0?`${t}-`:""}const hC={setConf:function(t){const e=Object.keys(t);for(const n of e)rC[n]=t[n]},draw:function(t,e,n,i){rC=hv().er,Db.info("Drawing ER diagram");const r=hv().securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body").select(`[id='${e}']`);let o;nC(s,rC),o=new Vf({multigraph:!0,directed:!0,compound:!1}).setGraph({rankdir:rC.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));const c=sC(s,i.db.getEntities(),o),l=function(t,e){return t.forEach((function(t){e.setEdge(aC.get(t.entityA),aC.get(t.entityB),{relationship:t},oC(t))})),t}(i.db.getRelationships(),o);Em(o),function(t,e){e.nodes().forEach((function(n){void 0!==n&&void 0!==e.node(n)&&t.select("#"+n).attr("transform","translate("+(e.node(n).x-e.node(n).width/2)+","+(e.node(n).y-e.node(n).height/2)+" )")}))}(s,o),l.forEach((function(t){!function(t,e,n,i,r){cC++;const a=n.edge(aC.get(e.entityA),aC.get(e.entityB),oC(e)),s=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(Bc),o=t.insert("path","#"+i).classed("er relationshipLine",!0).attr("d",s(a.points)).style("stroke",rC.stroke).style("fill","none");e.relSpec.relType===r.db.Identification.NON_IDENTIFYING&&o.attr("stroke-dasharray","8,8");let c="";switch(rC.arrowMarkerAbsolute&&(c=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,c=c.replace(/\(/g,"\\("),c=c.replace(/\)/g,"\\)")),e.relSpec.cardA){case r.db.Cardinality.ZERO_OR_ONE:o.attr("marker-end","url("+c+"#"+eC.ZERO_OR_ONE_END+")");break;case r.db.Cardinality.ZERO_OR_MORE:o.attr("marker-end","url("+c+"#"+eC.ZERO_OR_MORE_END+")");break;case r.db.Cardinality.ONE_OR_MORE:o.attr("marker-end","url("+c+"#"+eC.ONE_OR_MORE_END+")");break;case r.db.Cardinality.ONLY_ONE:o.attr("marker-end","url("+c+"#"+eC.ONLY_ONE_END+")")}switch(e.relSpec.cardB){case r.db.Cardinality.ZERO_OR_ONE:o.attr("marker-start","url("+c+"#"+eC.ZERO_OR_ONE_START+")");break;case r.db.Cardinality.ZERO_OR_MORE:o.attr("marker-start","url("+c+"#"+eC.ZERO_OR_MORE_START+")");break;case r.db.Cardinality.ONE_OR_MORE:o.attr("marker-start","url("+c+"#"+eC.ONE_OR_MORE_START+")");break;case r.db.Cardinality.ONLY_ONE:o.attr("marker-start","url("+c+"#"+eC.ONLY_ONE_START+")")}const l=o.node().getTotalLength(),h=o.node().getPointAtLength(.5*l),u="rel"+cC,d=t.append("text").classed("er relationshipLabel",!0).attr("id",u).attr("x",h.x).attr("y",h.y).style("text-anchor","middle").style("dominant-baseline","middle").style("font-family",hv().fontFamily).style("font-size",rC.fontSize+"px").text(e.roleA).node().getBBox();t.insert("rect","#"+u).classed("er relationshipLabelBox",!0).attr("x",h.x-d.width/2).attr("y",h.y-d.height/2).attr("width",d.width).attr("height",d.height)}(s,t,o,c,i)}));const h=rC.diagramPadding;tv.insertTitle(s,"entityTitleText",rC.titleTopMargin,i.db.getDiagramTitle());const u=s.node().getBBox(),d=u.width+2*h,p=u.height+2*h;mv(s,p,d,rC.useMaxWidth),s.attr("viewBox",`${u.x-h} ${u.y-h} ${d} ${p}`)}};var uC=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,9],i=[1,7],r=[1,6],a=[1,8],s=[1,20,21,22,23,38,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],o=[2,10],c=[1,20],l=[1,21],h=[1,22],u=[1,23],d=[1,30],p=[1,32],f=[1,33],g=[1,34],y=[1,62],m=[1,48],b=[1,52],_=[1,36],x=[1,37],v=[1,38],k=[1,39],w=[1,40],T=[1,56],C=[1,63],E=[1,51],S=[1,53],A=[1,55],D=[1,59],L=[1,60],N=[1,41],O=[1,42],B=[1,43],M=[1,44],I=[1,61],F=[1,50],R=[1,54],$=[1,57],P=[1,58],j=[1,49],Y=[1,66],z=[1,71],U=[1,20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],W=[1,75],H=[1,74],q=[1,76],V=[20,21,23,81,82],G=[1,99],X=[1,104],Z=[1,107],Q=[1,108],K=[1,101],J=[1,106],tt=[1,109],et=[1,102],nt=[1,114],it=[1,113],rt=[1,103],at=[1,105],st=[1,110],ot=[1,111],ct=[1,112],lt=[1,115],ht=[20,21,22,23,81,82],ut=[20,21,22,23,53,81,82],dt=[20,21,22,23,40,52,53,55,57,59,61,63,65,66,67,69,71,73,74,76,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],pt=[20,21,23],ft=[20,21,23,52,66,67,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],gt=[1,12,20,21,22,23,24,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],yt=[52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],mt=[1,149],bt=[1,157],_t=[1,158],xt=[1,159],vt=[1,160],kt=[1,144],wt=[1,145],Tt=[1,141],Ct=[1,152],Et=[1,153],St=[1,154],At=[1,155],Dt=[1,156],Lt=[1,161],Nt=[1,162],Ot=[1,147],Bt=[1,150],Mt=[1,146],It=[1,143],Ft=[20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],Rt=[1,165],$t=[20,21,22,23,26,52,66,67,91,105,106,109,111,112,122,123,124,125,126,127],Pt=[20,21,22,23,24,26,38,40,41,42,52,56,58,60,62,64,66,67,68,70,72,73,75,77,81,82,86,87,88,89,90,91,92,95,105,106,109,111,112,113,114,122,123,124,125,126,127],jt=[12,21,22,24],Yt=[22,106],zt=[1,250],Ut=[1,245],Wt=[1,246],Ht=[1,254],qt=[1,251],Vt=[1,248],Gt=[1,247],Xt=[1,249],Zt=[1,252],Qt=[1,253],Kt=[1,255],Jt=[1,273],te=[20,21,23,106],ee=[20,21,22,23,66,67,86,102,105,106,109,110,111,112,113],ne={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,directive:5,openDirective:6,typeDirective:7,closeDirective:8,separator:9,":":10,argDirective:11,open_directive:12,type_directive:13,arg_directive:14,close_directive:15,graphConfig:16,document:17,line:18,statement:19,SEMI:20,NEWLINE:21,SPACE:22,EOF:23,GRAPH:24,NODIR:25,DIR:26,FirstStmtSeperator:27,ending:28,endToken:29,spaceList:30,spaceListNewline:31,verticeStatement:32,styleStatement:33,linkStyleStatement:34,classDefStatement:35,classStatement:36,clickStatement:37,subgraph:38,text:39,SQS:40,SQE:41,end:42,direction:43,acc_title:44,acc_title_value:45,acc_descr:46,acc_descr_value:47,acc_descr_multiline_value:48,link:49,node:50,vertex:51,AMP:52,STYLE_SEPARATOR:53,idString:54,DOUBLECIRCLESTART:55,DOUBLECIRCLEEND:56,PS:57,PE:58,"(-":59,"-)":60,STADIUMSTART:61,STADIUMEND:62,SUBROUTINESTART:63,SUBROUTINEEND:64,VERTEX_WITH_PROPS_START:65,ALPHA:66,COLON:67,PIPE:68,CYLINDERSTART:69,CYLINDEREND:70,DIAMOND_START:71,DIAMOND_STOP:72,TAGEND:73,TRAPSTART:74,TRAPEND:75,INVTRAPSTART:76,INVTRAPEND:77,linkStatement:78,arrowText:79,TESTSTR:80,START_LINK:81,LINK:82,textToken:83,STR:84,keywords:85,STYLE:86,LINKSTYLE:87,CLASSDEF:88,CLASS:89,CLICK:90,DOWN:91,UP:92,textNoTags:93,textNoTagsToken:94,DEFAULT:95,stylesOpt:96,alphaNum:97,CALLBACKNAME:98,CALLBACKARGS:99,HREF:100,LINK_TARGET:101,HEX:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,MINUS:109,UNIT:110,BRKT:111,DOT:112,PCT:113,TAGSTART:114,alphaNumToken:115,idStringToken:116,alphaNumStatement:117,direction_tb:118,direction_bt:119,direction_rl:120,direction_lr:121,PUNCTUATION:122,UNICODE_TEXT:123,PLUS:124,EQUALS:125,MULT:126,UNDERSCORE:127,graphCodeTokens:128,ARROW_CROSS:129,ARROW_POINT:130,ARROW_CIRCLE:131,ARROW_OPEN:132,QUOTE:133,$accept:0,$end:1},terminals_:{2:"error",10:":",12:"open_directive",13:"type_directive",14:"arg_directive",15:"close_directive",20:"SEMI",21:"NEWLINE",22:"SPACE",23:"EOF",24:"GRAPH",25:"NODIR",26:"DIR",38:"subgraph",40:"SQS",41:"SQE",42:"end",44:"acc_title",45:"acc_title_value",46:"acc_descr",47:"acc_descr_value",48:"acc_descr_multiline_value",52:"AMP",53:"STYLE_SEPARATOR",55:"DOUBLECIRCLESTART",56:"DOUBLECIRCLEEND",57:"PS",58:"PE",59:"(-",60:"-)",61:"STADIUMSTART",62:"STADIUMEND",63:"SUBROUTINESTART",64:"SUBROUTINEEND",65:"VERTEX_WITH_PROPS_START",66:"ALPHA",67:"COLON",68:"PIPE",69:"CYLINDERSTART",70:"CYLINDEREND",71:"DIAMOND_START",72:"DIAMOND_STOP",73:"TAGEND",74:"TRAPSTART",75:"TRAPEND",76:"INVTRAPSTART",77:"INVTRAPEND",80:"TESTSTR",81:"START_LINK",82:"LINK",84:"STR",86:"STYLE",87:"LINKSTYLE",88:"CLASSDEF",89:"CLASS",90:"CLICK",91:"DOWN",92:"UP",95:"DEFAULT",98:"CALLBACKNAME",99:"CALLBACKARGS",100:"HREF",101:"LINK_TARGET",102:"HEX",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"MINUS",110:"UNIT",111:"BRKT",112:"DOT",113:"PCT",114:"TAGSTART",118:"direction_tb",119:"direction_bt",120:"direction_rl",121:"direction_lr",122:"PUNCTUATION",123:"UNICODE_TEXT",124:"PLUS",125:"EQUALS",126:"MULT",127:"UNDERSCORE",129:"ARROW_CROSS",130:"ARROW_POINT",131:"ARROW_CIRCLE",132:"ARROW_OPEN",133:"QUOTE"},productions_:[0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[19,1],[19,2],[19,2],[19,1],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[50,1],[50,5],[50,3],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,8],[51,4],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,4],[51,4],[51,1],[49,2],[49,3],[49,3],[49,1],[49,3],[78,1],[79,3],[39,1],[39,2],[39,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[93,1],[93,2],[35,5],[35,5],[36,5],[37,2],[37,4],[37,3],[37,5],[37,2],[37,4],[37,4],[37,6],[37,2],[37,4],[37,2],[37,4],[37,4],[37,6],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[103,1],[103,3],[96,1],[96,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[94,1],[94,1],[94,1],[94,1],[54,1],[54,2],[97,1],[97,2],[117,1],[117,1],[117,1],[117,1],[43,1],[43,1],[43,1],[43,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.parseDirective("%%{","open_directive");break;case 6:i.parseDirective(a[o],"type_directive");break;case 7:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 8:i.parseDirective("}%%","close_directive","flowchart");break;case 10:case 36:case 37:case 38:case 39:case 40:this.$=[];break;case 11:(!Array.isArray(a[o])||a[o].length>0)&&a[o-1].push(a[o]),this.$=a[o-1];break;case 12:case 82:case 84:case 96:case 152:case 154:case 155:case 78:case 150:this.$=a[o];break;case 19:i.setDirection("TB"),this.$="TB";break;case 20:i.setDirection(a[o-1]),this.$=a[o-1];break;case 35:this.$=a[o-1].nodes;break;case 41:this.$=i.addSubGraph(a[o-6],a[o-1],a[o-4]);break;case 42:this.$=i.addSubGraph(a[o-3],a[o-1],a[o-3]);break;case 43:this.$=i.addSubGraph(void 0,a[o-1],void 0);break;case 45:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 46:case 47:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 51:i.addLink(a[o-2].stmt,a[o],a[o-1]),this.$={stmt:a[o],nodes:a[o].concat(a[o-2].nodes)};break;case 52:i.addLink(a[o-3].stmt,a[o-1],a[o-2]),this.$={stmt:a[o-1],nodes:a[o-1].concat(a[o-3].nodes)};break;case 53:this.$={stmt:a[o-1],nodes:a[o-1]};break;case 54:this.$={stmt:a[o],nodes:a[o]};break;case 55:case 123:case 125:this.$=[a[o]];break;case 56:this.$=a[o-4].concat(a[o]);break;case 57:this.$=[a[o-2]],i.setClass(a[o-2],a[o]);break;case 58:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"square");break;case 59:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"doublecircle");break;case 60:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"circle");break;case 61:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"ellipse");break;case 62:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"stadium");break;case 63:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"subroutine");break;case 64:this.$=a[o-7],i.addVertex(a[o-7],a[o-1],"rect",void 0,void 0,void 0,Object.fromEntries([[a[o-5],a[o-3]]]));break;case 65:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"cylinder");break;case 66:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"round");break;case 67:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"diamond");break;case 68:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"hexagon");break;case 69:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"odd");break;case 70:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"trapezoid");break;case 71:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"inv_trapezoid");break;case 72:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_right");break;case 73:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_left");break;case 74:this.$=a[o],i.addVertex(a[o]);break;case 75:a[o-1].text=a[o],this.$=a[o-1];break;case 76:case 77:a[o-2].text=a[o-1],this.$=a[o-2];break;case 79:var c=i.destructLink(a[o],a[o-2]);this.$={type:c.type,stroke:c.stroke,length:c.length,text:a[o-1]};break;case 80:c=i.destructLink(a[o]);this.$={type:c.type,stroke:c.stroke,length:c.length};break;case 81:this.$=a[o-1];break;case 83:case 97:case 153:case 151:this.$=a[o-1]+""+a[o];break;case 98:case 99:this.$=a[o-4],i.addClass(a[o-2],a[o]);break;case 100:this.$=a[o-4],i.setClass(a[o-2],a[o]);break;case 101:case 109:this.$=a[o-1],i.setClickEvent(a[o-1],a[o]);break;case 102:case 110:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 103:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 104:this.$=a[o-4],i.setClickEvent(a[o-4],a[o-3],a[o-2]),i.setTooltip(a[o-4],a[o]);break;case 105:case 111:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 106:case 112:this.$=a[o-3],i.setLink(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 107:case 113:this.$=a[o-3],i.setLink(a[o-3],a[o-2],a[o]);break;case 108:case 114:this.$=a[o-5],i.setLink(a[o-5],a[o-4],a[o]),i.setTooltip(a[o-5],a[o-2]);break;case 115:this.$=a[o-4],i.addVertex(a[o-2],void 0,void 0,a[o]);break;case 116:case 118:this.$=a[o-4],i.updateLink(a[o-2],a[o]);break;case 117:this.$=a[o-4],i.updateLink([a[o-2]],a[o]);break;case 119:this.$=a[o-8],i.updateLinkInterpolate([a[o-6]],a[o-2]),i.updateLink([a[o-6]],a[o]);break;case 120:this.$=a[o-8],i.updateLinkInterpolate(a[o-6],a[o-2]),i.updateLink(a[o-6],a[o]);break;case 121:this.$=a[o-6],i.updateLinkInterpolate([a[o-4]],a[o]);break;case 122:this.$=a[o-6],i.updateLinkInterpolate(a[o-4],a[o]);break;case 124:case 126:a[o-2].push(a[o]),this.$=a[o-2];break;case 128:this.$=a[o-1]+a[o];break;case 156:this.$="v";break;case 157:this.$="-";break;case 158:this.$={stmt:"dir",value:"TB"};break;case 159:this.$={stmt:"dir",value:"BT"};break;case 160:this.$={stmt:"dir",value:"RL"};break;case 161:this.$={stmt:"dir",value:"LR"}}},table:[{3:1,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},e(s,o,{17:11}),{7:12,13:[1,13]},{16:14,21:i,22:r,24:a},{16:15,21:i,22:r,24:a},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},{8:64,10:[1,65],15:Y},e([10,15],[2,6]),e(s,[2,17]),e(s,[2,18]),e(s,[2,19]),{20:[1,68],21:[1,69],22:z,27:67,30:70},e(U,[2,11]),e(U,[2,12]),e(U,[2,13]),e(U,[2,14]),e(U,[2,15]),e(U,[2,16]),{9:72,20:W,21:H,23:q,49:73,78:77,81:[1,78],82:[1,79]},{9:80,20:W,21:H,23:q},{9:81,20:W,21:H,23:q},{9:82,20:W,21:H,23:q},{9:83,20:W,21:H,23:q},{9:84,20:W,21:H,23:q},{9:86,20:W,21:H,22:[1,85],23:q},e(U,[2,44]),{45:[1,87]},{47:[1,88]},e(U,[2,47]),e(V,[2,54],{30:89,22:z}),{22:[1,90]},{22:[1,91]},{22:[1,92]},{22:[1,93]},{26:G,52:X,66:Z,67:Q,84:[1,97],91:K,97:96,98:[1,94],100:[1,95],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(U,[2,158]),e(U,[2,159]),e(U,[2,160]),e(U,[2,161]),e(ht,[2,55],{53:[1,116]}),e(ut,[2,74],{116:129,40:[1,117],52:y,55:[1,118],57:[1,119],59:[1,120],61:[1,121],63:[1,122],65:[1,123],66:m,67:b,69:[1,124],71:[1,125],73:[1,126],74:[1,127],76:[1,128],91:T,95:C,105:E,106:S,109:A,111:D,112:L,122:I,123:F,124:R,125:$,126:P,127:j}),e(dt,[2,150]),e(dt,[2,175]),e(dt,[2,176]),e(dt,[2,177]),e(dt,[2,178]),e(dt,[2,179]),e(dt,[2,180]),e(dt,[2,181]),e(dt,[2,182]),e(dt,[2,183]),e(dt,[2,184]),e(dt,[2,185]),e(dt,[2,186]),e(dt,[2,187]),e(dt,[2,188]),e(dt,[2,189]),e(dt,[2,190]),{9:130,20:W,21:H,23:q},{11:131,14:[1,132]},e(pt,[2,8]),e(s,[2,20]),e(s,[2,26]),e(s,[2,27]),{21:[1,133]},e(ft,[2,34],{30:134,22:z}),e(U,[2,35]),{50:135,51:45,52:y,54:46,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,122:I,123:F,124:R,125:$,126:P,127:j},e(gt,[2,48]),e(gt,[2,49]),e(gt,[2,50]),e(yt,[2,78],{79:136,68:[1,138],80:[1,137]}),{22:mt,24:bt,26:_t,38:xt,39:139,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e([52,66,67,68,80,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,80]),e(U,[2,36]),e(U,[2,37]),e(U,[2,38]),e(U,[2,39]),e(U,[2,40]),{22:mt,24:bt,26:_t,38:xt,39:163,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:164}),e(U,[2,45]),e(U,[2,46]),e(V,[2,53],{52:Rt}),{26:G,52:X,66:Z,67:Q,91:K,97:166,102:[1,167],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{95:[1,168],103:169,105:[1,170]},{26:G,52:X,66:Z,67:Q,91:K,95:[1,171],97:172,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:G,52:X,66:Z,67:Q,91:K,97:173,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,101],{22:[1,174],99:[1,175]}),e(pt,[2,105],{22:[1,176]}),e(pt,[2,109],{115:100,117:178,22:[1,177],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,111],{22:[1,179]}),e($t,[2,152]),e($t,[2,154]),e($t,[2,155]),e($t,[2,156]),e($t,[2,157]),e(Pt,[2,162]),e(Pt,[2,163]),e(Pt,[2,164]),e(Pt,[2,165]),e(Pt,[2,166]),e(Pt,[2,167]),e(Pt,[2,168]),e(Pt,[2,169]),e(Pt,[2,170]),e(Pt,[2,171]),e(Pt,[2,172]),e(Pt,[2,173]),e(Pt,[2,174]),{52:y,54:180,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,122:I,123:F,124:R,125:$,126:P,127:j},{22:mt,24:bt,26:_t,38:xt,39:181,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:182,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:184,42:vt,52:X,57:[1,183],66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:185,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:186,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:187,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{66:[1,188]},{22:mt,24:bt,26:_t,38:xt,39:189,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:190,42:vt,52:X,66:Z,67:Q,71:[1,191],73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:192,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:193,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:194,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(dt,[2,151]),e(jt,[2,3]),{8:195,15:Y},{15:[2,7]},e(s,[2,28]),e(ft,[2,33]),e(V,[2,51],{30:196,22:z}),e(yt,[2,75],{22:[1,197]}),{22:[1,198]},{22:mt,24:bt,26:_t,38:xt,39:199,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,82:[1,200],83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Pt,[2,82]),e(Pt,[2,84]),e(Pt,[2,140]),e(Pt,[2,141]),e(Pt,[2,142]),e(Pt,[2,143]),e(Pt,[2,144]),e(Pt,[2,145]),e(Pt,[2,146]),e(Pt,[2,147]),e(Pt,[2,148]),e(Pt,[2,149]),e(Pt,[2,85]),e(Pt,[2,86]),e(Pt,[2,87]),e(Pt,[2,88]),e(Pt,[2,89]),e(Pt,[2,90]),e(Pt,[2,91]),e(Pt,[2,92]),e(Pt,[2,93]),e(Pt,[2,94]),e(Pt,[2,95]),{9:203,20:W,21:H,22:mt,23:q,24:bt,26:_t,38:xt,40:[1,202],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,204],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},{22:z,30:205},{22:[1,206],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,207]},{22:[1,208]},{22:[1,209],106:[1,210]},e(Yt,[2,123]),{22:[1,211]},{22:[1,212],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,213],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{84:[1,214]},e(pt,[2,103],{22:[1,215]}),{84:[1,216],101:[1,217]},{84:[1,218]},e($t,[2,153]),{84:[1,219],101:[1,220]},e(ht,[2,57],{116:129,52:y,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,122:I,123:F,124:R,125:$,126:P,127:j}),{22:mt,24:bt,26:_t,38:xt,41:[1,221],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,56:[1,222],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:223,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,58:[1,224],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,60:[1,225],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,62:[1,226],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,64:[1,227],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{67:[1,228]},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,70:[1,229],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,72:[1,230],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:231,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,41:[1,232],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,73:kt,75:[1,233],77:[1,234],81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,73:kt,75:[1,236],77:[1,235],81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{9:237,20:W,21:H,23:q},e(V,[2,52],{52:Rt}),e(yt,[2,77]),e(yt,[2,76]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,68:[1,238],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(yt,[2,79]),e(Pt,[2,83]),{22:mt,24:bt,26:_t,38:xt,39:239,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:240}),e(U,[2,43]),{51:241,52:y,54:46,66:m,67:b,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,122:I,123:F,124:R,125:$,126:P,127:j},{22:zt,66:Ut,67:Wt,86:Ht,96:242,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:256,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:257,102:qt,104:[1,258],105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:259,102:qt,104:[1,260],105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{105:[1,261]},{22:zt,66:Ut,67:Wt,86:Ht,96:262,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:263,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{26:G,52:X,66:Z,67:Q,91:K,97:264,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,102]),{84:[1,265]},e(pt,[2,106],{22:[1,266]}),e(pt,[2,107]),e(pt,[2,110]),e(pt,[2,112],{22:[1,267]}),e(pt,[2,113]),e(ut,[2,58]),e(ut,[2,59]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,58:[1,268],66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,66]),e(ut,[2,61]),e(ut,[2,62]),e(ut,[2,63]),{66:[1,269]},e(ut,[2,65]),e(ut,[2,67]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:X,66:Z,67:Q,72:[1,270],73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,69]),e(ut,[2,70]),e(ut,[2,72]),e(ut,[2,71]),e(ut,[2,73]),e(jt,[2,4]),e([22,52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,81]),{22:mt,24:bt,26:_t,38:xt,41:[1,271],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,272],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},e(ht,[2,56]),e(pt,[2,115],{106:Jt}),e(te,[2,125],{108:274,22:zt,66:Ut,67:Wt,86:Ht,102:qt,105:Vt,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt}),e(ee,[2,127]),e(ee,[2,129]),e(ee,[2,130]),e(ee,[2,131]),e(ee,[2,132]),e(ee,[2,133]),e(ee,[2,134]),e(ee,[2,135]),e(ee,[2,136]),e(ee,[2,137]),e(ee,[2,138]),e(ee,[2,139]),e(pt,[2,116],{106:Jt}),e(pt,[2,117],{106:Jt}),{22:[1,275]},e(pt,[2,118],{106:Jt}),{22:[1,276]},e(Yt,[2,124]),e(pt,[2,98],{106:Jt}),e(pt,[2,99],{106:Jt}),e(pt,[2,100],{115:100,117:178,26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,104]),{101:[1,277]},{101:[1,278]},{58:[1,279]},{68:[1,280]},{72:[1,281]},{9:282,20:W,21:H,23:q},e(U,[2,42]),{22:zt,66:Ut,67:Wt,86:Ht,102:qt,105:Vt,107:283,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},e(ee,[2,128]),{26:G,52:X,66:Z,67:Q,91:K,97:284,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:G,52:X,66:Z,67:Q,91:K,97:285,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,108]),e(pt,[2,114]),e(ut,[2,60]),{22:mt,24:bt,26:_t,38:xt,39:286,42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:140,84:Tt,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,68]),e(Ft,o,{17:287}),e(te,[2,126],{108:274,22:zt,66:Ut,67:Wt,86:Ht,102:qt,105:Vt,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt}),e(pt,[2,121],{115:100,117:178,22:[1,288],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,122],{115:100,117:178,22:[1,289],26:G,52:X,66:Z,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),{22:mt,24:bt,26:_t,38:xt,41:[1,290],42:vt,52:X,66:Z,67:Q,73:kt,81:wt,83:201,85:151,86:Ct,87:Et,88:St,89:At,90:Dt,91:Lt,92:Nt,94:142,95:Ot,105:J,106:tt,109:Bt,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,291],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:T,95:C,105:E,106:S,109:A,111:D,112:L,116:47,118:N,119:O,120:B,121:M,122:I,123:F,124:R,125:$,126:P,127:j},{22:zt,66:Ut,67:Wt,86:Ht,96:292,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},{22:zt,66:Ut,67:Wt,86:Ht,96:293,102:qt,105:Vt,107:243,108:244,109:Gt,110:Xt,111:Zt,112:Qt,113:Kt},e(ut,[2,64]),e(U,[2,41]),e(pt,[2,119],{106:Jt}),e(pt,[2,120],{106:Jt})],defaultActions:{2:[2,1],9:[2,5],10:[2,2],132:[2,7]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},ie=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),12;case 1:return this.begin("type_directive"),13;case 2:return this.popState(),this.begin("arg_directive"),10;case 3:return this.popState(),this.popState(),15;case 4:return 14;case 5:case 6:break;case 7:return this.begin("acc_title"),44;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),46;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:case 15:case 24:case 27:case 30:case 33:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:this.begin("string");break;case 16:return"STR";case 17:return 86;case 18:return 95;case 19:return 87;case 20:return 104;case 21:return 88;case 22:return 89;case 23:this.begin("href");break;case 25:return 100;case 26:this.begin("callbackname");break;case 28:this.popState(),this.begin("callbackargs");break;case 29:return 98;case 31:return 99;case 32:this.begin("click");break;case 34:return 90;case 35:case 36:return t.lex.firstGraph()&&this.begin("dir"),24;case 37:return 38;case 38:return 42;case 39:case 40:case 41:case 42:return 101;case 43:return this.popState(),25;case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:return this.popState(),26;case 54:return 118;case 55:return 119;case 56:return 120;case 57:return 121;case 58:return 105;case 59:return 111;case 60:return 53;case 61:return 67;case 62:return 52;case 63:return 20;case 64:return 106;case 65:return 126;case 66:case 67:case 68:return 82;case 69:case 70:case 71:return 81;case 72:return 59;case 73:return 60;case 74:return 61;case 75:return 62;case 76:return 63;case 77:return 64;case 78:return 65;case 79:return 69;case 80:return 70;case 81:return 55;case 82:return 56;case 83:return 109;case 84:return 112;case 85:return 127;case 86:return 124;case 87:return 113;case 88:case 89:return 125;case 90:return 114;case 91:return 73;case 92:return 92;case 93:return"SEP";case 94:return 91;case 95:return 66;case 96:return 75;case 97:return 74;case 98:return 77;case 99:return 76;case 100:return 122;case 101:return 123;case 102:return 68;case 103:return 57;case 104:return 58;case 105:return 40;case 106:return 41;case 107:return 71;case 108:return 72;case 109:return 133;case 110:return 21;case 111:return 22;case 112:return 23}},rules:[/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\])/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[30,31],inclusive:!1},callbackname:{rules:[27,28,29],inclusive:!1},href:{rules:[24,25],inclusive:!1},click:{rules:[33,34],inclusive:!1},vertex:{rules:[],inclusive:!1},dir:{rules:[43,44,45,46,47,48,49,50,51,52,53],inclusive:!1},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},string:{rules:[15,16],inclusive:!1},INITIAL:{rules:[0,5,6,7,9,11,14,17,18,19,20,21,22,23,26,32,35,36,37,38,39,40,41,42,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112],inclusive:!0}}},t);function re(){this.yy={}}return ne.lexer=ie,re.prototype=ne,ne.Parser=re,new re}();uC.parser=uC;const dC=uC,pC=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*graph/)},fC=(t,e)=>{var n;return"dagre-wrapper"===(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*graph/)||null!==t.match(/^\s*flowchart/)};let gC,yC,mC=0,bC=hv(),_C={},xC=[],vC={},kC=[],wC={},TC={},CC=0,EC=!0,SC=[];const AC=t=>jb.sanitizeText(t,bC),DC=function(t){const e=Object.keys(_C);for(const n of e)if(_C[n].id===t)return _C[n].domId;return t},LC=function(t,e,n,i){const r={start:t,end:e,type:void 0,text:""};void 0!==(i=n.text)&&(r.text=AC(i.trim()),'"'===r.text[0]&&'"'===r.text[r.text.length-1]&&(r.text=r.text.substring(1,r.text.length-1))),void 0!==n&&(r.type=n.type,r.stroke=n.stroke,r.length=n.length),xC.push(r)},NC=function(t,e){t.split(",").forEach((function(t){let n=t;void 0!==_C[n]&&_C[n].classes.push(e),void 0!==wC[n]&&wC[n].classes.push(e)}))},OC=function(t){let e=Ho(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=Ho("body").append("div").attr("class","mermaidTooltip").style("opacity",0));Ho(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=Ho(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);Ho(this).classed("hover",!1)}))};SC.push(OC);const BC=function(t){for(const[e,n]of kC.entries())if(n.id===t)return e;return-1};let MC=-1;const IC=[],FC=function(t,e){const n=kC[e].nodes;if(MC+=1,MC>2e3)return;if(IC[MC]=e,kC[e].id===t)return{result:!0,count:0};let i=0,r=1;for(;i<n.length;){const e=BC(n[i]);if(e>=0){const n=FC(t,e);if(n.result)return{result:!0,count:r+n.count};r+=n.count}i+=1}return{result:!1,count:r}},RC=(t,e)=>{let n=!1;return t.forEach((t=>{t.nodes.indexOf(e)>=0&&(n=!0)})),n},$C=(t,e)=>{const n=[];return t.nodes.forEach(((i,r)=>{RC(e,i)||n.push(t.nodes[r])})),{nodes:n}},PC={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},defaultConfig:()=>nv.flowchart,setAccTitle:Xv,getAccTitle:Zv,getAccDescription:Kv,setAccDescription:Qv,addVertex:function(t,e,n,i,r,a,s={}){let o,c=t;void 0!==c&&0!==c.trim().length&&(void 0===_C[c]&&(_C[c]={id:c,domId:"flowchart-"+c+"-"+mC,styles:[],classes:[]}),mC++,void 0!==e?(bC=hv(),o=AC(e.trim()),'"'===o[0]&&'"'===o[o.length-1]&&(o=o.substring(1,o.length-1)),_C[c].text=o):void 0===_C[c].text&&(_C[c].text=t),void 0!==n&&(_C[c].type=n),null!=i&&i.forEach((function(t){_C[c].styles.push(t)})),null!=r&&r.forEach((function(t){_C[c].classes.push(t)})),void 0!==a&&(_C[c].dir=a),void 0===_C[c].props?_C[c].props=s:void 0!==s&&Object.assign(_C[c].props,s))},lookUpDomId:DC,addLink:function(t,e,n,i){let r,a;for(r=0;r<t.length;r++)for(a=0;a<e.length;a++)LC(t[r],e[a],n,i)},updateLinkInterpolate:function(t,e){t.forEach((function(t){"default"===t?xC.defaultInterpolate=e:xC[t].interpolate=e}))},updateLink:function(t,e){t.forEach((function(t){"default"===t?xC.defaultStyle=e:(-1===tv.isSubstringInArray("fill",e)&&e.push("fill:none"),xC[t].style=e)}))},addClass:function(t,e){void 0===vC[t]&&(vC[t]={id:t,styles:[],textStyles:[]}),null!=e&&e.forEach((function(e){if(e.match("color")){const n=e.replace("fill","bgFill").replace("color","fill");vC[t].textStyles.push(n)}vC[t].styles.push(e)}))},setDirection:function(t){gC=t,gC.match(/.*</)&&(gC="RL"),gC.match(/.*\^/)&&(gC="BT"),gC.match(/.*>/)&&(gC="LR"),gC.match(/.*v/)&&(gC="TB")},setClass:NC,setTooltip:function(t,e){t.split(",").forEach((function(t){void 0!==e&&(TC["gen-1"===yC?DC(t):t]=AC(e))}))},getTooltip:function(t){return TC[t]},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){let i=DC(t);if("loose"!==hv().securityLevel)return;if(void 0===e)return;let r=[];if("string"==typeof n){r=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<r.length;t++){let e=r[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),r[t]=e}}0===r.length&&r.push(t),void 0!==_C[t]&&(_C[t].haveCallback=!0,SC.push((function(){const t=document.querySelector(`[id="${i}"]`);null!==t&&t.addEventListener("click",(function(){tv.runFunc(e,...r)}),!1)})))}(t,e,n)})),NC(t,"clickable")},setLink:function(t,e,n){t.split(",").forEach((function(t){void 0!==_C[t]&&(_C[t].link=tv.formatUrl(e,bC),_C[t].linkTarget=n)})),NC(t,"clickable")},bindFunctions:function(t){SC.forEach((function(e){e(t)}))},getDirection:function(){return gC.trim()},getVertices:function(){return _C},getEdges:function(){return xC},getClasses:function(){return vC},clear:function(t="gen-1"){_C={},vC={},xC=[],SC=[OC],kC=[],wC={},CC=0,TC=[],EC=!0,yC=t,Gv()},setGen:t=>{yC=t||"gen-1"},defaultStyle:function(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"},addSubGraph:function(t,e,n){let i=t.trim(),r=n;t===n&&n.match(/\s/)&&(i=void 0);let a=[];const{nodeList:s,dir:o}=function(t){const e={boolean:{},number:{},string:{}},n=[];let i;return{nodeList:t.filter((function(t){const r=typeof t;return t.stmt&&"dir"===t.stmt?(i=t.value,!1):""!==t.trim()&&(r in e?!e[r].hasOwnProperty(t)&&(e[r][t]=!0):!n.includes(t)&&n.push(t))})),dir:i}}(a.concat.apply(a,e));if(a=s,"gen-1"===yC)for(let l=0;l<a.length;l++)a[l]=DC(a[l]);i=i||"subGraph"+CC,r=r||"",r=AC(r),CC+=1;const c={id:i,nodes:a,title:r.trim(),classes:[],dir:o};return Db.info("Adding",c.id,c.nodes,c.dir),c.nodes=$C(c,kC).nodes,kC.push(c),wC[i]=c,i},getDepthFirstPos:function(t){return IC[t]},indexNodes:function(){MC=-1,kC.length>0&&FC("none",kC.length-1)},getSubGraphs:function(){return kC},destructLink:(t,e)=>{const n=(t=>{const e=t.trim();let n=e.slice(0,-1),i="arrow_open";switch(e.slice(-1)){case"x":i="arrow_cross","x"===e[0]&&(i="double_"+i,n=n.slice(1));break;case">":i="arrow_point","<"===e[0]&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle","o"===e[0]&&(i="double_"+i,n=n.slice(1))}let r="normal",a=n.length-1;"="===n[0]&&(r="thick");let s=((t,e)=>{const n=e.length;let i=0;for(let r=0;r<n;++r)e[r]===t&&++i;return i})(".",n);return s&&(r="dotted",a=s),{type:i,stroke:r,length:a}})(t);let i;if(e){if(i=(t=>{let e=t.trim(),n="arrow_open";switch(e[0]){case"<":n="arrow_point",e=e.slice(1);break;case"x":n="arrow_cross",e=e.slice(1);break;case"o":n="arrow_circle",e=e.slice(1)}let i="normal";return e.includes("=")&&(i="thick"),e.includes(".")&&(i="dotted"),{type:n,stroke:i}})(e),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if("arrow_open"===i.type)i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return"double_arrow"===i.type&&(i.type="double_arrow_point"),i.length=n.length,i}return n},lex:{firstGraph:()=>!!EC&&(EC=!1,!0)},exists:RC,makeUniq:$C,setDiagramTitle:Jv,getDiagramTitle:tk};const jC={},YC=function(t){const e=Object.keys(t);for(const n of e)jC[n]=t[n]},zC={},UC=function(t,e,n,i,r,a){const s=i.select(`[id="${n}"]`);Object.keys(t).forEach((function(n){const i=t[n];let o="default";i.classes.length>0&&(o=i.classes.join(" "));const c=jx(i.styles);let l,h=void 0!==i.text?i.text:i.id;if($b(hv().flowchart.htmlLabels)){const t={label:h.replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`))};l=Cb(s,t).node(),l.parentNode.removeChild(l)}else{const t=r.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",c.labelStyle.replace("color:","fill:"));const e=h.split(jb.lineBreakRegex);for(const n of e){const e=r.createElementNS("http://www.w3.org/2000/svg","tspan");e.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),e.setAttribute("dy","1em"),e.setAttribute("x","1"),e.textContent=n,t.appendChild(e)}l=t}let u=0,d="";switch(i.type){case"round":u=5,d="rect";break;case"square":case"group":default:d="rect";break;case"diamond":d="question";break;case"hexagon":d="hexagon";break;case"odd":case"odd_right":d="rect_left_inv_arrow";break;case"lean_right":d="lean_right";break;case"lean_left":d="lean_left";break;case"trapezoid":d="trapezoid";break;case"inv_trapezoid":d="inv_trapezoid";break;case"circle":d="circle";break;case"ellipse":d="ellipse";break;case"stadium":d="stadium";break;case"subroutine":d="subroutine";break;case"cylinder":d="cylinder";break;case"doublecircle":d="doublecircle"}e.setNode(i.id,{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,link:i.link,linkTarget:i.linkTarget,tooltip:a.db.getTooltip(i.id)||"",domId:a.db.lookUpDomId(i.id),haveCallback:i.haveCallback,width:"group"===i.type?500:void 0,dir:i.dir,type:i.type,props:i.props,padding:hv().flowchart.padding}),Db.info("setNode",{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,domId:a.db.lookUpDomId(i.id),width:"group"===i.type?500:void 0,type:i.type,dir:i.dir,props:i.props,padding:hv().flowchart.padding})}))},WC=function(t,e,n){Db.info("abc78 edges = ",t);let i,r,a=0,s={};if(void 0!==t.defaultStyle){const e=jx(t.defaultStyle);i=e.style,r=e.labelStyle}t.forEach((function(n){a++;var o="L-"+n.start+"-"+n.end;void 0===s[o]?(s[o]=0,Db.info("abc78 new entry",o,s[o])):(s[o]++,Db.info("abc78 new entry",o,s[o]));let c=o+"-"+s[o];Db.info("abc78 new link id to be used is",o,c,s[o]);var l="LS-"+n.start,h="LE-"+n.end;const u={style:"",labelStyle:""};switch(u.minlen=n.length||1,"arrow_open"===n.type?u.arrowhead="none":u.arrowhead="normal",u.arrowTypeStart="arrow_open",u.arrowTypeEnd="arrow_open",n.type){case"double_arrow_cross":u.arrowTypeStart="arrow_cross";case"arrow_cross":u.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":u.arrowTypeStart="arrow_point";case"arrow_point":u.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":u.arrowTypeStart="arrow_circle";case"arrow_circle":u.arrowTypeEnd="arrow_circle"}let d="",p="";switch(n.stroke){case"normal":d="fill:none;",void 0!==i&&(d=i),void 0!==r&&(p=r),u.thickness="normal",u.pattern="solid";break;case"dotted":u.thickness="normal",u.pattern="dotted",u.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":u.thickness="thick",u.pattern="solid",u.style="stroke-width: 3.5px;fill:none;"}if(void 0!==n.style){const t=jx(n.style);d=t.style,p=t.labelStyle}u.style=u.style+=d,u.labelStyle=u.labelStyle+=p,void 0!==n.interpolate?u.curve=$x(n.interpolate,Tc):void 0!==t.defaultInterpolate?u.curve=$x(t.defaultInterpolate,Tc):u.curve=$x(zC.curve,Tc),void 0===n.text?void 0!==n.style&&(u.arrowheadStyle="fill: #333"):(u.arrowheadStyle="fill: #333",u.labelpos="c"),u.labelType="text",u.label=n.text.replace(jb.lineBreakRegex,"\n"),void 0===n.style&&(u.style=u.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),u.labelStyle=u.labelStyle.replace("color:","fill:"),u.id=c,u.classes="flowchart-link "+l+" "+h,e.setEdge(n.start,n.end,u,a)}))},HC={setConf:function(t){const e=Object.keys(t);for(const n of e)zC[n]=t[n]},addVertices:UC,addEdges:WC,getClasses:function(t,e){Db.info("Extracting classes"),e.db.clear();try{return e.parse(t),e.db.getClasses()}catch(n){return}},draw:function(t,e,n,i){Db.info("Drawing flowchart"),i.db.clear(),PC.setGen("gen-2"),i.parser.parse(t);let r=i.db.getDirection();void 0===r&&(r="TD");const{securityLevel:a,flowchart:s}=hv(),o=s.nodeSpacing||50,c=s.rankSpacing||50;let l;"sandbox"===a&&(l=Ho("#i"+e));const h=Ho("sandbox"===a?l.nodes()[0].contentDocument.body:"body"),u="sandbox"===a?l.nodes()[0].contentDocument:document,d=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:r,nodesep:o,ranksep:c,marginx:0,marginy:0}).setDefaultEdgeLabel((function(){return{}}));let p;const f=i.db.getSubGraphs();Db.info("Subgraphs - ",f);for(let x=f.length-1;x>=0;x--)p=f[x],Db.info("Subgraph - ",p),i.db.addVertex(p.id,p.title,"group",void 0,p.classes,p.dir);const g=i.db.getVertices(),y=i.db.getEdges();Db.info(y);let m=0;for(m=f.length-1;m>=0;m--){p=f[m],qo("cluster").append("text");for(let t=0;t<p.nodes.length;t++)Db.info("Setting up subgraphs",p.nodes[t],p.id),d.setParent(p.nodes[t],p.id)}UC(g,d,e,h,u,i),WC(y,d);const b=h.select(`[id="${e}"]`),_=h.select("#"+e+" g");if(zT(_,d,["point","circle","cross"],"flowchart",e),tv.insertTitle(b,"flowchartTitleText",s.titleTopMargin,i.db.getDiagramTitle()),bv(d,b,s.diagramPadding,s.useMaxWidth),i.db.indexNodes("subGraph"+m),!s.htmlLabels){const t=u.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of t){const t=e.getBBox(),n=u.createElementNS("http://www.w3.org/2000/svg","rect");n.setAttribute("rx",0),n.setAttribute("ry",0),n.setAttribute("width",t.width),n.setAttribute("height",t.height),e.insertBefore(n,e.firstChild)}}Object.keys(g).forEach((function(t){const n=g[t];if(n.link){const i=Ho("#"+e+' [id="'+t+'"]');if(i){const t=u.createElementNS("http://www.w3.org/2000/svg","a");t.setAttributeNS("http://www.w3.org/2000/svg","class",n.classes.join(" ")),t.setAttributeNS("http://www.w3.org/2000/svg","href",n.link),t.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),"sandbox"===a?t.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):n.linkTarget&&t.setAttributeNS("http://www.w3.org/2000/svg","target",n.linkTarget);const e=i.insert((function(){return t}),":first-child"),r=i.select(".label-container");r&&e.append((function(){return r.node()}));const s=i.select(".label");s&&e.append((function(){return s.node()}))}}}))}};var qC=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,21],d=[1,22],p=[1,23],f=[1,24],g=[1,25],y=[1,26],m=[1,27],b=[1,29],_=[1,31],x=[1,34],v=[5,7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],k={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,gantt:5,document:6,EOF:7,line:8,SPACE:9,statement:10,NL:11,dateFormat:12,inclusiveEndDates:13,topAxis:14,axisFormat:15,tickInterval:16,excludes:17,includes:18,todayMarker:19,title:20,acc_title:21,acc_title_value:22,acc_descr:23,acc_descr_value:24,acc_descr_multiline_value:25,section:26,clickStatement:27,taskTxt:28,taskData:29,openDirective:30,typeDirective:31,closeDirective:32,":":33,argDirective:34,click:35,callbackname:36,callbackargs:37,href:38,clickStatementDebug:39,open_directive:40,type_directive:41,arg_directive:42,close_directive:43,$accept:0,$end:1},terminals_:{2:"error",5:"gantt",7:"EOF",9:"SPACE",11:"NL",12:"dateFormat",13:"inclusiveEndDates",14:"topAxis",15:"axisFormat",16:"tickInterval",17:"excludes",18:"includes",19:"todayMarker",20:"title",21:"acc_title",22:"acc_title_value",23:"acc_descr",24:"acc_descr_value",25:"acc_descr_multiline_value",26:"section",28:"taskTxt",29:"taskData",33:":",35:"click",36:"callbackname",37:"callbackargs",38:"href",40:"open_directive",41:"type_directive",42:"arg_directive",43:"close_directive"},productions_:[0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[27,2],[27,3],[27,3],[27,4],[27,3],[27,4],[27,2],[39,2],[39,3],[39,3],[39,4],[39,3],[39,4],[39,2],[30,1],[31,1],[34,1],[32,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 2:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 9:i.setDateFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 10:i.enableInclusiveEndDates(),this.$=a[o].substr(18);break;case 11:i.TopAxis(),this.$=a[o].substr(8);break;case 12:i.setAxisFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 13:i.setTickInterval(a[o].substr(13)),this.$=a[o].substr(13);break;case 14:i.setExcludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 15:i.setIncludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 16:i.setTodayMarker(a[o].substr(12)),this.$=a[o].substr(12);break;case 17:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 18:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 19:case 20:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 23:i.addTask(a[o-1],a[o]),this.$="task";break;case 27:this.$=a[o-1],i.setClickEvent(a[o-1],a[o],null);break;case 28:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 29:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],null),i.setLink(a[o-2],a[o]);break;case 30:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setLink(a[o-3],a[o]);break;case 31:this.$=a[o-2],i.setClickEvent(a[o-2],a[o],null),i.setLink(a[o-2],a[o-1]);break;case 32:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-1],a[o]),i.setLink(a[o-3],a[o-2]);break;case 33:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 34:case 40:this.$=a[o-1]+" "+a[o];break;case 35:case 36:case 38:this.$=a[o-2]+" "+a[o-1]+" "+a[o];break;case 37:case 39:this.$=a[o-3]+" "+a[o-2]+" "+a[o-1]+" "+a[o];break;case 41:i.parseDirective("%%{","open_directive");break;case 42:i.parseDirective(a[o],"type_directive");break;case 43:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 44:i.parseDirective("}%%","close_directive","gantt")}},table:[{3:1,4:2,5:n,30:4,40:i},{1:[3]},{3:6,4:2,5:n,30:4,40:i},e(r,[2,3],{6:7}),{31:8,41:[1,9]},{41:[2,41]},{1:[2,1]},{4:30,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},{32:32,33:[1,33],43:x},e([33,43],[2,42]),e(r,[2,8],{1:[2,2]}),e(r,[2,4]),{4:30,10:35,12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,9]),e(r,[2,10]),e(r,[2,11]),e(r,[2,12]),e(r,[2,13]),e(r,[2,14]),e(r,[2,15]),e(r,[2,16]),e(r,[2,17]),{22:[1,36]},{24:[1,37]},e(r,[2,20]),e(r,[2,21]),e(r,[2,22]),{29:[1,38]},e(r,[2,24]),{36:[1,39],38:[1,40]},{11:[1,41]},{34:42,42:[1,43]},{11:[2,44]},e(r,[2,5]),e(r,[2,18]),e(r,[2,19]),e(r,[2,23]),e(r,[2,27],{37:[1,44],38:[1,45]}),e(r,[2,33],{36:[1,46]}),e(v,[2,25]),{32:47,43:x},{43:[2,43]},e(r,[2,28],{38:[1,48]}),e(r,[2,29]),e(r,[2,31],{37:[1,49]}),{11:[1,50]},e(r,[2,30]),e(r,[2,32]),e(v,[2,26])],defaultActions:{5:[2,41],6:[2,1],34:[2,44],43:[2,43]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),40;case 1:return this.begin("type_directive"),41;case 2:return this.popState(),this.begin("arg_directive"),33;case 3:return this.popState(),this.popState(),43;case 4:return 42;case 5:return this.begin("acc_title"),21;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),23;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 20:case 23:case 26:case 29:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:case 13:case 14:case 16:case 17:case 18:break;case 15:return 11;case 19:this.begin("href");break;case 21:return 38;case 22:this.begin("callbackname");break;case 24:this.popState(),this.begin("callbackargs");break;case 25:return 36;case 27:return 37;case 28:this.begin("click");break;case 30:return 35;case 31:return 5;case 32:return 12;case 33:return 13;case 34:return 14;case 35:return 15;case 36:return 16;case 37:return 18;case 38:return 17;case 39:return 19;case 40:return"date";case 41:return 20;case 42:return"accDescription";case 43:return 26;case 44:return 28;case 45:return 29;case 46:return 33;case 47:return 7;case 48:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[26,27],inclusive:!1},callbackname:{rules:[23,24,25],inclusive:!1},href:{rules:[20,21],inclusive:!1},click:{rules:[29,30],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,22,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],inclusive:!0}}},t);function T(){this.yy={}}return k.lexer=w,T.prototype=k,k.Parser=T,new T}();qC.parser=qC;const VC=qC,GC=t=>null!==t.match(/^\s*gantt/);let XC,ZC="",QC="",KC="",JC=[],tE=[],eE={},nE=[],iE=[],rE="";const aE=["active","done","crit","milestone"];let sE=[],oE=!1,cE=!1,lE=0;const hE=function(t,e,n,i){return!i.includes(t.format(e.trim()))&&(!!(t.isoWeekday()>=6&&n.includes("weekends"))||(!!n.includes(t.format("dddd").toLowerCase())||n.includes(t.format(e.trim()))))},uE=function(t,e,n,i){if(!n.length||t.manualEndTime)return;let r=_t(t.startTime,e,!0);r.add(1,"d");let a=_t(t.endTime,e,!0),s=dE(r,a,e,n,i);t.endTime=a.toDate(),t.renderEndTime=s},dE=function(t,e,n,i,r){let a=!1,s=null;for(;t<=e;)a||(s=e.toDate()),a=hE(t,n,i,r),a&&e.add(1,"d"),t.add(1,"d");return s},pE=function(t,e,n){n=n.trim();const i=/^after\s+([\d\w- ]+)/.exec(n.trim());if(null!==i){let t=null;if(i[1].split(" ").forEach((function(e){let n=kE(e);void 0!==n&&(t?n.endTime>t.endTime&&(t=n):t=n)})),t)return t.endTime;{const t=new Date;return t.setHours(0,0,0,0),t}}let r=_t(n,e.trim(),!0);if(r.isValid())return r.toDate();{Db.debug("Invalid date:"+n),Db.debug("With date format:"+e.trim());const t=new Date(n);if(void 0===t||isNaN(t.getTime()))throw new Error("Invalid date:"+n);return t}},fE=function(t){const e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return null!==e?_t.duration(Number.parseFloat(e[1]),e[2]):_t.duration.invalid()},gE=function(t,e,n,i=!1){n=n.trim();let r=_t(n,e.trim(),!0);if(r.isValid())return i&&r.add(1,"d"),r.toDate();const a=_t(t),s=fE(n);return s.isValid()&&a.add(s),a.toDate()};let yE=0;const mE=function(t){return void 0===t?(yE+=1,"task"+yE):t};let bE,_E,xE=[];const vE={},kE=function(t){const e=vE[t];return xE[e]},wE=function(){const t=function(t){const e=xE[t];let n="";switch(xE[t].raw.startTime.type){case"prevTaskEnd":{const t=kE(e.prevTaskId);e.startTime=t.endTime;break}case"getStartDate":n=pE(0,ZC,xE[t].raw.startTime.startData),n&&(xE[t].startTime=n)}return xE[t].startTime&&(xE[t].endTime=gE(xE[t].startTime,ZC,xE[t].raw.endTime.data,oE),xE[t].endTime&&(xE[t].processed=!0,xE[t].manualEndTime=_t(xE[t].raw.endTime.data,"YYYY-MM-DD",!0).isValid(),uE(xE[t],ZC,tE,JC))),xE[t].processed};let e=!0;for(const[n,i]of xE.entries())t(n),e=e&&i.processed;return e},TE=function(t,e){t.split(",").forEach((function(t){let n=kE(t);void 0!==n&&n.classes.push(e)}))},CE=function(t,e){sE.push((function(){const n=document.querySelector(`[id="${t}"]`);null!==n&&n.addEventListener("click",(function(){e()}))}),(function(){const n=document.querySelector(`[id="${t}-text"]`);null!==n&&n.addEventListener("click",(function(){e()}))}))},EE={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().gantt,clear:function(){nE=[],iE=[],rE="",sE=[],yE=0,bE=void 0,_E=void 0,xE=[],ZC="",QC="",XC=void 0,KC="",JC=[],tE=[],oE=!1,cE=!1,lE=0,eE={},Gv()},setDateFormat:function(t){ZC=t},getDateFormat:function(){return ZC},enableInclusiveEndDates:function(){oE=!0},endDatesAreInclusive:function(){return oE},enableTopAxis:function(){cE=!0},topAxisEnabled:function(){return cE},setAxisFormat:function(t){QC=t},getAxisFormat:function(){return QC},setTickInterval:function(t){XC=t},getTickInterval:function(){return XC},setTodayMarker:function(t){KC=t},getTodayMarker:function(){return KC},setAccTitle:Xv,getAccTitle:Zv,setDiagramTitle:Jv,getDiagramTitle:tk,setAccDescription:Qv,getAccDescription:Kv,addSection:function(t){rE=t,nE.push(t)},getSections:function(){return nE},getTasks:function(){let t=wE();let e=0;for(;!t&&e<10;)t=wE(),e++;return iE=xE,iE},addTask:function(t,e){const n={section:rE,type:rE,processed:!1,manualEndTime:!1,renderEndTime:null,raw:{data:e},task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};SE(i,r,aE);for(let a=0;a<i.length;a++)i[a]=i[a].trim();switch(i.length){case 1:r.id=mE(),r.startTime={type:"prevTaskEnd",id:t},r.endTime={data:i[0]};break;case 2:r.id=mE(),r.startTime={type:"getStartDate",startData:i[0]},r.endTime={data:i[1]};break;case 3:r.id=mE(i[0]),r.startTime={type:"getStartDate",startData:i[1]},r.endTime={data:i[2]}}return r}(_E,e);n.raw.startTime=i.startTime,n.raw.endTime=i.endTime,n.id=i.id,n.prevTaskId=_E,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,n.order=lE,lE++;const r=xE.push(n);_E=n.id,vE[n.id]=r-1},findTaskById:kE,addTaskOrg:function(t,e){const n={section:rE,type:rE,description:t,task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};SE(i,r,aE);for(let s=0;s<i.length;s++)i[s]=i[s].trim();let a="";switch(i.length){case 1:r.id=mE(),r.startTime=t.endTime,a=i[0];break;case 2:r.id=mE(),r.startTime=pE(0,ZC,i[0]),a=i[1];break;case 3:r.id=mE(i[0]),r.startTime=pE(0,ZC,i[1]),a=i[2]}return a&&(r.endTime=gE(r.startTime,ZC,a,oE),r.manualEndTime=_t(a,"YYYY-MM-DD",!0).isValid(),uE(r,ZC,tE,JC)),r}(bE,e);n.startTime=i.startTime,n.endTime=i.endTime,n.id=i.id,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,bE=n,iE.push(n)},setIncludes:function(t){JC=t.toLowerCase().split(/[\s,]+/)},getIncludes:function(){return JC},setExcludes:function(t){tE=t.toLowerCase().split(/[\s,]+/)},getExcludes:function(){return tE},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){if("loose"!==hv().securityLevel)return;if(void 0===e)return;let i=[];if("string"==typeof n){i=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<i.length;t++){let e=i[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),i[t]=e}}0===i.length&&i.push(t),void 0!==kE(t)&&CE(t,(()=>{tv.runFunc(e,...i)}))}(t,e,n)})),TE(t,"clickable")},setLink:function(t,e){let n=e;"loose"!==hv().securityLevel&&(n=(0,xt.N)(e)),t.split(",").forEach((function(t){void 0!==kE(t)&&(CE(t,(()=>{window.open(n,"_self")})),eE[t]=n)})),TE(t,"clickable")},getLinks:function(){return eE},bindFunctions:function(t){sE.forEach((function(e){e(t)}))},parseDuration:fE,isInvalidDate:hE};function SE(t,e,n){let i=!0;for(;i;)i=!1,n.forEach((function(n){const r=new RegExp("^\\s*"+n+"\\s*$");t[0].match(r)&&(e[n]=!0,t.shift(1),i=!0)}))}let AE;const DE={setConf:function(){Db.debug("Something is calling, setConf, remove the call")},draw:function(t,e,n,i){const r=hv().gantt,a=hv().securityLevel;let s;"sandbox"===a&&(s=Ho("#i"+e));const o=Ho("sandbox"===a?s.nodes()[0].contentDocument.body:"body"),c="sandbox"===a?s.nodes()[0].contentDocument:document,l=c.getElementById(e);AE=l.parentElement.offsetWidth,void 0===AE&&(AE=1200),void 0!==r.useWidth&&(AE=r.useWidth);const h=i.db.getTasks(),u=h.length*(r.barHeight+r.barGap)+2*r.topPadding;l.setAttribute("viewBox","0 0 "+AE+" "+u);const d=o.select(`[id="${e}"]`),p=function(){return na.apply(Wo(ms,bs,ds,hs,Xa,Ha,Ua,Ya,ja,ws).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}().domain([kt(h,(function(t){return t.startTime})),vt(h,(function(t){return t.endTime}))]).rangeRound([0,AE-r.leftPadding-r.rightPadding]);let f=[];for(const m of h)f.push(m.type);const g=f;function y(t,e){return function(t){let e=t.length;const n={};for(;e;)n[t[--e]]=(n[t[e]]||0)+1;return n}(e)[t]||0}f=function(t){const e={},n=[];for(let i=0,r=t.length;i<r;++i)Object.prototype.hasOwnProperty.call(e,t[i])||(e[t[i]]=!0,n.push(t[i]));return n}(f),h.sort((function(t,e){const n=t.startTime,i=e.startTime;let r=0;return n>i?r=1:n<i&&(r=-1),r})),function(t,n,a){const s=r.barHeight,o=s+r.barGap,l=r.topPadding,h=r.leftPadding;xa().domain([0,f.length]).range(["#00B9FA","#F95002"]).interpolate(Sr);(function(t,e,n,a,s,o,c,l){const h=o.reduce(((t,{startTime:e})=>t?Math.min(t,e):e),0),u=o.reduce(((t,{endTime:e})=>t?Math.max(t,e):e),0),f=i.db.getDateFormat();if(!h||!u)return;const g=[];let y=null,m=_t(h);for(;m.valueOf()<=u;)i.db.isInvalidDate(m,f,c,l)?y?y.end=m.clone():y={start:m.clone(),end:m.clone()}:y&&(g.push(y),y=null),m.add(1,"d");d.append("g").selectAll("rect").data(g).enter().append("rect").attr("id",(function(t){return"exclude-"+t.start.format("YYYY-MM-DD")})).attr("x",(function(t){return p(t.start)+n})).attr("y",r.gridLineStartPadding).attr("width",(function(t){const e=t.end.clone().add(1,"day");return p(e)-p(t.start)})).attr("height",s-e-r.gridLineStartPadding).attr("transform-origin",(function(e,i){return(p(e.start)+n+.5*(p(e.end)-p(e.start))).toString()+"px "+(i*t+.5*s).toString()+"px"})).attr("class","exclude-range")})(o,l,h,0,a,t,i.db.getExcludes(),i.db.getIncludes()),function(t,e,n,a){let s=(o=p,Lt(3,o)).tickSize(-a+e+r.gridLineStartPadding).tickFormat(ws(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));var o;const c=/^([1-9]\d*)(minute|hour|day|week|month)$/.exec(i.db.getTickInterval()||r.tickInterval);if(null!==c){const t=c[1];switch(c[2]){case"minute":s.ticks(Ya.every(t));break;case"hour":s.ticks(Ua.every(t));break;case"day":s.ticks(Ha.every(t));break;case"week":s.ticks(Xa.every(t));break;case"month":s.ticks(hs.every(t))}}if(d.append("g").attr("class","grid").attr("transform","translate("+t+", "+(a-50)+")").call(s).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),i.db.topAxisEnabled()||r.topAxis){let n=function(t){return Lt(1,t)}(p).tickSize(-a+e+r.gridLineStartPadding).tickFormat(ws(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));if(null!==c){const t=c[1];switch(c[2]){case"minute":n.ticks(Ya.every(t));break;case"hour":n.ticks(Ua.every(t));break;case"day":n.ticks(Ha.every(t));break;case"week":n.ticks(Xa.every(t));break;case"month":n.ticks(hs.every(t))}}d.append("g").attr("class","grid").attr("transform","translate("+t+", "+e+")").call(n).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}(h,l,0,a),function(t,n,a,s,o,c,l){d.append("g").selectAll("rect").data(t).enter().append("rect").attr("x",0).attr("y",(function(t,e){return t.order*n+a-2})).attr("width",(function(){return l-r.rightPadding/2})).attr("height",n).attr("class",(function(t){for(const[e,n]of f.entries())if(t.type===n)return"section section"+e%r.numberSectionStyles;return"section section0"}));const h=d.append("g").selectAll("rect").data(t).enter(),u=i.db.getLinks();h.append("rect").attr("id",(function(t){return t.id})).attr("rx",3).attr("ry",3).attr("x",(function(t){return t.milestone?p(t.startTime)+s+.5*(p(t.endTime)-p(t.startTime))-.5*o:p(t.startTime)+s})).attr("y",(function(t,e){return t.order*n+a})).attr("width",(function(t){return t.milestone?o:p(t.renderEndTime||t.endTime)-p(t.startTime)})).attr("height",o).attr("transform-origin",(function(t,e){return e=t.order,(p(t.startTime)+s+.5*(p(t.endTime)-p(t.startTime))).toString()+"px "+(e*n+a+.5*o).toString()+"px"})).attr("class",(function(t){const e="task";let n="";t.classes.length>0&&(n=t.classes.join(" "));let i=0;for(const[s,o]of f.entries())t.type===o&&(i=s%r.numberSectionStyles);let a="";return t.active?t.crit?a+=" activeCrit":a=" active":t.done?a=t.crit?" doneCrit":" done":t.crit&&(a+=" crit"),0===a.length&&(a=" task"),t.milestone&&(a=" milestone "+a),a+=i,a+=" "+n,e+a})),h.append("text").attr("id",(function(t){return t.id+"-text"})).text((function(t){return t.task})).attr("font-size",r.fontSize).attr("x",(function(t){let e=p(t.startTime),n=p(t.renderEndTime||t.endTime);t.milestone&&(e+=.5*(p(t.endTime)-p(t.startTime))-.5*o),t.milestone&&(n=e+o);const i=this.getBBox().width;return i>n-e?n+i+1.5*r.leftPadding>l?e+s-5:n+s+5:(n-e)/2+e+s})).attr("y",(function(t,e){return t.order*n+r.barHeight/2+(r.fontSize/2-2)+a})).attr("text-height",o).attr("class",(function(t){const e=p(t.startTime);let n=p(t.endTime);t.milestone&&(n=e+o);const i=this.getBBox().width;let a="";t.classes.length>0&&(a=t.classes.join(" "));let s=0;for(const[o,l]of f.entries())t.type===l&&(s=o%r.numberSectionStyles);let c="";return t.active&&(c=t.crit?"activeCritText"+s:"activeText"+s),t.done?c=t.crit?c+" doneCritText"+s:c+" doneText"+s:t.crit&&(c=c+" critText"+s),t.milestone&&(c+=" milestoneText"),i>n-e?n+i+1.5*r.leftPadding>l?a+" taskTextOutsideLeft taskTextOutside"+s+" "+c:a+" taskTextOutsideRight taskTextOutside"+s+" "+c+" width-"+i:a+" taskText taskText"+s+" "+c+" width-"+i}));if("sandbox"===hv().securityLevel){let t;t=Ho("#i"+e);const n=t.nodes()[0].contentDocument;h.filter((function(t){return void 0!==u[t.id]})).each((function(t){var e=n.querySelector("#"+t.id),i=n.querySelector("#"+t.id+"-text");const r=e.parentNode;var a=n.createElement("a");a.setAttribute("xlink:href",u[t.id]),a.setAttribute("target","_top"),r.appendChild(a),a.appendChild(e),a.appendChild(i)}))}}(t,o,l,h,s,0,n),function(t,e){const n=[];let i=0;for(const[r,a]of f.entries())n[r]=[a,y(a,g)];d.append("g").selectAll("text").data(n).enter().append((function(t){const e=t[0].split(jb.lineBreakRegex),n=-(e.length-1)/2,i=c.createElementNS("http://www.w3.org/2000/svg","text");i.setAttribute("dy",n+"em");for(const[r,a]of e.entries()){const t=c.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttribute("alignment-baseline","central"),t.setAttribute("x","10"),r>0&&t.setAttribute("dy","1em"),t.textContent=a,i.appendChild(t)}return i})).attr("x",10).attr("y",(function(r,a){if(!(a>0))return r[1]*t/2+e;for(let s=0;s<a;s++)return i+=n[a-1][1],r[1]*t/2+i*t+e})).attr("font-size",r.sectionFontSize).attr("font-size",r.sectionFontSize).attr("class",(function(t){for(const[e,n]of f.entries())if(t[0]===n)return"sectionTitle sectionTitle"+e%r.numberSectionStyles;return"sectionTitle"}))}(o,l),function(t,e,n,a){const s=i.db.getTodayMarker();if("off"===s)return;const o=d.append("g").attr("class","today"),c=new Date,l=o.append("line");l.attr("x1",p(c)+t).attr("x2",p(c)+t).attr("y1",r.titleTopMargin).attr("y2",a-r.titleTopMargin).attr("class","today"),""!==s&&l.attr("style",s.replace(/,/g,";"))}(h,0,0,a)}(h,AE,u),mv(d,u,AE,r.useMaxWidth),d.append("text").text(i.db.getDiagramTitle()).attr("x",AE/2).attr("y",r.titleTopMargin).attr("class","titleText")}};var LE=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[6,9,10],i={trace:function(){},yy:{},symbols_:{error:2,start:3,info:4,document:5,EOF:6,line:7,statement:8,NL:9,showInfo:10,$accept:0,$end:1},terminals_:{2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},productions_:[0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],performAction:function(t,e,n,i,r,a,s){switch(a.length,r){case 1:return i;case 4:break;case 6:i.setInfo(!0)}},table:[{3:1,4:[1,2]},{1:[3]},e(n,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},e(n,[2,3]),e(n,[2,4]),e(n,[2,5]),e(n,[2,6])],defaultActions:{4:[2,1]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},r=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 4;case 1:return 9;case 2:return"space";case 3:return 10;case 4:return 6;case 5:return"TXT"}},rules:[/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5],inclusive:!0}}},t);function a(){this.yy={}}return i.lexer=r,a.prototype=i,i.Parser=a,new a}();LE.parser=LE;const NE=LE;var OE="",BE=!1;const ME={setMessage:t=>{Db.debug("Setting message to: "+t),OE=t},getMessage:()=>OE,setInfo:t=>{BE=t},getInfo:()=>BE,clear:Gv},IE={draw:(t,e,n)=>{try{Db.debug("Rendering info diagram\n"+t);const i=hv().securityLevel;let r;"sandbox"===i&&(r=Ho("#i"+e));const a=Ho("sandbox"===i?r.nodes()[0].contentDocument.body:"body").select("#"+e);a.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size","32px").style("text-anchor","middle").text("v "+n),a.attr("height",100),a.attr("width",400)}catch(i){Db.error("Error while rendering info diagram"),Db.error(i.message)}}},FE=t=>null!==t.match(/^\s*info/);var RE=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,5],r=[1,6],a=[1,7],s=[1,9],o=[1,11,13,15,17,19,20,26,27,28,29],c=[2,5],l=[1,6,11,13,15,17,19,20,26,27,28,29],h=[26,27,28],u=[2,8],d=[1,18],p=[1,19],f=[1,20],g=[1,21],y=[1,22],m=[1,23],b=[1,28],_=[6,26,27,28,29],x={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,PIE:6,document:7,showData:8,line:9,statement:10,txt:11,value:12,title:13,title_value:14,acc_title:15,acc_title_value:16,acc_descr:17,acc_descr_value:18,acc_descr_multiline_value:19,section:20,openDirective:21,typeDirective:22,closeDirective:23,":":24,argDirective:25,NEWLINE:26,";":27,EOF:28,open_directive:29,type_directive:30,arg_directive:31,close_directive:32,$accept:0,$end:1},terminals_:{2:"error",6:"PIE",8:"showData",11:"txt",12:"value",13:"title",14:"title_value",15:"acc_title",16:"acc_title_value",17:"acc_descr",18:"acc_descr_value",19:"acc_descr_multiline_value",20:"section",24:":",26:"NEWLINE",27:";",28:"EOF",29:"open_directive",30:"type_directive",31:"arg_directive",32:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,3],[7,0],[7,2],[9,2],[10,0],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,1],[5,3],[5,5],[4,1],[4,1],[4,1],[21,1],[22,1],[25,1],[23,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setShowData(!0);break;case 7:this.$=a[o-1];break;case 9:i.addSection(a[o-1],i.cleanupValue(a[o]));break;case 10:this.$=a[o].trim(),i.setDiagramTitle(this.$);break;case 11:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 12:case 13:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 14:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 21:i.parseDirective("%%{","open_directive");break;case 22:i.parseDirective(a[o],"type_directive");break;case 23:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 24:i.parseDirective("}%%","close_directive","pie")}},table:[{3:1,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{1:[3]},{3:10,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{3:11,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},e(o,c,{7:12,8:[1,13]}),e(l,[2,18]),e(l,[2,19]),e(l,[2,20]),{22:14,30:[1,15]},{30:[2,21]},{1:[2,1]},{1:[2,2]},e(h,u,{21:8,9:16,10:17,5:24,1:[2,3],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(o,c,{7:25}),{23:26,24:[1,27],32:b},e([24,32],[2,22]),e(o,[2,6]),{4:29,26:i,27:r,28:a},{12:[1,30]},{14:[1,31]},{16:[1,32]},{18:[1,33]},e(h,[2,13]),e(h,[2,14]),e(h,[2,15]),e(h,u,{21:8,9:16,10:17,5:24,1:[2,4],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(_,[2,16]),{25:34,31:[1,35]},e(_,[2,24]),e(o,[2,7]),e(h,[2,9]),e(h,[2,10]),e(h,[2,11]),e(h,[2,12]),{23:36,32:b},{32:[2,23]},e(_,[2,17])],defaultActions:{9:[2,21],10:[2,1],11:[2,2],35:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},v=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),29;case 1:return this.begin("type_directive"),30;case 2:return this.popState(),this.begin("arg_directive"),24;case 3:return this.popState(),this.popState(),32;case 4:return 31;case 5:case 6:case 8:case 9:break;case 7:return 26;case 10:return this.begin("title"),13;case 11:return this.popState(),"title_value";case 12:return this.begin("acc_title"),15;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),17;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:case 20:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:this.begin("string");break;case 21:return"txt";case 22:return 6;case 23:return 8;case 24:return"value";case 25:return 28}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?:showData\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},title:{rules:[11],inclusive:!1},string:{rules:[20,21],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,12,14,16,19,22,23,24,25],inclusive:!0}}},t);function k(){this.yy={}}return x.lexer=v,k.prototype=x,x.Parser=k,new k}();RE.parser=RE;const $E=RE,PE=t=>null!==t.match(/^\s*pie/)||null!==t.match(/^\s*bar/);let jE={},YE=!1;const zE={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().pie,addSection:function(t,e){t=jb.sanitizeText(t,hv()),void 0===jE[t]&&(jE[t]=e,Db.debug("Added new section :",t))},getSections:()=>jE,cleanupValue:function(t){return":"===t.substring(0,1)?(t=t.substring(1).trim(),Number(t.trim())):Number(t.trim())},clear:function(){jE={},YE=!1,Gv()},setAccTitle:Xv,getAccTitle:Zv,setDiagramTitle:Jv,getDiagramTitle:tk,setShowData:function(t){YE=t},getShowData:function(){return YE},getAccDescription:Kv,setAccDescription:Qv};let UE,WE=hv();const HE=450,qE={draw:(t,e,n,i)=>{try{WE=hv(),Db.debug("Rendering info diagram\n"+t);const n=hv().securityLevel;let y;"sandbox"===n&&(y=Ho("#i"+e));const m=Ho("sandbox"===n?y.nodes()[0].contentDocument.body:"body"),b="sandbox"===n?y.nodes()[0].contentDocument:document;i.db.clear(),i.parser.parse(t),Db.debug("Parsed info diagram");const _=b.getElementById(e);UE=_.parentElement.offsetWidth,void 0===UE&&(UE=1200),void 0!==WE.useWidth&&(UE=WE.useWidth),void 0!==WE.pie.useWidth&&(UE=WE.pie.useWidth);const x=m.select("#"+e);mv(x,HE,UE,WE.pie.useMaxWidth),_.setAttribute("viewBox","0 0 "+UE+" "+HE);var r=18,a=Math.min(UE,HE)/2-40,s=x.append("g").attr("transform","translate("+UE/2+",225)"),o=i.db.getSections(),c=0;Object.keys(o).forEach((function(t){c+=o[t]}));const v=WE.themeVariables;var l=[v.pie1,v.pie2,v.pie3,v.pie4,v.pie5,v.pie6,v.pie7,v.pie8,v.pie9,v.pie10,v.pie11,v.pie12],h=Aa().range(l),u=Object.entries(o).map((function(t,e){return{order:e,name:t[0],value:t[1]}})),d=function(){var t=Dc,e=Ac,n=null,i=Vo(0),r=Vo(rc),a=Vo(0);function s(s){var o,c,l,h,u,d=(s=kc(s)).length,p=0,f=new Array(d),g=new Array(d),y=+i.apply(this,arguments),m=Math.min(rc,Math.max(-rc,r.apply(this,arguments)-y)),b=Math.min(Math.abs(m)/d,a.apply(this,arguments)),_=b*(m<0?-1:1);for(o=0;o<d;++o)(u=g[f[o]=o]=+t(s[o],o,s))>0&&(p+=u);for(null!=e?f.sort((function(t,n){return e(g[t],g[n])})):null!=n&&f.sort((function(t,e){return n(s[t],s[e])})),o=0,l=p?(m-d*_)/p:0;o<d;++o,y=h)c=f[o],h=y+((u=g[c])>0?u*l:0)+_,g[c]={data:s[c],index:o,value:u,startAngle:y,endAngle:h,padAngle:b};return g}return s.value=function(e){return arguments.length?(t="function"==typeof e?e:Vo(+e),s):t},s.sortValues=function(t){return arguments.length?(e=t,n=null,s):e},s.sort=function(t){return arguments.length?(n=t,e=null,s):n},s.startAngle=function(t){return arguments.length?(i="function"==typeof t?t:Vo(+t),s):i},s.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:Vo(+t),s):r},s.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:Vo(+t),s):a},s}().value((function(t){return t.value})).sort((function(t,e){return t.order-e.order})),p=d(u),f=vc().innerRadius(0).outerRadius(a);s.selectAll("mySlices").data(p).enter().append("path").attr("d",f).attr("fill",(function(t){return h(t.data.name)})).attr("class","pieCircle"),s.selectAll("mySlices").data(p).enter().append("text").text((function(t){return(t.data.value/c*100).toFixed(0)+"%"})).attr("transform",(function(t){return"translate("+f.centroid(t)+")"})).style("text-anchor","middle").attr("class","slice"),s.append("text").text(i.db.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");var g=s.selectAll(".legend").data(h.domain()).enter().append("g").attr("class","legend").attr("transform",(function(t,e){return"translate(216,"+(22*e-22*h.domain().length/2)+")"}));g.append("rect").attr("width",r).attr("height",r).style("fill",h).style("stroke",h),g.data(p).append("text").attr("x",22).attr("y",14).text((function(t){return i.db.getShowData()||WE.showData||WE.pie.showData?t.data.name+" ["+t.data.value+"]":t.data.name}))}catch(y){Db.error("Error while rendering info diagram"),Db.error(y)}}};var VE=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[1,6],a=[1,7],s=[1,8],o=[5,6,8,14,16,18,19,40,41,42,43,44,45,53,71,72],c=[1,22],l=[2,13],h=[1,26],u=[1,27],d=[1,28],p=[1,29],f=[1,30],g=[1,31],y=[1,24],m=[1,32],b=[1,33],_=[1,36],x=[71,72],v=[5,8,14,16,18,19,40,41,42,43,44,45,53,60,62,71,72],k=[1,56],w=[1,57],T=[1,58],C=[1,59],E=[1,60],S=[1,61],A=[1,62],D=[62,63],L=[1,74],N=[1,70],O=[1,71],B=[1,72],M=[1,73],I=[1,75],F=[1,79],R=[1,80],$=[1,77],P=[1,78],j=[5,8,14,16,18,19,40,41,42,43,44,45,53,71,72],Y={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,openDirective:9,typeDirective:10,closeDirective:11,":":12,argDirective:13,acc_title:14,acc_title_value:15,acc_descr:16,acc_descr_value:17,acc_descr_multiline_value:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,requirementDef:23,elementDef:24,relationshipDef:25,requirementType:26,requirementName:27,STRUCT_START:28,requirementBody:29,ID:30,COLONSEP:31,id:32,TEXT:33,text:34,RISK:35,riskLevel:36,VERIFYMTHD:37,verifyType:38,STRUCT_STOP:39,REQUIREMENT:40,FUNCTIONAL_REQUIREMENT:41,INTERFACE_REQUIREMENT:42,PERFORMANCE_REQUIREMENT:43,PHYSICAL_REQUIREMENT:44,DESIGN_CONSTRAINT:45,LOW_RISK:46,MED_RISK:47,HIGH_RISK:48,VERIFY_ANALYSIS:49,VERIFY_DEMONSTRATION:50,VERIFY_INSPECTION:51,VERIFY_TEST:52,ELEMENT:53,elementName:54,elementBody:55,TYPE:56,type:57,DOCREF:58,ref:59,END_ARROW_L:60,relationship:61,LINE:62,END_ARROW_R:63,CONTAINS:64,COPIES:65,DERIVES:66,SATISFIES:67,VERIFIES:68,REFINES:69,TRACES:70,unqString:71,qString:72,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",12:":",14:"acc_title",15:"acc_title_value",16:"acc_descr",17:"acc_descr_value",18:"acc_descr_multiline_value",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",28:"STRUCT_START",30:"ID",31:"COLONSEP",33:"TEXT",35:"RISK",37:"VERIFYMTHD",39:"STRUCT_STOP",40:"REQUIREMENT",41:"FUNCTIONAL_REQUIREMENT",42:"INTERFACE_REQUIREMENT",43:"PERFORMANCE_REQUIREMENT",44:"PHYSICAL_REQUIREMENT",45:"DESIGN_CONSTRAINT",46:"LOW_RISK",47:"MED_RISK",48:"HIGH_RISK",49:"VERIFY_ANALYSIS",50:"VERIFY_DEMONSTRATION",51:"VERIFY_INSPECTION",52:"VERIFY_TEST",53:"ELEMENT",56:"TYPE",58:"DOCREF",60:"END_ARROW_L",62:"LINE",63:"END_ARROW_R",64:"CONTAINS",65:"COPIES",66:"DERIVES",67:"SATISFIES",68:"VERIFIES",69:"REFINES",70:"TRACES",71:"unqString",72:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,3],[4,5],[4,2],[4,2],[4,1],[9,1],[10,1],[13,1],[11,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[23,5],[29,5],[29,5],[29,5],[29,5],[29,2],[29,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[36,1],[36,1],[36,1],[38,1],[38,1],[38,1],[38,1],[24,5],[55,5],[55,5],[55,2],[55,1],[25,5],[25,5],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[27,1],[27,1],[32,1],[32,1],[34,1],[34,1],[54,1],[54,1],[57,1],[57,1],[59,1],[59,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 6:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 7:case 8:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 9:i.parseDirective("%%{","open_directive");break;case 10:i.parseDirective(a[o],"type_directive");break;case 11:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 12:i.parseDirective("}%%","close_directive","pie");break;case 13:this.$=[];break;case 19:i.addRequirement(a[o-3],a[o-4]);break;case 20:i.setNewReqId(a[o-2]);break;case 21:i.setNewReqText(a[o-2]);break;case 22:i.setNewReqRisk(a[o-2]);break;case 23:i.setNewReqVerifyMethod(a[o-2]);break;case 26:this.$=i.RequirementType.REQUIREMENT;break;case 27:this.$=i.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 28:this.$=i.RequirementType.INTERFACE_REQUIREMENT;break;case 29:this.$=i.RequirementType.PERFORMANCE_REQUIREMENT;break;case 30:this.$=i.RequirementType.PHYSICAL_REQUIREMENT;break;case 31:this.$=i.RequirementType.DESIGN_CONSTRAINT;break;case 32:this.$=i.RiskLevel.LOW_RISK;break;case 33:this.$=i.RiskLevel.MED_RISK;break;case 34:this.$=i.RiskLevel.HIGH_RISK;break;case 35:this.$=i.VerifyType.VERIFY_ANALYSIS;break;case 36:this.$=i.VerifyType.VERIFY_DEMONSTRATION;break;case 37:this.$=i.VerifyType.VERIFY_INSPECTION;break;case 38:this.$=i.VerifyType.VERIFY_TEST;break;case 39:i.addElement(a[o-3]);break;case 40:i.setNewElementType(a[o-2]);break;case 41:i.setNewElementDocRef(a[o-2]);break;case 44:i.addRelationship(a[o-2],a[o],a[o-4]);break;case 45:i.addRelationship(a[o-2],a[o-4],a[o]);break;case 46:this.$=i.Relationships.CONTAINS;break;case 47:this.$=i.Relationships.COPIES;break;case 48:this.$=i.Relationships.DERIVES;break;case 49:this.$=i.Relationships.SATISFIES;break;case 50:this.$=i.Relationships.VERIFIES;break;case 51:this.$=i.Relationships.REFINES;break;case 52:this.$=i.Relationships.TRACES}},table:[{3:1,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[3]},{3:10,4:2,5:[1,9],6:n,9:4,14:i,16:r,18:a,19:s},{5:[1,11]},{10:12,20:[1,13]},{15:[1,14]},{17:[1,15]},e(o,[2,8]),{20:[2,9]},{3:16,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[2,2]},{4:21,5:c,7:17,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{11:34,12:[1,35],22:_},e([12,22],[2,10]),e(o,[2,6]),e(o,[2,7]),{1:[2,1]},{8:[1,37]},{4:21,5:c,7:38,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:39,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:40,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:41,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:42,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{27:43,71:[1,44],72:[1,45]},{54:46,71:[1,47],72:[1,48]},{60:[1,49],62:[1,50]},e(x,[2,26]),e(x,[2,27]),e(x,[2,28]),e(x,[2,29]),e(x,[2,30]),e(x,[2,31]),e(v,[2,55]),e(v,[2,56]),e(o,[2,4]),{13:51,21:[1,52]},e(o,[2,12]),{1:[2,3]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{8:[2,17]},{8:[2,18]},{28:[1,53]},{28:[2,53]},{28:[2,54]},{28:[1,54]},{28:[2,59]},{28:[2,60]},{61:55,64:k,65:w,66:T,67:C,68:E,69:S,70:A},{61:63,64:k,65:w,66:T,67:C,68:E,69:S,70:A},{11:64,22:_},{22:[2,11]},{5:[1,65]},{5:[1,66]},{62:[1,67]},e(D,[2,46]),e(D,[2,47]),e(D,[2,48]),e(D,[2,49]),e(D,[2,50]),e(D,[2,51]),e(D,[2,52]),{63:[1,68]},e(o,[2,5]),{5:L,29:69,30:N,33:O,35:B,37:M,39:I},{5:F,39:R,55:76,56:$,58:P},{32:81,71:m,72:b},{32:82,71:m,72:b},e(j,[2,19]),{31:[1,83]},{31:[1,84]},{31:[1,85]},{31:[1,86]},{5:L,29:87,30:N,33:O,35:B,37:M,39:I},e(j,[2,25]),e(j,[2,39]),{31:[1,88]},{31:[1,89]},{5:F,39:R,55:90,56:$,58:P},e(j,[2,43]),e(j,[2,44]),e(j,[2,45]),{32:91,71:m,72:b},{34:92,71:[1,93],72:[1,94]},{36:95,46:[1,96],47:[1,97],48:[1,98]},{38:99,49:[1,100],50:[1,101],51:[1,102],52:[1,103]},e(j,[2,24]),{57:104,71:[1,105],72:[1,106]},{59:107,71:[1,108],72:[1,109]},e(j,[2,42]),{5:[1,110]},{5:[1,111]},{5:[2,57]},{5:[2,58]},{5:[1,112]},{5:[2,32]},{5:[2,33]},{5:[2,34]},{5:[1,113]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[2,38]},{5:[1,114]},{5:[2,61]},{5:[2,62]},{5:[1,115]},{5:[2,63]},{5:[2,64]},{5:L,29:116,30:N,33:O,35:B,37:M,39:I},{5:L,29:117,30:N,33:O,35:B,37:M,39:I},{5:L,29:118,30:N,33:O,35:B,37:M,39:I},{5:L,29:119,30:N,33:O,35:B,37:M,39:I},{5:F,39:R,55:120,56:$,58:P},{5:F,39:R,55:121,56:$,58:P},e(j,[2,20]),e(j,[2,21]),e(j,[2,22]),e(j,[2,23]),e(j,[2,40]),e(j,[2,41])],defaultActions:{8:[2,9],10:[2,2],16:[2,1],37:[2,3],38:[2,14],39:[2,15],40:[2,16],41:[2,17],42:[2,18],44:[2,53],45:[2,54],47:[2,59],48:[2,60],52:[2,11],93:[2,57],94:[2,58],96:[2,32],97:[2,33],98:[2,34],100:[2,35],101:[2,36],102:[2,37],103:[2,38],105:[2,61],106:[2,62],108:[2,63],109:[2,64]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},z=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return this.begin("type_directive"),20;case 2:return this.popState(),this.begin("arg_directive"),12;case 3:return this.popState(),this.popState(),22;case 4:return 21;case 5:return"title";case 6:return this.begin("acc_title"),14;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),16;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 53:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 5;case 14:case 15:case 16:break;case 17:return 8;case 18:return 6;case 19:return 28;case 20:return 39;case 21:return 31;case 22:return 30;case 23:return 33;case 24:return 35;case 25:return 37;case 26:return 40;case 27:return 41;case 28:return 42;case 29:return 43;case 30:return 44;case 31:return 45;case 32:return 46;case 33:return 47;case 34:return 48;case 35:return 49;case 36:return 50;case 37:return 51;case 38:return 52;case 39:return 53;case 40:return 64;case 41:return 65;case 42:return 66;case 43:return 67;case 44:return 68;case 45:return 69;case 46:return 70;case 47:return 56;case 48:return 58;case 49:return 60;case 50:return 63;case 51:return 62;case 52:this.begin("string");break;case 54:return"qString";case 55:return e.yytext=e.yytext.trim(),71}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[53,54],inclusive:!1},INITIAL:{rules:[0,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55],inclusive:!0}}},t);function U(){this.yy={}}return Y.lexer=z,U.prototype=Y,Y.Parser=U,new U}();VE.parser=VE;const GE=VE,XE=t=>null!==t.match(/^\s*requirement(Diagram)?/);let ZE=[],QE={},KE={},JE={},tS={};const eS={RequirementType:{REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},RiskLevel:{LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},VerifyType:{VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},Relationships:{CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().req,addRequirement:(t,e)=>(void 0===KE[t]&&(KE[t]={name:t,type:e,id:QE.id,text:QE.text,risk:QE.risk,verifyMethod:QE.verifyMethod}),QE={},KE[t]),getRequirements:()=>KE,setNewReqId:t=>{void 0!==QE&&(QE.id=t)},setNewReqText:t=>{void 0!==QE&&(QE.text=t)},setNewReqRisk:t=>{void 0!==QE&&(QE.risk=t)},setNewReqVerifyMethod:t=>{void 0!==QE&&(QE.verifyMethod=t)},setAccTitle:Xv,getAccTitle:Zv,setAccDescription:Qv,getAccDescription:Kv,addElement:t=>(void 0===tS[t]&&(tS[t]={name:t,type:JE.type,docRef:JE.docRef},Db.info("Added new requirement: ",t)),JE={},tS[t]),getElements:()=>tS,setNewElementType:t=>{void 0!==JE&&(JE.type=t)},setNewElementDocRef:t=>{void 0!==JE&&(JE.docRef=t)},addRelationship:(t,e,n)=>{ZE.push({type:t,src:e,dst:n})},getRelationships:()=>ZE,clear:()=>{ZE=[],QE={},KE={},JE={},tS={},Gv()}},nS={CONTAINS:"contains",ARROW:"arrow"},iS=nS,rS=(t,e)=>{let n=t.append("defs").append("marker").attr("id",nS.CONTAINS+"_line_ending").attr("refX",0).attr("refY",e.line_height/2).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("g");n.append("circle").attr("cx",e.line_height/2).attr("cy",e.line_height/2).attr("r",e.line_height/2).attr("fill","none"),n.append("line").attr("x1",0).attr("x2",e.line_height).attr("y1",e.line_height/2).attr("y2",e.line_height/2).attr("stroke-width",1),n.append("line").attr("y1",0).attr("y2",e.line_height).attr("x1",e.line_height/2).attr("x2",e.line_height/2).attr("stroke-width",1),t.append("defs").append("marker").attr("id",nS.ARROW+"_line_ending").attr("refX",e.line_height).attr("refY",.5*e.line_height).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("path").attr("d",`M0,0\n L${e.line_height},${e.line_height/2}\n M${e.line_height},${e.line_height/2}\n L0,${e.line_height}`).attr("stroke-width",1)};let aS={},sS=0;const oS=(t,e)=>t.insert("rect","#"+e).attr("class","req reqBox").attr("x",0).attr("y",0).attr("width",aS.rect_min_width+"px").attr("height",aS.rect_min_height+"px"),cS=(t,e,n)=>{let i=aS.rect_min_width/2,r=t.append("text").attr("class","req reqLabel reqTitle").attr("id",e).attr("x",i).attr("y",aS.rect_padding).attr("dominant-baseline","hanging"),a=0;n.forEach((t=>{0==a?r.append("tspan").attr("text-anchor","middle").attr("x",aS.rect_min_width/2).attr("dy",0).text(t):r.append("tspan").attr("text-anchor","middle").attr("x",aS.rect_min_width/2).attr("dy",.75*aS.line_height).text(t),a++}));let s=1.5*aS.rect_padding+a*aS.line_height*.75;return t.append("line").attr("class","req-title-line").attr("x1","0").attr("x2",aS.rect_min_width).attr("y1",s).attr("y2",s),{titleNode:r,y:s}},lS=(t,e,n,i)=>{let r=t.append("text").attr("class","req reqLabel").attr("id",e).attr("x",aS.rect_padding).attr("y",i).attr("dominant-baseline","hanging"),a=0;let s=[];return n.forEach((t=>{let e=t.length;for(;e>30&&a<3;){let n=t.substring(0,30);e=(t=t.substring(30,t.length)).length,s[s.length]=n,a++}if(3==a){let t=s[s.length-1];s[s.length-1]=t.substring(0,t.length-4)+"..."}else s[s.length]=t;a=0})),s.forEach((t=>{r.append("tspan").attr("x",aS.rect_padding).attr("dy",aS.line_height).text(t)})),r},hS=function(t,e,n,i,r){const a=n.edge(uS(e.src),uS(e.dst)),s=Sc().x((function(t){return t.x})).y((function(t){return t.y})),o=t.insert("path","#"+i).attr("class","er relationshipLine").attr("d",s(a.points)).attr("fill","none");e.type==r.db.Relationships.CONTAINS?o.attr("marker-start","url("+jb.getUrl(aS.arrowMarkerAbsolute)+"#"+e.type+"_line_ending)"):(o.attr("stroke-dasharray","10,7"),o.attr("marker-end","url("+jb.getUrl(aS.arrowMarkerAbsolute)+"#"+iS.ARROW+"_line_ending)")),((t,e,n,i)=>{const r=e.node().getTotalLength(),a=e.node().getPointAtLength(.5*r),s="rel"+sS;sS++;const o=t.append("text").attr("class","req relationshipLabel").attr("id",s).attr("x",a.x).attr("y",a.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(i).node().getBBox();t.insert("rect","#"+s).attr("class","req reqLabelBox").attr("x",a.x-o.width/2).attr("y",a.y-o.height/2).attr("width",o.width).attr("height",o.height).attr("fill","white").attr("fill-opacity","85%")})(t,o,0,`<<${e.type}>>`)},uS=t=>t.replace(/\s/g,"").replace(/\./g,"_"),dS={draw:(t,e,n,i)=>{aS=hv().requirement,i.db.clear(),i.parser.parse(t);const r=aS.securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body").select(`[id='${e}']`);rS(s,aS);const o=new Vf({multigraph:!1,compound:!1,directed:!0}).setGraph({rankdir:aS.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));let c=i.db.getRequirements(),l=i.db.getElements(),h=i.db.getRelationships();((t,e,n)=>{Object.keys(t).forEach((i=>{let r=t[i];i=uS(i),Db.info("Added new requirement: ",i);const a=n.append("g").attr("id",i),s=oS(a,"req-"+i);let o=cS(a,i+"_title",[`<<${r.type}>>`,`${r.name}`]);lS(a,i+"_body",[`Id: ${r.id}`,`Text: ${r.text}`,`Risk: ${r.risk}`,`Verification: ${r.verifyMethod}`],o.y);const c=s.node().getBBox();e.setNode(i,{width:c.width,height:c.height,shape:"rect",id:i})}))})(c,o,s),((t,e,n)=>{Object.keys(t).forEach((i=>{let r=t[i];const a=uS(i),s=n.append("g").attr("id",a),o="element-"+a,c=oS(s,o);let l=cS(s,o+"_title",["<<Element>>",`${i}`]);lS(s,o+"_body",[`Type: ${r.type||"Not Specified"}`,`Doc Ref: ${r.docRef||"None"}`],l.y);const h=c.node().getBBox();e.setNode(a,{width:h.width,height:h.height,shape:"rect",id:a})}))})(l,o,s),((t,e)=>{t.forEach((function(t){let n=uS(t.src),i=uS(t.dst);e.setEdge(n,i,{relationship:t})}))})(h,o),Em(o),function(t,e){e.nodes().forEach((function(n){void 0!==n&&void 0!==e.node(n)&&(t.select("#"+n),t.select("#"+n).attr("transform","translate("+(e.node(n).x-e.node(n).width/2)+","+(e.node(n).y-e.node(n).height/2)+" )"))}))}(s,o),h.forEach((function(t){hS(s,t,o,e,i)}));const u=aS.rect_padding,d=s.node().getBBox(),p=d.width+2*u,f=d.height+2*u;mv(s,f,p,aS.useMaxWidth),s.attr("viewBox",`${d.x-u} ${d.y-u} ${p} ${f}`)}};var pS=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,18],h=[1,19],u=[1,21],d=[1,22],p=[1,23],f=[1,29],g=[1,30],y=[1,31],m=[1,32],b=[1,33],_=[1,34],x=[1,35],v=[1,36],k=[1,37],w=[1,38],T=[1,39],C=[1,40],E=[1,43],S=[1,44],A=[1,45],D=[1,46],L=[1,47],N=[1,48],O=[1,51],B=[1,4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,51,52,53,58,59,60,61,69,79],M=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,53,58,59,60,61,69,79],I=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,52,53,58,59,60,61,69,79],F=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,51,53,58,59,60,61,69,79],R=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,53,58,59,60,61,69,79],$=[67,68,69],P=[1,121],j=[1,4,5,7,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,51,52,53,58,59,60,61,69,79],Y={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,directive:6,SD:7,document:8,line:9,statement:10,openDirective:11,typeDirective:12,closeDirective:13,":":14,argDirective:15,participant:16,actor:17,AS:18,restOfLine:19,participant_actor:20,signal:21,autonumber:22,NUM:23,off:24,activate:25,deactivate:26,note_statement:27,links_statement:28,link_statement:29,properties_statement:30,details_statement:31,title:32,legacy_title:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,loop:39,end:40,rect:41,opt:42,alt:43,else_sections:44,par:45,par_sections:46,critical:47,option_sections:48,break:49,option:50,and:51,else:52,note:53,placement:54,text2:55,over:56,actor_pair:57,links:58,link:59,properties:60,details:61,spaceList:62,",":63,left_of:64,right_of:65,signaltype:66,"+":67,"-":68,ACTOR:69,SOLID_OPEN_ARROW:70,DOTTED_OPEN_ARROW:71,SOLID_ARROW:72,DOTTED_ARROW:73,SOLID_CROSS:74,DOTTED_CROSS:75,SOLID_POINT:76,DOTTED_POINT:77,TXT:78,open_directive:79,type_directive:80,arg_directive:81,close_directive:82,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",7:"SD",14:":",16:"participant",18:"AS",19:"restOfLine",20:"participant_actor",22:"autonumber",23:"NUM",24:"off",25:"activate",26:"deactivate",32:"title",33:"legacy_title",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",39:"loop",40:"end",41:"rect",42:"opt",43:"alt",45:"par",47:"critical",49:"break",50:"option",51:"and",52:"else",53:"note",56:"over",58:"links",59:"link",60:"properties",61:"details",63:",",64:"left_of",65:"right_of",67:"+",68:"-",69:"ACTOR",70:"SOLID_OPEN_ARROW",71:"DOTTED_OPEN_ARROW",72:"SOLID_ARROW",73:"DOTTED_ARROW",74:"SOLID_CROSS",75:"DOTTED_CROSS",76:"SOLID_POINT",77:"DOTTED_POINT",78:"TXT",79:"open_directive",80:"type_directive",81:"arg_directive",82:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[6,4],[6,6],[10,5],[10,3],[10,5],[10,3],[10,2],[10,4],[10,3],[10,3],[10,2],[10,3],[10,3],[10,2],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,2],[10,2],[10,1],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,1],[48,1],[48,4],[46,1],[46,4],[44,1],[44,4],[27,4],[27,4],[28,3],[29,3],[30,3],[31,3],[62,2],[62,1],[57,3],[57,1],[54,1],[54,1],[21,5],[21,5],[21,4],[17,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[55,1],[11,1],[12,1],[15,1],[13,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.apply(a[o]),a[o];case 5:case 9:this.$=[];break;case 6:a[o-1].push(a[o]),this.$=a[o-1];break;case 7:case 8:case 56:this.$=a[o];break;case 12:a[o-3].type="addParticipant",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 13:a[o-1].type="addParticipant",this.$=a[o-1];break;case 14:a[o-3].type="addActor",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 15:a[o-1].type="addActor",this.$=a[o-1];break;case 17:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-2]),sequenceIndexStep:Number(a[o-1]),sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:i.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]};break;case 22:this.$={type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-1]};break;case 28:i.setDiagramTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 29:i.setDiagramTitle(a[o].substring(7)),this.$=a[o].substring(7);break;case 30:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 33:a[o-1].unshift({type:"loopStart",loopText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.LOOP_START}),a[o-1].push({type:"loopEnd",loopText:a[o-2],signalType:i.LINETYPE.LOOP_END}),this.$=a[o-1];break;case 34:a[o-1].unshift({type:"rectStart",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_START}),a[o-1].push({type:"rectEnd",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_END}),this.$=a[o-1];break;case 35:a[o-1].unshift({type:"optStart",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_START}),a[o-1].push({type:"optEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_END}),this.$=a[o-1];break;case 36:a[o-1].unshift({type:"altStart",altText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.ALT_START}),a[o-1].push({type:"altEnd",signalType:i.LINETYPE.ALT_END}),this.$=a[o-1];break;case 37:a[o-1].unshift({type:"parStart",parText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.PAR_START}),a[o-1].push({type:"parEnd",signalType:i.LINETYPE.PAR_END}),this.$=a[o-1];break;case 38:a[o-1].unshift({type:"criticalStart",criticalText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.CRITICAL_START}),a[o-1].push({type:"criticalEnd",signalType:i.LINETYPE.CRITICAL_END}),this.$=a[o-1];break;case 39:a[o-1].unshift({type:"breakStart",breakText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_START}),a[o-1].push({type:"breakEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_END}),this.$=a[o-1];break;case 42:this.$=a[o-3].concat([{type:"option",optionText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.CRITICAL_OPTION},a[o]]);break;case 44:this.$=a[o-3].concat([{type:"and",parText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.PAR_AND},a[o]]);break;case 46:this.$=a[o-3].concat([{type:"else",altText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.ALT_ELSE},a[o]]);break;case 47:this.$=[a[o-1],{type:"addNote",placement:a[o-2],actor:a[o-1].actor,text:a[o]}];break;case 48:a[o-2]=[].concat(a[o-1],a[o-1]).slice(0,2),a[o-2][0]=a[o-2][0].actor,a[o-2][1]=a[o-2][1].actor,this.$=[a[o-1],{type:"addNote",placement:i.PLACEMENT.OVER,actor:a[o-2].slice(0,2),text:a[o]}];break;case 49:this.$=[a[o-1],{type:"addLinks",actor:a[o-1].actor,text:a[o]}];break;case 50:this.$=[a[o-1],{type:"addALink",actor:a[o-1].actor,text:a[o]}];break;case 51:this.$=[a[o-1],{type:"addProperties",actor:a[o-1].actor,text:a[o]}];break;case 52:this.$=[a[o-1],{type:"addDetails",actor:a[o-1].actor,text:a[o]}];break;case 55:this.$=[a[o-2],a[o]];break;case 57:this.$=i.PLACEMENT.LEFTOF;break;case 58:this.$=i.PLACEMENT.RIGHTOF;break;case 59:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]}];break;case 60:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-4]}];break;case 61:this.$=[a[o-3],a[o-1],{type:"addMessage",from:a[o-3].actor,to:a[o-1].actor,signalType:a[o-2],msg:a[o]}];break;case 62:this.$={type:"addParticipant",actor:a[o]};break;case 63:this.$=i.LINETYPE.SOLID_OPEN;break;case 64:this.$=i.LINETYPE.DOTTED_OPEN;break;case 65:this.$=i.LINETYPE.SOLID;break;case 66:this.$=i.LINETYPE.DOTTED;break;case 67:this.$=i.LINETYPE.SOLID_CROSS;break;case 68:this.$=i.LINETYPE.DOTTED_CROSS;break;case 69:this.$=i.LINETYPE.SOLID_POINT;break;case 70:this.$=i.LINETYPE.DOTTED_POINT;break;case 71:this.$=i.parseMessage(a[o].trim().substring(1));break;case 72:i.parseDirective("%%{","open_directive");break;case 73:i.parseDirective(a[o],"type_directive");break;case 74:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 75:i.parseDirective("}%%","close_directive","sequence")}},table:[{3:1,4:n,5:i,6:4,7:r,11:6,79:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,11:6,79:a},{3:9,4:n,5:i,6:4,7:r,11:6,79:a},{3:10,4:n,5:i,6:4,7:r,11:6,79:a},e([1,4,5,16,20,22,25,26,32,33,34,36,38,39,41,42,43,45,47,49,53,58,59,60,61,69,79],s,{8:11}),{12:12,80:[1,13]},{80:[2,72]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{13:49,14:[1,50],82:O},e([14,82],[2,73]),e(B,[2,6]),{6:41,10:52,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},e(B,[2,8]),e(B,[2,9]),{17:53,69:N},{17:54,69:N},{5:[1,55]},{5:[1,58],23:[1,56],24:[1,57]},{17:59,69:N},{17:60,69:N},{5:[1,61]},{5:[1,62]},{5:[1,63]},{5:[1,64]},{5:[1,65]},e(B,[2,28]),e(B,[2,29]),{35:[1,66]},{37:[1,67]},e(B,[2,32]),{19:[1,68]},{19:[1,69]},{19:[1,70]},{19:[1,71]},{19:[1,72]},{19:[1,73]},{19:[1,74]},e(B,[2,40]),{66:75,70:[1,76],71:[1,77],72:[1,78],73:[1,79],74:[1,80],75:[1,81],76:[1,82],77:[1,83]},{54:84,56:[1,85],64:[1,86],65:[1,87]},{17:88,69:N},{17:89,69:N},{17:90,69:N},{17:91,69:N},e([5,18,63,70,71,72,73,74,75,76,77,78],[2,62]),{5:[1,92]},{15:93,81:[1,94]},{5:[2,75]},e(B,[2,7]),{5:[1,96],18:[1,95]},{5:[1,98],18:[1,97]},e(B,[2,16]),{5:[1,100],23:[1,99]},{5:[1,101]},e(B,[2,20]),{5:[1,102]},{5:[1,103]},e(B,[2,23]),e(B,[2,24]),e(B,[2,25]),e(B,[2,26]),e(B,[2,27]),e(B,[2,30]),e(B,[2,31]),e(M,s,{8:104}),e(M,s,{8:105}),e(M,s,{8:106}),e(I,s,{44:107,8:108}),e(F,s,{46:109,8:110}),e(R,s,{48:111,8:112}),e(M,s,{8:113}),{17:116,67:[1,114],68:[1,115],69:N},e($,[2,63]),e($,[2,64]),e($,[2,65]),e($,[2,66]),e($,[2,67]),e($,[2,68]),e($,[2,69]),e($,[2,70]),{17:117,69:N},{17:119,57:118,69:N},{69:[2,57]},{69:[2,58]},{55:120,78:P},{55:122,78:P},{55:123,78:P},{55:124,78:P},e(j,[2,10]),{13:125,82:O},{82:[2,74]},{19:[1,126]},e(B,[2,13]),{19:[1,127]},e(B,[2,15]),{5:[1,128]},e(B,[2,18]),e(B,[2,19]),e(B,[2,21]),e(B,[2,22]),{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,129],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,130],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,131],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{40:[1,132]},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[2,45],41:x,42:v,43:k,45:w,47:T,49:C,52:[1,133],53:E,58:S,59:A,60:D,61:L,69:N,79:a},{40:[1,134]},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[2,43],41:x,42:v,43:k,45:w,47:T,49:C,51:[1,135],53:E,58:S,59:A,60:D,61:L,69:N,79:a},{40:[1,136]},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[2,41],41:x,42:v,43:k,45:w,47:T,49:C,50:[1,137],53:E,58:S,59:A,60:D,61:L,69:N,79:a},{4:o,5:c,6:41,9:14,10:16,11:6,16:l,17:42,20:h,21:20,22:u,25:d,26:p,27:24,28:25,29:26,30:27,31:28,32:f,33:g,34:y,36:m,38:b,39:_,40:[1,138],41:x,42:v,43:k,45:w,47:T,49:C,53:E,58:S,59:A,60:D,61:L,69:N,79:a},{17:139,69:N},{17:140,69:N},{55:141,78:P},{55:142,78:P},{55:143,78:P},{63:[1,144],78:[2,56]},{5:[2,49]},{5:[2,71]},{5:[2,50]},{5:[2,51]},{5:[2,52]},{5:[1,145]},{5:[1,146]},{5:[1,147]},e(B,[2,17]),e(B,[2,33]),e(B,[2,34]),e(B,[2,35]),e(B,[2,36]),{19:[1,148]},e(B,[2,37]),{19:[1,149]},e(B,[2,38]),{19:[1,150]},e(B,[2,39]),{55:151,78:P},{55:152,78:P},{5:[2,61]},{5:[2,47]},{5:[2,48]},{17:153,69:N},e(j,[2,11]),e(B,[2,12]),e(B,[2,14]),e(I,s,{8:108,44:154}),e(F,s,{8:110,46:155}),e(R,s,{8:112,48:156}),{5:[2,59]},{5:[2,60]},{78:[2,55]},{40:[2,46]},{40:[2,44]},{40:[2,42]}],defaultActions:{7:[2,72],8:[2,1],9:[2,2],10:[2,3],51:[2,75],86:[2,57],87:[2,58],94:[2,74],120:[2,49],121:[2,71],122:[2,50],123:[2,51],124:[2,52],141:[2,61],142:[2,47],143:[2,48],151:[2,59],152:[2,60],153:[2,55],154:[2,46],155:[2,44],156:[2,42]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},z=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),79;case 1:return this.begin("type_directive"),80;case 2:return this.popState(),this.begin("arg_directive"),14;case 3:return this.popState(),this.popState(),82;case 4:return 81;case 5:case 52:case 65:return 5;case 6:case 7:case 8:case 9:case 10:break;case 11:return 23;case 12:return this.begin("ID"),16;case 13:return this.begin("ID"),20;case 14:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),69;case 15:return this.popState(),this.popState(),this.begin("LINE"),18;case 16:return this.popState(),this.popState(),5;case 17:return this.begin("LINE"),39;case 18:return this.begin("LINE"),41;case 19:return this.begin("LINE"),42;case 20:return this.begin("LINE"),43;case 21:return this.begin("LINE"),52;case 22:return this.begin("LINE"),45;case 23:return this.begin("LINE"),51;case 24:return this.begin("LINE"),47;case 25:return this.begin("LINE"),50;case 26:return this.begin("LINE"),49;case 27:return this.popState(),19;case 28:return 40;case 29:return 64;case 30:return 65;case 31:return 58;case 32:return 59;case 33:return 60;case 34:return 61;case 35:return 56;case 36:return 53;case 37:return this.begin("ID"),25;case 38:return this.begin("ID"),26;case 39:return 32;case 40:return 33;case 41:return this.begin("acc_title"),34;case 42:return this.popState(),"acc_title_value";case 43:return this.begin("acc_descr"),36;case 44:return this.popState(),"acc_descr_value";case 45:this.begin("acc_descr_multiline");break;case 46:this.popState();break;case 47:return"acc_descr_multiline_value";case 48:return 7;case 49:return 22;case 50:return 24;case 51:return 63;case 53:return e.yytext=e.yytext.trim(),69;case 54:return 72;case 55:return 73;case 56:return 70;case 57:return 71;case 58:return 74;case 59:return 75;case 60:return 76;case 61:return 77;case 62:return 78;case 63:return 67;case 64:return 68;case 66:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:[^\->:\n,;]+?([\-]*[^\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[46,47],inclusive:!1},acc_descr:{rules:[44],inclusive:!1},acc_title:{rules:[42],inclusive:!1},open_directive:{rules:[1,8],inclusive:!1},type_directive:{rules:[2,3,8],inclusive:!1},arg_directive:{rules:[3,4,8],inclusive:!1},ID:{rules:[7,8,14],inclusive:!1},ALIAS:{rules:[7,8,15,16],inclusive:!1},LINE:{rules:[7,8,27],inclusive:!1},INITIAL:{rules:[0,5,6,8,9,10,11,12,13,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,45,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66],inclusive:!0}}},t);function U(){this.yy={}}return Y.lexer=z,U.prototype=Y,Y.Parser=U,new U}();pS.parser=pS;const fS=pS,gS=t=>null!==t.match(/^\s*sequenceDiagram/);let yS,mS,bS={},_S=[],xS=!1;const vS=function(t,e,n,i){const r=bS[t];r&&e===r.name&&null==n||(null!=n&&null!=n.text||(n={text:e,wrap:null,type:i}),null!=i&&null!=n.text||(n={text:e,wrap:null,type:i}),bS[t]={name:e,description:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,prevActor:yS,links:{},properties:{},actorCnt:null,rectData:null,type:i||"participant"},yS&&bS[yS]&&(bS[yS].nextActor=t),yS=t)},kS=function(t,e,n={text:void 0,wrap:void 0},i){if(i===CS.ACTIVE_END){const e=(t=>{let e,n=0;for(e=0;e<_S.length;e++)_S[e].type===CS.ACTIVE_START&&_S[e].from.actor===t&&n++,_S[e].type===CS.ACTIVE_END&&_S[e].from.actor===t&&n--;return n})(t.actor);if(e<1){let e=new Error("Trying to inactivate an inactive participant ("+t.actor+")");throw e.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},e}}return _S.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,type:i}),!0},wS=function(t){return bS[t]},TS=()=>void 0!==mS?mS:hv().sequence.wrap,CS={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31},ES=function(t,e,n){n.text,void 0===n.wrap&&TS()||n.wrap;const i=[].concat(t,t);_S.push({from:i[0],to:i[1],message:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,type:CS.NOTE,placement:e})},SS=function(t,e){const n=wS(t);try{let t=Mb(e.text,hv());t=t.replace(/&/g,"&"),t=t.replace(/=/g,"=");AS(n,JSON.parse(t))}catch(i){Db.error("error while parsing actor link text",i)}};function AS(t,e){if(null==t.links)t.links=e;else for(let n in e)t.links[n]=e[n]}const DS=function(t,e){const n=wS(t);try{let t=Mb(e.text,hv());LS(n,JSON.parse(t))}catch(i){Db.error("error while parsing actor properties text",i)}};function LS(t,e){if(null==t.properties)t.properties=e;else for(let n in e)t.properties[n]=e[n]}const NS=function(t,e){const n=wS(t),i=document.getElementById(e.text);try{const t=i.innerHTML,e=JSON.parse(t);e.properties&&LS(n,e.properties),e.links&&AS(n,e.links)}catch(r){Db.error("error while parsing actor details text",r)}},OS=function(t){if(Array.isArray(t))t.forEach((function(t){OS(t)}));else switch(t.type){case"sequenceIndex":_S.push({from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":vS(t.actor,t.actor,t.description,"participant");break;case"addActor":vS(t.actor,t.actor,t.description,"actor");break;case"activeStart":case"activeEnd":kS(t.actor,void 0,void 0,t.signalType);break;case"addNote":ES(t.actor,t.placement,t.text);break;case"addLinks":SS(t.actor,t.text);break;case"addALink":!function(t,e){const n=wS(t);try{const t={};let s=Mb(e.text,hv());var i=s.indexOf("@");s=s.replace(/&/g,"&"),s=s.replace(/=/g,"=");var r=s.slice(0,i-1).trim(),a=s.slice(i+1).trim();t[r]=a,AS(n,t)}catch(s){Db.error("error while parsing actor link text",s)}}(t.actor,t.text);break;case"addProperties":DS(t.actor,t.text);break;case"addDetails":NS(t.actor,t.text);break;case"addMessage":kS(t.from,t.to,t.msg,t.signalType);break;case"loopStart":kS(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":case"rectEnd":case"optEnd":case"altEnd":case"parEnd":case"criticalEnd":case"breakEnd":kS(void 0,void 0,void 0,t.signalType);break;case"rectStart":kS(void 0,void 0,t.color,t.signalType);break;case"optStart":kS(void 0,void 0,t.optText,t.signalType);break;case"altStart":case"else":kS(void 0,void 0,t.altText,t.signalType);break;case"setAccTitle":Xv(t.text);break;case"parStart":case"and":kS(void 0,void 0,t.parText,t.signalType);break;case"criticalStart":kS(void 0,void 0,t.criticalText,t.signalType);break;case"option":kS(void 0,void 0,t.optionText,t.signalType);break;case"breakStart":kS(void 0,void 0,t.breakText,t.signalType)}},BS={addActor:vS,addMessage:function(t,e,n,i){_S.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&TS()||!!n.wrap,answer:i})},addSignal:kS,addLinks:SS,addDetails:NS,addProperties:DS,autoWrap:TS,setWrap:function(t){mS=t},enableSequenceNumbers:function(){xS=!0},disableSequenceNumbers:function(){xS=!1},showSequenceNumbers:()=>xS,getMessages:function(){return _S},getActors:function(){return bS},getActor:wS,getActorKeys:function(){return Object.keys(bS)},getActorProperty:function(t,e){if(void 0!==t&&void 0!==t.properties)return t.properties[e]},getAccTitle:Zv,getDiagramTitle:tk,setDiagramTitle:Jv,parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().sequence,clear:function(){bS={},_S=[],xS=!1,Gv()},parseMessage:function(t){const e=t.trim(),n={text:e.replace(/^:?(?:no)?wrap:/,"").trim(),wrap:null!==e.match(/^:?wrap:/)||null===e.match(/^:?nowrap:/)&&void 0};return Db.debug("parseMessage:",n),n},LINETYPE:CS,ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},addNote:ES,setAccTitle:Xv,apply:OS,setAccDescription:Qv,getAccDescription:Kv};let MS=[];const IS=()=>{MS.forEach((t=>{t()})),MS=[]},FS=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},RS=(t,e)=>{var n;n=()=>{const n=document.querySelectorAll(t);0!==n.length&&(n[0].addEventListener("mouseover",(function(){jS("actor"+e+"_popup")})),n[0].addEventListener("mouseout",(function(){YS("actor"+e+"_popup")})))},MS.push(n)},$S=function(t,e,n,i){const r=t.append("image");r.attr("x",e),r.attr("y",n);var a=(0,xt.N)(i);r.attr("xlink:href",a)},PS=function(t,e,n,i){const r=t.append("use");r.attr("x",e),r.attr("y",n);var a=(0,xt.N)(i);r.attr("xlink:href","#"+a)},jS=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="block")},YS=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="none")},zS=function(t,e){let n=0,i=0;const r=e.text.split(jb.lineBreakRegex);let a=[],s=0,o=()=>e.y;if(void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0)switch(e.valign){case"top":case"start":o=()=>Math.round(e.y+e.textMargin);break;case"middle":case"center":o=()=>Math.round(e.y+(n+i+e.textMargin)/2);break;case"bottom":case"end":o=()=>Math.round(e.y+(n+i+2*e.textMargin)-e.textMargin)}if(void 0!==e.anchor&&void 0!==e.textMargin&&void 0!==e.width)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle"}for(let[c,l]of r.entries()){void 0!==e.textMargin&&0===e.textMargin&&void 0!==e.fontSize&&(s=c*e.fontSize);const r=t.append("text");if(r.attr("x",e.x),r.attr("y",o()),void 0!==e.anchor&&r.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),void 0!==e.fontFamily&&r.style("font-family",e.fontFamily),void 0!==e.fontSize&&r.style("font-size",e.fontSize),void 0!==e.fontWeight&&r.style("font-weight",e.fontWeight),void 0!==e.fill&&r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class),void 0!==e.dy?r.attr("dy",e.dy):0!==s&&r.attr("dy",s),e.tspan){const t=r.append("tspan");t.attr("x",e.x),void 0!==e.fill&&t.attr("fill",e.fill),t.text(l)}else r.text(l);void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0&&(i+=(r._groups||r)[0][0].getBBox().height,n=i),a.push(r)}return a},US=function(t,e){const n=t.append("polygon");var i,r,a,s,o;return n.attr("points",(i=e.x,r=e.y,a=e.width,s=e.height,i+","+r+" "+(i+a)+","+r+" "+(i+a)+","+(r+s-(o=7))+" "+(i+a-1.2*o)+","+(r+s)+" "+i+","+(r+s))),n.attr("class","labelBox"),e.y=e.y+e.height/2,zS(t,e),n};let WS=-1;const HS=(t,e)=>{t.selectAll&&t.selectAll(".actor-line").attr("class","200").attr("y2",e-55)},qS=function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},VS=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},GS=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c;let d=l&&l.replace?l.replace("px",""):l;const p=t.split(jb.lineBreakRegex);for(let f=0;f<p.length;f++){const t=f*d-d*(p.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").style("font-size",l).style("font-weight",u).style("font-family",h);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(p[f]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),XS=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c,d=t.split(jb.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,a=e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").style("font-size",l).style("font-weight",u).style("font-family",h);a.append("tspan").attr("x",n).attr("dy",t).text(d[p]),a.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(a,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,0,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),ZS={drawRect:FS,drawText:zS,drawLabel:US,drawActor:function(t,e,n){switch(e.type){case"actor":return function(t,e,n){const i=e.x+e.width/2;0===e.y&&(WS++,t.append("line").attr("id","actor"+WS).attr("x1",i).attr("y1",80).attr("x2",i).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"));const r=t.append("g");r.attr("class","actor-man");const a=VS();a.x=e.x,a.y=e.y,a.fill="#eaeaea",a.width=e.width,a.height=e.height,a.class="actor",a.rx=3,a.ry=3,r.append("line").attr("id","actor-man-torso"+WS).attr("x1",i).attr("y1",e.y+25).attr("x2",i).attr("y2",e.y+45),r.append("line").attr("id","actor-man-arms"+WS).attr("x1",i-18).attr("y1",e.y+33).attr("x2",i+18).attr("y2",e.y+33),r.append("line").attr("x1",i-18).attr("y1",e.y+60).attr("x2",i).attr("y2",e.y+45),r.append("line").attr("x1",i).attr("y1",e.y+45).attr("x2",i+16).attr("y2",e.y+60);const s=r.append("circle");s.attr("cx",e.x+e.width/2),s.attr("cy",e.y+10),s.attr("r",15),s.attr("width",e.width),s.attr("height",e.height);const o=r.node().getBBox();return e.height=o.height,GS(n)(e.description,r,a.x,a.y+35,a.width,a.height,{class:"actor"},n),e.height}(t,e,n);case"participant":return function(t,e,n){const i=e.x+e.width/2,r=t.append("g");var a=r;0===e.y&&(WS++,a.append("line").attr("id","actor"+WS).attr("x1",i).attr("y1",5).attr("x2",i).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"),a=r.append("g"),e.actorCnt=WS,null!=e.links&&(a.attr("id","root-"+WS),RS("#root-"+WS,WS)));const s=VS();var o="actor";null!=e.properties&&e.properties.class?o=e.properties.class:s.fill="#eaeaea",s.x=e.x,s.y=e.y,s.width=e.width,s.height=e.height,s.class=o,s.rx=3,s.ry=3;const c=FS(a,s);if(e.rectData=s,null!=e.properties&&e.properties.icon){const t=e.properties.icon.trim();"@"===t.charAt(0)?PS(a,s.x+s.width-20,s.y+10,t.substr(1)):$S(a,s.x+s.width-20,s.y+10,t)}GS(n)(e.description,a,s.x,s.y,s.width,s.height,{class:"actor"},n);let l=e.height;if(c.node){const t=c.node().getBBox();e.height=t.height,l=t.height}return l}(t,e,n)}},drawPopup:function(t,e,n,i,r){if(void 0===e.links||null===e.links||0===Object.keys(e.links).length)return{height:0,width:0};const a=e.links,s=e.actorCnt,o=e.rectData;var c="none";r&&(c="block !important");const l=t.append("g");l.attr("id","actor"+s+"_popup"),l.attr("class","actorPopupMenu"),l.attr("display",c),RS("#actor"+s+"_popup",s);var h="";void 0!==o.class&&(h=" "+o.class);let u=o.width>n?o.width:n;const d=l.append("rect");if(d.attr("class","actorPopupMenuPanel"+h),d.attr("x",o.x),d.attr("y",o.height),d.attr("fill",o.fill),d.attr("stroke",o.stroke),d.attr("width",u),d.attr("height",o.height),d.attr("rx",o.rx),d.attr("ry",o.ry),null!=a){var p=20;for(let t in a){var f=l.append("a"),g=(0,xt.N)(a[t]);f.attr("xlink:href",g),f.attr("target","_blank"),XS(i)(t,f,o.x+10,o.height+p,u,20,{class:"actor"},i),p+=30}}return d.attr("height",p),{height:o.height+p,width:u}},drawImage:$S,drawEmbeddedImage:PS,anchorElement:function(t){return t.append("g")},drawActivation:function(t,e,n,i,r){const a=VS(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+r%3,a.width=e.stopx-e.startx,a.height=n-e.starty,FS(s,a)},drawLoop:function(t,e,n,i){const{boxMargin:r,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:o,messageFontFamily:c,messageFontSize:l,messageFontWeight:h}=i,u=t.append("g"),d=function(t,e,n,i){return u.append("line").attr("x1",t).attr("y1",e).attr("x2",n).attr("y2",i).attr("class","loopLine")};d(e.startx,e.starty,e.stopx,e.starty),d(e.stopx,e.starty,e.stopx,e.stopy),d(e.startx,e.stopy,e.stopx,e.stopy),d(e.startx,e.starty,e.startx,e.stopy),void 0!==e.sections&&e.sections.forEach((function(t){d(e.startx,t.y,e.stopx,t.y).style("stroke-dasharray","3, 3")}));let p=qS();p.text=n,p.x=e.startx,p.y=e.starty,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.anchor="middle",p.valign="middle",p.tspan=!1,p.width=o||50,p.height=s||20,p.textMargin=a,p.class="labelText",US(u,p),p=qS(),p.text=e.title,p.x=e.startx+o/2+(e.stopx-e.startx)/2,p.y=e.starty+r+a,p.anchor="middle",p.valign="middle",p.textMargin=a,p.class="loopText",p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=!0;let f=zS(u,p);return void 0!==e.sectionTitles&&e.sectionTitles.forEach((function(t,n){if(t.message){p.text=t.message,p.x=e.startx+(e.stopx-e.startx)/2,p.y=e.sections[n].y+r+a,p.class="loopText",p.anchor="middle",p.valign="middle",p.tspan=!1,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=e.wrap,f=zS(u,p);let i=Math.round(f.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));e.sections[n].height+=i-(r+a)}})),e.height=Math.round(e.stopy-e.starty),u},drawBackgroundRect:function(t,e){FS(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},insertArrowHead:function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},insertArrowFilledHead:function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},insertSequenceNumber:function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},insertArrowCrossHead:function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},insertDatabaseIcon:function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},insertComputerIcon:function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},insertClockIcon:function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},getTextObj:qS,getNoteRect:VS,popupMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'block'; }"},popdownMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'none'; }"},fixLifeLineHeights:HS,sanitizeUrl:xt.N};let QS={};const KS={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:function(){return Math.max.apply(null,0===this.actors.length?[0]:this.actors.map((t=>t.height||0)))+(0===this.loops.length?0:this.loops.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.messages.length?0:this.messages.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.notes.length?0:this.notes.map((t=>t.height||0)).reduce(((t,e)=>t+e)))},clear:function(){this.actors=[],this.loops=[],this.messages=[],this.notes=[]},addActor:function(t){this.actors.push(t)},addLoop:function(t){this.loops.push(t)},addMessage:function(t){this.messages.push(t)},addNote:function(t){this.notes.push(t)},lastActor:function(){return this.actors[this.actors.length-1]},lastLoop:function(){return this.loops[this.loops.length-1]},lastMessage:function(){return this.messages[this.messages.length-1]},lastNote:function(){return this.notes[this.notes.length-1]},actors:[],loops:[],messages:[],notes:[]},init:function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,rA(hv())},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=this;let a=0;function s(s){return function(o){a++;const c=r.sequenceItems.length-a+1;r.updateVal(o,"starty",e-c*QS.boxMargin,Math.min),r.updateVal(o,"stopy",i+c*QS.boxMargin,Math.max),r.updateVal(KS.data,"startx",t-c*QS.boxMargin,Math.min),r.updateVal(KS.data,"stopx",n+c*QS.boxMargin,Math.max),"activation"!==s&&(r.updateVal(o,"startx",t-c*QS.boxMargin,Math.min),r.updateVal(o,"stopx",n+c*QS.boxMargin,Math.max),r.updateVal(KS.data,"starty",e-c*QS.boxMargin,Math.min),r.updateVal(KS.data,"stopy",i+c*QS.boxMargin,Math.max))}}this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal(KS.data,"startx",r,Math.min),this.updateVal(KS.data,"starty",s,Math.min),this.updateVal(KS.data,"stopx",a,Math.max),this.updateVal(KS.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},newActivation:function(t,e,n){const i=n[t.from.actor],r=aA(t.from.actor).length||0,a=i.x+i.width/2+(r-1)*QS.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+QS.activationWidth,stopy:void 0,actor:t.from.actor,anchored:ZS.anchorElement(e)})},endActivation:function(t){const e=this.activations.map((function(t){return t.actor})).lastIndexOf(t.from.actor);return this.activations.splice(e,1)[0]},createLoop:function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},newLoop:function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},endLoop:function(){return this.sequenceItems.pop()},addSectionToLoop:function(t){const e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:KS.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return{bounds:this.data,models:this.models}}},JS=t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),tA=t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),eA=t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight});const nA=function(t,e,n,i,r,a){if(!0===r.hideUnusedParticipants){const t=new Set;a.forEach((e=>{t.add(e.from),t.add(e.to)})),n=n.filter((e=>t.has(e)))}let s=0,o=0,c=0;for(const l of n){const n=e[l];n.width=n.width||QS.width,n.height=Math.max(n.height||QS.height,QS.height),n.margin=n.margin||QS.actorMargin,n.x=s+o,n.y=i;const r=ZS.drawActor(t,n,QS);c=Math.max(c,r),KS.insert(n.x,i,n.x+n.width,n.height),s+=n.width,o+=n.margin,KS.models.addActor(n)}KS.bumpVerticalPos(c)},iA=function(t,e,n,i){let r=0,a=0;for(const s of n){const n=e[s],o=cA(n),c=ZS.drawPopup(t,n,o,QS,QS.forceMenus,i);c.height>r&&(r=c.height),c.width+n.x>a&&(a=c.width+n.x)}return{maxHeight:r,maxWidth:a}},rA=function(t){Bx(QS,t),t.fontFamily&&(QS.actorFontFamily=QS.noteFontFamily=QS.messageFontFamily=t.fontFamily),t.fontSize&&(QS.actorFontSize=QS.noteFontSize=QS.messageFontSize=t.fontSize),t.fontWeight&&(QS.actorFontWeight=QS.noteFontWeight=QS.messageFontWeight=t.fontWeight)},aA=function(t){return KS.activations.filter((function(e){return e.actor===t}))},sA=function(t,e){const n=e[t],i=aA(t);return[i.reduce((function(t,e){return Math.min(t,e.startx)}),n.x+n.width/2),i.reduce((function(t,e){return Math.max(t,e.stopx)}),n.x+n.width/2)]};function oA(t,e,n,i,r){KS.bumpVerticalPos(n);let a=i;if(e.id&&e.message&&t[e.id]){const n=t[e.id].width,r=JS(QS);e.message=tv.wrapLabel(`[${e.message}]`,n-2*QS.wrapPadding,r),e.width=n,e.wrap=!0;const s=tv.calculateTextDimensions(e.message,r),o=Math.max(s.height,QS.labelBoxHeight);a=i+o,Db.debug(`${o} - ${e.message}`)}r(e),KS.bumpVerticalPos(a)}const cA=function(t){let e=0;const n=eA(QS);for(const i in t.links){const t=tv.calculateTextDimensions(i,n).width+2*QS.wrapPadding+2*QS.boxMargin;e<t&&(e=t)}return e};const lA=function(t,e,n,i){const r={},a=[];let s,o,c;return t.forEach((function(t){switch(t.id=tv.random({length:10}),t.type){case i.db.LINETYPE.LOOP_START:case i.db.LINETYPE.ALT_START:case i.db.LINETYPE.OPT_START:case i.db.LINETYPE.PAR_START:case i.db.LINETYPE.CRITICAL_START:case i.db.LINETYPE.BREAK_START:a.push({id:t.id,msg:t.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case i.db.LINETYPE.ALT_ELSE:case i.db.LINETYPE.PAR_AND:case i.db.LINETYPE.CRITICAL_OPTION:t.message&&(s=a.pop(),r[s.id]=s,r[t.id]=s,a.push(s));break;case i.db.LINETYPE.LOOP_END:case i.db.LINETYPE.ALT_END:case i.db.LINETYPE.OPT_END:case i.db.LINETYPE.PAR_END:case i.db.LINETYPE.CRITICAL_END:case i.db.LINETYPE.BREAK_END:s=a.pop(),r[s.id]=s;break;case i.db.LINETYPE.ACTIVE_START:{const n=e[t.from?t.from.actor:t.to.actor],i=aA(t.from?t.from.actor:t.to.actor).length,r=n.x+n.width/2+(i-1)*QS.activationWidth/2,a={startx:r,stopx:r+QS.activationWidth,actor:t.from.actor,enabled:!0};KS.activations.push(a)}break;case i.db.LINETYPE.ACTIVE_END:{const e=KS.activations.map((t=>t.actor)).lastIndexOf(t.from.actor);delete KS.activations.splice(e,1)[0]}}void 0!==t.placement?(o=function(t,e,n){const i=e[t.from].x,r=e[t.to].x,a=t.wrap&&t.message;let s=tv.calculateTextDimensions(a?tv.wrapLabel(t.message,QS.width,tA(QS)):t.message,tA(QS));const o={width:a?QS.width:Math.max(QS.width,s.width+2*QS.noteMargin),height:0,startx:e[t.from].x,stopx:0,starty:0,stopy:0,message:t.message};return t.placement===n.db.PLACEMENT.RIGHTOF?(o.width=a?Math.max(QS.width,s.width):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*QS.noteMargin),o.startx=i+(e[t.from].width+QS.actorMargin)/2):t.placement===n.db.PLACEMENT.LEFTOF?(o.width=a?Math.max(QS.width,s.width+2*QS.noteMargin):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*QS.noteMargin),o.startx=i-o.width+(e[t.from].width-QS.actorMargin)/2):t.to===t.from?(s=tv.calculateTextDimensions(a?tv.wrapLabel(t.message,Math.max(QS.width,e[t.from].width),tA(QS)):t.message,tA(QS)),o.width=a?Math.max(QS.width,e[t.from].width):Math.max(e[t.from].width,QS.width,s.width+2*QS.noteMargin),o.startx=i+(e[t.from].width-o.width)/2):(o.width=Math.abs(i+e[t.from].width/2-(r+e[t.to].width/2))+QS.actorMargin,o.startx=i<r?i+e[t.from].width/2-QS.actorMargin/2:r+e[t.to].width/2-QS.actorMargin/2),a&&(o.message=tv.wrapLabel(t.message,o.width-2*QS.wrapPadding,tA(QS))),Db.debug(`NM:[${o.startx},${o.stopx},${o.starty},${o.stopy}:${o.width},${o.height}=${t.message}]`),o}(t,e,i),t.noteModel=o,a.forEach((t=>{s=t,s.from=Math.min(s.from,o.startx),s.to=Math.max(s.to,o.startx+o.width),s.width=Math.max(s.width,Math.abs(s.from-s.to))-QS.labelBoxWidth}))):(c=function(t,e,n){let i=!1;if([n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(i=!0),!i)return{};const r=sA(t.from,e),a=sA(t.to,e),s=r[0]<=a[0]?1:0,o=r[0]<a[0]?0:1,c=[...r,...a],l=Math.abs(a[o]-r[s]);t.wrap&&t.message&&(t.message=tv.wrapLabel(t.message,Math.max(l+2*QS.wrapPadding,QS.width),JS(QS)));const h=tv.calculateTextDimensions(t.message,JS(QS));return{width:Math.max(t.wrap?0:h.width+2*QS.wrapPadding,l+2*QS.wrapPadding,QS.width),height:0,startx:r[s],stopx:a[o],starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,c),toBounds:Math.max.apply(null,c)}}(t,e,i),t.msgModel=c,c.startx&&c.stopx&&a.length>0&&a.forEach((n=>{if(s=n,c.startx===c.stopx){const n=e[t.from],i=e[t.to];s.from=Math.min(n.x-c.width/2,n.x-n.width/2,s.from),s.to=Math.max(i.x+c.width/2,i.x+n.width/2,s.to),s.width=Math.max(s.width,Math.abs(s.to-s.from))-QS.labelBoxWidth}else s.from=Math.min(c.startx,s.from),s.to=Math.max(c.stopx,s.to),s.width=Math.max(s.width,c.width)-QS.labelBoxWidth})))})),KS.activations=[],Db.debug("Loop type widths:",r),r},hA={bounds:KS,drawActors:nA,drawActorsPopup:iA,setConf:rA,draw:function(t,e,n,i){const{securityLevel:r,sequence:a}=hv();let s;QS=a,"sandbox"===r&&(s=Ho("#i"+e));const o=Ho("sandbox"===r?s.nodes()[0].contentDocument.body:"body"),c="sandbox"===r?s.nodes()[0].contentDocument:document;KS.init(),Db.debug(i.db);const l="sandbox"===r?o.select(`[id="${e}"]`):Ho(`[id="${e}"]`),h=i.db.getActors(),u=i.db.getActorKeys(),d=i.db.getMessages(),p=i.db.getDiagramTitle(),f=function(t,e,n){const i={};return e.forEach((function(e){if(t[e.to]&&t[e.from]){const r=t[e.to];if(e.placement===n.db.PLACEMENT.LEFTOF&&!r.prevActor)return;if(e.placement===n.db.PLACEMENT.RIGHTOF&&!r.nextActor)return;const a=void 0!==e.placement,s=!a,o=a?tA(QS):JS(QS),c=e.wrap?tv.wrapLabel(e.message,QS.width-2*QS.wrapPadding,o):e.message,l=tv.calculateTextDimensions(c,o).width+2*QS.wrapPadding;s&&e.from===r.nextActor?i[e.to]=Math.max(i[e.to]||0,l):s&&e.from===r.prevActor?i[e.from]=Math.max(i[e.from]||0,l):s&&e.from===e.to?(i[e.from]=Math.max(i[e.from]||0,l/2),i[e.to]=Math.max(i[e.to]||0,l/2)):e.placement===n.db.PLACEMENT.RIGHTOF?i[e.from]=Math.max(i[e.from]||0,l):e.placement===n.db.PLACEMENT.LEFTOF?i[r.prevActor]=Math.max(i[r.prevActor]||0,l):e.placement===n.db.PLACEMENT.OVER&&(r.prevActor&&(i[r.prevActor]=Math.max(i[r.prevActor]||0,l/2)),r.nextActor&&(i[e.from]=Math.max(i[e.from]||0,l/2)))}})),Db.debug("maxMessageWidthPerActor:",i),i}(h,d,i);QS.height=function(t,e){let n=0;Object.keys(t).forEach((e=>{const i=t[e];i.wrap&&(i.description=tv.wrapLabel(i.description,QS.width-2*QS.wrapPadding,eA(QS)));const r=tv.calculateTextDimensions(i.description,eA(QS));i.width=i.wrap?QS.width:Math.max(QS.width,r.width+2*QS.wrapPadding),i.height=i.wrap?Math.max(r.height,QS.height):QS.height,n=Math.max(n,i.height)}));for(const i in e){const n=t[i];if(!n)continue;const r=t[n.nextActor];if(!r)continue;const a=e[i]+QS.actorMargin-n.width/2-r.width/2;n.margin=Math.max(a,QS.actorMargin)}return Math.max(n,QS.height)}(h,f),ZS.insertComputerIcon(l),ZS.insertDatabaseIcon(l),ZS.insertClockIcon(l),nA(l,h,u,0,QS,d);const g=lA(d,h,f,i);ZS.insertArrowHead(l),ZS.insertArrowCrossHead(l),ZS.insertArrowFilledHead(l),ZS.insertSequenceNumber(l);let y=1,m=1;const b=[];d.forEach((function(t){let e,n,r;switch(t.type){case i.db.LINETYPE.NOTE:n=t.noteModel,function(t,e){KS.bumpVerticalPos(QS.boxMargin),e.height=QS.boxMargin,e.starty=KS.getVerticalPos();const n=ZS.getNoteRect();n.x=e.startx,n.y=e.starty,n.width=e.width||QS.width,n.class="note";const i=t.append("g"),r=ZS.drawRect(i,n),a=ZS.getTextObj();a.x=e.startx,a.y=e.starty,a.width=n.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=QS.noteFontFamily,a.fontSize=QS.noteFontSize,a.fontWeight=QS.noteFontWeight,a.anchor=QS.noteAlign,a.textMargin=QS.noteMargin,a.valign="center";const s=zS(i,a),o=Math.round(s.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));r.attr("height",o+2*QS.noteMargin),e.height+=o+2*QS.noteMargin,KS.bumpVerticalPos(o+2*QS.noteMargin),e.stopy=e.starty+o+2*QS.noteMargin,e.stopx=e.startx+n.width,KS.insert(e.startx,e.starty,e.stopx,e.stopy),KS.models.addNote(e)}(l,n);break;case i.db.LINETYPE.ACTIVE_START:KS.newActivation(t,l,h);break;case i.db.LINETYPE.ACTIVE_END:!function(t,e){const n=KS.endActivation(t);n.starty+18>e&&(n.starty=e-6,e+=12),ZS.drawActivation(l,n,e,QS,aA(t.from.actor).length),KS.insert(n.startx,e-10,n.stopx,e)}(t,KS.getVerticalPos());break;case i.db.LINETYPE.LOOP_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.LOOP_END:e=KS.endLoop(),ZS.drawLoop(l,e,"loop",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.RECT_START:oA(g,t,QS.boxMargin,QS.boxMargin,(t=>KS.newLoop(void 0,t.message)));break;case i.db.LINETYPE.RECT_END:e=KS.endLoop(),ZS.drawBackgroundRect(l,e),KS.models.addLoop(e),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos());break;case i.db.LINETYPE.OPT_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.OPT_END:e=KS.endLoop(),ZS.drawLoop(l,e,"opt",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.ALT_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.ALT_ELSE:oA(g,t,QS.boxMargin+QS.boxTextMargin,QS.boxMargin,(t=>KS.addSectionToLoop(t)));break;case i.db.LINETYPE.ALT_END:e=KS.endLoop(),ZS.drawLoop(l,e,"alt",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.PAR_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.PAR_AND:oA(g,t,QS.boxMargin+QS.boxTextMargin,QS.boxMargin,(t=>KS.addSectionToLoop(t)));break;case i.db.LINETYPE.PAR_END:e=KS.endLoop(),ZS.drawLoop(l,e,"par",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.AUTONUMBER:y=t.message.start||y,m=t.message.step||m,t.message.visible?i.db.enableSequenceNumbers():i.db.disableSequenceNumbers();break;case i.db.LINETYPE.CRITICAL_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.CRITICAL_OPTION:oA(g,t,QS.boxMargin+QS.boxTextMargin,QS.boxMargin,(t=>KS.addSectionToLoop(t)));break;case i.db.LINETYPE.CRITICAL_END:e=KS.endLoop(),ZS.drawLoop(l,e,"critical",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;case i.db.LINETYPE.BREAK_START:oA(g,t,QS.boxMargin,QS.boxMargin+QS.boxTextMargin,(t=>KS.newLoop(t)));break;case i.db.LINETYPE.BREAK_END:e=KS.endLoop(),ZS.drawLoop(l,e,"break",QS),KS.bumpVerticalPos(e.stopy-KS.getVerticalPos()),KS.models.addLoop(e);break;default:try{r=t.msgModel,r.starty=KS.getVerticalPos(),r.sequenceIndex=y,r.sequenceVisible=i.db.showSequenceNumbers();const e=function(t,e){KS.bumpVerticalPos(10);const{startx:n,stopx:i,message:r}=e,a=jb.splitBreaks(r).length,s=tv.calculateTextDimensions(r,JS(QS)),o=s.height/a;let c;e.height+=o,KS.bumpVerticalPos(o);let l=s.height-10;const h=s.width;if(n===i){c=KS.getVerticalPos()+l,QS.rightAngles||(l+=QS.boxMargin,c=KS.getVerticalPos()+l),l+=30;const t=Math.max(h/2,QS.width/2);KS.insert(n-t,KS.getVerticalPos()-10+l,i+t,KS.getVerticalPos()+30+l)}else l+=QS.boxMargin,c=KS.getVerticalPos()+l,KS.insert(n,c-10,i,c);return KS.bumpVerticalPos(l),e.height+=l,e.stopy=e.starty+e.height,KS.insert(e.fromBounds,e.starty,e.toBounds,e.stopy),c}(0,r);b.push({messageModel:r,lineStartY:e}),KS.models.addMessage(r)}catch(a){Db.error("error while drawing message",a)}}[i.db.LINETYPE.SOLID_OPEN,i.db.LINETYPE.DOTTED_OPEN,i.db.LINETYPE.SOLID,i.db.LINETYPE.DOTTED,i.db.LINETYPE.SOLID_CROSS,i.db.LINETYPE.DOTTED_CROSS,i.db.LINETYPE.SOLID_POINT,i.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(y+=m)})),b.forEach((t=>function(t,e,n,i){const{startx:r,stopx:a,starty:s,message:o,type:c,sequenceIndex:l,sequenceVisible:h}=e,u=tv.calculateTextDimensions(o,JS(QS)),d=ZS.getTextObj();d.x=r,d.y=s+10,d.width=a-r,d.class="messageText",d.dy="1em",d.text=o,d.fontFamily=QS.messageFontFamily,d.fontSize=QS.messageFontSize,d.fontWeight=QS.messageFontWeight,d.anchor=QS.messageAlign,d.valign="center",d.textMargin=QS.wrapPadding,d.tspan=!1,zS(t,d);const p=u.width;let f;r===a?f=QS.rightAngles?t.append("path").attr("d",`M ${r},${n} H ${r+Math.max(QS.width/2,p/2)} V ${n+25} H ${r}`):t.append("path").attr("d","M "+r+","+n+" C "+(r+60)+","+(n-10)+" "+(r+60)+","+(n+30)+" "+r+","+(n+20)):(f=t.append("line"),f.attr("x1",r),f.attr("y1",n),f.attr("x2",a),f.attr("y2",n)),c===i.db.LINETYPE.DOTTED||c===i.db.LINETYPE.DOTTED_CROSS||c===i.db.LINETYPE.DOTTED_POINT||c===i.db.LINETYPE.DOTTED_OPEN?(f.style("stroke-dasharray","3, 3"),f.attr("class","messageLine1")):f.attr("class","messageLine0");let g="";QS.arrowMarkerAbsolute&&(g=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,g=g.replace(/\(/g,"\\("),g=g.replace(/\)/g,"\\)")),f.attr("stroke-width",2),f.attr("stroke","none"),f.style("fill","none"),c!==i.db.LINETYPE.SOLID&&c!==i.db.LINETYPE.DOTTED||f.attr("marker-end","url("+g+"#arrowhead)"),c!==i.db.LINETYPE.SOLID_POINT&&c!==i.db.LINETYPE.DOTTED_POINT||f.attr("marker-end","url("+g+"#filled-head)"),c!==i.db.LINETYPE.SOLID_CROSS&&c!==i.db.LINETYPE.DOTTED_CROSS||f.attr("marker-end","url("+g+"#crosshead)"),(h||QS.showSequenceNumbers)&&(f.attr("marker-start","url("+g+"#sequencenumber)"),t.append("text").attr("x",r).attr("y",n+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(l))}(l,t.messageModel,t.lineStartY,i))),QS.mirrorActors&&(KS.bumpVerticalPos(2*QS.boxMargin),nA(l,h,u,KS.getVerticalPos(),QS,d),KS.bumpVerticalPos(QS.boxMargin),HS(l,KS.getVerticalPos()));const _=iA(l,h,u,c),{bounds:x}=KS.getBounds();Db.debug("For line height fix Querying: #"+e+" .actor-line");qo("#"+e+" .actor-line").attr("y2",x.stopy);let v=x.stopy-x.starty;v<_.maxHeight&&(v=_.maxHeight);let k=v+2*QS.diagramMarginY;QS.mirrorActors&&(k=k-QS.boxMargin+QS.bottomMarginAdj);let w=x.stopx-x.startx;w<_.maxWidth&&(w=_.maxWidth);const T=w+2*QS.diagramMarginX;p&&l.append("text").text(p).attr("x",(x.stopx-x.startx)/2-2*QS.diagramMarginX).attr("y",-25),mv(l,k,T,QS.useMaxWidth);const C=p?40:0;l.attr("viewBox",x.startx-QS.diagramMarginX+" -"+(QS.diagramMarginY+C)+" "+T+" "+(k+C)),Db.debug("models:",KS.models)}};var uA=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,21],h=[1,22],u=[1,23],d=[1,24],p=[1,37],f=[1,25],g=[1,26],y=[1,27],m=[1,28],b=[1,29],_=[1,32],x=[1,33],v=[1,34],k=[1,35],w=[1,36],T=[1,39],C=[1,40],E=[1,41],S=[1,42],A=[1,38],D=[1,45],L=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],N=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],O=[1,4,5,7,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],B=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],M={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,directive:6,SD:7,document:8,line:9,statement:10,classDefStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"--\x3e":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,class:42,CLASSENTITY_IDS:43,STYLECLASS:44,openDirective:45,typeDirective:46,closeDirective:47,":":48,argDirective:49,direction_tb:50,direction_bt:51,direction_rl:52,direction_lr:53,eol:54,";":55,EDGE_STATE:56,STYLE_SEPARATOR:57,left_of:58,right_of:59,open_directive:60,type_directive:61,arg_directive:62,close_directive:63,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",7:"SD",14:"DESCR",15:"--\x3e",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"class",43:"CLASSENTITY_IDS",44:"STYLECLASS",48:":",50:"direction_tb",51:"direction_bt",52:"direction_rl",53:"direction_lr",55:";",56:"EDGE_STATE",57:"STYLE_SEPARATOR",58:"left_of",59:"right_of",60:"open_directive",61:"type_directive",62:"arg_directive",63:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[10,1],[10,2],[10,2],[10,1],[11,3],[11,3],[12,3],[6,3],[6,5],[32,1],[32,1],[32,1],[32,1],[54,1],[54,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1],[45,1],[46,1],[49,1],[47,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.setRootDoc(a[o]),a[o];case 5:this.$=[];break;case 6:"nl"!=a[o]&&(a[o-1].push(a[o]),this.$=a[o-1]);break;case 7:case 8:case 12:this.$=a[o];break;case 9:this.$="nl";break;case 13:const t=a[o-1];t.description=i.trimColon(a[o]),this.$=t;break;case 14:this.$={stmt:"relation",state1:a[o-2],state2:a[o]};break;case 15:const e=i.trimColon(a[o]);this.$={stmt:"relation",state1:a[o-3],state2:a[o-1],description:e};break;case 19:this.$={stmt:"state",id:a[o-3],type:"default",description:"",doc:a[o-1]};break;case 20:var c=a[o],l=a[o-2].trim();if(a[o].match(":")){var h=a[o].split(":");c=h[0],l=[l,h[1]]}this.$={stmt:"state",id:c,type:"default",description:l};break;case 21:this.$={stmt:"state",id:a[o-3],type:"default",description:a[o-5],doc:a[o-1]};break;case 22:this.$={stmt:"state",id:a[o],type:"fork"};break;case 23:this.$={stmt:"state",id:a[o],type:"join"};break;case 24:this.$={stmt:"state",id:a[o],type:"choice"};break;case 25:this.$={stmt:"state",id:i.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:a[o-1].trim(),note:{position:a[o-2].trim(),text:a[o].trim()}};break;case 30:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 33:case 34:this.$={stmt:"classDef",id:a[o-1].trim(),classes:a[o].trim()};break;case 35:this.$={stmt:"applyClass",id:a[o-1].trim(),styleClass:a[o].trim()};break;case 38:i.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:i.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:i.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:i.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:a[o].trim(),type:"default",description:""};break;case 46:case 47:this.$={stmt:"state",id:a[o-2].trim(),classes:[a[o].trim()],type:"default",description:""};break;case 50:i.parseDirective("%%{","open_directive");break;case 51:i.parseDirective(a[o],"type_directive");break;case 52:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 53:i.parseDirective("}%%","close_directive","state")}},table:[{3:1,4:n,5:i,6:4,7:r,45:6,60:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,45:6,60:a},{3:9,4:n,5:i,6:4,7:r,45:6,60:a},{3:10,4:n,5:i,6:4,7:r,45:6,60:a},e([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],s,{8:11}),{46:12,61:[1,13]},{61:[2,50]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},{47:43,48:[1,44],63:D},e([48,63],[2,51]),e(L,[2,6]),{6:30,10:46,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},e(L,[2,8]),e(L,[2,9]),e(L,[2,10]),e(L,[2,11]),e(L,[2,12],{14:[1,47],15:[1,48]}),e(L,[2,16]),{18:[1,49]},e(L,[2,18],{20:[1,50]}),{23:[1,51]},e(L,[2,22]),e(L,[2,23]),e(L,[2,24]),e(L,[2,25]),{30:52,31:[1,53],58:[1,54],59:[1,55]},e(L,[2,28]),e(L,[2,29]),{34:[1,56]},{36:[1,57]},e(L,[2,32]),{39:[1,58],41:[1,59]},{43:[1,60]},e(N,[2,44],{57:[1,61]}),e(N,[2,45],{57:[1,62]}),e(L,[2,38]),e(L,[2,39]),e(L,[2,40]),e(L,[2,41]),e(O,[2,36]),{49:63,62:[1,64]},e(O,[2,53]),e(L,[2,7]),e(L,[2,13]),{13:65,24:p,56:A},e(L,[2,17]),e(B,s,{8:66}),{24:[1,67]},{24:[1,68]},{23:[1,69]},{24:[2,48]},{24:[2,49]},e(L,[2,30]),e(L,[2,31]),{40:[1,70]},{40:[1,71]},{44:[1,72]},{24:[1,73]},{24:[1,74]},{47:75,63:D},{63:[2,52]},e(L,[2,14],{14:[1,76]}),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,77],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},e(L,[2,20],{20:[1,78]}),{31:[1,79]},{24:[1,80]},e(L,[2,33]),e(L,[2,34]),e(L,[2,35]),e(N,[2,46]),e(N,[2,47]),e(O,[2,37]),e(L,[2,15]),e(L,[2,19]),e(B,s,{8:81}),e(L,[2,26]),e(L,[2,27]),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,82],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:T,51:C,52:E,53:S,56:A,60:a},e(L,[2,21])],defaultActions:{7:[2,50],8:[2,1],9:[2,2],10:[2,3],54:[2,48],55:[2,49],64:[2,52]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},I=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 41;case 1:case 44:return 50;case 2:case 45:return 51;case 3:case 46:return 52;case 4:case 47:return 53;case 5:return this.begin("open_directive"),60;case 6:return this.begin("type_directive"),61;case 7:return this.popState(),this.begin("arg_directive"),48;case 8:return this.popState(),this.popState(),63;case 9:return 62;case 10:case 11:case 13:case 14:case 15:case 16:case 56:case 58:case 64:break;case 12:case 79:return 5;case 17:case 34:return this.pushState("SCALE"),17;case 18:case 35:return 18;case 19:case 25:case 36:case 51:case 54:this.popState();break;case 20:return this.begin("acc_title"),33;case 21:return this.popState(),"acc_title_value";case 22:return this.begin("acc_descr"),35;case 23:return this.popState(),"acc_descr_value";case 24:this.begin("acc_descr_multiline");break;case 26:return"acc_descr_multiline_value";case 27:return this.pushState("CLASSDEF"),38;case 28:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 29:return this.popState(),this.pushState("CLASSDEFID"),39;case 30:return this.popState(),40;case 31:return this.pushState("CLASS"),42;case 32:return this.popState(),this.pushState("CLASS_STYLE"),43;case 33:return this.popState(),44;case 37:this.pushState("STATE");break;case 38:case 41:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),25;case 39:case 42:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),26;case 40:case 43:return this.popState(),e.yytext=e.yytext.slice(0,-10).trim(),27;case 48:this.begin("STATE_STRING");break;case 49:return this.popState(),this.pushState("STATE_ID"),"AS";case 50:case 66:return this.popState(),"ID";case 52:return"STATE_DESCR";case 53:return 19;case 55:return this.popState(),this.pushState("struct"),20;case 57:return this.popState(),21;case 59:return this.begin("NOTE"),29;case 60:return this.popState(),this.pushState("NOTE_ID"),58;case 61:return this.popState(),this.pushState("NOTE_ID"),59;case 62:this.popState(),this.pushState("FLOATING_NOTE");break;case 63:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 65:return"NOTE_TEXT";case 67:return this.popState(),this.pushState("NOTE_TEXT"),24;case 68:return this.popState(),e.yytext=e.yytext.substr(2).trim(),31;case 69:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),31;case 70:case 71:return 7;case 72:return 16;case 73:return 56;case 74:return 24;case 75:return e.yytext=e.yytext.trim(),14;case 76:return 15;case 77:return 28;case 78:return 57;case 80:return"INVALID"}},rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<<fork>>)/i,/^(?:.*<<join>>)/i,/^(?:.*<<choice>>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[14,15],inclusive:!1},close_directive:{rules:[14,15],inclusive:!1},arg_directive:{rules:[8,9,14,15],inclusive:!1},type_directive:{rules:[7,8,14,15],inclusive:!1},open_directive:{rules:[6,14,15],inclusive:!1},struct:{rules:[14,15,27,31,37,44,45,46,47,56,57,58,59,73,74,75,76,77],inclusive:!1},FLOATING_NOTE_ID:{rules:[66],inclusive:!1},FLOATING_NOTE:{rules:[63,64,65],inclusive:!1},NOTE_TEXT:{rules:[68,69],inclusive:!1},NOTE_ID:{rules:[67],inclusive:!1},NOTE:{rules:[60,61,62],inclusive:!1},CLASS_STYLE:{rules:[33],inclusive:!1},CLASS:{rules:[32],inclusive:!1},CLASSDEFID:{rules:[30],inclusive:!1},CLASSDEF:{rules:[28,29],inclusive:!1},acc_descr_multiline:{rules:[25,26],inclusive:!1},acc_descr:{rules:[23],inclusive:!1},acc_title:{rules:[21],inclusive:!1},SCALE:{rules:[18,19,35,36],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[50],inclusive:!1},STATE_STRING:{rules:[51,52],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[14,15,38,39,40,41,42,43,48,49,53,54,55],inclusive:!1},ID:{rules:[14,15],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,10,11,12,13,15,16,17,20,22,24,27,31,34,37,55,59,70,71,72,73,74,75,76,78,79,80],inclusive:!0}}},t);function F(){this.yy={}}return M.lexer=I,F.prototype=M,M.Parser=F,new F}();uA.parser=uA;const dA=uA,pA=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*stateDiagram/)},fA=(t,e)=>{var n;return null!==t.match(/^\s*stateDiagram-v2/)||!(!t.match(/^\s*stateDiagram/)||"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer))},gA="state",yA="relation",mA="default",bA="divider",_A="[*]",xA="start",vA="color",kA="fill";let wA="LR",TA=[],CA={};let EA={root:{relations:[],states:{},documents:{}}},SA=EA.root,AA=0,DA=0;const LA=t=>JSON.parse(JSON.stringify(t)),NA=(t,e,n)=>{if(e.stmt===yA)NA(t,e.state1,!0),NA(t,e.state2,!1);else if(e.stmt===gA&&"[*]"===e.id&&(e.id=n?t.id+"_start":t.id+"_end",e.start=n),e.doc){const t=[];let n,i=[];for(n=0;n<e.doc.length;n++)if(e.doc[n].type===bA){const r=LA(e.doc[n]);r.doc=LA(i),t.push(r),i=[]}else i.push(e.doc[n]);if(t.length>0&&i.length>0){const n={stmt:gA,id:zx(),type:"divider",doc:LA(i)};t.push(LA(n)),e.doc=t}e.doc.forEach((t=>NA(e,t,!0)))}},OA=function(t,e="default",n=null,i=null,r=null,a=null,s=null,o=null){if(void 0===SA.states[t]?(Db.info("Adding state ",t,i),SA.states[t]={id:t,descriptions:[],type:e,doc:n,note:r,classes:[],styles:[],textStyles:[]}):(SA.states[t].doc||(SA.states[t].doc=n),SA.states[t].type||(SA.states[t].type=e)),i&&(Db.info("Setting state description",t,i),"string"==typeof i&&$A(t,i.trim()),"object"==typeof i&&i.forEach((e=>$A(t,e.trim())))),r&&(SA.states[t].note=r,SA.states[t].note.text=jb.sanitizeText(SA.states[t].note.text,hv())),a){Db.info("Setting state classes",t,a);("string"==typeof a?[a]:a).forEach((e=>jA(t,e.trim())))}if(s){Db.info("Setting state styles",t,s);("string"==typeof s?[s]:s).forEach((e=>YA(t,e.trim())))}if(o){Db.info("Setting state styles",t,s);("string"==typeof o?[o]:o).forEach((e=>zA(t,e.trim())))}},BA=function(t){EA={root:{relations:[],states:{},documents:{}}},SA=EA.root,AA=0,CA={},t||Gv()},MA=function(t){return SA.states[t]};function IA(t=""){let e=t;return t===_A&&(AA++,e=`start${AA}`),e}function FA(t="",e="default"){return t===_A?xA:e}const RA=function(t,e,n){if("object"==typeof t)!function(t,e,n){let i=IA(t.id),r=FA(t.id,t.type),a=IA(e.id),s=FA(e.id,e.type);OA(i,r,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),OA(a,s,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),SA.relations.push({id1:i,id2:a,relationTitle:jb.sanitizeText(n,hv())})}(t,e,n);else{const i=IA(t),r=FA(t),a=function(t=""){let e=t;return"[*]"===t&&(AA++,e=`end${AA}`),e}(e),s=function(t="",e="default"){return"[*]"===t?"end":e}(e);OA(i,r),OA(a,s),SA.relations.push({id1:i,id2:a,title:jb.sanitizeText(n,hv())})}},$A=function(t,e){const n=SA.states[t],i=e.startsWith(":")?e.replace(":","").trim():e;n.descriptions.push(jb.sanitizeText(i,hv()))},PA=function(t,e=""){void 0===CA[t]&&(CA[t]={id:t,styles:[],textStyles:[]});const n=CA[t];null!=e&&e.split(",").forEach((t=>{const e=t.replace(/([^;]*);/,"$1").trim();if(t.match(vA)){const t=e.replace(kA,"bgFill").replace(vA,kA);n.textStyles.push(t)}n.styles.push(e)}))},jA=function(t,e){t.split(",").forEach((function(t){let n=MA(t);if(void 0===n){const e=t.trim();OA(e),n=MA(e)}n.classes.push(e)}))},YA=function(t,e){const n=MA(t);void 0!==n&&n.textStyles.push(e)},zA=function(t,e){const n=MA(t);void 0!==n&&n.textStyles.push(e)},UA={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().state,addState:OA,clear:BA,getState:MA,getStates:function(){return SA.states},getRelations:function(){return SA.relations},getClasses:function(){return CA},getDirection:()=>wA,addRelation:RA,getDividerId:()=>(DA++,"divider-id-"+DA),setDirection:t=>{wA=t},cleanupLabel:function(t){return":"===t.substring(0,1)?t.substr(2).trim():t.trim()},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3},logDocuments:function(){Db.info("Documents = ",EA)},getRootDoc:()=>TA,setRootDoc:t=>{Db.info("Setting root doc",t),TA=t},getRootDocV2:()=>(NA({id:"root"},{id:"root",doc:TA},!0),{id:"root",doc:TA}),extract:t=>{let e;e=t.doc?t.doc:t,Db.info(e),BA(!0),Db.info("Extract",e),e.forEach((t=>{switch(t.stmt){case gA:OA(t.id,t.type,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles);break;case yA:RA(t.state1,t.state2,t.description);break;case"classDef":PA(t.id,t.classes);break;case"applyClass":jA(t.id,t.styleClass)}}))},trimColon:t=>t&&":"===t[0]?t.substr(1).trim():t.trim(),getAccTitle:Zv,setAccTitle:Xv,getAccDescription:Kv,setAccDescription:Qv,addStyleClass:PA,setCssClass:jA,addDescription:$A,setDiagramTitle:Jv,getDiagramTitle:tk},WA={},HA=(t,e)=>{WA[t]=e},qA=(t,e)=>{const n=t.append("text").attr("x",2*hv().state.padding).attr("y",hv().state.textHeight+1.3*hv().state.padding).attr("font-size",hv().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),i=n.height,r=t.append("text").attr("x",hv().state.padding).attr("y",i+.4*hv().state.padding+hv().state.dividerMargin+hv().state.textHeight).attr("class","state-description");let a=!0,s=!0;e.descriptions.forEach((function(t){a||(!function(t,e,n){const i=t.append("tspan").attr("x",2*hv().state.padding).text(e);n||i.attr("dy",hv().state.textHeight)}(r,t,s),s=!1),a=!1}));const o=t.append("line").attr("x1",hv().state.padding).attr("y1",hv().state.padding+i+hv().state.dividerMargin/2).attr("y2",hv().state.padding+i+hv().state.dividerMargin/2).attr("class","descr-divider"),c=r.node().getBBox(),l=Math.max(c.width,n.width);return o.attr("x2",l+3*hv().state.padding),t.insert("rect",":first-child").attr("x",hv().state.padding).attr("y",hv().state.padding).attr("width",l+2*hv().state.padding).attr("height",c.height+i+2*hv().state.padding).attr("rx",hv().state.radius),t},VA=(t,e,n)=>{const i=hv().state.padding,r=2*hv().state.padding,a=t.node().getBBox(),s=a.width,o=a.x,c=t.append("text").attr("x",0).attr("y",hv().state.titleShift).attr("font-size",hv().state.fontSize).attr("class","state-title").text(e.id),l=c.node().getBBox().width+r;let h,u=Math.max(l,s);u===s&&(u+=r);const d=t.node().getBBox();e.doc,h=o-i,l>s&&(h=(s-u)/2+i),Math.abs(o-d.x)<i&&l>s&&(h=o-(l-s)/2);const p=1-hv().state.textHeight;return t.insert("rect",":first-child").attr("x",h).attr("y",p).attr("class",n?"alt-composit":"composit").attr("width",u).attr("height",d.height+hv().state.textHeight+hv().state.titleShift+1).attr("rx","0"),c.attr("x",h+i),l<=s&&c.attr("x",o+(u-r)/2-l/2+i),t.insert("rect",":first-child").attr("x",h).attr("y",hv().state.titleShift-hv().state.textHeight-hv().state.padding).attr("width",u).attr("height",3*hv().state.textHeight).attr("rx",hv().state.radius),t.insert("rect",":first-child").attr("x",h).attr("y",hv().state.titleShift-hv().state.textHeight-hv().state.padding).attr("width",u).attr("height",d.height+3+2*hv().state.textHeight).attr("rx",hv().state.radius),t},GA=(t,e)=>{e.attr("class","state-note");const n=e.append("rect").attr("x",0).attr("y",hv().state.padding),i=e.append("g"),{textWidth:r,textHeight:a}=((t,e,n,i)=>{let r=0;const a=i.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"<br/>");s=s.replace(/\n/g,"<br/>");const o=s.split(jb.lineBreakRegex);let c=1.25*hv().state.noteMargin;for(const l of o){const t=l.trim();if(t.length>0){const i=a.append("tspan");i.text(t),0===c&&(c+=i.node().getBBox().height),r+=c,i.attr("x",e+hv().state.noteMargin),i.attr("y",n+r+1.25*hv().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:r}})(t,0,0,i);return n.attr("height",a+2*hv().state.noteMargin),n.attr("width",r+2*hv().state.noteMargin),n},XA=function(t,e){const n=e.id,i={id:n,label:e.id,width:0,height:0},r=t.append("g").attr("id",n).attr("class","stateGroup");"start"===e.type&&(t=>{t.append("circle").attr("class","start-state").attr("r",hv().state.sizeUnit).attr("cx",hv().state.padding+hv().state.sizeUnit).attr("cy",hv().state.padding+hv().state.sizeUnit)})(r),"end"===e.type&&(t=>{t.append("circle").attr("class","end-state-outer").attr("r",hv().state.sizeUnit+hv().state.miniPadding).attr("cx",hv().state.padding+hv().state.sizeUnit+hv().state.miniPadding).attr("cy",hv().state.padding+hv().state.sizeUnit+hv().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",hv().state.sizeUnit).attr("cx",hv().state.padding+hv().state.sizeUnit+2).attr("cy",hv().state.padding+hv().state.sizeUnit+2)})(r),"fork"!==e.type&&"join"!==e.type||((t,e)=>{let n=hv().state.forkWidth,i=hv().state.forkHeight;if(e.parentId){let t=n;n=i,i=t}t.append("rect").style("stroke","black").style("fill","black").attr("width",n).attr("height",i).attr("x",hv().state.padding).attr("y",hv().state.padding)})(r,e),"note"===e.type&&GA(e.note.text,r),"divider"===e.type&&(t=>{t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",hv().state.textHeight).attr("class","divider").attr("x2",2*hv().state.textHeight).attr("y1",0).attr("y2",0)})(r),"default"===e.type&&0===e.descriptions.length&&((t,e)=>{const n=t.append("text").attr("x",2*hv().state.padding).attr("y",hv().state.textHeight+2*hv().state.padding).attr("font-size",hv().state.fontSize).attr("class","state-title").text(e.id),i=n.node().getBBox();t.insert("rect",":first-child").attr("x",hv().state.padding).attr("y",hv().state.padding).attr("width",i.width+2*hv().state.padding).attr("height",i.height+2*hv().state.padding).attr("rx",hv().state.radius)})(r,e),"default"===e.type&&e.descriptions.length>0&&qA(r,e);const a=r.node().getBBox();return i.width=a.width+2*hv().state.padding,i.height=a.height+2*hv().state.padding,HA(n,i),i};let ZA=0;let QA;const KA={},JA=(t,e,n,i,r,a,s)=>{const o=new Vf({compound:!0,multigraph:!0});let c,l=!0;for(c=0;c<t.length;c++)if("relation"===t[c].stmt){l=!1;break}n?o.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:l?1:QA.edgeLengthFactor,nodeSep:l?1:50,isMultiGraph:!0}):o.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:l?1:QA.edgeLengthFactor,nodeSep:l?1:50,ranker:"tight-tree",isMultiGraph:!0}),o.setDefaultEdgeLabel((function(){return{}})),s.db.extract(t);const h=s.db.getStates(),u=s.db.getRelations(),d=Object.keys(h);for(const m of d){const t=h[m];let c;if(n&&(t.parentId=n),t.doc){let n=e.append("g").attr("id",t.id).attr("class","stateGroup");c=JA(t.doc,n,t.id,!i,r,a,s);{n=VA(n,t,i);let e=n.node().getBBox();c.width=e.width,c.height=e.height+QA.padding/2,KA[t.id]={y:QA.compositTitleSize}}}else c=XA(e,t);if(t.note){const n={descriptions:[],id:t.id+"-note",note:t.note,type:"note"},i=XA(e,n);"left of"===t.note.position?(o.setNode(c.id+"-note",i),o.setNode(c.id,c)):(o.setNode(c.id,c),o.setNode(c.id+"-note",i)),o.setParent(c.id,c.id+"-group"),o.setParent(c.id+"-note",c.id+"-group")}else o.setNode(c.id,c)}Db.debug("Count=",o.nodeCount(),o);let p=0;u.forEach((function(t){var e;p++,Db.debug("Setting edge",t),o.setEdge(t.id1,t.id2,{relation:t,width:(e=t.title,e?e.length*QA.fontSizeFactor:1),height:QA.labelHeight*jb.getRows(t.title).length,labelpos:"c"},"id"+p)})),Em(o),Db.debug("Graph after layout",o.nodes());const f=e.node();o.nodes().forEach((function(t){if(void 0!==t&&void 0!==o.node(t)){Db.warn("Node "+t+": "+JSON.stringify(o.node(t))),r.select("#"+f.id+" #"+t).attr("transform","translate("+(o.node(t).x-o.node(t).width/2)+","+(o.node(t).y+(KA[t]?KA[t].y:0)-o.node(t).height/2)+" )"),r.select("#"+f.id+" #"+t).attr("data-x-shift",o.node(t).x-o.node(t).width/2);a.querySelectorAll("#"+f.id+" #"+t+" .divider").forEach((t=>{const e=t.parentElement;let n=0,i=0;e&&(e.parentElement&&(n=e.parentElement.getBBox().width),i=parseInt(e.getAttribute("data-x-shift"),10),Number.isNaN(i)&&(i=0)),t.setAttribute("x1",0-i+8),t.setAttribute("x2",n-i-8)}))}else Db.debug("No Node "+t+": "+JSON.stringify(o.node(t)))}));let g=f.getBBox();o.edges().forEach((function(t){void 0!==t&&void 0!==o.edge(t)&&(Db.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(o.edge(t))),function(t,e,n){e.points=e.points.filter((t=>!Number.isNaN(t.y)));const i=e.points,r=Sc().x((function(t){return t.x})).y((function(t){return t.y})).curve(Bc),a=t.append("path").attr("d",r(i)).attr("id","edge"+ZA).attr("class","transition");let s="";if(hv().state.arrowMarkerAbsolute&&(s=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,s=s.replace(/\(/g,"\\("),s=s.replace(/\)/g,"\\)")),a.attr("marker-end","url("+s+"#"+function(t){switch(t){case UA.relationType.AGGREGATION:return"aggregation";case UA.relationType.EXTENSION:return"extension";case UA.relationType.COMPOSITION:return"composition";case UA.relationType.DEPENDENCY:return"dependency"}}(UA.relationType.DEPENDENCY)+"End)"),void 0!==n.title){const i=t.append("g").attr("class","stateLabel"),{x:r,y:a}=tv.calcLabelPosition(e.points),s=jb.getRows(n.title);let o=0;const c=[];let l=0,h=0;for(let t=0;t<=s.length;t++){const e=i.append("text").attr("text-anchor","middle").text(s[t]).attr("x",r).attr("y",a+o),n=e.node().getBBox();if(l=Math.max(l,n.width),h=Math.min(h,n.x),Db.info(n.x,r,a+o),0===o){const t=e.node().getBBox();o=t.height,Db.info("Title height",o,a)}c.push(e)}let u=o*s.length;if(s.length>1){const t=(s.length-1)*o*.5;c.forEach(((e,n)=>e.attr("y",a+n*o-t))),u=o*s.length}const d=i.node().getBBox();i.insert("rect",":first-child").attr("class","box").attr("x",r-l/2-hv().state.padding/2).attr("y",a-u/2-hv().state.padding/2-3.5).attr("width",l+hv().state.padding).attr("height",u+hv().state.padding),Db.info(d)}ZA++}(e,o.edge(t),o.edge(t).relation))})),g=f.getBBox();const y={id:n||"root",label:n||"root",width:0,height:0};return y.width=g.width+2*QA.padding,y.height=g.height+2*QA.padding,Db.debug("Doc rendered",y,o),y},tD={setConf:function(){},draw:function(t,e,n,i){QA=hv().state;const r=hv().securityLevel;let a;"sandbox"===r&&(a=Ho("#i"+e));const s=Ho("sandbox"===r?a.nodes()[0].contentDocument.body:"body"),o="sandbox"===r?a.nodes()[0].contentDocument:document;Db.debug("Rendering diagram "+t);const c=s.select(`[id='${e}']`);c.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z");new Vf({multigraph:!0,compound:!0,rankdir:"RL"}).setDefaultEdgeLabel((function(){return{}}));const l=i.db.getRootDoc();JA(l,c,void 0,!1,s,o,i);const h=QA.padding,u=c.node().getBBox(),d=u.width+2*h,p=u.height+2*h;mv(c,p,1.75*d,QA.useMaxWidth),c.attr("viewBox",`${u.x-QA.padding} ${u.y-QA.padding} `+d+" "+p)}},eD="rect",nD="rectWithTitle",iD="statediagram",rD="transition",aD="parent",sD="note",oD="----parent",cD="fill:none",lD="fill: #333",hD="text",uD="normal";let dD={},pD=0;function fD(t="",e=0,n="",i="----"){return`state-${t}${null!==n&&n.length>0?`${i}${n}`:""}-${e}`}const gD=(t,e,n,i,r,a)=>{const s=n.id,o=null==(c=i[s])?"":c.classes?c.classes.join(" "):"";var c;if("root"!==s){let e=eD;!0===n.start&&(e="start"),!1===n.start&&(e="end"),n.type!==mA&&(e=n.type),dD[s]||(dD[s]={id:s,shape:e,description:jb.sanitizeText(s,hv()),classes:`${o} statediagram-state`});const i=dD[s];n.description&&(Array.isArray(i.description)?(i.shape=nD,i.description.push(n.description)):i.description.length>0?(i.shape=nD,i.description===s?i.description=[n.description]:i.description=[i.description,n.description]):(i.shape=eD,i.description=n.description),i.description=jb.sanitizeTextOrArray(i.description,hv())),1===i.description.length&&i.shape===nD&&(i.shape=eD),!i.type&&n.doc&&(Db.info("Setting cluster for ",s,mD(n)),i.type="group",i.dir=mD(n),i.shape=n.type===bA?"divider":"roundedWithTitle",i.classes=i.classes+" statediagram-cluster "+(a?"statediagram-cluster-alt":""));const r={labelStyle:"",shape:i.shape,labelText:i.description,classes:i.classes,style:"",id:s,dir:i.dir,domId:fD(s,pD),type:i.type,padding:15};if(n.note){const e={labelStyle:"",shape:"note",labelText:n.note.text,classes:"statediagram-note",style:"",id:s+"----note-"+pD,domId:fD(s,pD,sD),type:i.type,padding:15},a={labelStyle:"",shape:"noteGroup",labelText:n.note.text,classes:i.classes,style:"",id:s+oD,domId:fD(s,pD,aD),type:"group",padding:0};pD++;const o=s+oD;t.setNode(o,a),t.setNode(e.id,e),t.setNode(s,r),t.setParent(s,o),t.setParent(e.id,o);let c=s,l=e.id;"left of"===n.note.position&&(c=e.id,l=s),t.setEdge(c,l,{arrowhead:"none",arrowType:"",style:cD,labelStyle:"",classes:"transition note-edge",arrowheadStyle:lD,labelpos:"c",labelType:hD,thickness:uD})}else t.setNode(s,r)}e&&"root"!==e.id&&(Db.trace("Setting node ",s," to be child of its parent ",e.id),t.setParent(s,e.id)),n.doc&&(Db.trace("Adding nodes children "),yD(t,n,n.doc,i,r,!a))},yD=(t,e,n,i,r,a)=>{Db.trace("items",n),n.forEach((n=>{switch(n.stmt){case gA:case mA:gD(t,e,n,i,r,a);break;case yA:{gD(t,e,n.state1,i,r,a),gD(t,e,n.state2,i,r,a);const s={id:"edge"+pD,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:cD,labelStyle:"",label:jb.sanitizeText(n.description,hv()),arrowheadStyle:lD,labelpos:"c",labelType:hD,thickness:uD,classes:rD};t.setEdge(n.state1.id,n.state2.id,s,pD),pD++}}}))},mD=(t,e="TB")=>{let n=e;if(t.doc)for(let i=0;i<t.doc.length;i++){const e=t.doc[i];"dir"===e.stmt&&(n=e.value)}return n},bD={setConf:function(t){const e=Object.keys(t);for(const n of e)t[n]},getClasses:function(t,e){Db.trace("Extracting classes"),e.db.clear();try{return e.parser.parse(t),e.db.extract(e.db.getRootDocV2()),e.db.getClasses()}catch(n){return n}},draw:function(t,e,n,i){Db.info("Drawing state diagram (v2)",e),dD={};let r=i.db.getDirection();void 0===r&&(r="LR");const{securityLevel:a,state:s}=hv(),o=s.nodeSpacing||50,c=s.rankSpacing||50;Db.info(i.db.getRootDocV2()),i.db.extract(i.db.getRootDocV2()),Db.info(i.db.getRootDocV2());const l=i.db.getStates(),h=new Vf({multigraph:!0,compound:!0}).setGraph({rankdir:mD(i.db.getRootDocV2()),nodesep:o,ranksep:c,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));let u;gD(h,void 0,i.db.getRootDocV2(),l,i.db,!0),"sandbox"===a&&(u=Ho("#i"+e));const d=Ho("sandbox"===a?u.nodes()[0].contentDocument.body:"body"),p=d.select(`[id="${e}"]`),f=d.select("#"+e+" g");zT(f,h,["barb"],iD,e);tv.insertTitle(p,"statediagramTitleText",s.titleTopMargin,i.db.getDiagramTitle());const g=p.node().getBBox(),y=g.width+16,m=g.height+16;p.attr("class",iD);const b=p.node().getBBox();mv(p,m,y,s.useMaxWidth);const _=`${b.x-8} ${b.y-8} ${y} ${m}`;Db.debug(`viewBox ${_}`),p.attr("viewBox",_);const x=document.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const v of x){const t=v.getBBox(),e=document.createElementNS("http://www.w3.org/2000/svg",eD);e.setAttribute("rx",0),e.setAttribute("ry",0),e.setAttribute("width",t.width),e.setAttribute("height",t.height),v.insertBefore(e,v.firstChild)}}};var _D=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,17,18,20,22,23,24,26],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,24],d=[4,6,9,11,17,18,20,22,23,24,26],p={trace:function(){},yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,acc_title:18,acc_title_value:19,acc_descr:20,acc_descr_value:21,acc_descr_multiline_value:22,section:23,taskName:24,taskData:25,open_directive:26,type_directive:27,arg_directive:28,close_directive:29,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"acc_title",19:"acc_title_value",20:"acc_descr",21:"acc_descr_value",22:"acc_descr_multiline_value",23:"section",24:"taskName",25:"taskData",26:"open_directive",27:"type_directive",28:"arg_directive",29:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,2],[10,2],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 11:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 12:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 13:case 14:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 15:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 16:i.addTask(a[o-1],a[o]),this.$="task";break;case 18:i.parseDirective("%%{","open_directive");break;case 19:i.parseDirective(a[o],"type_directive");break;case 20:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 21:i.parseDirective("}%%","close_directive","journey")}},table:[{3:1,4:n,7:3,12:4,26:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,26:i},{13:8,27:[1,9]},{27:[2,18]},{6:[1,10],7:21,8:11,9:[1,12],10:13,11:[1,14],12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},{1:[2,2]},{14:22,15:[1,23],29:u},e([15,29],[2,19]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:21,10:25,12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),{19:[1,26]},{21:[1,27]},e(r,[2,14]),e(r,[2,15]),{25:[1,28]},e(r,[2,17]),{11:[1,29]},{16:30,28:[1,31]},{11:[2,21]},e(r,[2,5]),e(r,[2,12]),e(r,[2,13]),e(r,[2,16]),e(d,[2,9]),{14:32,29:u},{29:[2,20]},{11:[1,33]},e(d,[2,10])],defaultActions:{5:[2,18],7:[2,2],24:[2,21],31:[2,20]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=2,u=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);p.setInput(t,f.yy),f.yy.lexer=p,f.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var y=p.yylloc;a.push(y);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||p.lex()||u)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,v,k,w,T,C,E,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null==_&&(_=b()),v=s[x]&&s[x][_]),void 0===v||!v.length||!v[0]){var A="";for(w in E=[],s[x])this.terminals_[w]&&w>h&&E.push("'"+this.terminals_[w]+"'");A=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==u?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(A,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:y,expected:E})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+_);switch(v[0]){case 1:n.push(_),r.push(p.yytext),a.push(p.yylloc),n.push(v[1]),_=null,l=p.yyleng,o=p.yytext,c=p.yylineno,y=p.yylloc;break;case 2:if(T=this.productions_[v[1]][1],S.$=r[r.length-T],S._$={first_line:a[a.length-(T||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(T||1)].first_column,last_column:a[a.length-1].last_column},m&&(S._$.range=[a[a.length-(T||1)].range[0],a[a.length-1].range[1]]),void 0!==(k=this.performAction.apply(S,[o,l,c,f.yy,v[1],r,a].concat(d))))return k;T&&(n=n.slice(0,-1*T*2),r=r.slice(0,-1*T),a=a.slice(0,-1*T)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),C=s[n[n.length-2]][n[n.length-1]],n.push(C);break;case 3:return!0}}return!0}},f=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),26;case 1:return this.begin("type_directive"),27;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),29;case 4:return 28;case 5:case 6:case 8:case 9:break;case 7:return 11;case 10:return 4;case 11:return 17;case 12:return this.begin("acc_title"),18;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),20;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:return 23;case 20:return 24;case 21:return 25;case 22:return 15;case 23:return 6;case 24:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,14,16,19,20,21,22,23,24],inclusive:!0}}},t);function g(){this.yy={}}return p.lexer=f,g.prototype=p,p.Parser=g,new g}();_D.parser=_D;const xD=_D,vD=t=>null!==t.match(/^\s*journey/);let kD="";const wD=[],TD=[],CD=[],ED=function(){let t=!0;for(const[e,n]of CD.entries())CD[e].processed,t=t&&n.processed;return t},SD={parseDirective:function(t,e,n){xL.parseDirective(this,t,e,n)},getConfig:()=>hv().journey,clear:function(){wD.length=0,TD.length=0,kD="",CD.length=0,Gv()},setDiagramTitle:Jv,getDiagramTitle:tk,setAccTitle:Xv,getAccTitle:Zv,setAccDescription:Qv,getAccDescription:Kv,addSection:function(t){kD=t,wD.push(t)},getSections:function(){return wD},getTasks:function(){let t=ED();let e=0;for(;!t&&e<100;)t=ED(),e++;return TD.push(...CD),TD},addTask:function(t,e){const n=e.substr(1).split(":");let i=0,r=[];1===n.length?(i=Number(n[0]),r=[]):(i=Number(n[0]),r=n[1].split(","));const a=r.map((t=>t.trim())),s={section:kD,type:kD,people:a,task:t,score:i};CD.push(s)},addTaskOrg:function(t){const e={section:kD,type:kD,description:t,task:t,classes:[]};TD.push(e)},getActors:function(){return function(){const t=[];return TD.forEach((e=>{e.people&&t.push(...e.people)})),[...new Set(t)].sort()}()}},AD=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},DD=function(t,e){const n=t.append("circle");return n.attr("cx",e.cx),n.attr("cy",e.cy),n.attr("class","actor-"+e.pos),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("r",e.r),void 0!==n.class&&n.attr("class",n.class),void 0!==e.title&&n.append("title").text(e.title),n},LD=function(t,e){const n=e.text.replace(/<br\s*\/?>/gi," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.attr("class","legend"),i.style("text-anchor",e.anchor),void 0!==e.class&&i.attr("class",e.class);const r=i.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.text(n),i};let ND=-1;const OD=function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},BD=function(){function t(t,e,n,r,a,s,o,c){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c,l){const{taskFontSize:h,taskFontFamily:u}=c,d=t.split(/<br\s*\/?>/gi);for(let p=0;p<d.length;p++){const t=p*h-h*(d.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).attr("fill",l).style("text-anchor","middle").style("font-size",h).style("font-family",u);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(d[p]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).attr("position","fixed").append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").attr("class","label").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)n in e&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),MD=DD,ID=function(t,e,n){const i=t.append("g"),r=OD();r.x=e.x,r.y=e.y,r.fill=e.fill,r.width=n.width,r.height=n.height,r.class="journey-section section-type-"+e.num,r.rx=3,r.ry=3,AD(i,r),BD(n)(e.text,i,r.x,r.y,r.width,r.height,{class:"journey-section section-type-"+e.num},n,e.colour)},FD=LD,RD=function(t,e,n){const i=e.x+n.width/2,r=t.append("g");ND++;r.append("line").attr("id","task"+ND).attr("x1",i).attr("y1",e.y).attr("x2",i).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),function(t,e){const n=15,i=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",n).attr("stroke-width",2).attr("overflow","visible"),r=t.append("g");r.append("circle").attr("cx",e.cx-5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),r.append("circle").attr("cx",e.cx+5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),e.score>3?function(t){const i=vc().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}(r):e.score<3?function(t){const i=vc().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}(r):r.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}(r,{cx:i,cy:300+30*(5-e.score),score:e.score});const a=OD();a.x=e.x,a.y=e.y,a.fill=e.fill,a.width=n.width,a.height=n.height,a.class="task task-type-"+e.num,a.rx=3,a.ry=3,AD(r,a);let s=e.x+14;e.people.forEach((t=>{const n=e.actors[t].color,i={cx:s,cy:e.y,r:7,fill:n,stroke:"#000",title:t,pos:e.actors[t].position};DD(r,i),s+=10})),BD(n)(e.task,r,a.x,a.y,a.width,a.height,{class:"task"},n,e.colour)},$D=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")},PD={};const jD=hv().journey,YD=jD.leftMargin,zD={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=hv().journey,a=this;let s=0;var o;this.sequenceItems.forEach((function(c){s++;const l=a.sequenceItems.length-s+1;a.updateVal(c,"starty",e-l*r.boxMargin,Math.min),a.updateVal(c,"stopy",i+l*r.boxMargin,Math.max),a.updateVal(zD.data,"startx",t-l*r.boxMargin,Math.min),a.updateVal(zD.data,"stopx",n+l*r.boxMargin,Math.max),"activation"!==o&&(a.updateVal(c,"startx",t-l*r.boxMargin,Math.min),a.updateVal(c,"stopx",n+l*r.boxMargin,Math.max),a.updateVal(zD.data,"starty",e-l*r.boxMargin,Math.min),a.updateVal(zD.data,"stopy",i+l*r.boxMargin,Math.max))}))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal(zD.data,"startx",r,Math.min),this.updateVal(zD.data,"starty",s,Math.min),this.updateVal(zD.data,"stopx",a,Math.max),this.updateVal(zD.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return this.data}},UD=jD.sectionFills,WD=jD.sectionColours,HD=function(t,e,n){const i=hv().journey;let r="";const a=n+(2*i.height+i.diagramMarginY);let s=0,o="#CCC",c="black",l=0;for(const[h,u]of e.entries()){if(r!==u.section){o=UD[s%UD.length],l=s%UD.length,c=WD[s%WD.length];const e={x:h*i.taskMargin+h*i.width+YD,y:50,text:u.section,fill:o,num:l,colour:c};ID(t,e,i),r=u.section,s++}const e=u.people.reduce(((t,e)=>(PD[e]&&(t[e]=PD[e]),t)),{});u.x=h*i.taskMargin+h*i.width+YD,u.y=a,u.width=i.diagramMarginX,u.height=i.diagramMarginY,u.colour=c,u.fill=o,u.num=l,u.actors=e,RD(t,u,i),zD.insert(u.x,u.y,u.x+u.width+i.taskMargin,450)}},qD={setConf:function(t){Object.keys(t).forEach((function(e){jD[e]=t[e]}))},draw:function(t,e,n,i){const r=hv().journey;i.db.clear(),i.parser.parse(t+"\n");const a=hv().securityLevel;let s;"sandbox"===a&&(s=Ho("#i"+e));const o=Ho("sandbox"===a?s.nodes()[0].contentDocument.body:"body");zD.init();const c=o.select("#"+e);$D(c);const l=i.db.getTasks(),h=i.db.getDiagramTitle(),u=i.db.getActors();for(const m in PD)delete PD[m];let d=0;u.forEach((t=>{PD[t]={color:r.actorColours[d%r.actorColours.length],position:d},d++})),function(t){const e=hv().journey;let n=60;Object.keys(PD).forEach((i=>{const r=PD[i].color,a={cx:20,cy:n,r:7,fill:r,stroke:"#000",pos:PD[i].position};MD(t,a);const s={x:40,y:n+7,fill:"#666",text:i,textMargin:5|e.boxTextMargin};FD(t,s),n+=20}))}(c),zD.insert(0,0,YD,50*Object.keys(PD).length),HD(c,l,0);const p=zD.getBounds();h&&c.append("text").text(h).attr("x",YD).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);const f=p.stopy-p.starty+2*r.diagramMarginY,g=YD+p.stopx+2*r.diagramMarginX;mv(c,f,g,r.useMaxWidth),c.append("line").attr("x1",YD).attr("y1",4*r.height).attr("x2",g-YD-4).attr("y2",4*r.height).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");const y=h?70:0;c.attr("viewBox",`${p.startx} -25 ${g} ${f+y}`),c.attr("preserveAspectRatio","xMinYMin meet"),c.attr("height",f+y+25)}};let VD={};const GD={setConf:function(t){VD={...VD,...t}},draw:(t,e,n)=>{try{Db.debug("Renering svg for syntax error\n");const t=Ho("#"+e),i=t.append("g");i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in graph"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text("mermaid version "+n),t.attr("height",100),t.attr("width",500),t.attr("viewBox","768 0 912 512")}catch(r){Db.error("Error while rendering info diagram"),Db.error((i=r)instanceof Error?i.message:String(i))}var i}};let XD=!1;const ZD=()=>{XD||(XD=!0,Pv("error",{db:{clear:()=>{}},styles:vv,renderer:GD,parser:{parser:{yy:{}},parse:()=>{}},init:()=>{}},(t=>"error"===t.toLowerCase().trim())),Pv("c4",{parser:Ik,db:Zk,renderer:Aw,styles:Lv,init:t=>{Aw.setConf(t.c4)}},Fk),Pv("class",{parser:Lw,db:Gw,renderer:oT,styles:_v,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Gw.clear()}},Nw),Pv("classDiagram",{parser:Lw,db:Gw,renderer:qT,styles:_v,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Gw.clear()}},Ow),Pv("er",{parser:GT,db:JT,renderer:hC,styles:xv},XT),Pv("gantt",{parser:VC,db:EE,renderer:DE,styles:wv},GC),Pv("info",{parser:NE,db:ME,renderer:IE,styles:Tv},FE),Pv("pie",{parser:$E,db:zE,renderer:qE,styles:Cv},PE),Pv("requirement",{parser:GE,db:eS,renderer:dS,styles:Ev},XE),Pv("sequence",{parser:fS,db:BS,renderer:hA,styles:Sv,init:t=>{if(t.sequence||(t.sequence={}),t.sequence.arrowMarkerAbsolute=t.arrowMarkerAbsolute,"sequenceDiagram"in t)throw new Error("`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.");BS.setWrap(t.wrap),hA.setConf(t.sequence)}},gS),Pv("state",{parser:dA,db:UA,renderer:tD,styles:Av,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,UA.clear()}},pA),Pv("stateDiagram",{parser:dA,db:UA,renderer:bD,styles:Av,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,UA.clear()}},fA),Pv("journey",{parser:xD,db:SD,renderer:qD,styles:Dv,init:t=>{qD.setConf(t.journey),SD.clear()}},vD),Pv("flowchart",{parser:dC,db:PC,renderer:HC,styles:kv,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,YC(t.flowchart),PC.clear(),PC.setGen("gen-1")}},pC),Pv("flowchart-v2",{parser:dC,db:PC,renderer:HC,styles:kv,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,lv({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}}),HC.setConf(t.flowchart),PC.clear(),PC.setGen("gen-2")}},fC),Pv("gitGraph",{parser:zv,db:mk,renderer:Ok,styles:Bk},Uv))};class QD{constructor(t,e){var n,i;Sb(this,"type","graph"),Sb(this,"parser"),Sb(this,"renderer"),Sb(this,"db"),Sb(this,"detectTypeFailed",!1),this.txt=t;const r=hv();this.txt=t;try{this.type=Lx(t,r)}catch(o){this.handleError(o,e),this.type="error",this.detectTypeFailed=!0}const a=jv(this.type);Db.debug("Type "+this.type),this.db=a.db,null==(i=(n=this.db).clear)||i.call(n),this.renderer=a.renderer,this.parser=a.parser;const s=this.parser.parse.bind(this.parser);this.parser.parse=t=>s(function(t,e){var n;const i=t.match(Ex);if(i){const r=Cx(i[1],{schema:Tx});return(null==r?void 0:r.title)&&(null==(n=e.setDiagramTitle)||n.call(e,r.title)),t.slice(i[0].length)}return t}(t,this.db)),this.parser.parser.yy=this.db,a.init&&(a.init(r),Db.debug("Initialized diagram "+this.type,r)),this.txt+="\n",this.parse(this.txt,e)}parse(t,e){var n,i;if(this.detectTypeFailed)return!1;try{return t+="\n",null==(i=(n=this.db).clear)||i.call(n),this.parser.parse(t),!0}catch(r){this.handleError(r,e)}return!1}handleError(t,e){if(void 0===e)throw t;Jx(t)?e(t.str,t.hash):e(t)}getParser(){return this.parser}getType(){return this.type}}const KD=(t,e)=>{const n=Lx(t,hv());try{jv(n)}catch(i){const r=Dx[n].loader;if(!r)throw new Error(`Diagram ${n} not found.`);return r().then((({diagram:i})=>(Pv(n,i,void 0),new QD(t,e))))}return new QD(t,e)},JD=QD;const tL=["graph","flowchart","flowchart-v2","stateDiagram","stateDiagram-v2"],eL="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",nL="sandbox",iL="loose",rL="http://www.w3.org/1999/xlink",aL="http://www.w3.org/1999/xhtml",sL=["foreignobject"],oL=["dominant-baseline"];const cL=function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/classDef.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/#\w+;/g,(function(t){const e=t.substring(1,t.length-1);return/^\+?\d+$/.test(e)?"\ufb02\xb0\xb0"+e+"\xb6\xdf":"\ufb02\xb0"+e+"\xb6\xdf"})),e},lL=function(t){let e=t;return e=e.replace(/\ufb02\xb0\xb0/g,"&#"),e=e.replace(/\ufb02\xb0/g,"&"),e=e.replace(/\xb6\xdf/g,";"),e},hL=(t,e,n=[])=>`\n.${t} ${e} { ${n.join(" !important; ")} !important; }`,uL=(t,e,n,i)=>{const r=((t,e,n={})=>{var i;let r="";if(void 0!==t.themeCSS&&(r+=`\n${t.themeCSS}`),void 0!==t.fontFamily&&(r+=`\n:root { --mermaid-font-family: ${t.fontFamily}}`),void 0!==t.altFontFamily&&(r+=`\n:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),!bf(n)&&tL.includes(e)){const e=["> *","span"],a=["rect","polygon","ellipse","circle","path"],s=t.htmlLabels||(null==(i=t.flowchart)?void 0:i.htmlLabels)?e:a;for(const t in n){const e=n[t];bf(e.styles)||s.forEach((t=>{r+=hL(e.id,t,e.styles)})),bf(e.textStyles)||(r+=hL(e.id,"tspan",e.textStyles))}}return r})(t,e,n);return Hh(fu(`${i}{${Ov(e,r,t.themeVariables)}}`),qh)},dL=(t="",e,n)=>{let i=t;return n||e||(i=i.replace(/marker-end="url\(.*?#/g,'marker-end="url(#')),i=lL(i),i=i.replace(/<br>/g,"<br/>"),i},pL=(t="",e)=>`<iframe style="width:100%;height:${e?e.viewBox.baseVal.height+"px":"100%"};border:0;margin:0;" src="data:text/html;base64,${btoa('<body style="margin:0">'+t+"</body>")}" sandbox="allow-top-navigation-by-user-activation allow-popups">\n The "iframe" tag is not supported by your browser.\n</iframe>`,fL=(t,e,n,i,r)=>{const a=t.append("div");a.attr("id",n),i&&a.attr("style",i);const s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns","http://www.w3.org/2000/svg");return r&&s.attr("xmlns:xlink",r),s.append("g"),t};function gL(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}const yL=(t,e,n,i)=>{var r,a,s;null==(r=t.getElementById(e))||r.remove(),null==(a=t.getElementById(n))||a.remove(),null==(s=t.getElementById(i))||s.remove()};let mL={};const bL=function(t,e,n){switch(Db.debug(`Directive type=${e.type} with args:`,e.args),e.type){case"init":case"initialize":["config"].forEach((t=>{void 0!==e.args[t]&&("flowchart-v2"===n&&(n="flowchart"),e.args[n]=e.args[t],delete e.args[t])})),Db.debug("sanitize in handleDirective",e.args),Qx(e.args),Db.debug("sanitize in handleDirective (done)",e.args),dv(e.args);break;case"wrap":case"nowrap":t&&t.setWrap&&t.setWrap("wrap"===e.type);break;case"themeCss":Db.warn("themeCss encountered");break;default:Db.warn(`Unhandled directive: source: '%%{${e.type}: ${JSON.stringify(e.args?e.args:{})}}%%`,e)}};function _L(t,e,n,i){!function(t,e){bf(e)||t.attr("aria-roledescription",e)}(e,t),function(t,e,n,i){if(void 0!==t.insert&&(e||n)){if(n){const e="chart-desc-"+i;t.attr("aria-describedby",e),t.insert("desc",":first-child").attr("id",e).text(n)}if(e){const n="chart-title-"+i;t.attr("aria-labelledby",n),t.insert("title",":first-child").attr("id",n).text(e)}}}(e,n,i,e.attr("id"))}const xL=Object.freeze({render:function(t,e,n,i){var r,a,s,o,c;ZD(),pv();const l=tv.detectInit(e);l&&(Qx(l),dv(l));const h=hv();Db.debug(h),e.length>(null!=(r=null==h?void 0:h.maxTextSize)?r:5e4)&&(e=eL),e=e.replace(/\r\n?/g,"\n");const u="#"+t,d="i"+t,p="#"+d,f="d"+t,g="#"+f;let y=Ho("body");const m=h.securityLevel===nL,b=h.securityLevel===iL,_=h.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),m){const t=gL(Ho(i),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho(i);fL(y,t,f,`font-family: ${_}`,rL)}else{if(yL(document,t,f,d),m){const t=gL(Ho("body"),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho("body");fL(y,t,f)}let x,v;e=cL(e);try{if(x=KD(e),"then"in x)throw new Error("Diagram is a promise. Use renderAsync.")}catch(N){x=new JD("error"),v=N}const k=y.select(g).node(),w=x.type,T=k.firstChild,C=T.firstChild,E=tL.includes(w)?x.renderer.getClasses(e,x):{},S=uL(h,w,E,u),A=document.createElement("style");A.innerHTML=S,T.insertBefore(A,C);try{x.renderer.draw(e,t,ev,x)}catch(O){throw GD.draw(e,t,ev),O}_L(w,y.select(`${g} svg`),null==(s=(a=x.db).getAccTitle)?void 0:s.call(a),null==(c=(o=x.db).getAccDescription)?void 0:c.call(o)),y.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",aL);let D=y.select(g).node().innerHTML;if(Db.debug("config.arrowMarkerAbsolute",h.arrowMarkerAbsolute),D=dL(D,m,$b(h.arrowMarkerAbsolute)),m){const t=y.select(g+" svg").node();D=pL(D,t)}else b||(D=Gc.sanitize(D,{ADD_TAGS:sL,ADD_ATTR:oL}));if(void 0!==n)switch(w){case"flowchart":case"flowchart-v2":n(D,PC.bindFunctions);break;case"gantt":n(D,EE.bindFunctions);break;case"class":case"classDiagram":n(D,Gw.bindFunctions);break;default:n(D)}else Db.debug("CB = undefined!");IS();const L=Ho(m?p:g).node();if(L&&"remove"in L&&L.remove(),v)throw v;return D},renderAsync:async function(t,e,n,i){var r,a,s,o,c;ZD(),pv();const l=tv.detectInit(e);l&&(Qx(l),dv(l));const h=hv();Db.debug(h),e.length>(null!=(r=null==h?void 0:h.maxTextSize)?r:5e4)&&(e=eL),e=e.replace(/\r\n?/g,"\n");const u="#"+t,d="i"+t,p="#"+d,f="d"+t,g="#"+f;let y=Ho("body");const m=h.securityLevel===nL,b=h.securityLevel===iL,_=h.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),m){const t=gL(Ho(i),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho(i);fL(y,t,f,`font-family: ${_}`,rL)}else{if(yL(document,t,f,d),m){const t=gL(Ho("body"),d);y=Ho(t.nodes()[0].contentDocument.body),y.node().style.margin=0}else y=Ho("body");fL(y,t,f)}let x,v;e=cL(e);try{x=await KD(e)}catch(N){x=new JD("error"),v=N}const k=y.select(g).node(),w=x.type,T=k.firstChild,C=T.firstChild,E=tL.includes(w)?x.renderer.getClasses(e,x):{},S=uL(h,w,E,u),A=document.createElement("style");A.innerHTML=S,T.insertBefore(A,C);try{await x.renderer.draw(e,t,ev,x)}catch(O){throw GD.draw(e,t,ev),O}_L(w,y.select(`${g} svg`),null==(s=(a=x.db).getAccTitle)?void 0:s.call(a),null==(c=(o=x.db).getAccDescription)?void 0:c.call(o)),y.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",aL);let D=y.select(g).node().innerHTML;if(Db.debug("config.arrowMarkerAbsolute",h.arrowMarkerAbsolute),D=dL(D,m,$b(h.arrowMarkerAbsolute)),m){const t=y.select(g+" svg").node();D=pL(D,t)}else b||(D=Gc.sanitize(D,{ADD_TAGS:sL,ADD_ATTR:oL}));if(void 0!==n)switch(w){case"flowchart":case"flowchart-v2":n(D,PC.bindFunctions);break;case"gantt":n(D,EE.bindFunctions);break;case"class":case"classDiagram":n(D,Gw.bindFunctions);break;default:n(D)}else Db.debug("CB = undefined!");IS();const L=Ho(m?p:g).node();if(L&&"remove"in L&&L.remove(),v)throw v;return D},parse:function(t,e){return ZD(),new JD(t,e).parse(t,e)},parseAsync:async function(t,e){return ZD(),(await KD(t,e)).parse(t,e)},parseDirective:function(t,e,n,i){try{if(void 0!==e)switch(e=e.trim(),n){case"open_directive":mL={};break;case"type_directive":if(!mL)throw new Error("currentDirective is undefined");mL.type=e.toLowerCase();break;case"arg_directive":if(!mL)throw new Error("currentDirective is undefined");mL.args=JSON.parse(e);break;case"close_directive":bL(t,mL,i),mL=void 0}}catch(r){Db.error(`Error while rendering sequenceDiagram directive: ${e} jison context: ${n}`),Db.error(r.message)}},initialize:function(t={}){var e;(null==t?void 0:t.fontFamily)&&!(null==(e=t.themeVariables)?void 0:e.fontFamily)&&(t.themeVariables={fontFamily:t.fontFamily}),iv=Bx({},t),(null==t?void 0:t.theme)&&t.theme in Xb?t.themeVariables=Xb[t.theme].getThemeVariables(t.themeVariables):t&&(t.themeVariables=Xb.default.getThemeVariables(t.themeVariables));const n="object"==typeof t?(t=>(rv=Bx({},nv),rv=Bx(rv,t),t.theme&&Xb[t.theme]&&(rv.themeVariables=Xb[t.theme].getThemeVariables(t.themeVariables)),ov(rv,av),rv))(t):cv();Lb(n.logLevel),ZD()},getConfig:hv,setConfig:lv,getSiteConfig:cv,updateSiteConfig:t=>(rv=Bx(rv,t),ov(rv,av),rv),reset:()=>{pv()},globalReset:()=>{pv(nv)},defaultConfig:nv});Lb(hv().logLevel),pv(hv());let vL=!1;const kL=(t,e,n)=>{Db.warn(t),Jx(t)?(n&&n(t.str,t.hash),e.push({...t,message:t.str,error:t})):(n&&n(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},wL=function(t,e,n){const i=xL.getConfig();let r;if(t&&(DL.sequenceConfig=t),Db.debug((n?"":"No ")+"Callback function found"),void 0===e)r=document.querySelectorAll(".mermaid");else if("string"==typeof e)r=document.querySelectorAll(e);else if(e instanceof HTMLElement)r=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");r=e}Db.debug(`Found ${r.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Db.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),xL.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const a=new tv.initIdGenerator(i.deterministicIds,i.deterministicIDSeed);let s;const o=[];for(const l of Array.from(r)){if(Db.info("Rendering diagram: "+l.id),l.getAttribute("data-processed"))continue;l.setAttribute("data-processed","true");const t=`mermaid-${a.next()}`;s=l.innerHTML,s=tv.entityDecode(s).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=tv.detectInit(s);e&&Db.debug("Detected early reinit: ",e);try{xL.render(t,s,((e,i)=>{l.innerHTML=e,void 0!==n&&n(t),i&&i(l)}),l)}catch(c){kL(c,o,DL.parseError)}}if(o.length>0)throw o[0]},TL=async function(t,e,n){const i=xL.getConfig();let r;if(t&&(DL.sequenceConfig=t),Db.debug((n?"":"No ")+"Callback function found"),void 0===e)r=document.querySelectorAll(".mermaid");else if("string"==typeof e)r=document.querySelectorAll(e);else if(e instanceof HTMLElement)r=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");r=e}Db.debug(`Found ${r.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Db.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),xL.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const a=new tv.initIdGenerator(i.deterministicIds,i.deterministicIDSeed);let s;const o=[];for(const l of Array.from(r)){if(Db.info("Rendering diagram: "+l.id),l.getAttribute("data-processed"))continue;l.setAttribute("data-processed","true");const t=`mermaid-${a.next()}`;s=l.innerHTML,s=tv.entityDecode(s).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=tv.detectInit(s);e&&Db.debug("Detected early reinit: ",e);try{await xL.renderAsync(t,s,((e,i)=>{l.innerHTML=e,void 0!==n&&n(t),i&&i(l)}),l)}catch(c){kL(c,o,DL.parseError)}}if(o.length>0)throw o[0]},CL=function(){if(DL.startOnLoad){const{startOnLoad:t}=xL.getConfig();t&&DL.init()}};"undefined"!=typeof document&&window.addEventListener("load",CL,!1);const EL=[];let SL=!1;const AL=async()=>{if(!SL){for(SL=!0;EL.length>0;){const e=EL.shift();if(e)try{await e()}catch(t){Db.error("Error executing queue",t)}}SL=!1}},DL={startOnLoad:!0,diagrams:{},mermaidAPI:xL,parse:t=>xL.parse(t,DL.parseError),parseAsync:t=>new Promise(((e,n)=>{EL.push((()=>new Promise(((i,r)=>{xL.parseAsync(t,DL.parseError).then((t=>{i(t),e(t)}),(t=>{Db.error("Error parsing",t),r(t),n(t)}))})))),AL()})),render:xL.render,renderAsync:(t,e,n,i)=>new Promise(((r,a)=>{EL.push((()=>new Promise(((s,o)=>{xL.renderAsync(t,e,n,i).then((t=>{s(t),r(t)}),(t=>{Db.error("Error parsing",t),o(t),a(t)}))})))),AL()})),init:async function(t,e,n){try{vL?await TL(t,e,n):wL(t,e,n)}catch(i){Db.warn("Syntax Error rendering"),Jx(i)&&Db.warn(i.str),DL.parseError&&DL.parseError(i)}},initThrowsErrors:wL,initThrowsErrorsAsync:TL,registerExternalDiagrams:async(t,{lazyLoad:e=!0}={})=>{e?(t=>{for(const{id:e,detector:n,loader:i}of t)Nx(e,n,i)})(t):await(async t=>{Db.debug(`Loading ${t.length} external diagrams`);const e=await Promise.allSettled(t.map((async({id:t,detector:e,loader:n})=>{const{diagram:i}=await n();Pv(t,i,e)}))),n=e.filter((t=>"rejected"===t.status));if(n.length>0){Db.error(`Failed to load ${n.length} external diagrams`);for(const t of n)Db.error(t);throw new Error(`Failed to load ${n.length} external diagrams`)}})(t),vL=!0},initialize:function(t){xL.initialize(t)},parseError:void 0,contentLoaded:CL,setParseErrorHandler:function(t){DL.parseError=t}};function LL(){const{colorMode:t}=(0,h.I)(),e=(0,u.L)().mermaid,n=e.theme[t],{options:r}=e;return(0,i.useMemo)((()=>({startOnLoad:!1,...r,theme:n})),[n,r])}const NL="container_lyt7";function OL(t){let{value:e}=t;const n=function(t,e){const n=LL(),r=e??n;return(0,i.useMemo)((()=>{DL.mermaidAPI.initialize(r);const e=`mermaid-svg-${Math.round(1e7*Math.random())}`;return DL.render(e,t)}),[t,r])}(e);return i.createElement("div",{className:`docusaurus-mermaid-container ${NL}`,dangerouslySetInnerHTML:{__html:n}})}const BL={head:function(t){const e=i.Children.map(t.children,(t=>i.isValidElement(t)?function(t){if(t.props?.mdxType&&t.props.originalType){const{mdxType:e,originalType:n,...r}=t.props;return i.createElement(t.props.originalType,r)}return t}(t):t));return i.createElement(s.Z,t,e)},code:function(t){const e=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return i.Children.toArray(t.children).every((t=>"string"==typeof t&&!t.includes("\n")||(0,i.isValidElement)(t)&&e.includes(t.props?.mdxType)))?i.createElement("code",t):i.createElement(Z,t)},a:function(t){return i.createElement(Q.Z,t)},pre:function(t){return i.createElement(Z,(0,i.isValidElement)(t.children)&&"code"===t.children.props?.originalType?t.children.props:{...t})},details:function(t){const e=i.Children.toArray(t.children),n=e.find((t=>i.isValidElement(t)&&"summary"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return i.createElement(st,(0,a.Z)({},t,{summary:n}),r)},ul:function(t){return i.createElement("ul",(0,a.Z)({},t,{className:(e=t.className,(0,l.Z)(e,e?.includes("contains-task-list")&<))}));var e},img:function(t){return i.createElement("img",(0,a.Z)({loading:"lazy"},t,{className:(e=t.className,(0,l.Z)(e,ht))}));var e},h1:t=>i.createElement(ct,(0,a.Z)({as:"h1"},t)),h2:t=>i.createElement(ct,(0,a.Z)({as:"h2"},t)),h3:t=>i.createElement(ct,(0,a.Z)({as:"h3"},t)),h4:t=>i.createElement(ct,(0,a.Z)({as:"h4"},t)),h5:t=>i.createElement(ct,(0,a.Z)({as:"h5"},t)),h6:t=>i.createElement(ct,(0,a.Z)({as:"h6"},t)),admonition:function(t){const{children:e,type:n,title:r,icon:a}=mt(t),s=function(t){const e=yt[t]??t;return gt[e]||(console.warn(`No admonition config found for admonition type "${e}". Using Info as fallback.`),gt.info)}(n),o=r??s.label,{iconComponent:c}=s,h=a??i.createElement(c,null);return i.createElement("div",{className:(0,l.Z)(p.k.common.admonition,p.k.common.admonitionType(t.type),"alert",`alert--${s.infimaClassName}`,ut)},i.createElement("div",{className:dt},i.createElement("span",{className:pt},h),o),i.createElement("div",{className:ft},e))},mermaid:function(t){return i.createElement(bt,null,(()=>i.createElement(OL,t)))}},ML=BL;function IL(t){let{children:e}=t;return i.createElement(r.Zo,{components:ML},e)}},32244:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(67294),r=n(86010),a=n(39960);function s(t){const{permalink:e,title:n,subLabel:s,isNext:o}=t;return i.createElement(a.Z,{className:(0,r.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:e},s&&i.createElement("div",{className:"pagination-nav__sublabel"},s),i.createElement("div",{className:"pagination-nav__label"},n))}},13008:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(67294),r=n(86010),a=n(39960);const s="tag_zVej",o="tagRegular_sFm0",c="tagWithCount_h2kH";function l(t){let{permalink:e,label:n,count:l}=t;return i.createElement(a.Z,{href:e,className:(0,r.Z)(s,l?c:o)},n,l&&i.createElement("span",null,l))}},71526:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(67294),r=n(86010),a=n(95999),s=n(13008);const o="tags_jXut",c="tag_QGVx";function l(t){let{tags:e}=t;return i.createElement(i.Fragment,null,i.createElement("b",null,i.createElement(a.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),i.createElement("ul",{className:(0,r.Z)(o,"padding--none","margin-left--sm")},e.map((t=>{let{label:e,permalink:n}=t;return i.createElement("li",{key:n,className:c},i.createElement(s.Z,{label:e,permalink:n}))}))))}},27856:function(t){t.exports=function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,n){return e=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},e(t,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function i(t,r,a){return i=n()?Reflect.construct:function(t,n,i){var r=[null];r.push.apply(r,n);var a=new(Function.bind.apply(t,r));return i&&e(a,i.prototype),a},i.apply(null,arguments)}function r(t){return a(t)||s(t)||o(t)||l()}function a(t){if(Array.isArray(t))return c(t)}function s(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function o(t,e){if(t){if("string"==typeof t)return c(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n<e;n++)i[n]=t[n];return i}function l(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var h=Object.hasOwnProperty,u=Object.setPrototypeOf,d=Object.isFrozen,p=Object.getPrototypeOf,f=Object.getOwnPropertyDescriptor,g=Object.freeze,y=Object.seal,m=Object.create,b="undefined"!=typeof Reflect&&Reflect,_=b.apply,x=b.construct;_||(_=function(t,e,n){return t.apply(e,n)}),g||(g=function(t){return t}),y||(y=function(t){return t}),x||(x=function(t,e){return i(t,r(e))});var v=O(Array.prototype.forEach),k=O(Array.prototype.pop),w=O(Array.prototype.push),T=O(String.prototype.toLowerCase),C=O(String.prototype.toString),E=O(String.prototype.match),S=O(String.prototype.replace),A=O(String.prototype.indexOf),D=O(String.prototype.trim),L=O(RegExp.prototype.test),N=B(TypeError);function O(t){return function(e){for(var n=arguments.length,i=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];return _(t,e,i)}}function B(t){return function(){for(var e=arguments.length,n=new Array(e),i=0;i<e;i++)n[i]=arguments[i];return x(t,n)}}function M(t,e,n){n=n||T,u&&u(t,null);for(var i=e.length;i--;){var r=e[i];if("string"==typeof r){var a=n(r);a!==r&&(d(e)||(e[i]=a),r=a)}t[r]=!0}return t}function I(t){var e,n=m(null);for(e in t)_(h,t,[e])&&(n[e]=t[e]);return n}function F(t,e){for(;null!==t;){var n=f(t,e);if(n){if(n.get)return O(n.get);if("function"==typeof n.value)return O(n.value)}t=p(t)}function i(t){return console.warn("fallback value for",t),null}return i}var R=g(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),$=g(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),P=g(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),j=g(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Y=g(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),z=g(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),U=g(["#text"]),W=g(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),H=g(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),q=g(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),V=g(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),G=y(/\{\{[\w\W]*|[\w\W]*\}\}/gm),X=y(/<%[\w\W]*|[\w\W]*%>/gm),Z=y(/\${[\w\W]*}/gm),Q=y(/^data-[\-\w.\u00B7-\uFFFF]/),K=y(/^aria-[\-\w]+$/),J=y(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),tt=y(/^(?:\w+script|data):/i),et=y(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),nt=y(/^html$/i),it=function(){return"undefined"==typeof window?null:window},rt=function(e,n){if("object"!==t(e)||"function"!=typeof e.createPolicy)return null;var i=null,r="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(r)&&(i=n.currentScript.getAttribute(r));var a="dompurify"+(i?"#"+i:"");try{return e.createPolicy(a,{createHTML:function(t){return t},createScriptURL:function(t){return t}})}catch(s){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};function at(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:it(),n=function(t){return at(t)};if(n.version="2.4.1",n.removed=[],!e||!e.document||9!==e.document.nodeType)return n.isSupported=!1,n;var i=e.document,a=e.document,s=e.DocumentFragment,o=e.HTMLTemplateElement,c=e.Node,l=e.Element,h=e.NodeFilter,u=e.NamedNodeMap,d=void 0===u?e.NamedNodeMap||e.MozNamedAttrMap:u,p=e.HTMLFormElement,f=e.DOMParser,y=e.trustedTypes,m=l.prototype,b=F(m,"cloneNode"),_=F(m,"nextSibling"),x=F(m,"childNodes"),O=F(m,"parentNode");if("function"==typeof o){var B=a.createElement("template");B.content&&B.content.ownerDocument&&(a=B.content.ownerDocument)}var st=rt(y,i),ot=st?st.createHTML(""):"",ct=a,lt=ct.implementation,ht=ct.createNodeIterator,ut=ct.createDocumentFragment,dt=ct.getElementsByTagName,pt=i.importNode,ft={};try{ft=I(a).documentMode?a.documentMode:{}}catch(Oe){}var gt={};n.isSupported="function"==typeof O&<&&void 0!==lt.createHTMLDocument&&9!==ft;var yt,mt,bt=G,_t=X,xt=Z,vt=Q,kt=K,wt=tt,Tt=et,Ct=J,Et=null,St=M({},[].concat(r(R),r($),r(P),r(Y),r(U))),At=null,Dt=M({},[].concat(r(W),r(H),r(q),r(V))),Lt=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Nt=null,Ot=null,Bt=!0,Mt=!0,It=!1,Ft=!1,Rt=!1,$t=!1,Pt=!1,jt=!1,Yt=!1,zt=!1,Ut=!0,Wt=!1,Ht="user-content-",qt=!0,Vt=!1,Gt={},Xt=null,Zt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Qt=null,Kt=M({},["audio","video","img","source","image","track"]),Jt=null,te=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ee="http://www.w3.org/1998/Math/MathML",ne="http://www.w3.org/2000/svg",ie="http://www.w3.org/1999/xhtml",re=ie,ae=!1,se=null,oe=M({},[ee,ne,ie],C),ce=["application/xhtml+xml","text/html"],le="text/html",he=null,ue=a.createElement("form"),de=function(t){return t instanceof RegExp||t instanceof Function},pe=function(e){he&&he===e||(e&&"object"===t(e)||(e={}),e=I(e),yt=yt=-1===ce.indexOf(e.PARSER_MEDIA_TYPE)?le:e.PARSER_MEDIA_TYPE,mt="application/xhtml+xml"===yt?C:T,Et="ALLOWED_TAGS"in e?M({},e.ALLOWED_TAGS,mt):St,At="ALLOWED_ATTR"in e?M({},e.ALLOWED_ATTR,mt):Dt,se="ALLOWED_NAMESPACES"in e?M({},e.ALLOWED_NAMESPACES,C):oe,Jt="ADD_URI_SAFE_ATTR"in e?M(I(te),e.ADD_URI_SAFE_ATTR,mt):te,Qt="ADD_DATA_URI_TAGS"in e?M(I(Kt),e.ADD_DATA_URI_TAGS,mt):Kt,Xt="FORBID_CONTENTS"in e?M({},e.FORBID_CONTENTS,mt):Zt,Nt="FORBID_TAGS"in e?M({},e.FORBID_TAGS,mt):{},Ot="FORBID_ATTR"in e?M({},e.FORBID_ATTR,mt):{},Gt="USE_PROFILES"in e&&e.USE_PROFILES,Bt=!1!==e.ALLOW_ARIA_ATTR,Mt=!1!==e.ALLOW_DATA_ATTR,It=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ft=e.SAFE_FOR_TEMPLATES||!1,Rt=e.WHOLE_DOCUMENT||!1,jt=e.RETURN_DOM||!1,Yt=e.RETURN_DOM_FRAGMENT||!1,zt=e.RETURN_TRUSTED_TYPE||!1,Pt=e.FORCE_BODY||!1,Ut=!1!==e.SANITIZE_DOM,Wt=e.SANITIZE_NAMED_PROPS||!1,qt=!1!==e.KEEP_CONTENT,Vt=e.IN_PLACE||!1,Ct=e.ALLOWED_URI_REGEXP||Ct,re=e.NAMESPACE||ie,e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Lt.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Lt.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Lt.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ft&&(Mt=!1),Yt&&(jt=!0),Gt&&(Et=M({},r(U)),At=[],!0===Gt.html&&(M(Et,R),M(At,W)),!0===Gt.svg&&(M(Et,$),M(At,H),M(At,V)),!0===Gt.svgFilters&&(M(Et,P),M(At,H),M(At,V)),!0===Gt.mathMl&&(M(Et,Y),M(At,q),M(At,V))),e.ADD_TAGS&&(Et===St&&(Et=I(Et)),M(Et,e.ADD_TAGS,mt)),e.ADD_ATTR&&(At===Dt&&(At=I(At)),M(At,e.ADD_ATTR,mt)),e.ADD_URI_SAFE_ATTR&&M(Jt,e.ADD_URI_SAFE_ATTR,mt),e.FORBID_CONTENTS&&(Xt===Zt&&(Xt=I(Xt)),M(Xt,e.FORBID_CONTENTS,mt)),qt&&(Et["#text"]=!0),Rt&&M(Et,["html","head","body"]),Et.table&&(M(Et,["tbody"]),delete Nt.tbody),g&&g(e),he=e)},fe=M({},["mi","mo","mn","ms","mtext"]),ge=M({},["foreignobject","desc","title","annotation-xml"]),ye=M({},["title","style","font","a","script"]),me=M({},$);M(me,P),M(me,j);var be=M({},Y);M(be,z);var _e=function(t){var e=O(t);e&&e.tagName||(e={namespaceURI:re,tagName:"template"});var n=T(t.tagName),i=T(e.tagName);return!!se[t.namespaceURI]&&(t.namespaceURI===ne?e.namespaceURI===ie?"svg"===n:e.namespaceURI===ee?"svg"===n&&("annotation-xml"===i||fe[i]):Boolean(me[n]):t.namespaceURI===ee?e.namespaceURI===ie?"math"===n:e.namespaceURI===ne?"math"===n&&ge[i]:Boolean(be[n]):t.namespaceURI===ie?!(e.namespaceURI===ne&&!ge[i])&&!(e.namespaceURI===ee&&!fe[i])&&!be[n]&&(ye[n]||!me[n]):!("application/xhtml+xml"!==yt||!se[t.namespaceURI]))},xe=function(t){w(n.removed,{element:t});try{t.parentNode.removeChild(t)}catch(Oe){try{t.outerHTML=ot}catch(Oe){t.remove()}}},ve=function(t,e){try{w(n.removed,{attribute:e.getAttributeNode(t),from:e})}catch(Oe){w(n.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t&&!At[t])if(jt||Yt)try{xe(e)}catch(Oe){}else try{e.setAttribute(t,"")}catch(Oe){}},ke=function(t){var e,n;if(Pt)t="<remove></remove>"+t;else{var i=E(t,/^[\r\n\t ]+/);n=i&&i[0]}"application/xhtml+xml"===yt&&re===ie&&(t='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+t+"</body></html>");var r=st?st.createHTML(t):t;if(re===ie)try{e=(new f).parseFromString(r,yt)}catch(Oe){}if(!e||!e.documentElement){e=lt.createDocument(re,"template",null);try{e.documentElement.innerHTML=ae?"":r}catch(Oe){}}var s=e.body||e.documentElement;return t&&n&&s.insertBefore(a.createTextNode(n),s.childNodes[0]||null),re===ie?dt.call(e,Rt?"html":"body")[0]:Rt?e.documentElement:s},we=function(t){return ht.call(t.ownerDocument||t,t,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT,null,!1)},Te=function(t){return t instanceof p&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof d)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore||"function"!=typeof t.hasChildNodes)},Ce=function(e){return"object"===t(c)?e instanceof c:e&&"object"===t(e)&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ee=function(t,e,i){gt[t]&&v(gt[t],(function(t){t.call(n,e,i,he)}))},Se=function(t){var e;if(Ee("beforeSanitizeElements",t,null),Te(t))return xe(t),!0;if(L(/[\u0080-\uFFFF]/,t.nodeName))return xe(t),!0;var i=mt(t.nodeName);if(Ee("uponSanitizeElement",t,{tagName:i,allowedTags:Et}),t.hasChildNodes()&&!Ce(t.firstElementChild)&&(!Ce(t.content)||!Ce(t.content.firstElementChild))&&L(/<[/\w]/g,t.innerHTML)&&L(/<[/\w]/g,t.textContent))return xe(t),!0;if("select"===i&&L(/<template/i,t.innerHTML))return xe(t),!0;if(!Et[i]||Nt[i]){if(!Nt[i]&&De(i)){if(Lt.tagNameCheck instanceof RegExp&&L(Lt.tagNameCheck,i))return!1;if(Lt.tagNameCheck instanceof Function&&Lt.tagNameCheck(i))return!1}if(qt&&!Xt[i]){var r=O(t)||t.parentNode,a=x(t)||t.childNodes;if(a&&r)for(var s=a.length-1;s>=0;--s)r.insertBefore(b(a[s],!0),_(t))}return xe(t),!0}return t instanceof l&&!_e(t)?(xe(t),!0):"noscript"!==i&&"noembed"!==i||!L(/<\/no(script|embed)/i,t.innerHTML)?(Ft&&3===t.nodeType&&(e=t.textContent,e=S(e,bt," "),e=S(e,_t," "),e=S(e,xt," "),t.textContent!==e&&(w(n.removed,{element:t.cloneNode()}),t.textContent=e)),Ee("afterSanitizeElements",t,null),!1):(xe(t),!0)},Ae=function(t,e,n){if(Ut&&("id"===e||"name"===e)&&(n in a||n in ue))return!1;if(Mt&&!Ot[e]&&L(vt,e));else if(Bt&&L(kt,e));else if(!At[e]||Ot[e]){if(!(De(t)&&(Lt.tagNameCheck instanceof RegExp&&L(Lt.tagNameCheck,t)||Lt.tagNameCheck instanceof Function&&Lt.tagNameCheck(t))&&(Lt.attributeNameCheck instanceof RegExp&&L(Lt.attributeNameCheck,e)||Lt.attributeNameCheck instanceof Function&&Lt.attributeNameCheck(e))||"is"===e&&Lt.allowCustomizedBuiltInElements&&(Lt.tagNameCheck instanceof RegExp&&L(Lt.tagNameCheck,n)||Lt.tagNameCheck instanceof Function&&Lt.tagNameCheck(n))))return!1}else if(Jt[e]);else if(L(Ct,S(n,Tt,"")));else if("src"!==e&&"xlink:href"!==e&&"href"!==e||"script"===t||0!==A(n,"data:")||!Qt[t])if(It&&!L(wt,S(n,Tt,"")));else if(n)return!1;return!0},De=function(t){return t.indexOf("-")>0},Le=function(e){var i,r,a,s;Ee("beforeSanitizeAttributes",e,null);var o=e.attributes;if(o){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:At};for(s=o.length;s--;){var l=i=o[s],h=l.name,u=l.namespaceURI;if(r="value"===h?i.value:D(i.value),a=mt(h),c.attrName=a,c.attrValue=r,c.keepAttr=!0,c.forceKeepAttr=void 0,Ee("uponSanitizeAttribute",e,c),r=c.attrValue,!c.forceKeepAttr&&(ve(h,e),c.keepAttr))if(L(/\/>/i,r))ve(h,e);else{Ft&&(r=S(r,bt," "),r=S(r,_t," "),r=S(r,xt," "));var d=mt(e.nodeName);if(Ae(d,a,r)){if(!Wt||"id"!==a&&"name"!==a||(ve(h,e),r=Ht+r),st&&"object"===t(y)&&"function"==typeof y.getAttributeType)if(u);else switch(y.getAttributeType(d,a)){case"TrustedHTML":r=st.createHTML(r);break;case"TrustedScriptURL":r=st.createScriptURL(r)}try{u?e.setAttributeNS(u,h,r):e.setAttribute(h,r),k(n.removed)}catch(Oe){}}}}Ee("afterSanitizeAttributes",e,null)}},Ne=function t(e){var n,i=we(e);for(Ee("beforeSanitizeShadowDOM",e,null);n=i.nextNode();)Ee("uponSanitizeShadowNode",n,null),Se(n)||(n.content instanceof s&&t(n.content),Le(n));Ee("afterSanitizeShadowDOM",e,null)};return n.sanitize=function(r){var a,o,l,h,u,d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((ae=!r)&&(r="\x3c!--\x3e"),"string"!=typeof r&&!Ce(r)){if("function"!=typeof r.toString)throw N("toString is not a function");if("string"!=typeof(r=r.toString()))throw N("dirty is not a string, aborting")}if(!n.isSupported){if("object"===t(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof r)return e.toStaticHTML(r);if(Ce(r))return e.toStaticHTML(r.outerHTML)}return r}if($t||pe(d),n.removed=[],"string"==typeof r&&(Vt=!1),Vt){if(r.nodeName){var p=mt(r.nodeName);if(!Et[p]||Nt[p])throw N("root node is forbidden and cannot be sanitized in-place")}}else if(r instanceof c)1===(o=(a=ke("\x3c!----\x3e")).ownerDocument.importNode(r,!0)).nodeType&&"BODY"===o.nodeName||"HTML"===o.nodeName?a=o:a.appendChild(o);else{if(!jt&&!Ft&&!Rt&&-1===r.indexOf("<"))return st&&zt?st.createHTML(r):r;if(!(a=ke(r)))return jt?null:zt?ot:""}a&&Pt&&xe(a.firstChild);for(var f=we(Vt?r:a);l=f.nextNode();)3===l.nodeType&&l===h||Se(l)||(l.content instanceof s&&Ne(l.content),Le(l),h=l);if(h=null,Vt)return r;if(jt){if(Yt)for(u=ut.call(a.ownerDocument);a.firstChild;)u.appendChild(a.firstChild);else u=a;return At.shadowroot&&(u=pt.call(i,u,!0)),u}var g=Rt?a.outerHTML:a.innerHTML;return Rt&&Et["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&L(nt,a.ownerDocument.doctype.name)&&(g="<!DOCTYPE "+a.ownerDocument.doctype.name+">\n"+g),Ft&&(g=S(g,bt," "),g=S(g,_t," "),g=S(g,xt," ")),st&&zt?st.createHTML(g):g},n.setConfig=function(t){pe(t),$t=!0},n.clearConfig=function(){he=null,$t=!1},n.isValidAttribute=function(t,e,n){he||pe({});var i=mt(t),r=mt(e);return Ae(i,r,n)},n.addHook=function(t,e){"function"==typeof e&&(gt[t]=gt[t]||[],w(gt[t],e))},n.removeHook=function(t){if(gt[t])return k(gt[t])},n.removeHooks=function(t){gt[t]&&(gt[t]=[])},n.removeAllHooks=function(){gt={}},n}return at()}()},89234:()=>{},11941:function(t,e,n){(t=n.nmd(t)).exports=function(){"use strict";var e;function i(){return e.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function a(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function o(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;for(var e in t)if(s(t,e))return;return 1}function c(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function h(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function u(t,e){for(var n=[],i=t.length,r=0;r<i;++r)n.push(e(t[r],r));return n}function d(t,e){for(var n in e)s(e,n)&&(t[n]=e[n]);return s(e,"toString")&&(t.toString=e.toString),s(e,"valueOf")&&(t.valueOf=e.valueOf),t}function p(t,e,n,i){return Le(t,e,n,i,!0).utc()}function f(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),t._pf}function g(t){if(null==t._isValid){var e=f(t),n=m.call(e.parsedDateParts,(function(t){return null!=t}));if(n=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidEra&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n),t._strict&&(n=n&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return n;t._isValid=n}return t._isValid}function y(t){var e=p(NaN);return null!=t?d(f(e),t):f(e).userInvalidated=!0,e}var m=Array.prototype.some||function(t){for(var e=Object(this),n=e.length>>>0,i=0;i<n;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1},b=i.momentProperties=[],_=!1;function x(t,e){var n,i,r,a=b.length;if(c(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),c(e._i)||(t._i=e._i),c(e._f)||(t._f=e._f),c(e._l)||(t._l=e._l),c(e._strict)||(t._strict=e._strict),c(e._tzm)||(t._tzm=e._tzm),c(e._isUTC)||(t._isUTC=e._isUTC),c(e._offset)||(t._offset=e._offset),c(e._pf)||(t._pf=f(e)),c(e._locale)||(t._locale=e._locale),0<a)for(n=0;n<a;n++)c(r=e[i=b[n]])||(t[i]=r);return t}function v(t){x(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===_&&(_=!0,i.updateOffset(this),_=!1)}function k(t){return t instanceof v||null!=t&&null!=t._isAMomentObject}function w(t){!1===i.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function T(t,e){var n=!0;return d((function(){if(null!=i.deprecationHandler&&i.deprecationHandler(null,t),n){for(var r,a,o=[],c=arguments.length,l=0;l<c;l++){if(r="","object"==typeof arguments[l]){for(a in r+="\n["+l+"] ",arguments[0])s(arguments[0],a)&&(r+=a+": "+arguments[0][a]+", ");r=r.slice(0,-2)}else r=arguments[l];o.push(r)}w(t+"\nArguments: "+Array.prototype.slice.call(o).join("")+"\n"+(new Error).stack),n=!1}return e.apply(this,arguments)}),e)}var C={};function E(t,e){null!=i.deprecationHandler&&i.deprecationHandler(t,e),C[t]||(w(e),C[t]=!0)}function S(t){return"undefined"!=typeof Function&&t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function A(t,e){var n,i=d({},t);for(n in e)s(e,n)&&(a(t[n])&&a(e[n])?(i[n]={},d(i[n],t[n]),d(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)s(t,n)&&!s(e,n)&&a(t[n])&&(i[n]=d({},i[n]));return i}function D(t){null!=t&&this.set(t)}i.suppressDeprecationWarnings=!1,i.deprecationHandler=null;var L=Object.keys||function(t){var e,n=[];for(e in t)s(t,e)&&n.push(e);return n};function N(t,e,n){var i=""+Math.abs(t);return(0<=t?n?"+":"":"-")+Math.pow(10,Math.max(0,e-i.length)).toString().substr(1)+i}var O=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,B=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,M={},I={};function F(t,e,n,i){var r="string"==typeof i?function(){return this[i]()}:i;t&&(I[t]=r),e&&(I[e[0]]=function(){return N(r.apply(this,arguments),e[1],e[2])}),n&&(I[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function R(t,e){return t.isValid()?(e=$(e,t.localeData()),M[e]=M[e]||function(t){for(var e,n=t.match(O),i=0,r=n.length;i<r;i++)I[n[i]]?n[i]=I[n[i]]:n[i]=(e=n[i]).match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"");return function(e){for(var i="",a=0;a<r;a++)i+=S(n[a])?n[a].call(e,t):n[a];return i}}(e),M[e](t)):t.localeData().invalidDate()}function $(t,e){var n=5;function i(t){return e.longDateFormat(t)||t}for(B.lastIndex=0;0<=n&&B.test(t);)t=t.replace(B,i),B.lastIndex=0,--n;return t}var P={};function j(t,e){var n=t.toLowerCase();P[n]=P[n+"s"]=P[e]=t}function Y(t){return"string"==typeof t?P[t]||P[t.toLowerCase()]:void 0}function z(t){var e,n,i={};for(n in t)s(t,n)&&(e=Y(n))&&(i[e]=t[n]);return i}var U={};function W(t,e){U[t]=e}function H(t){return t%4==0&&t%100!=0||t%400==0}function q(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function V(t){var e=0;return 0!=(t=+t)&&isFinite(t)?q(t):e}function G(t,e){return function(n){return null!=n?(Z(this,t,n),i.updateOffset(this,e),this):X(this,t)}}function X(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Z(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&H(t.year())&&1===t.month()&&29===t.date()?(n=V(n),t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),Lt(n,t.month()))):t._d["set"+(t._isUTC?"UTC":"")+e](n))}var Q=/\d/,K=/\d\d/,J=/\d{3}/,tt=/\d{4}/,et=/[+-]?\d{6}/,nt=/\d\d?/,it=/\d\d\d\d?/,rt=/\d\d\d\d\d\d?/,at=/\d{1,3}/,st=/\d{1,4}/,ot=/[+-]?\d{1,6}/,ct=/\d+/,lt=/[+-]?\d+/,ht=/Z|[+-]\d\d:?\d\d/gi,ut=/Z|[+-]\d\d(?::?\d\d)?/gi,dt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function pt(t,e,n){yt[t]=S(e)?e:function(t,i){return t&&n?n:e}}function ft(t,e){return s(yt,t)?yt[t](e._strict,e._locale):new RegExp(gt(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,n,i,r){return e||n||i||r}))))}function gt(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var yt={},mt={};function bt(t,e){var n,i,r=e;for("string"==typeof t&&(t=[t]),l(e)&&(r=function(t,n){n[e]=V(t)}),i=t.length,n=0;n<i;n++)mt[t[n]]=r}function _t(t,e){bt(t,(function(t,n,i,r){i._w=i._w||{},e(t,i._w,i,r)}))}var xt,vt=0,kt=1,wt=2,Tt=3,Ct=4,Et=5,St=6,At=7,Dt=8;function Lt(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=(e%(n=12)+n)%n;return t+=(e-n)/12,1==n?H(t)?29:28:31-n%7%2}xt=Array.prototype.indexOf||function(t){for(var e=0;e<this.length;++e)if(this[e]===t)return e;return-1},F("M",["MM",2],"Mo",(function(){return this.month()+1})),F("MMM",0,0,(function(t){return this.localeData().monthsShort(this,t)})),F("MMMM",0,0,(function(t){return this.localeData().months(this,t)})),j("month","M"),W("month",8),pt("M",nt),pt("MM",nt,K),pt("MMM",(function(t,e){return e.monthsShortRegex(t)})),pt("MMMM",(function(t,e){return e.monthsRegex(t)})),bt(["M","MM"],(function(t,e){e[kt]=V(t)-1})),bt(["MMM","MMMM"],(function(t,e,n,i){null!=(i=n._locale.monthsParse(t,i,n._strict))?e[kt]=i:f(n).invalidMonth=t}));var Nt="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Ot="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Bt=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Mt=dt,It=dt;function Ft(t,e){var n;if(t.isValid()){if("string"==typeof e)if(/^\d+$/.test(e))e=V(e);else if(!l(e=t.localeData().monthsParse(e)))return;n=Math.min(t.date(),Lt(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n)}}function Rt(t){return null!=t?(Ft(this,t),i.updateOffset(this,!0),this):X(this,"Month")}function $t(){function t(t,e){return e.length-t.length}for(var e,n=[],i=[],r=[],a=0;a<12;a++)e=p([2e3,a]),n.push(this.monthsShort(e,"")),i.push(this.months(e,"")),r.push(this.months(e,"")),r.push(this.monthsShort(e,""));for(n.sort(t),i.sort(t),r.sort(t),a=0;a<12;a++)n[a]=gt(n[a]),i[a]=gt(i[a]);for(a=0;a<24;a++)r[a]=gt(r[a]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+n.join("|")+")","i")}function Pt(t){return H(t)?366:365}F("Y",0,0,(function(){var t=this.year();return t<=9999?N(t,4):"+"+t})),F(0,["YY",2],0,(function(){return this.year()%100})),F(0,["YYYY",4],0,"year"),F(0,["YYYYY",5],0,"year"),F(0,["YYYYYY",6,!0],0,"year"),j("year","y"),W("year",1),pt("Y",lt),pt("YY",nt,K),pt("YYYY",st,tt),pt("YYYYY",ot,et),pt("YYYYYY",ot,et),bt(["YYYYY","YYYYYY"],vt),bt("YYYY",(function(t,e){e[vt]=2===t.length?i.parseTwoDigitYear(t):V(t)})),bt("YY",(function(t,e){e[vt]=i.parseTwoDigitYear(t)})),bt("Y",(function(t,e){e[vt]=parseInt(t,10)})),i.parseTwoDigitYear=function(t){return V(t)+(68<V(t)?1900:2e3)};var jt=G("FullYear",!0);function Yt(t,e,n,i,r,a,s){var o;return t<100&&0<=t?(o=new Date(t+400,e,n,i,r,a,s),isFinite(o.getFullYear())&&o.setFullYear(t)):o=new Date(t,e,n,i,r,a,s),o}function zt(t){var e;return t<100&&0<=t?((e=Array.prototype.slice.call(arguments))[0]=t+400,e=new Date(Date.UTC.apply(null,e)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)):e=new Date(Date.UTC.apply(null,arguments)),e}function Ut(t,e,n){return(n=7+e-n)-(7+zt(t,0,n).getUTCDay()-e)%7-1}function Wt(t,e,n,i,r){var a;return n=(e=1+7*(e-1)+(7+n-i)%7+Ut(t,i,r))<=0?Pt(a=t-1)+e:e>Pt(t)?(a=t+1,e-Pt(t)):(a=t,e),{year:a,dayOfYear:n}}function Ht(t,e,n){var i,r,a=Ut(t.year(),e,n);return(a=Math.floor((t.dayOfYear()-a-1)/7)+1)<1?i=a+qt(r=t.year()-1,e,n):a>qt(t.year(),e,n)?(i=a-qt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function qt(t,e,n){var i=Ut(t,e,n);return e=Ut(t+1,e,n),(Pt(t)-i+e)/7}function Vt(t,e){return t.slice(e,7).concat(t.slice(0,e))}F("w",["ww",2],"wo","week"),F("W",["WW",2],"Wo","isoWeek"),j("week","w"),j("isoWeek","W"),W("week",5),W("isoWeek",5),pt("w",nt),pt("ww",nt,K),pt("W",nt),pt("WW",nt,K),_t(["w","ww","W","WW"],(function(t,e,n,i){e[i.substr(0,1)]=V(t)})),F("d",0,"do","day"),F("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),F("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),F("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),F("e",0,0,"weekday"),F("E",0,0,"isoWeekday"),j("day","d"),j("weekday","e"),j("isoWeekday","E"),W("day",11),W("weekday",11),W("isoWeekday",11),pt("d",nt),pt("e",nt),pt("E",nt),pt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),pt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),pt("dddd",(function(t,e){return e.weekdaysRegex(t)})),_t(["dd","ddd","dddd"],(function(t,e,n,i){null!=(i=n._locale.weekdaysParse(t,i,n._strict))?e.d=i:f(n).invalidWeekday=t})),_t(["d","e","E"],(function(t,e,n,i){e[i]=V(t)}));var Gt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Xt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Zt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Qt=dt,Kt=dt,Jt=dt;function te(){function t(t,e){return e.length-t.length}for(var e,n,i,r=[],a=[],s=[],o=[],c=0;c<7;c++)i=p([2e3,1]).day(c),e=gt(this.weekdaysMin(i,"")),n=gt(this.weekdaysShort(i,"")),i=gt(this.weekdays(i,"")),r.push(e),a.push(n),s.push(i),o.push(e),o.push(n),o.push(i);r.sort(t),a.sort(t),s.sort(t),o.sort(t),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function ee(){return this.hours()%12||12}function ne(t,e){F(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function ie(t,e){return e._meridiemParse}F("H",["HH",2],0,"hour"),F("h",["hh",2],0,ee),F("k",["kk",2],0,(function(){return this.hours()||24})),F("hmm",0,0,(function(){return""+ee.apply(this)+N(this.minutes(),2)})),F("hmmss",0,0,(function(){return""+ee.apply(this)+N(this.minutes(),2)+N(this.seconds(),2)})),F("Hmm",0,0,(function(){return""+this.hours()+N(this.minutes(),2)})),F("Hmmss",0,0,(function(){return""+this.hours()+N(this.minutes(),2)+N(this.seconds(),2)})),ne("a",!0),ne("A",!1),j("hour","h"),W("hour",13),pt("a",ie),pt("A",ie),pt("H",nt),pt("h",nt),pt("k",nt),pt("HH",nt,K),pt("hh",nt,K),pt("kk",nt,K),pt("hmm",it),pt("hmmss",rt),pt("Hmm",it),pt("Hmmss",rt),bt(["H","HH"],Tt),bt(["k","kk"],(function(t,e,n){t=V(t),e[Tt]=24===t?0:t})),bt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),bt(["h","hh"],(function(t,e,n){e[Tt]=V(t),f(n).bigHour=!0})),bt("hmm",(function(t,e,n){var i=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i)),f(n).bigHour=!0})),bt("hmmss",(function(t,e,n){var i=t.length-4,r=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i,2)),e[Et]=V(t.substr(r)),f(n).bigHour=!0})),bt("Hmm",(function(t,e,n){var i=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i))})),bt("Hmmss",(function(t,e,n){var i=t.length-4,r=t.length-2;e[Tt]=V(t.substr(0,i)),e[Ct]=V(t.substr(i,2)),e[Et]=V(t.substr(r))})),dt=G("Hours",!0);var re,ae={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Nt,monthsShort:Ot,week:{dow:0,doy:6},weekdays:Gt,weekdaysMin:Zt,weekdaysShort:Xt,meridiemParse:/[ap]\.?m?\.?/i},se={},oe={};function ce(t){return t&&t.toLowerCase().replace("_","-")}function le(t){for(var e,n,i,r,a=0;a<t.length;){for(e=(r=ce(t[a]).split("-")).length,n=(n=ce(t[a+1]))?n.split("-"):null;0<e;){if(i=he(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&function(t,e){for(var n=Math.min(t.length,e.length),i=0;i<n;i+=1)if(t[i]!==e[i])return i;return n}(r,n)>=e-1)break;e--}a++}return re}function he(e){var i;if(void 0===se[e]&&t&&t.exports&&null!=e.match("^[^/\\\\]*$"))try{i=re._abbr,n(11748)("./"+e),ue(i)}catch(i){se[e]=null}return se[e]}function ue(t,e){return t&&((e=c(e)?pe(t):de(t,e))?re=e:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),re._abbr}function de(t,e){if(null===e)return delete se[t],null;var n,i=ae;if(e.abbr=t,null!=se[t])E("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=se[t]._config;else if(null!=e.parentLocale)if(null!=se[e.parentLocale])i=se[e.parentLocale]._config;else{if(null==(n=he(e.parentLocale)))return oe[e.parentLocale]||(oe[e.parentLocale]=[]),oe[e.parentLocale].push({name:t,config:e}),null;i=n._config}return se[t]=new D(A(i,e)),oe[t]&&oe[t].forEach((function(t){de(t.name,t.config)})),ue(t),se[t]}function pe(t){var e;if(!(t=t&&t._locale&&t._locale._abbr?t._locale._abbr:t))return re;if(!r(t)){if(e=he(t))return e;t=[t]}return le(t)}function fe(t){var e=t._a;return e&&-2===f(t).overflow&&(e=e[kt]<0||11<e[kt]?kt:e[wt]<1||e[wt]>Lt(e[vt],e[kt])?wt:e[Tt]<0||24<e[Tt]||24===e[Tt]&&(0!==e[Ct]||0!==e[Et]||0!==e[St])?Tt:e[Ct]<0||59<e[Ct]?Ct:e[Et]<0||59<e[Et]?Et:e[St]<0||999<e[St]?St:-1,f(t)._overflowDayOfYear&&(e<vt||wt<e)&&(e=wt),f(t)._overflowWeeks&&-1===e&&(e=At),f(t)._overflowWeekday&&-1===e&&(e=Dt),f(t).overflow=e),t}var ge=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,me=/Z|[+-]\d\d(?::?\d\d)?/,be=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],_e=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],xe=/^\/?Date\((-?\d+)/i,ve=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,ke={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function we(t){var e,n,i,r,a,s,o=t._i,c=ge.exec(o)||ye.exec(o),l=(o=be.length,_e.length);if(c){for(f(t).iso=!0,e=0,n=o;e<n;e++)if(be[e][1].exec(c[1])){r=be[e][0],i=!1!==be[e][2];break}if(null==r)t._isValid=!1;else{if(c[3]){for(e=0,n=l;e<n;e++)if(_e[e][1].exec(c[3])){a=(c[2]||" ")+_e[e][0];break}if(null==a)return void(t._isValid=!1)}if(i||null==a){if(c[4]){if(!me.exec(c[4]))return void(t._isValid=!1);s="Z"}t._f=r+(a||"")+(s||""),Ae(t)}else t._isValid=!1}}else t._isValid=!1}function Te(t,e,n,i,r,a){return t=[function(t){return(t=parseInt(t,10))<=49?2e3+t:t<=999?1900+t:t}(t),Ot.indexOf(e),parseInt(n,10),parseInt(i,10),parseInt(r,10)],a&&t.push(parseInt(a,10)),t}function Ce(t){var e,n,i,r,a=ve.exec(t._i.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));a?(i=e=Te(a[4],a[3],a[2],a[5],a[6],a[7]),r=t,(n=a[1])&&Xt.indexOf(n)!==new Date(i[0],i[1],i[2]).getDay()?(f(r).weekdayMismatch=!0,r._isValid=!1):(t._a=e,t._tzm=(n=a[8],i=a[9],r=a[10],n?ke[n]:i?0:((n=parseInt(r,10))-(i=n%100))/100*60+i),t._d=zt.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),f(t).rfc2822=!0)):t._isValid=!1}function Ee(t,e,n){return null!=t?t:null!=e?e:n}function Se(t){var e,n,r,a,s,o,c,l,h,u,d,p=[];if(!t._d){for(r=t,a=new Date(i.now()),n=r._useUTC?[a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate()]:[a.getFullYear(),a.getMonth(),a.getDate()],t._w&&null==t._a[wt]&&null==t._a[kt]&&(null!=(a=(r=t)._w).GG||null!=a.W||null!=a.E?(l=1,h=4,s=Ee(a.GG,r._a[vt],Ht(Ne(),1,4).year),o=Ee(a.W,1),((c=Ee(a.E,1))<1||7<c)&&(u=!0)):(l=r._locale._week.dow,h=r._locale._week.doy,d=Ht(Ne(),l,h),s=Ee(a.gg,r._a[vt],d.year),o=Ee(a.w,d.week),null!=a.d?((c=a.d)<0||6<c)&&(u=!0):null!=a.e?(c=a.e+l,(a.e<0||6<a.e)&&(u=!0)):c=l),o<1||o>qt(s,l,h)?f(r)._overflowWeeks=!0:null!=u?f(r)._overflowWeekday=!0:(d=Wt(s,o,c,l,h),r._a[vt]=d.year,r._dayOfYear=d.dayOfYear)),null!=t._dayOfYear&&(a=Ee(t._a[vt],n[vt]),(t._dayOfYear>Pt(a)||0===t._dayOfYear)&&(f(t)._overflowDayOfYear=!0),u=zt(a,0,t._dayOfYear),t._a[kt]=u.getUTCMonth(),t._a[wt]=u.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=p[e]=n[e];for(;e<7;e++)t._a[e]=p[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Tt]&&0===t._a[Ct]&&0===t._a[Et]&&0===t._a[St]&&(t._nextDay=!0,t._a[Tt]=0),t._d=(t._useUTC?zt:Yt).apply(null,p),s=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Tt]=24),t._w&&void 0!==t._w.d&&t._w.d!==s&&(f(t).weekdayMismatch=!0)}}function Ae(t){if(t._f===i.ISO_8601)we(t);else if(t._f===i.RFC_2822)Ce(t);else{t._a=[],f(t).empty=!0;for(var e,n,r,a,o,c=""+t._i,l=c.length,h=0,u=$(t._f,t._locale).match(O)||[],d=u.length,p=0;p<d;p++)n=u[p],(e=(c.match(ft(n,t))||[])[0])&&(0<(r=c.substr(0,c.indexOf(e))).length&&f(t).unusedInput.push(r),c=c.slice(c.indexOf(e)+e.length),h+=e.length),I[n]?(e?f(t).empty=!1:f(t).unusedTokens.push(n),r=n,o=t,null!=(a=e)&&s(mt,r)&&mt[r](a,o._a,o,r)):t._strict&&!e&&f(t).unusedTokens.push(n);f(t).charsLeftOver=l-h,0<c.length&&f(t).unusedInput.push(c),t._a[Tt]<=12&&!0===f(t).bigHour&&0<t._a[Tt]&&(f(t).bigHour=void 0),f(t).parsedDateParts=t._a.slice(0),f(t).meridiem=t._meridiem,t._a[Tt]=function(t,e,n){return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((t=t.isPM(n))&&e<12&&(e+=12),e=t||12!==e?e:0):e}(t._locale,t._a[Tt],t._meridiem),null!==(l=f(t).era)&&(t._a[vt]=t._locale.erasConvertYear(l,t._a[vt])),Se(t),fe(t)}}function De(t){var e,n,s,o=t._i,p=t._f;return t._locale=t._locale||pe(t._l),null===o||void 0===p&&""===o?y({nullInput:!0}):("string"==typeof o&&(t._i=o=t._locale.preparse(o)),k(o)?new v(fe(o)):(h(o)?t._d=o:r(p)?function(t){var e,n,i,r,a,s,o=!1,c=t._f.length;if(0===c)return f(t).invalidFormat=!0,t._d=new Date(NaN);for(r=0;r<c;r++)a=0,s=!1,e=x({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[r],Ae(e),g(e)&&(s=!0),a=(a+=f(e).charsLeftOver)+10*f(e).unusedTokens.length,f(e).score=a,o?a<i&&(i=a,n=e):(null==i||a<i||s)&&(i=a,n=e,s&&(o=!0));d(t,n||e)}(t):p?Ae(t):c(p=(o=t)._i)?o._d=new Date(i.now()):h(p)?o._d=new Date(p.valueOf()):"string"==typeof p?(n=o,null!==(e=xe.exec(n._i))?n._d=new Date(+e[1]):(we(n),!1===n._isValid&&(delete n._isValid,Ce(n),!1===n._isValid&&(delete n._isValid,n._strict?n._isValid=!1:i.createFromInputFallback(n))))):r(p)?(o._a=u(p.slice(0),(function(t){return parseInt(t,10)})),Se(o)):a(p)?(e=o)._d||(s=void 0===(n=z(e._i)).day?n.date:n.day,e._a=u([n.year,n.month,s,n.hour,n.minute,n.second,n.millisecond],(function(t){return t&&parseInt(t,10)})),Se(e)):l(p)?o._d=new Date(p):i.createFromInputFallback(o),g(t)||(t._d=null),t))}function Le(t,e,n,i,s){var c={};return!0!==e&&!1!==e||(i=e,e=void 0),!0!==n&&!1!==n||(i=n,n=void 0),(a(t)&&o(t)||r(t)&&0===t.length)&&(t=void 0),c._isAMomentObject=!0,c._useUTC=c._isUTC=s,c._l=n,c._i=t,c._f=e,c._strict=i,(s=new v(fe(De(s=c))))._nextDay&&(s.add(1,"d"),s._nextDay=void 0),s}function Ne(t,e,n,i){return Le(t,e,n,i,!1)}function Oe(t,e){var n,i;if(!(e=1===e.length&&r(e[0])?e[0]:e).length)return Ne();for(n=e[0],i=1;i<e.length;++i)e[i].isValid()&&!e[i][t](n)||(n=e[i]);return n}i.createFromInputFallback=T("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",(function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))})),i.ISO_8601=function(){},i.RFC_2822=function(){},it=T("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Ne.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:y()})),rt=T("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Ne.apply(null,arguments);return this.isValid()&&t.isValid()?this<t?this:t:y()}));var Be=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Me(t){var e=(t=z(t)).year||0,n=t.quarter||0,i=t.month||0,r=t.week||t.isoWeek||0,a=t.day||0,o=t.hour||0,c=t.minute||0,l=t.second||0,h=t.millisecond||0;this._isValid=function(t){var e,n,i=!1,r=Be.length;for(e in t)if(s(t,e)&&(-1===xt.call(Be,e)||null!=t[e]&&isNaN(t[e])))return!1;for(n=0;n<r;++n)if(t[Be[n]]){if(i)return!1;parseFloat(t[Be[n]])!==V(t[Be[n]])&&(i=!0)}return!0}(t),this._milliseconds=+h+1e3*l+6e4*c+1e3*o*60*60,this._days=+a+7*r,this._months=+i+3*n+12*e,this._data={},this._locale=pe(),this._bubble()}function Ie(t){return t instanceof Me}function Fe(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function Re(t,e){F(t,0,0,(function(){var t=this.utcOffset(),n="+";return t<0&&(t=-t,n="-"),n+N(~~(t/60),2)+e+N(~~t%60,2)}))}Re("Z",":"),Re("ZZ",""),pt("Z",ut),pt("ZZ",ut),bt(["Z","ZZ"],(function(t,e,n){n._useUTC=!0,n._tzm=Pe(ut,t)}));var $e=/([\+\-]|\d\d)/gi;function Pe(t,e){return null===(e=(e||"").match(t))?null:0===(e=60*(t=((e[e.length-1]||[])+"").match($e)||["-",0,0])[1]+V(t[2]))?0:"+"===t[0]?e:-e}function je(t,e){var n;return e._isUTC?(e=e.clone(),n=(k(t)||h(t)?t:Ne(t)).valueOf()-e.valueOf(),e._d.setTime(e._d.valueOf()+n),i.updateOffset(e,!1),e):Ne(t).local()}function Ye(t){return-Math.round(t._d.getTimezoneOffset())}function ze(){return!!this.isValid()&&this._isUTC&&0===this._offset}i.updateOffset=function(){};var Ue=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,We=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function He(t,e){var n,i=t,r=null;return Ie(t)?i={ms:t._milliseconds,d:t._days,M:t._months}:l(t)||!isNaN(+t)?(i={},e?i[e]=+t:i.milliseconds=+t):(r=Ue.exec(t))?(n="-"===r[1]?-1:1,i={y:0,d:V(r[wt])*n,h:V(r[Tt])*n,m:V(r[Ct])*n,s:V(r[Et])*n,ms:V(Fe(1e3*r[St]))*n}):(r=We.exec(t))?(n="-"===r[1]?-1:1,i={y:qe(r[2],n),M:qe(r[3],n),w:qe(r[4],n),d:qe(r[5],n),h:qe(r[6],n),m:qe(r[7],n),s:qe(r[8],n)}):null==i?i={}:"object"==typeof i&&("from"in i||"to"in i)&&(e=function(t,e){var n;return t.isValid()&&e.isValid()?(e=je(e,t),t.isBefore(e)?n=Ve(t,e):((n=Ve(e,t)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}(Ne(i.from),Ne(i.to)),(i={}).ms=e.milliseconds,i.M=e.months),r=new Me(i),Ie(t)&&s(t,"_locale")&&(r._locale=t._locale),Ie(t)&&s(t,"_isValid")&&(r._isValid=t._isValid),r}function qe(t,e){return t=t&&parseFloat(t.replace(",",".")),(isNaN(t)?0:t)*e}function Ve(t,e){var n={};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function Ge(t,e){return function(n,i){var r;return null===i||isNaN(+i)||(E(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),r=n,n=i,i=r),Xe(this,He(n,i),t),this}}function Xe(t,e,n,r){var a=e._milliseconds,s=Fe(e._days);e=Fe(e._months),t.isValid()&&(r=null==r||r,e&&Ft(t,X(t,"Month")+e*n),s&&Z(t,"Date",X(t,"Date")+s*n),a&&t._d.setTime(t._d.valueOf()+a*n),r&&i.updateOffset(t,s||e))}function Ze(t){return"string"==typeof t||t instanceof String}function Qe(t){return k(t)||h(t)||Ze(t)||l(t)||function(t){var e=r(t),n=!1;return e&&(n=0===t.filter((function(e){return!l(e)&&Ze(t)})).length),e&&n}(t)||function(t){var e,n,i=a(t)&&!o(t),r=!1,c=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],l=c.length;for(e=0;e<l;e+=1)n=c[e],r=r||s(t,n);return i&&r}(t)||null==t}function Ke(t,e){if(t.date()<e.date())return-Ke(e,t);var n=12*(e.year()-t.year())+(e.month()-t.month()),i=t.clone().add(n,"months");return-(n+(e=e-i<0?(e-i)/(i-t.clone().add(n-1,"months")):(e-i)/(t.clone().add(1+n,"months")-i)))||0}function Je(t){return void 0===t?this._locale._abbr:(null!=(t=pe(t))&&(this._locale=t),this)}function tn(){return this._locale}He.fn=Me.prototype,He.invalid=function(){return He(NaN)},Nt=Ge(1,"add"),Gt=Ge(-1,"subtract"),i.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",i.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]",Zt=T("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(t){return void 0===t?this.localeData():this.locale(t)}));var en,nn=126227808e5;function rn(t,e){return(t%e+e)%e}function an(t,e,n){return t<100&&0<=t?new Date(t+400,e,n)-nn:new Date(t,e,n).valueOf()}function sn(t,e,n){return t<100&&0<=t?Date.UTC(t+400,e,n)-nn:Date.UTC(t,e,n)}function on(t,e){return e.erasAbbrRegex(t)}function cn(){for(var t=[],e=[],n=[],i=[],r=this.eras(),a=0,s=r.length;a<s;++a)e.push(gt(r[a].name)),t.push(gt(r[a].abbr)),n.push(gt(r[a].narrow)),i.push(gt(r[a].name)),i.push(gt(r[a].abbr)),i.push(gt(r[a].narrow));this._erasRegex=new RegExp("^("+i.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+e.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+t.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+n.join("|")+")","i")}function ln(t,e){F(0,[t,t.length],0,e)}function hn(t,e,n,i,r){var a;return null==t?Ht(this,i,r).year:(a=qt(t,i,r),function(t,e,n,i,r){return e=zt((t=Wt(t,e,n,i,r)).year,0,t.dayOfYear),this.year(e.getUTCFullYear()),this.month(e.getUTCMonth()),this.date(e.getUTCDate()),this}.call(this,t,e=a<e?a:e,n,i,r))}for(F("N",0,0,"eraAbbr"),F("NN",0,0,"eraAbbr"),F("NNN",0,0,"eraAbbr"),F("NNNN",0,0,"eraName"),F("NNNNN",0,0,"eraNarrow"),F("y",["y",1],"yo","eraYear"),F("y",["yy",2],0,"eraYear"),F("y",["yyy",3],0,"eraYear"),F("y",["yyyy",4],0,"eraYear"),pt("N",on),pt("NN",on),pt("NNN",on),pt("NNNN",(function(t,e){return e.erasNameRegex(t)})),pt("NNNNN",(function(t,e){return e.erasNarrowRegex(t)})),bt(["N","NN","NNN","NNNN","NNNNN"],(function(t,e,n,i){(i=n._locale.erasParse(t,i,n._strict))?f(n).era=i:f(n).invalidEra=t})),pt("y",ct),pt("yy",ct),pt("yyy",ct),pt("yyyy",ct),pt("yo",(function(t,e){return e._eraYearOrdinalRegex||ct})),bt(["y","yy","yyy","yyyy"],vt),bt(["yo"],(function(t,e,n,i){var r;n._locale._eraYearOrdinalRegex&&(r=t.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?e[vt]=n._locale.eraYearOrdinalParse(t,r):e[vt]=parseInt(t,10)})),F(0,["gg",2],0,(function(){return this.weekYear()%100})),F(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),ln("gggg","weekYear"),ln("ggggg","weekYear"),ln("GGGG","isoWeekYear"),ln("GGGGG","isoWeekYear"),j("weekYear","gg"),j("isoWeekYear","GG"),W("weekYear",1),W("isoWeekYear",1),pt("G",lt),pt("g",lt),pt("GG",nt,K),pt("gg",nt,K),pt("GGGG",st,tt),pt("gggg",st,tt),pt("GGGGG",ot,et),pt("ggggg",ot,et),_t(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,n,i){e[i.substr(0,2)]=V(t)})),_t(["gg","GG"],(function(t,e,n,r){e[r]=i.parseTwoDigitYear(t)})),F("Q",0,"Qo","quarter"),j("quarter","Q"),W("quarter",7),pt("Q",Q),bt("Q",(function(t,e){e[kt]=3*(V(t)-1)})),F("D",["DD",2],"Do","date"),j("date","D"),W("date",9),pt("D",nt),pt("DD",nt,K),pt("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),bt(["D","DD"],wt),bt("Do",(function(t,e){e[wt]=V(t.match(nt)[0])})),st=G("Date",!0),F("DDD",["DDDD",3],"DDDo","dayOfYear"),j("dayOfYear","DDD"),W("dayOfYear",4),pt("DDD",at),pt("DDDD",J),bt(["DDD","DDDD"],(function(t,e,n){n._dayOfYear=V(t)})),F("m",["mm",2],0,"minute"),j("minute","m"),W("minute",14),pt("m",nt),pt("mm",nt,K),bt(["m","mm"],Ct),tt=G("Minutes",!1),F("s",["ss",2],0,"second"),j("second","s"),W("second",15),pt("s",nt),pt("ss",nt,K),bt(["s","ss"],Et),ot=G("Seconds",!1),F("S",0,0,(function(){return~~(this.millisecond()/100)})),F(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),F(0,["SSS",3],0,"millisecond"),F(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),F(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),F(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),F(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),F(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),F(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),j("millisecond","ms"),W("millisecond",16),pt("S",at,Q),pt("SS",at,K),pt("SSS",at,J),en="SSSS";en.length<=9;en+="S")pt(en,ct);function un(t,e){e[St]=V(1e3*("0."+t))}for(en="S";en.length<=9;en+="S")bt(en,un);function dn(t){return t}function pn(t,e,n,i){var r=pe();return i=p().set(i,e),r[n](i,t)}function fn(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return pn(t,e,n,"month");for(var i=[],r=0;r<12;r++)i[r]=pn(t,r,n,"month");return i}function gn(t,e,n,i){"boolean"==typeof t?l(e)&&(n=e,e=void 0):(e=t,t=!1,l(n=e)&&(n=e,e=void 0)),e=e||"";var r,a=pe(),s=t?a._week.dow:0,o=[];if(null!=n)return pn(e,(n+s)%7,i,"day");for(r=0;r<7;r++)o[r]=pn(e,(r+s)%7,i,"day");return o}et=G("Milliseconds",!1),F("z",0,0,"zoneAbbr"),F("zz",0,0,"zoneName"),(Q=v.prototype).add=Nt,Q.calendar=function(t,e){1===arguments.length&&(arguments[0]?Qe(arguments[0])?(t=arguments[0],e=void 0):function(t){for(var e=a(t)&&!o(t),n=!1,i=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],r=0;r<i.length;r+=1)n=n||s(t,i[r]);return e&&n}(arguments[0])&&(e=arguments[0],t=void 0):e=t=void 0);var n=je(t=t||Ne(),this).startOf("day");return n=i.calendarFormat(this,n)||"sameElse",e=e&&(S(e[n])?e[n].call(this,t):e[n]),this.format(e||this.localeData().calendar(n,this,Ne(t)))},Q.clone=function(){return new v(this)},Q.diff=function(t,e,n){var i,r,a;if(!this.isValid())return NaN;if(!(i=je(t,this)).isValid())return NaN;switch(r=6e4*(i.utcOffset()-this.utcOffset()),e=Y(e)){case"year":a=Ke(this,i)/12;break;case"month":a=Ke(this,i);break;case"quarter":a=Ke(this,i)/3;break;case"second":a=(this-i)/1e3;break;case"minute":a=(this-i)/6e4;break;case"hour":a=(this-i)/36e5;break;case"day":a=(this-i-r)/864e5;break;case"week":a=(this-i-r)/6048e5;break;default:a=this-i}return n?a:q(a)},Q.endOf=function(t){var e,n;if(void 0===(t=Y(t))||"millisecond"===t||!this.isValid())return this;switch(n=this._isUTC?sn:an,t){case"year":e=n(this.year()+1,0,1)-1;break;case"quarter":e=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=n(this.year(),this.month()+1,1)-1;break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=36e5-rn(e+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":e=this._d.valueOf(),e+=6e4-rn(e,6e4)-1;break;case"second":e=this._d.valueOf(),e+=1e3-rn(e,1e3)-1}return this._d.setTime(e),i.updateOffset(this,!0),this},Q.format=function(t){return t=R(this,t=t||(this.isUtc()?i.defaultFormatUtc:i.defaultFormat)),this.localeData().postformat(t)},Q.from=function(t,e){return this.isValid()&&(k(t)&&t.isValid()||Ne(t).isValid())?He({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Q.fromNow=function(t){return this.from(Ne(),t)},Q.to=function(t,e){return this.isValid()&&(k(t)&&t.isValid()||Ne(t).isValid())?He({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Q.toNow=function(t){return this.to(Ne(),t)},Q.get=function(t){return S(this[t=Y(t)])?this[t]():this},Q.invalidAt=function(){return f(this).overflow},Q.isAfter=function(t,e){return t=k(t)?t:Ne(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=Y(e)||"millisecond")?this.valueOf()>t.valueOf():t.valueOf()<this.clone().startOf(e).valueOf())},Q.isBefore=function(t,e){return t=k(t)?t:Ne(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=Y(e)||"millisecond")?this.valueOf()<t.valueOf():this.clone().endOf(e).valueOf()<t.valueOf())},Q.isBetween=function(t,e,n,i){return t=k(t)?t:Ne(t),e=k(e)?e:Ne(e),!!(this.isValid()&&t.isValid()&&e.isValid())&&("("===(i=i||"()")[0]?this.isAfter(t,n):!this.isBefore(t,n))&&(")"===i[1]?this.isBefore(e,n):!this.isAfter(e,n))},Q.isSame=function(t,e){return t=k(t)?t:Ne(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=Y(e)||"millisecond")?this.valueOf()===t.valueOf():(t=t.valueOf(),this.clone().startOf(e).valueOf()<=t&&t<=this.clone().endOf(e).valueOf()))},Q.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},Q.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},Q.isValid=function(){return g(this)},Q.lang=Zt,Q.locale=Je,Q.localeData=tn,Q.max=rt,Q.min=it,Q.parsingFlags=function(){return d({},f(this))},Q.set=function(t,e){if("object"==typeof t)for(var n=function(t){var e,n=[];for(e in t)s(t,e)&&n.push({unit:e,priority:U[e]});return n.sort((function(t,e){return t.priority-e.priority})),n}(t=z(t)),i=n.length,r=0;r<i;r++)this[n[r].unit](t[n[r].unit]);else if(S(this[t=Y(t)]))return this[t](e);return this},Q.startOf=function(t){var e,n;if(void 0===(t=Y(t))||"millisecond"===t||!this.isValid())return this;switch(n=this._isUTC?sn:an,t){case"year":e=n(this.year(),0,1);break;case"quarter":e=n(this.year(),this.month()-this.month()%3,1);break;case"month":e=n(this.year(),this.month(),1);break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":e=n(this.year(),this.month(),this.date());break;case"hour":e=this._d.valueOf(),e-=rn(e+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":e=this._d.valueOf(),e-=rn(e,6e4);break;case"second":e=this._d.valueOf(),e-=rn(e,1e3)}return this._d.setTime(e),i.updateOffset(this,!0),this},Q.subtract=Gt,Q.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},Q.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},Q.toDate=function(){return new Date(this.valueOf())},Q.toISOString=function(t){if(!this.isValid())return null;var e=(t=!0!==t)?this.clone().utc():this;return e.year()<0||9999<e.year()?R(e,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):S(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",R(e,"Z")):R(e,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Q.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t,e="moment",n="";return this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",n="Z"),e="["+e+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(e+t+"-MM-DD[T]HH:mm:ss.SSS"+n+'[")]')},"undefined"!=typeof Symbol&&null!=Symbol.for&&(Q[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),Q.toJSON=function(){return this.isValid()?this.toISOString():null},Q.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Q.unix=function(){return Math.floor(this.valueOf()/1e3)},Q.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Q.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Q.eraName=function(){for(var t,e=this.localeData().eras(),n=0,i=e.length;n<i;++n){if(t=this.clone().startOf("day").valueOf(),e[n].since<=t&&t<=e[n].until)return e[n].name;if(e[n].until<=t&&t<=e[n].since)return e[n].name}return""},Q.eraNarrow=function(){for(var t,e=this.localeData().eras(),n=0,i=e.length;n<i;++n){if(t=this.clone().startOf("day").valueOf(),e[n].since<=t&&t<=e[n].until)return e[n].narrow;if(e[n].until<=t&&t<=e[n].since)return e[n].narrow}return""},Q.eraAbbr=function(){for(var t,e=this.localeData().eras(),n=0,i=e.length;n<i;++n){if(t=this.clone().startOf("day").valueOf(),e[n].since<=t&&t<=e[n].until)return e[n].abbr;if(e[n].until<=t&&t<=e[n].since)return e[n].abbr}return""},Q.eraYear=function(){for(var t,e,n=this.localeData().eras(),r=0,a=n.length;r<a;++r)if(t=n[r].since<=n[r].until?1:-1,e=this.clone().startOf("day").valueOf(),n[r].since<=e&&e<=n[r].until||n[r].until<=e&&e<=n[r].since)return(this.year()-i(n[r].since).year())*t+n[r].offset;return this.year()},Q.year=jt,Q.isLeapYear=function(){return H(this.year())},Q.weekYear=function(t){return hn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Q.isoWeekYear=function(t){return hn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Q.quarter=Q.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Q.month=Rt,Q.daysInMonth=function(){return Lt(this.year(),this.month())},Q.week=Q.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},Q.isoWeek=Q.isoWeeks=function(t){var e=Ht(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},Q.weeksInYear=function(){var t=this.localeData()._week;return qt(this.year(),t.dow,t.doy)},Q.weeksInWeekYear=function(){var t=this.localeData()._week;return qt(this.weekYear(),t.dow,t.doy)},Q.isoWeeksInYear=function(){return qt(this.year(),1,4)},Q.isoWeeksInISOWeekYear=function(){return qt(this.isoWeekYear(),1,4)},Q.date=st,Q.day=Q.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e,n,i=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(e=t,n=this.localeData(),t="string"!=typeof e?e:isNaN(e)?"number"==typeof(e=n.weekdaysParse(e))?e:null:parseInt(e,10),this.add(t-i,"d")):i},Q.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},Q.isoWeekday=function(t){return this.isValid()?null!=t?(e=t,n=this.localeData(),n="string"==typeof e?n.weekdaysParse(e)%7||7:isNaN(e)?null:e,this.day(this.day()%7?n:n-7)):this.day()||7:null!=t?this:NaN;var e,n},Q.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},Q.hour=Q.hours=dt,Q.minute=Q.minutes=tt,Q.second=Q.seconds=ot,Q.millisecond=Q.milliseconds=et,Q.utcOffset=function(t,e,n){var r,a=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null==t)return this._isUTC?a:Ye(this);if("string"==typeof t){if(null===(t=Pe(ut,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(r=Ye(this)),this._offset=t,this._isUTC=!0,null!=r&&this.add(r,"m"),a!==t&&(!e||this._changeInProgress?Xe(this,He(t-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,i.updateOffset(this,!0),this._changeInProgress=null)),this},Q.utc=function(t){return this.utcOffset(0,t)},Q.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ye(this),"m")),this},Q.parseZone=function(){var t;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(t=Pe(ht,this._i))?this.utcOffset(t):this.utcOffset(0,!0)),this},Q.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Ne(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Q.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Q.isLocal=function(){return!!this.isValid()&&!this._isUTC},Q.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Q.isUtc=ze,Q.isUTC=ze,Q.zoneAbbr=function(){return this._isUTC?"UTC":""},Q.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Q.dates=T("dates accessor is deprecated. Use date instead.",st),Q.months=T("months accessor is deprecated. Use month instead",Rt),Q.years=T("years accessor is deprecated. Use year instead",jt),Q.zone=T("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?(this.utcOffset(t="string"!=typeof t?-t:t,e),this):-this.utcOffset()})),Q.isDSTShifted=T("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!c(this._isDSTShifted))return this._isDSTShifted;var t,e={};return x(e,this),(e=De(e))._a?(t=(e._isUTC?p:Ne)(e._a),this._isDSTShifted=this.isValid()&&0<function(t,e,n){for(var i=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),a=0,s=0;s<i;s++)(n&&t[s]!==e[s]||!n&&V(t[s])!==V(e[s]))&&a++;return a+r}(e._a,t.toArray())):this._isDSTShifted=!1,this._isDSTShifted})),(K=D.prototype).calendar=function(t,e,n){return S(t=this._calendar[t]||this._calendar.sameElse)?t.call(e,n):t},K.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.match(O).map((function(t){return"MMMM"===t||"MM"===t||"DD"===t||"dddd"===t?t.slice(1):t})).join(""),this._longDateFormat[t])},K.invalidDate=function(){return this._invalidDate},K.ordinal=function(t){return this._ordinal.replace("%d",t)},K.preparse=dn,K.postformat=dn,K.relativeTime=function(t,e,n,i){var r=this._relativeTime[n];return S(r)?r(t,e,n,i):r.replace(/%d/i,t)},K.pastFuture=function(t,e){return S(t=this._relativeTime[0<t?"future":"past"])?t(e):t.replace(/%s/i,e)},K.set=function(t){var e,n;for(n in t)s(t,n)&&(S(e=t[n])?this[n]=e:this["_"+n]=e);this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},K.eras=function(t,e){for(var n,r=this._eras||pe("en")._eras,a=0,s=r.length;a<s;++a)switch("string"==typeof r[a].since&&(n=i(r[a].since).startOf("day"),r[a].since=n.valueOf()),typeof r[a].until){case"undefined":r[a].until=1/0;break;case"string":n=i(r[a].until).startOf("day").valueOf(),r[a].until=n.valueOf()}return r},K.erasParse=function(t,e,n){var i,r,a,s,o,c=this.eras();for(t=t.toUpperCase(),i=0,r=c.length;i<r;++i)if(a=c[i].name.toUpperCase(),s=c[i].abbr.toUpperCase(),o=c[i].narrow.toUpperCase(),n)switch(e){case"N":case"NN":case"NNN":if(s===t)return c[i];break;case"NNNN":if(a===t)return c[i];break;case"NNNNN":if(o===t)return c[i]}else if(0<=[a,s,o].indexOf(t))return c[i]},K.erasConvertYear=function(t,e){var n=t.since<=t.until?1:-1;return void 0===e?i(t.since).year():i(t.since).year()+(e-t.offset)*n},K.erasAbbrRegex=function(t){return s(this,"_erasAbbrRegex")||cn.call(this),t?this._erasAbbrRegex:this._erasRegex},K.erasNameRegex=function(t){return s(this,"_erasNameRegex")||cn.call(this),t?this._erasNameRegex:this._erasRegex},K.erasNarrowRegex=function(t){return s(this,"_erasNarrowRegex")||cn.call(this),t?this._erasNarrowRegex:this._erasRegex},K.months=function(t,e){return t?(r(this._months)?this._months:this._months[(this._months.isFormat||Bt).test(e)?"format":"standalone"])[t.month()]:r(this._months)?this._months:this._months.standalone},K.monthsShort=function(t,e){return t?(r(this._monthsShort)?this._monthsShort:this._monthsShort[Bt.test(e)?"format":"standalone"])[t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},K.monthsParse=function(t,e,n){var i,r;if(this._monthsParseExact)return function(t,e,n){var i,r,a;if(t=t.toLocaleLowerCase(),!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)a=p([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(a,"").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(a,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(r=xt.call(this._shortMonthsParse,t))?r:null:-1!==(r=xt.call(this._longMonthsParse,t))?r:null:"MMM"===e?-1!==(r=xt.call(this._shortMonthsParse,t))||-1!==(r=xt.call(this._longMonthsParse,t))?r:null:-1!==(r=xt.call(this._longMonthsParse,t))||-1!==(r=xt.call(this._shortMonthsParse,t))?r:null}.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(r=p([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},K.monthsRegex=function(t){return this._monthsParseExact?(s(this,"_monthsRegex")||$t.call(this),t?this._monthsStrictRegex:this._monthsRegex):(s(this,"_monthsRegex")||(this._monthsRegex=It),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},K.monthsShortRegex=function(t){return this._monthsParseExact?(s(this,"_monthsRegex")||$t.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(s(this,"_monthsShortRegex")||(this._monthsShortRegex=Mt),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},K.week=function(t){return Ht(t,this._week.dow,this._week.doy).week},K.firstDayOfYear=function(){return this._week.doy},K.firstDayOfWeek=function(){return this._week.dow},K.weekdays=function(t,e){return e=r(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"],!0===t?Vt(e,this._week.dow):t?e[t.day()]:e},K.weekdaysMin=function(t){return!0===t?Vt(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},K.weekdaysShort=function(t){return!0===t?Vt(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},K.weekdaysParse=function(t,e,n){var i,r;if(this._weekdaysParseExact)return function(t,e,n){var i,r,a;if(t=t.toLocaleLowerCase(),!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)a=p([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(r=xt.call(this._weekdaysParse,t))?r:null:"ddd"===e?-1!==(r=xt.call(this._shortWeekdaysParse,t))?r:null:-1!==(r=xt.call(this._minWeekdaysParse,t))?r:null:"dddd"===e?-1!==(r=xt.call(this._weekdaysParse,t))||-1!==(r=xt.call(this._shortWeekdaysParse,t))||-1!==(r=xt.call(this._minWeekdaysParse,t))?r:null:"ddd"===e?-1!==(r=xt.call(this._shortWeekdaysParse,t))||-1!==(r=xt.call(this._weekdaysParse,t))||-1!==(r=xt.call(this._minWeekdaysParse,t))?r:null:-1!==(r=xt.call(this._minWeekdaysParse,t))||-1!==(r=xt.call(this._weekdaysParse,t))||-1!==(r=xt.call(this._shortWeekdaysParse,t))?r:null}.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=p([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},K.weekdaysRegex=function(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||te.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(s(this,"_weekdaysRegex")||(this._weekdaysRegex=Qt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},K.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||te.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(s(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Kt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},K.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||te.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(s(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Jt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},K.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},K.meridiem=function(t,e,n){return 11<t?n?"pm":"PM":n?"am":"AM"},ue("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===V(t%100/10)?"th":1==e?"st":2==e?"nd":3==e?"rd":"th")}}),i.lang=T("moment.lang is deprecated. Use moment.locale instead.",ue),i.langData=T("moment.langData is deprecated. Use moment.localeData instead.",pe);var yn=Math.abs;function mn(t,e,n,i){return e=He(e,n),t._milliseconds+=i*e._milliseconds,t._days+=i*e._days,t._months+=i*e._months,t._bubble()}function bn(t){return t<0?Math.floor(t):Math.ceil(t)}function _n(t){return 4800*t/146097}function xn(t){return 146097*t/4800}function vn(t){return function(){return this.as(t)}}function kn(t){return function(){return this.isValid()?this._data[t]:NaN}}at=vn("ms"),J=vn("s"),Nt=vn("m"),rt=vn("h"),it=vn("d"),Gt=vn("w"),dt=vn("M"),tt=vn("Q"),ot=vn("y"),et=kn("milliseconds"),st=kn("seconds"),jt=kn("minutes"),K=kn("hours");var wn=kn("days"),Tn=kn("months"),Cn=kn("years"),En=Math.round,Sn={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function An(t,e,n,i){var r=He(t).abs(),a=En(r.as("s")),s=En(r.as("m")),o=En(r.as("h")),c=En(r.as("d")),l=En(r.as("M")),h=En(r.as("w"));return r=En(r.as("y")),a=(a<=n.ss?["s",a]:a<n.s&&["ss",a])||s<=1&&["m"]||s<n.m&&["mm",s]||o<=1&&["h"]||o<n.h&&["hh",o]||c<=1&&["d"]||c<n.d&&["dd",c],(a=(a=null!=n.w?a||h<=1&&["w"]||h<n.w&&["ww",h]:a)||l<=1&&["M"]||l<n.M&&["MM",l]||r<=1&&["y"]||["yy",r])[2]=e,a[3]=0<+t,a[4]=i,function(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}.apply(null,a)}var Dn=Math.abs;function Ln(t){return(0<t)-(t<0)||+t}function Nn(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i,r,a,s,o=Dn(this._milliseconds)/1e3,c=Dn(this._days),l=Dn(this._months),h=this.asSeconds();return h?(t=q(o/60),e=q(t/60),o%=60,t%=60,n=q(l/12),l%=12,i=o?o.toFixed(3).replace(/\.?0+$/,""):"",r=Ln(this._months)!==Ln(h)?"-":"",a=Ln(this._days)!==Ln(h)?"-":"",s=Ln(this._milliseconds)!==Ln(h)?"-":"",(h<0?"-":"")+"P"+(n?r+n+"Y":"")+(l?r+l+"M":"")+(c?a+c+"D":"")+(e||t||o?"T":"")+(e?s+e+"H":"")+(t?s+t+"M":"")+(o?s+i+"S":"")):"P0D"}var On=Me.prototype;return On.isValid=function(){return this._isValid},On.abs=function(){var t=this._data;return this._milliseconds=yn(this._milliseconds),this._days=yn(this._days),this._months=yn(this._months),t.milliseconds=yn(t.milliseconds),t.seconds=yn(t.seconds),t.minutes=yn(t.minutes),t.hours=yn(t.hours),t.months=yn(t.months),t.years=yn(t.years),this},On.add=function(t,e){return mn(this,t,e,1)},On.subtract=function(t,e){return mn(this,t,e,-1)},On.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=Y(t))||"quarter"===t||"year"===t)switch(e=this._days+i/864e5,n=this._months+_n(e),t){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(e=this._days+Math.round(xn(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},On.asMilliseconds=at,On.asSeconds=J,On.asMinutes=Nt,On.asHours=rt,On.asDays=it,On.asWeeks=Gt,On.asMonths=dt,On.asQuarters=tt,On.asYears=ot,On.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*V(this._months/12):NaN},On._bubble=function(){var t=this._milliseconds,e=this._days,n=this._months,i=this._data;return 0<=t&&0<=e&&0<=n||t<=0&&e<=0&&n<=0||(t+=864e5*bn(xn(n)+e),n=e=0),i.milliseconds=t%1e3,t=q(t/1e3),i.seconds=t%60,t=q(t/60),i.minutes=t%60,t=q(t/60),i.hours=t%24,e+=q(t/24),n+=t=q(_n(e)),e-=bn(xn(t)),t=q(n/12),n%=12,i.days=e,i.months=n,i.years=t,this},On.clone=function(){return He(this)},On.get=function(t){return t=Y(t),this.isValid()?this[t+"s"]():NaN},On.milliseconds=et,On.seconds=st,On.minutes=jt,On.hours=K,On.days=wn,On.weeks=function(){return q(this.days()/7)},On.months=Tn,On.years=Cn,On.humanize=function(t,e){if(!this.isValid())return this.localeData().invalidDate();var n=!1,i=Sn;return"object"==typeof t&&(e=t,t=!1),"boolean"==typeof t&&(n=t),"object"==typeof e&&(i=Object.assign({},Sn,e),null!=e.s&&null==e.ss&&(i.ss=e.s-1)),e=An(this,!n,i,t=this.localeData()),n&&(e=t.pastFuture(+this,e)),t.postformat(e)},On.toISOString=Nn,On.toString=Nn,On.toJSON=Nn,On.locale=Je,On.localeData=tn,On.toIsoString=T("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Nn),On.lang=Zt,F("X",0,0,"unix"),F("x",0,0,"valueOf"),pt("x",lt),pt("X",/[+-]?\d+(\.\d{1,3})?/),bt("X",(function(t,e,n){n._d=new Date(1e3*parseFloat(t))})),bt("x",(function(t,e,n){n._d=new Date(V(t))})),i.version="2.29.4",e=Ne,i.fn=Q,i.min=function(){return Oe("isBefore",[].slice.call(arguments,0))},i.max=function(){return Oe("isAfter",[].slice.call(arguments,0))},i.now=function(){return Date.now?Date.now():+new Date},i.utc=p,i.unix=function(t){return Ne(1e3*t)},i.months=function(t,e){return fn(t,e,"months")},i.isDate=h,i.locale=ue,i.invalid=y,i.duration=He,i.isMoment=k,i.weekdays=function(t,e,n){return gn(t,e,n,"weekdays")},i.parseZone=function(){return Ne.apply(null,arguments).parseZone()},i.localeData=pe,i.isDuration=Ie,i.monthsShort=function(t,e){return fn(t,e,"monthsShort")},i.weekdaysMin=function(t,e,n){return gn(t,e,n,"weekdaysMin")},i.defineLocale=de,i.updateLocale=function(t,e){var n,i;return null!=e?(i=ae,null!=se[t]&&null!=se[t].parentLocale?se[t].set(A(se[t]._config,e)):(e=A(i=null!=(n=he(t))?n._config:i,e),null==n&&(e.abbr=t),(i=new D(e)).parentLocale=se[t],se[t]=i),ue(t)):null!=se[t]&&(null!=se[t].parentLocale?(se[t]=se[t].parentLocale,t===ue()&&ue(t)):null!=se[t]&&delete se[t]),se[t]},i.locales=function(){return L(se)},i.weekdaysShort=function(t,e,n){return gn(t,e,n,"weekdaysShort")},i.normalizeUnits=Y,i.relativeTimeRounding=function(t){return void 0===t?En:"function"==typeof t&&(En=t,!0)},i.relativeTimeThreshold=function(t,e){return void 0!==Sn[t]&&(void 0===e?Sn[t]:(Sn[t]=e,"s"===t&&(Sn.ss=e-1),!0))},i.calendarFormat=function(t,e){return(t=t.diff(e,"days",!0))<-6?"sameElse":t<-1?"lastWeek":t<0?"lastDay":t<1?"sameDay":t<2?"nextDay":t<7?"nextWeek":"sameElse"},i.prototype=Q,i.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},i}()},87594:(t,e)=>{function n(t){let e,n=[];for(let i of t.split(",").map((t=>t.trim())))if(/^-?\d+$/.test(i))n.push(parseInt(i,10));else if(e=i.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[t,i,r,a]=e;if(i&&a){i=parseInt(i),a=parseInt(a);const t=i<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=t);for(let e=i;e!==a;e+=t)n.push(e)}}return n}e.default=n,t.exports=n}}]); \ No newline at end of file diff --git a/assets/js/8126.0a7b9cc2.js.LICENSE.txt b/assets/js/8126.c500ccde.js.LICENSE.txt similarity index 100% rename from assets/js/8126.0a7b9cc2.js.LICENSE.txt rename to assets/js/8126.c500ccde.js.LICENSE.txt diff --git a/assets/js/814f3328.4c5abdb2.js b/assets/js/814f3328.4c5abdb2.js new file mode 100644 index 000000000..e62ee2e43 --- /dev/null +++ b/assets/js/814f3328.4c5abdb2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2535],{45641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","permalink":"/41"},{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/40"},{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/39"},{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/38"},{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/37"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.a85c80fe.js b/assets/js/814f3328.a85c80fe.js deleted file mode 100644 index a5daf94f0..000000000 --- a/assets/js/814f3328.a85c80fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/40"},{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/39"},{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/38"},{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/37"},{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/36"}]}')}}]); \ No newline at end of file diff --git a/assets/js/86863b3d.6f6381e4.js b/assets/js/86863b3d.6f6381e4.js new file mode 100644 index 000000000..32c37d83d --- /dev/null +++ b/assets/js/86863b3d.6f6381e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3359],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var l=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,l,a=function(e,t){if(null==e)return{};var n,l,a={},r=Object.keys(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=l.createContext({}),s=function(e){var t=l.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):u(u({},t),e)),n},c=function(e){var t=s(e.components);return l.createElement(i.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||r;return n?l.createElement(f,u(u({ref:t},c),{},{components:n})):l.createElement(f,u({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,u=new Array(r);u[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,u[1]=o;for(var s=2;s<r;s++)u[s]=n[s];return l.createElement.apply(null,u)}return l.createElement.apply(null,n)}d.displayName="MDXCreateElement"},85162:(e,t,n)=>{n.d(t,{Z:()=>u});var l=n(67294),a=n(86010);const r="tabItem_Ymn6";function u(e){let{children:t,hidden:n,className:u}=e;return l.createElement("div",{role:"tabpanel",className:(0,a.Z)(r,u),hidden:n},t)}},74866:(e,t,n)=>{n.d(t,{Z:()=>w});var l=n(87462),a=n(67294),r=n(86010),u=n(12466),o=n(16550),i=n(91980),s=n(67392),c=n(50012);function p(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:l,default:a}}=e;return{value:t,label:n,attributes:l,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??p(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const l=(0,o.k6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,i._X)(r),(0,a.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:l}=e,r=d(e),[u,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=n.find((e=>e.default))??n[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,s]=f({queryString:n,groupId:l}),[p,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,c.Nk)(n);return[l,(0,a.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:l}),k=(()=>{const e=i??p;return m({value:e,tabValues:r})?e:null})();(0,a.useEffect)((()=>{k&&o(k)}),[k]);return{selectedValue:u,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),s(e),b(e)}),[s,b,r]),tabValues:r}}var k=n(72389);const g="tabList__CuJ",v="tabItem_LNqP";function h(e){let{className:t,block:n,selectedValue:o,selectValue:i,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,u.o5)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),l=s[n].value;l!==o&&(p(t),i(l))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:u}=e;return a.createElement("li",(0,l.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},u,{className:(0,r.Z)("tabs__item",v,u?.className,{"tabs__item--active":o===t})}),n??t)})))}function N(e){let{lazy:t,children:n,selectedValue:l}=e;if(t){const e=n.find((e=>e.props.value===l));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function y(e){const t=b(e);return a.createElement("div",{className:(0,r.Z)("tabs-container",g)},a.createElement(h,(0,l.Z)({},e,t)),a.createElement(N,(0,l.Z)({},e,t)))}function w(e){const t=(0,k.Z)();return a.createElement(y,(0,l.Z)({key:String(t)},e))}},35838:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var l=n(87462),a=(n(67294),n(3905)),r=n(74866),u=n(85162);const o={title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:5,tags:["Kotlin"]},i=void 0,s={permalink:"/5",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",source:"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",description:"nullable \ud0c0\uc785",date:"2023-01-16T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 16\uc77c",tags:[{label:"Kotlin",permalink:"/tags/kotlin"}],readingTime:4.225,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:"5",tags:["Kotlin"]},prevItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"},nextItem:{title:"JSR-310",permalink:"/4"}},c={authorsImageUrls:[]},p=[{value:"nullable \ud0c0\uc785",id:"nullable-\ud0c0\uc785",level:3},{value:"<code>?.</code> Safe Calls \uc5f0\uc0b0\uc790",id:"-safe-calls-\uc5f0\uc0b0\uc790",level:3},{value:"<code>?:</code> \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790",id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790",level:3},{value:"<code>!!</code> \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790",id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790",level:3},{value:"<code>as?</code> \uc548\uc804\ud55c \uce90\uc2a4\ud305",id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305",level:3},{value:"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac",id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],d={toc:p};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,l.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"nullable-\ud0c0\uc785"},"nullable \ud0c0\uc785"),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 ",(0,a.kt)("inlineCode",{parentName:"p"},"NullPointerException")," \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val number: Int?\n")),(0,a.kt)("p",null,"\ud0c0\uc785 \ub4a4\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4."),(0,a.kt)("h3",{id:"-safe-calls-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?.")," Safe Calls \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"?.")," \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public String repeat(String word) {\n if (word == null) {\n return null;\n }\n return word.repeat(2);\n}\n"))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"fun repeat(word: String?): String? {\n return word?.repeat(2)\n}\n")))),(0,a.kt)("h3",{id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?:")," \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4."),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public String stringSafe(String word) {\n if (word == null) {\n return "";\n }\n return word;\n}\n'))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'fun stringSafe(word: String?): String {\n return word ?: ""\n}\n')))),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"userRepository.findByName(name) ?: throw IllegalArgumentException()\n")),(0,a.kt)("h3",{id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"!!")," \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val length: Int = word!!.length\n")),(0,a.kt)("h3",{id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305"},(0,a.kt)("inlineCode",{parentName:"h3"},"as?")," \uc548\uc804\ud55c \uce90\uc2a4\ud305"),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"ClassCastException"),"\uc774 \ubc1c\uc0dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val value: Int? = something as? Int\n")),(0,a.kt)("h3",{id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac"},"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac"),(0,a.kt)("p",null,"List\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 ",(0,a.kt)("inlineCode",{parentName:"p"},"filterNotNull")," \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")\nval foods = foodsWithNull.filterNotNull()\n')),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001804588"},"Kotlin in Action")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001033129"},"Effective Kotlin Item 8")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/kotlin/null-safety"},"Comprehensive Guide to Null Safety in Kotlin")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://kotlinlang.org/docs/null-safety.html"},"Kotlin NullSafety"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/86863b3d.c9095d16.js b/assets/js/86863b3d.c9095d16.js deleted file mode 100644 index adb92d03b..000000000 --- a/assets/js/86863b3d.c9095d16.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3359],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var l=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,l,a=function(e,t){if(null==e)return{};var n,l,a={},r=Object.keys(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=l.createContext({}),s=function(e){var t=l.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):u(u({},t),e)),n},c=function(e){var t=s(e.components);return l.createElement(i.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||r;return n?l.createElement(f,u(u({ref:t},c),{},{components:n})):l.createElement(f,u({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,u=new Array(r);u[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,u[1]=o;for(var s=2;s<r;s++)u[s]=n[s];return l.createElement.apply(null,u)}return l.createElement.apply(null,n)}d.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>u});var l=n(7294),a=n(6010);const r="tabItem_Ymn6";function u(e){let{children:t,hidden:n,className:u}=e;return l.createElement("div",{role:"tabpanel",className:(0,a.Z)(r,u),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var l=n(7462),a=n(7294),r=n(6010),u=n(2466),o=n(6550),i=n(1980),s=n(7392),c=n(12);function p(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:l,default:a}}=e;return{value:t,label:n,attributes:l,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??p(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const l=(0,o.k6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,i._X)(r),(0,a.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:l}=e,r=d(e),[u,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=n.find((e=>e.default))??n[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,s]=f({queryString:n,groupId:l}),[p,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,c.Nk)(n);return[l,(0,a.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:l}),k=(()=>{const e=i??p;return m({value:e,tabValues:r})?e:null})();(0,a.useEffect)((()=>{k&&o(k)}),[k]);return{selectedValue:u,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),s(e),b(e)}),[s,b,r]),tabValues:r}}var k=n(2389);const g="tabList__CuJ",v="tabItem_LNqP";function h(e){let{className:t,block:n,selectedValue:o,selectValue:i,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,u.o5)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),l=s[n].value;l!==o&&(p(t),i(l))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:u}=e;return a.createElement("li",(0,l.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},u,{className:(0,r.Z)("tabs__item",v,u?.className,{"tabs__item--active":o===t})}),n??t)})))}function N(e){let{lazy:t,children:n,selectedValue:l}=e;if(t){const e=n.find((e=>e.props.value===l));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function y(e){const t=b(e);return a.createElement("div",{className:(0,r.Z)("tabs-container",g)},a.createElement(h,(0,l.Z)({},e,t)),a.createElement(N,(0,l.Z)({},e,t)))}function w(e){const t=(0,k.Z)();return a.createElement(y,(0,l.Z)({key:String(t)},e))}},5838:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var l=n(7462),a=(n(7294),n(3905)),r=n(4866),u=n(5162);const o={title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:5,tags:["Kotlin"]},i=void 0,s={permalink:"/5",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",source:"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",description:"nullable \ud0c0\uc785",date:"2023-01-16T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 16\uc77c",tags:[{label:"Kotlin",permalink:"/tags/kotlin"}],readingTime:4.225,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:"5",tags:["Kotlin"]},prevItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"},nextItem:{title:"JSR-310",permalink:"/4"}},c={authorsImageUrls:[]},p=[{value:"nullable \ud0c0\uc785",id:"nullable-\ud0c0\uc785",level:3},{value:"<code>?.</code> Safe Calls \uc5f0\uc0b0\uc790",id:"-safe-calls-\uc5f0\uc0b0\uc790",level:3},{value:"<code>?:</code> \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790",id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790",level:3},{value:"<code>!!</code> \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790",id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790",level:3},{value:"<code>as?</code> \uc548\uc804\ud55c \uce90\uc2a4\ud305",id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305",level:3},{value:"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac",id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],d={toc:p};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,l.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"nullable-\ud0c0\uc785"},"nullable \ud0c0\uc785"),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 ",(0,a.kt)("inlineCode",{parentName:"p"},"NullPointerException")," \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val number: Int?\n")),(0,a.kt)("p",null,"\ud0c0\uc785 \ub4a4\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4."),(0,a.kt)("h3",{id:"-safe-calls-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?.")," Safe Calls \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"?.")," \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public String repeat(String word) {\n if (word == null) {\n return null;\n }\n return word.repeat(2);\n}\n"))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"fun repeat(word: String?): String? {\n return word?.repeat(2)\n}\n")))),(0,a.kt)("h3",{id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?:")," \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4."),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public String stringSafe(String word) {\n if (word == null) {\n return "";\n }\n return word;\n}\n'))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'fun stringSafe(word: String?): String {\n return word ?: ""\n}\n')))),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"userRepository.findByName(name) ?: throw IllegalArgumentException()\n")),(0,a.kt)("h3",{id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"!!")," \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val length: Int = word!!.length\n")),(0,a.kt)("h3",{id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305"},(0,a.kt)("inlineCode",{parentName:"h3"},"as?")," \uc548\uc804\ud55c \uce90\uc2a4\ud305"),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"ClassCastException"),"\uc774 \ubc1c\uc0dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val value: Int? = something as? Int\n")),(0,a.kt)("h3",{id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac"},"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac"),(0,a.kt)("p",null,"List\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 ",(0,a.kt)("inlineCode",{parentName:"p"},"filterNotNull")," \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")\nval foods = foodsWithNull.filterNotNull()\n')),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001804588"},"Kotlin in Action")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001033129"},"Effective Kotlin Item 8")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/kotlin/null-safety"},"Comprehensive Guide to Null Safety in Kotlin")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://kotlinlang.org/docs/null-safety.html"},"Kotlin NullSafety"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/39ee6679.999a40fe.js b/assets/js/86b4da3d.705abb3b.js similarity index 72% rename from assets/js/39ee6679.999a40fe.js rename to assets/js/86b4da3d.705abb3b.js index a2b1a69a2..65e8fa37e 100644 --- a/assets/js/39ee6679.999a40fe.js +++ b/assets/js/86b4da3d.705abb3b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5717],{3636:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[952],{44149:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/86b4da3d.bf0a0d2a.js b/assets/js/86b4da3d.bf0a0d2a.js deleted file mode 100644 index e1f801a0c..000000000 --- a/assets/js/86b4da3d.bf0a0d2a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[952],{4149:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/871c1e5a.b7cf75b8.js b/assets/js/871c1e5a.b7cf75b8.js new file mode 100644 index 000000000..2785f4bea --- /dev/null +++ b/assets/js/871c1e5a.b7cf75b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5966],{71247:e=>{e.exports=JSON.parse('{"permalink":"/page/23","page":23,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/22","nextPage":"/page/24","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/871c1e5a.c8ef8df6.js b/assets/js/871c1e5a.c8ef8df6.js deleted file mode 100644 index 791ce4d83..000000000 --- a/assets/js/871c1e5a.c8ef8df6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5966],{1247:e=>{e.exports=JSON.parse('{"permalink":"/page/23","page":23,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/22","nextPage":"/page/24","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/87a22936.e115b74d.js b/assets/js/87a22936.e115b74d.js new file mode 100644 index 000000000..a3bd33d74 --- /dev/null +++ b/assets/js/87a22936.e115b74d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[418],{3905:(t,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>s});var r=n(67294);function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function p(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?l(Object(n),!0).forEach((function(e){a(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function o(t,e){if(null==t)return{};var n,r,a=function(t,e){if(null==t)return{};var n,r,a={},l=Object.keys(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||(a[n]=t[n]);return a}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(a[n]=t[n])}return a}var i=r.createContext({}),m=function(t){var e=r.useContext(i),n=e;return t&&(n="function"==typeof t?t(e):p(p({},e),t)),n},u=function(t){var e=m(t.components);return r.createElement(i.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},c=r.forwardRef((function(t,e){var n=t.components,a=t.mdxType,l=t.originalType,i=t.parentName,u=o(t,["components","mdxType","originalType","parentName"]),c=m(n),s=a,d=c["".concat(i,".").concat(s)]||c[s]||k[s]||l;return n?r.createElement(d,p(p({ref:e},u),{},{components:n})):r.createElement(d,p({ref:e},u))}));function s(t,e){var n=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var l=n.length,p=new Array(l);p[0]=c;var o={};for(var i in e)hasOwnProperty.call(e,i)&&(o[i]=e[i]);o.originalType=t,o.mdxType="string"==typeof t?t:a,p[1]=o;for(var m=2;m<l;m++)p[m]=n[m];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}c.displayName="MDXCreateElement"},1637:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var r=n(87462),a=(n(67294),n(3905));const l={title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:16,tags:["Test","Mock"]},p=void 0,o={permalink:"/16",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",source:"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",description:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",date:"2023-04-04T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 4\uc77c",tags:[{label:"Test",permalink:"/tags/test"},{label:"Mock",permalink:"/tags/mock"}],readingTime:4.52,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:"16",tags:["Test","Mock"]},prevItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"},nextItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"}},i={authorsImageUrls:[]},m=[{value:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780",level:3},{value:"\ub354\ubbf8(Dummy)",id:"\ub354\ubbf8dummy",level:3},{value:"\uc2a4\ud141(Stub)",id:"\uc2a4\ud141stub",level:3},{value:"\uc2a4\ud30c\uc774(Spy)",id:"\uc2a4\ud30c\uc774spy",level:3},{value:"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)",id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock",level:3},{value:"\uac00\uc9dc(Fake)",id:"\uac00\uc9dcfake",level:3},{value:"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84",id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:m};function k(t){let{components:e,...n}=t;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?"),(0,a.kt)("p",null,"\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Gerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4."),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870")),(0,a.kt)("mermaid",{value:"flowchart LR\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\n Fake --\x3e TestDouble"}),(0,a.kt)("h3",{id:"\ub354\ubbf8dummy"},"\ub354\ubbf8(Dummy)"),(0,a.kt)("p",null,"\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud141stub"},"\uc2a4\ud141(Stub)"),(0,a.kt)("p",null,"\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud30c\uc774spy"},"\uc2a4\ud30c\uc774(Spy)"),(0,a.kt)("p",null,"\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock"},"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)"),(0,a.kt)("p",null,"\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uac00\uc9dcfake"},"\uac00\uc9dc(Fake)"),(0,a.kt)("p",null,"DOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"DOC(depended-on component)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. ")),(0,a.kt)("h3",{id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84"},"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84"),(0,a.kt)("p",null,"\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. "),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"TestDouble"),(0,a.kt)("th",{parentName:"tr",align:null},"Mock"),(0,a.kt)("th",{parentName:"tr",align:null},"Stub"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\ud3ec\ud568 \uc720\ud615"),(0,a.kt)("td",{parentName:"tr",align:null},"\ubaa9, \uc2a4\ud30c\uc774"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc6a9\ub3c4"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc124\uba85"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc608\uc2dc"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc774\uba54\uc77c \ubc1c\uc1a1"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub370\uc774\ud130 \uac80\uc0c9")))),(0,a.kt)("admonition",{title:"SUT(system under test)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.martinfowler.com/bliki/TestDouble.html"},"\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://johngrib.github.io/wiki/test-terms/"},"\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"http://xunitpatterns.com/Test%20Double.html"},"Test Double, Gerard Meszaros")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/87a22936.ee0bd36a.js b/assets/js/87a22936.ee0bd36a.js deleted file mode 100644 index bfb4525fe..000000000 --- a/assets/js/87a22936.ee0bd36a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[418],{3905:(t,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>s});var r=n(7294);function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function p(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?l(Object(n),!0).forEach((function(e){a(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function o(t,e){if(null==t)return{};var n,r,a=function(t,e){if(null==t)return{};var n,r,a={},l=Object.keys(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||(a[n]=t[n]);return a}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(a[n]=t[n])}return a}var i=r.createContext({}),m=function(t){var e=r.useContext(i),n=e;return t&&(n="function"==typeof t?t(e):p(p({},e),t)),n},u=function(t){var e=m(t.components);return r.createElement(i.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},c=r.forwardRef((function(t,e){var n=t.components,a=t.mdxType,l=t.originalType,i=t.parentName,u=o(t,["components","mdxType","originalType","parentName"]),c=m(n),s=a,d=c["".concat(i,".").concat(s)]||c[s]||k[s]||l;return n?r.createElement(d,p(p({ref:e},u),{},{components:n})):r.createElement(d,p({ref:e},u))}));function s(t,e){var n=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var l=n.length,p=new Array(l);p[0]=c;var o={};for(var i in e)hasOwnProperty.call(e,i)&&(o[i]=e[i]);o.originalType=t,o.mdxType="string"==typeof t?t:a,p[1]=o;for(var m=2;m<l;m++)p[m]=n[m];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}c.displayName="MDXCreateElement"},1637:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var r=n(7462),a=(n(7294),n(3905));const l={title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:16,tags:["Test","Mock"]},p=void 0,o={permalink:"/16",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",source:"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",description:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",date:"2023-04-04T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 4\uc77c",tags:[{label:"Test",permalink:"/tags/test"},{label:"Mock",permalink:"/tags/mock"}],readingTime:4.52,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:"16",tags:["Test","Mock"]},prevItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"},nextItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"}},i={authorsImageUrls:[]},m=[{value:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780",level:3},{value:"\ub354\ubbf8(Dummy)",id:"\ub354\ubbf8dummy",level:3},{value:"\uc2a4\ud141(Stub)",id:"\uc2a4\ud141stub",level:3},{value:"\uc2a4\ud30c\uc774(Spy)",id:"\uc2a4\ud30c\uc774spy",level:3},{value:"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)",id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock",level:3},{value:"\uac00\uc9dc(Fake)",id:"\uac00\uc9dcfake",level:3},{value:"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84",id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:m};function k(t){let{components:e,...n}=t;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?"),(0,a.kt)("p",null,"\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Gerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4."),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870")),(0,a.kt)("mermaid",{value:"flowchart LR\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\n Fake --\x3e TestDouble"}),(0,a.kt)("h3",{id:"\ub354\ubbf8dummy"},"\ub354\ubbf8(Dummy)"),(0,a.kt)("p",null,"\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud141stub"},"\uc2a4\ud141(Stub)"),(0,a.kt)("p",null,"\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud30c\uc774spy"},"\uc2a4\ud30c\uc774(Spy)"),(0,a.kt)("p",null,"\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock"},"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)"),(0,a.kt)("p",null,"\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uac00\uc9dcfake"},"\uac00\uc9dc(Fake)"),(0,a.kt)("p",null,"DOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"DOC(depended-on component)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. ")),(0,a.kt)("h3",{id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84"},"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84"),(0,a.kt)("p",null,"\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. "),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"TestDouble"),(0,a.kt)("th",{parentName:"tr",align:null},"Mock"),(0,a.kt)("th",{parentName:"tr",align:null},"Stub"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\ud3ec\ud568 \uc720\ud615"),(0,a.kt)("td",{parentName:"tr",align:null},"\ubaa9, \uc2a4\ud30c\uc774"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc6a9\ub3c4"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc124\uba85"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc608\uc2dc"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc774\uba54\uc77c \ubc1c\uc1a1"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub370\uc774\ud130 \uac80\uc0c9")))),(0,a.kt)("admonition",{title:"SUT(system under test)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.martinfowler.com/bliki/TestDouble.html"},"\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://johngrib.github.io/wiki/test-terms/"},"\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"http://xunitpatterns.com/Test%20Double.html"},"Test Double, Gerard Meszaros")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/882ffb20.1fdacee7.js b/assets/js/882ffb20.1fdacee7.js new file mode 100644 index 000000000..f8458779b --- /dev/null +++ b/assets/js/882ffb20.1fdacee7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3910],{3905:(e,t,n)=>{n.d(t,{Zo:()=>k,kt:()=>u});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},k=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},s=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,k=i(e,["components","mdxType","originalType","parentName"]),s=c(n),u=r,d=s["".concat(p,".").concat(u)]||s[u]||m[u]||l;return n?a.createElement(d,o(o({ref:t},k),{},{components:n})):a.createElement(d,o({ref:t},k))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var c=2;c<l;c++)o[c]=n[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}s.displayName="MDXCreateElement"},91645:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const l={title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:19,tags:["DataBase","Lock","InnoDB"]},o=void 0,i={permalink:"/19",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-07T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 7\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"InnoDB",permalink:"/tags/inno-db"}],readingTime:5.805,hasTruncateMarker:!1,authors:[],frontMatter:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"19",tags:["DataBase","Lock","InnoDB"]},prevItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"},nextItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"}},p={authorsImageUrls:[]},c=[{value:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"Shared & Exclusive Locks",id:"shared--exclusive-locks",level:3},{value:"Intention Locks",id:"intention-locks",level:3},{value:"Record Locks",id:"record-locks",level:3},{value:"Gap Locks",id:"gap-locks",level:3},{value:"Next-Key Locks",id:"next-key-locks",level:3},{value:"AUTO-INC Locks",id:"auto-inc-locks",level:3},{value:"\uc7a0\uae08 \uc608\uc2dc",id:"\uc7a0\uae08-\uc608\uc2dc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],k={toc:c};function m(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},k,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("p",null,"\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd ")),(0,r.kt)("admonition",{title:"\ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"shared--exclusive-locks"},"Shared & Exclusive Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uacf5\uc720 \uc7a0\uae08(S, shared lock)")),(0,r.kt)("p",null,"\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)")," "),(0,r.kt)("p",null,"\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 FOR UPDATE;")),(0,r.kt)("h3",{id:"intention-locks"},"Intention Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)")),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)")," "),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"}," \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 ")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null},"X"),(0,r.kt)("th",{parentName:"tr",align:null},"IX"),(0,r.kt)("th",{parentName:"tr",align:null},"S"),(0,r.kt)("th",{parentName:"tr",align:null},"IS"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IX"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"S"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IS"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")))),(0,r.kt)("h3",{id:"record-locks"},"Record Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. "),(0,r.kt)("h3",{id:"gap-locks"},"Gap Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"next-key-locks"},"Next-Key Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("h3",{id:"auto-inc-locks"},"AUTO-INC Locks"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," \ubb38\uc7a5\uc5d0\uc11c ",(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc7a0\uae08-\uc608\uc2dc"},"\uc7a0\uae08 \uc608\uc2dc"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id = 10 for update;\n\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id > 100 for update;\n\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking"},"Optimistic and Pessimistic record locking, IBM"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/"},"MySQL Innodb Locks, cecil1018"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html"},"MySQL 8.0 InnoDB Locks, MySQL"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html"},"Locks Set by Different SQL Statements in InnoDB, MySQL")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/882ffb20.48c99e14.js b/assets/js/882ffb20.48c99e14.js deleted file mode 100644 index 3b7307a1e..000000000 --- a/assets/js/882ffb20.48c99e14.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3910],{3905:(e,t,n)=>{n.d(t,{Zo:()=>k,kt:()=>u});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},k=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},s=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,k=i(e,["components","mdxType","originalType","parentName"]),s=c(n),u=r,d=s["".concat(p,".").concat(u)]||s[u]||m[u]||l;return n?a.createElement(d,o(o({ref:t},k),{},{components:n})):a.createElement(d,o({ref:t},k))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var c=2;c<l;c++)o[c]=n[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}s.displayName="MDXCreateElement"},1645:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const l={title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:19,tags:["DataBase","Lock","InnoDB"]},o=void 0,i={permalink:"/19",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-07T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 7\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"InnoDB",permalink:"/tags/inno-db"}],readingTime:5.805,hasTruncateMarker:!1,authors:[],frontMatter:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"19",tags:["DataBase","Lock","InnoDB"]},prevItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"},nextItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"}},p={authorsImageUrls:[]},c=[{value:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"Shared & Exclusive Locks",id:"shared--exclusive-locks",level:3},{value:"Intention Locks",id:"intention-locks",level:3},{value:"Record Locks",id:"record-locks",level:3},{value:"Gap Locks",id:"gap-locks",level:3},{value:"Next-Key Locks",id:"next-key-locks",level:3},{value:"AUTO-INC Locks",id:"auto-inc-locks",level:3},{value:"\uc7a0\uae08 \uc608\uc2dc",id:"\uc7a0\uae08-\uc608\uc2dc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],k={toc:c};function m(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},k,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("p",null,"\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd ")),(0,r.kt)("admonition",{title:"\ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"shared--exclusive-locks"},"Shared & Exclusive Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uacf5\uc720 \uc7a0\uae08(S, shared lock)")),(0,r.kt)("p",null,"\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)")," "),(0,r.kt)("p",null,"\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 FOR UPDATE;")),(0,r.kt)("h3",{id:"intention-locks"},"Intention Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)")),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)")," "),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"}," \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 ")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null},"X"),(0,r.kt)("th",{parentName:"tr",align:null},"IX"),(0,r.kt)("th",{parentName:"tr",align:null},"S"),(0,r.kt)("th",{parentName:"tr",align:null},"IS"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IX"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"S"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IS"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")))),(0,r.kt)("h3",{id:"record-locks"},"Record Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. "),(0,r.kt)("h3",{id:"gap-locks"},"Gap Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"next-key-locks"},"Next-Key Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("h3",{id:"auto-inc-locks"},"AUTO-INC Locks"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," \ubb38\uc7a5\uc5d0\uc11c ",(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc7a0\uae08-\uc608\uc2dc"},"\uc7a0\uae08 \uc608\uc2dc"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id = 10 for update;\n\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id > 100 for update;\n\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking"},"Optimistic and Pessimistic record locking, IBM"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/"},"MySQL Innodb Locks, cecil1018"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html"},"MySQL 8.0 InnoDB Locks, MySQL"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html"},"Locks Set by Different SQL Statements in InnoDB, MySQL")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6945.94f4a660.js b/assets/js/8894.f447a143.js similarity index 55% rename from assets/js/6945.94f4a660.js rename to assets/js/8894.f447a143.js index 0b498c83f..049296e42 100644 --- a/assets/js/6945.94f4a660.js +++ b/assets/js/8894.f447a143.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6945],{6945:(e,s,b)=>{b.r(s)}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8894],{18894:(e,s,b)=>{b.r(s)}}]); \ No newline at end of file diff --git a/assets/js/899da081.3e16d702.js b/assets/js/899da081.3e16d702.js new file mode 100644 index 000000000..952af3c29 --- /dev/null +++ b/assets/js/899da081.3e16d702.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7528],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,f=m["".concat(i,".").concat(b)]||m[b]||s[b]||o;return r?n.createElement(f,p(p({ref:t},u),{},{components:r})):n.createElement(f,p({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c<o;c++)p[c]=r[c];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},36539:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:31,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/31",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",description:"\ub808\ubca8 \uc778\ud130\ubdf0",date:"2023-06-08T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 8\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.435,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:"31",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"},nextItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"}},i={authorsImageUrls:[]},c=[{value:"\ub808\ubca8 \uc778\ud130\ubdf0",id:"\ub808\ubca8-\uc778\ud130\ubdf0",level:3},{value:"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd",id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd",level:3},{value:"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158",id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158",level:3},{value:"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810",id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ub808\ubca8-\uc778\ud130\ubdf0"},"\ub808\ubca8 \uc778\ud130\ubdf0"),(0,a.kt)("p",null,"\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd"},"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd"),(0,a.kt)("p",null,"\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4."),(0,a.kt)("p",null,"\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d")),(0,a.kt)("h3",{id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158"},"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158"),(0,a.kt)("p",null,"PUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810"},"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810"),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n",'\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c "\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30',(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/899da081.defb4665.js b/assets/js/899da081.defb4665.js deleted file mode 100644 index 120d0c6d6..000000000 --- a/assets/js/899da081.defb4665.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7528],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,f=m["".concat(i,".").concat(b)]||m[b]||s[b]||o;return r?n.createElement(f,p(p({ref:t},u),{},{components:r})):n.createElement(f,p({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,p[1]=l;for(var c=2;c<o;c++)p[c]=r[c];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},6539:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:31,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,l={permalink:"/31",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",description:"\ub808\ubca8 \uc778\ud130\ubdf0",date:"2023-06-08T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 8\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.435,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",slug:"31",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"},nextItem:{title:"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0",permalink:"/30"}},i={authorsImageUrls:[]},c=[{value:"\ub808\ubca8 \uc778\ud130\ubdf0",id:"\ub808\ubca8-\uc778\ud130\ubdf0",level:3},{value:"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd",id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd",level:3},{value:"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158",id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158",level:3},{value:"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810",id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ub808\ubca8-\uc778\ud130\ubdf0"},"\ub808\ubca8 \uc778\ud130\ubdf0"),(0,a.kt)("p",null,"\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. "),(0,a.kt)("h3",{id:"api-\ubb38\uc11c-\ub3c4\uad6c-\uc120\ud0dd"},"API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd"),(0,a.kt)("p",null,"\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4."),(0,a.kt)("p",null,"\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d")),(0,a.kt)("h3",{id:"put\uacfc-patch--\ud1a0\ud070\uacfc-\uc138\uc158"},"PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158"),(0,a.kt)("p",null,"PUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uadf8-\uc678-\uac1c\uc120\ud560-\uc810"},"\uadf8 \uc678 \uac1c\uc120\ud560 \uc810"),(0,a.kt)("p",null,"\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n",'\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c "\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30',(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8b79a48d.a2f3ed79.js b/assets/js/8b79a48d.a2f3ed79.js new file mode 100644 index 000000000..662846701 --- /dev/null +++ b/assets/js/8b79a48d.a2f3ed79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9287],{59070:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/8b79a48d.df968c86.js b/assets/js/8b79a48d.df968c86.js deleted file mode 100644 index 7cabc483e..000000000 --- a/assets/js/8b79a48d.df968c86.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9287],{9070:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/8c6c0796.1dee3fc7.js b/assets/js/8c6c0796.1dee3fc7.js deleted file mode 100644 index 39927fa32..000000000 --- a/assets/js/8c6c0796.1dee3fc7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2816],{9123:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/8c6c0796.d37112d9.js b/assets/js/8c6c0796.d37112d9.js new file mode 100644 index 000000000..d261834f7 --- /dev/null +++ b/assets/js/8c6c0796.d37112d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2816],{59123:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/8d05b77c.55e18bb1.js b/assets/js/8d05b77c.55e18bb1.js new file mode 100644 index 000000000..4f0b9adf6 --- /dev/null +++ b/assets/js/8d05b77c.55e18bb1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4149],{22801:e=>{e.exports=JSON.parse('{"permalink":"/page/5","page":5,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/4","nextPage":"/page/6","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8d05b77c.f8f6cfb8.js b/assets/js/8d05b77c.f8f6cfb8.js deleted file mode 100644 index d9d0b1237..000000000 --- a/assets/js/8d05b77c.f8f6cfb8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4149],{2801:e=>{e.exports=JSON.parse('{"permalink":"/page/5","page":5,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/4","nextPage":"/page/6","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8d7288fe.5f0bac2d.js b/assets/js/8d7288fe.5f0bac2d.js new file mode 100644 index 000000000..79035b5e7 --- /dev/null +++ b/assets/js/8d7288fe.5f0bac2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4801],{71830:e=>{e.exports=JSON.parse('{"permalink":"/tags/class","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8d7288fe.86a4d820.js b/assets/js/8d7288fe.86a4d820.js deleted file mode 100644 index 7cf192748..000000000 --- a/assets/js/8d7288fe.86a4d820.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4801],{1830:e=>{e.exports=JSON.parse('{"permalink":"/tags/class","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8dc09bac.44e33d7b.js b/assets/js/8dc09bac.44e33d7b.js new file mode 100644 index 000000000..0b4904212 --- /dev/null +++ b/assets/js/8dc09bac.44e33d7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8338],{28881:e=>{e.exports=JSON.parse('{"permalink":"/tags/event","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8dc09bac.d7398399.js b/assets/js/8dc09bac.d7398399.js deleted file mode 100644 index 48325407b..000000000 --- a/assets/js/8dc09bac.d7398399.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8338],{8881:e=>{e.exports=JSON.parse('{"permalink":"/tags/event","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8e3d08a4.d29e5c5f.js b/assets/js/8e3d08a4.d29e5c5f.js new file mode 100644 index 000000000..7d0bd7ccd --- /dev/null +++ b/assets/js/8e3d08a4.d29e5c5f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2727],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),f=i,d=m["".concat(p,".").concat(f)]||m[f]||u[f]||o;return r?n.createElement(d,a(a({ref:t},s),{},{components:r})):n.createElement(d,a({ref:t},s))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:i,a[1]=l;for(var c=2;c<o;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},7553:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),i=(r(67294),r(3905));const o={title:"IntelliJ \uc124\uc815",slug:6,tags:["IntelliJ"]},a=void 0,l={permalink:"/6",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",source:"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",title:"IntelliJ \uc124\uc815",description:"Import \uc790\ub3d9 \uc801\uc6a9",date:"2023-01-30T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 30\uc77c",tags:[{label:"IntelliJ",permalink:"/tags/intelli-j"}],readingTime:.465,hasTruncateMarker:!1,authors:[],frontMatter:{title:"IntelliJ \uc124\uc815",slug:"6",tags:["IntelliJ"]},prevItem:{title:"Parameterized Tests",permalink:"/7"},nextItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"}},p={authorsImageUrls:[]},c=[{value:"Import \uc790\ub3d9 \uc801\uc6a9",id:"import-\uc790\ub3d9-\uc801\uc6a9",level:3},{value:"\uc800\uc7a5\uc2dc \ub3d9\uc791",id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791",level:3},{value:"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9",id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9",level:3}],s={toc:c};function u(e){let{components:t,...o}=e;return(0,i.kt)("wrapper",(0,n.Z)({},s,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"import-\uc790\ub3d9-\uc801\uc6a9"},"Import \uc790\ub3d9 \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"auto-import",src:r(42055).Z,width:"2558",height:"1656"})),(0,i.kt)("h3",{id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791"},"\uc800\uc7a5\uc2dc \ub3d9\uc791"),(0,i.kt)("p",null,"Prefrences > Tools > Actions on Save"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"actions-on-save",src:r(15782).Z,width:"2558",height:"1656"})),(0,i.kt)("p",null,"Reformat Code: Code Reformmating"),(0,i.kt)("p",null,"Optimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70"),(0,i.kt)("p",null,"Rearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c"),(0,i.kt)("h3",{id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9"},"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"final-modifier",src:r(80052).Z,width:"2558",height:"1656"})))}u.isMDXComponent=!0},15782:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/actions-on-save-6c1203027c28ff08919e045812c7d456.png"},42055:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/auto-import-3dbe46f0109af17296039d52d498225e.png"},80052:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/final-modifier-1dd2aea35979423a30869a7b0ebe501a.png"}}]); \ No newline at end of file diff --git a/assets/js/8e3d08a4.d81d9bf2.js b/assets/js/8e3d08a4.d81d9bf2.js deleted file mode 100644 index 7ee41f319..000000000 --- a/assets/js/8e3d08a4.d81d9bf2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2727],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),f=i,d=m["".concat(p,".").concat(f)]||m[f]||u[f]||o;return r?n.createElement(d,a(a({ref:t},s),{},{components:r})):n.createElement(d,a({ref:t},s))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:i,a[1]=l;for(var c=2;c<o;c++)a[c]=r[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},7553:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(7462),i=(r(7294),r(3905));const o={title:"IntelliJ \uc124\uc815",slug:6,tags:["IntelliJ"]},a=void 0,l={permalink:"/6",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",source:"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",title:"IntelliJ \uc124\uc815",description:"Import \uc790\ub3d9 \uc801\uc6a9",date:"2023-01-30T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 30\uc77c",tags:[{label:"IntelliJ",permalink:"/tags/intelli-j"}],readingTime:.465,hasTruncateMarker:!1,authors:[],frontMatter:{title:"IntelliJ \uc124\uc815",slug:"6",tags:["IntelliJ"]},prevItem:{title:"Parameterized Tests",permalink:"/7"},nextItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"}},p={authorsImageUrls:[]},c=[{value:"Import \uc790\ub3d9 \uc801\uc6a9",id:"import-\uc790\ub3d9-\uc801\uc6a9",level:3},{value:"\uc800\uc7a5\uc2dc \ub3d9\uc791",id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791",level:3},{value:"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9",id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9",level:3}],s={toc:c};function u(e){let{components:t,...o}=e;return(0,i.kt)("wrapper",(0,n.Z)({},s,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"import-\uc790\ub3d9-\uc801\uc6a9"},"Import \uc790\ub3d9 \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"auto-import",src:r(2055).Z,width:"2558",height:"1656"})),(0,i.kt)("h3",{id:"\uc800\uc7a5\uc2dc-\ub3d9\uc791"},"\uc800\uc7a5\uc2dc \ub3d9\uc791"),(0,i.kt)("p",null,"Prefrences > Tools > Actions on Save"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"actions-on-save",src:r(5782).Z,width:"2558",height:"1656"})),(0,i.kt)("p",null,"Reformat Code: Code Reformmating"),(0,i.kt)("p",null,"Optimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70"),(0,i.kt)("p",null,"Rearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c"),(0,i.kt)("h3",{id:"\uba54\uc18c\ub4dc-\ucd94\ucd9c-\ubcc0\uc218-\ucd94\ucd9c\uc2dc-final-\uc801\uc6a9"},"\uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9"),(0,i.kt)("p",null,"Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"final-modifier",src:r(52).Z,width:"2558",height:"1656"})))}u.isMDXComponent=!0},5782:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/actions-on-save-6c1203027c28ff08919e045812c7d456.png"},2055:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/auto-import-3dbe46f0109af17296039d52d498225e.png"},52:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/final-modifier-1dd2aea35979423a30869a7b0ebe501a.png"}}]); \ No newline at end of file diff --git a/assets/js/8e498bb6.88346cb4.js b/assets/js/8e498bb6.88346cb4.js deleted file mode 100644 index 4f22b4d68..000000000 --- a/assets/js/8e498bb6.88346cb4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1436],{257:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/8e498bb6.a1dd0c3d.js b/assets/js/8e498bb6.a1dd0c3d.js new file mode 100644 index 000000000..83cd35b0e --- /dev/null +++ b/assets/js/8e498bb6.a1dd0c3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1436],{50257:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/8e9056ec.9c533161.js b/assets/js/8e9056ec.9c533161.js deleted file mode 100644 index f9c55e3e4..000000000 --- a/assets/js/8e9056ec.9c533161.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[893],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),k=r,f=m["".concat(p,".").concat(k)]||m[k]||s[k]||l;return n?a.createElement(f,i(i({ref:t},u),{},{components:n})):a.createElement(f,i({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var c=2;c<l;c++)i[c]=n[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5346:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const l={title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:28,tags:["Pattern","Composite"]},i=void 0,o={permalink:"/28",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",source:"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",description:"\uc694\uad6c\uc0ac\ud56d",date:"2023-05-26T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 26\uc77c",tags:[{label:"Pattern",permalink:"/tags/pattern"},{label:"Composite",permalink:"/tags/composite"}],readingTime:4.74,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:"28",tags:["Pattern","Composite"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"},nextItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"}},p={authorsImageUrls:[]},c=[{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9",level:3},{value:"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30",id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30",level:3},{value:"\uc815\ucc45\uc758 \uc21c\uc11c",id:"\uc815\ucc45\uc758-\uc21c\uc11c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c",level:3},{value:"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84",id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45")),(0,r.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9"},"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9"),(0,r.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public interface FarePolicy {\n int calculate(Path path, Passenger passenger, int fare);\n}\n\npublic class BaseFarePolicy implements FarePolicy { ... }\npublic class DistanceFarePolicy implements FarePolicy { ... }\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite1",src:n(1769).Z,width:"1768",height:"554"})),(0,r.kt)("h3",{id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30"},"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30"),(0,r.kt)("p",null,"\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public class SubwayFarePolicy implements FarePolicy {\n\n private final List<FarePolicy> farePolicies;\n\n public SubwayFarePolicy(final List<FarePolicy> farePolicies) {\n this.farePolicies = farePolicies;\n }\n\n @Override\n public int calculate(final Path path, final Passenger passenger, final int fare) {\n int calculatedFare = fare;\n for (FarePolicy farePolicy : farePolicies) {\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\n }\n return calculatedFare;\n }\n}\n")),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite2",src:n(3417).Z,width:"2020",height:"954"})),(0,r.kt)("h3",{id:"\uc815\ucc45\uc758-\uc21c\uc11c"},"\uc815\ucc45\uc758 \uc21c\uc11c"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Configuration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"@Configuration\npublic class FareConfiguration {\n\n @Bean\n public FarePolicy farePolicy() {\n return new SubwayFarePolicy(List.of(\n new BaseFarePolicy(),\n new DistanceFarePolicy(),\n new AgeDiscountFarePolicy()\n ));\n }\n}\n")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite3",src:n(6388).Z,width:"1848",height:"482"})),(0,r.kt)("p",null,"GOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.")),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c"),(0,r.kt)("p",null,"Component"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc694\uae08 \uc815\ucc45(FarePolicy) ")),(0,r.kt)("p",null,"Leaf"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) ")),(0,r.kt)("p",null,"Composite"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) ")),(0,r.kt)("p",null,"Client"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c"),(0,r.kt)("p",null,"\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c",(0,r.kt)("br",{parentName:"p"}),"\n","Client \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c"),(0,r.kt)("h3",{id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84"},"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84"),(0,r.kt)("p",null,"\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134",(0,r.kt)("br",{parentName:"p"}),"\n","\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"))}s.isMDXComponent=!0},1769:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite1-6117733e5244b235d9405ba72afb53ed.png"},3417:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite2-ac487a832bf12267cc91996ea3a5b9c7.png"},6388:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite3-016bf41863692b1f738bc89011687166.png"}}]); \ No newline at end of file diff --git a/assets/js/8e9056ec.d8176654.js b/assets/js/8e9056ec.d8176654.js new file mode 100644 index 000000000..d8fdbc431 --- /dev/null +++ b/assets/js/8e9056ec.d8176654.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[893],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),k=r,f=m["".concat(p,".").concat(k)]||m[k]||s[k]||l;return n?a.createElement(f,i(i({ref:t},u),{},{components:n})):a.createElement(f,i({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var c=2;c<l;c++)i[c]=n[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},65346:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const l={title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:28,tags:["Pattern","Composite"]},i=void 0,o={permalink:"/28",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",source:"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",description:"\uc694\uad6c\uc0ac\ud56d",date:"2023-05-26T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 26\uc77c",tags:[{label:"Pattern",permalink:"/tags/pattern"},{label:"Composite",permalink:"/tags/composite"}],readingTime:4.74,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",slug:"28",tags:["Pattern","Composite"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604",permalink:"/29"},nextItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"}},p={authorsImageUrls:[]},c=[{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9",level:3},{value:"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30",id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30",level:3},{value:"\uc815\ucc45\uc758 \uc21c\uc11c",id:"\uc815\ucc45\uc758-\uc21c\uc11c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c",level:3},{value:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c",id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c",level:3},{value:"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84",id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45"),(0,r.kt)("li",{parentName:"ul"},"\uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45")),(0,r.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc0ac\uc6a9"},"\uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9"),(0,r.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public interface FarePolicy {\n int calculate(Path path, Passenger passenger, int fare);\n}\n\npublic class BaseFarePolicy implements FarePolicy { ... }\npublic class DistanceFarePolicy implements FarePolicy { ... }\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite1",src:n(71769).Z,width:"1768",height:"554"})),(0,r.kt)("h3",{id:"\ubaa8\ub4e0-\uc694\uae08-\uc815\ucc45\uc744-\ud3ec\ud568\ud558\ub294-\uc0c8\ub85c\uc6b4-\uc694\uae08-\uc815\ucc45-\ub9cc\ub4e4\uae30"},"\ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30"),(0,r.kt)("p",null,"\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public class SubwayFarePolicy implements FarePolicy {\n\n private final List<FarePolicy> farePolicies;\n\n public SubwayFarePolicy(final List<FarePolicy> farePolicies) {\n this.farePolicies = farePolicies;\n }\n\n @Override\n public int calculate(final Path path, final Passenger passenger, final int fare) {\n int calculatedFare = fare;\n for (FarePolicy farePolicy : farePolicies) {\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\n }\n return calculatedFare;\n }\n}\n")),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite2",src:n(43417).Z,width:"2020",height:"954"})),(0,r.kt)("h3",{id:"\uc815\ucc45\uc758-\uc21c\uc11c"},"\uc815\ucc45\uc758 \uc21c\uc11c"),(0,r.kt)("p",null,"\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Configuration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"@Configuration\npublic class FareConfiguration {\n\n @Bean\n public FarePolicy farePolicy() {\n return new SubwayFarePolicy(List.of(\n new BaseFarePolicy(),\n new DistanceFarePolicy(),\n new AgeDiscountFarePolicy()\n ));\n }\n}\n")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc774\ub780"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"composite3",src:n(36388).Z,width:"1848",height:"482"})),(0,r.kt)("p",null,"GOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.")),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uad6c\uc131\uc694\uc18c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c"),(0,r.kt)("p",null,"Component"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc694\uae08 \uc815\ucc45(FarePolicy) ")),(0,r.kt)("p",null,"Leaf"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) ")),(0,r.kt)("p",null,"Composite"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 "),(0,r.kt)("li",{parentName:"ul"},"ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) ")),(0,r.kt)("p",null,"Client"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8")),(0,r.kt)("h3",{id:"\ucef4\ud3ec\uc9c0\ud2b8-\ud328\ud134\uc758-\uc0ac\uc6a9\uacfc-\uc8fc\uc694-\ubaa9\ud45c"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c"),(0,r.kt)("p",null,"\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c",(0,r.kt)("br",{parentName:"p"}),"\n","Client \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c"),(0,r.kt)("h3",{id:"\ud328\ud134-\uc0ac\uc6a9\uc2dc-\uc8fc\uc758\ud574\uc57c\ud560-\ubd80\ubd84"},"\ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84"),(0,r.kt)("p",null,"\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!"),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134",(0,r.kt)("br",{parentName:"p"}),"\n","\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"))}s.isMDXComponent=!0},71769:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite1-6117733e5244b235d9405ba72afb53ed.png"},43417:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite2-ac487a832bf12267cc91996ea3a5b9c7.png"},36388:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/composite3-016bf41863692b1f738bc89011687166.png"}}]); \ No newline at end of file diff --git a/assets/js/92926477.2bd619e2.js b/assets/js/92926477.2bd619e2.js deleted file mode 100644 index a670f1e34..000000000 --- a/assets/js/92926477.2bd619e2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6080],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>u});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),i=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=i(e.components);return a.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,c=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),k=i(n),u=r,y=k["".concat(c,".").concat(u)]||k[u]||s[u]||l;return n?a.createElement(y,o(o({ref:t},m),{},{components:n})):a.createElement(y,o({ref:t},m))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=k;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,o[1]=p;for(var i=2;i<l;i++)o[i]=n[i];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}k.displayName="MDXCreateElement"},6133:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var a=n(7462),r=(n(7294),n(3905));const l={title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:18,tags:["DataBase","Lock","MySQL"]},o=void 0,p={permalink:"/18",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-06T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 6\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"MySQL",permalink:"/tags/my-sql"}],readingTime:4.405,hasTruncateMarker:!1,authors:[],frontMatter:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"18",tags:["DataBase","Lock","MySQL"]},prevItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"},nextItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"}},c={authorsImageUrls:[]},i=[{value:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"\uae00\ub85c\ubc8c \ub77d(Global lock)",id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock",level:3},{value:"\ud14c\uc774\ube14 \ub77d(Table lock)",id:"\ud14c\uc774\ube14-\ub77dtable-lock",level:3},{value:"\ub124\uc784\ub4dc \ub77d(Named lock)",id:"\ub124\uc784\ub4dc-\ub77dnamed-lock",level:3},{value:"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)",id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],m={toc:i};function s(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. "),(0,r.kt)("h3",{id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock"},"\uae00\ub85c\ubc8c \ub77d(Global lock)"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.")),(0,r.kt)("p",null,"\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- GLOBAL LOCK\nFLUSH TABLES WITH READ LOCK;\n-- UNLOCK\nUNLOCK TABLES;\n\n-- BACKUP LOCK\nLOCK INSTANCE FOR BACKUP;\n-- UNLOCK\nUNLOCK INSTANCE;\n")),(0,r.kt)("admonition",{title:"MyISAM",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"MySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.")),(0,r.kt)("h3",{id:"\ud14c\uc774\ube14-\ub77dtable-lock"},"\ud14c\uc774\ube14 \ub77d(Table lock)"),(0,r.kt)("p",null,"\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- TABLE LOCK\nLOCK TABLES table_name [ READ | WRITE ]\n\n-- UNLOCK\nUNLOCK TABLES;\n")),(0,r.kt)("h3",{id:"\ub124\uc784\ub4dc-\ub77dnamed-lock"},"\ub124\uc784\ub4dc \ub77d(Named lock)"),(0,r.kt)("p",null,"\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\nSELECT GET_LOCK('aGVyYg==', 1);\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\nSELECT IS_FREE_LOCK('aGVyYg==');\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\nSELECT RELEASE_LOCK('aGVyYg==');\n\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\n\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\nSELECT RELEASE_ALL_LOCKS();\n")),(0,r.kt)("h3",{id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock"},"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gywn.net/2013/12/mysql-user-level-lock/"},"MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 5.7 Reference"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 8.0 Reference")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/92926477.36896f2d.js b/assets/js/92926477.36896f2d.js new file mode 100644 index 000000000..35f3249a1 --- /dev/null +++ b/assets/js/92926477.36896f2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6080],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>u});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),i=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=i(e.components);return a.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,c=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),k=i(n),u=r,y=k["".concat(c,".").concat(u)]||k[u]||s[u]||l;return n?a.createElement(y,o(o({ref:t},m),{},{components:n})):a.createElement(y,o({ref:t},m))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=k;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,o[1]=p;for(var i=2;i<l;i++)o[i]=n[i];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}k.displayName="MDXCreateElement"},26133:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var a=n(87462),r=(n(67294),n(3905));const l={title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:18,tags:["DataBase","Lock","MySQL"]},o=void 0,p={permalink:"/18",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-06T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 6\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"MySQL",permalink:"/tags/my-sql"}],readingTime:4.405,hasTruncateMarker:!1,authors:[],frontMatter:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"18",tags:["DataBase","Lock","MySQL"]},prevItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"},nextItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"}},c={authorsImageUrls:[]},i=[{value:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"\uae00\ub85c\ubc8c \ub77d(Global lock)",id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock",level:3},{value:"\ud14c\uc774\ube14 \ub77d(Table lock)",id:"\ud14c\uc774\ube14-\ub77dtable-lock",level:3},{value:"\ub124\uc784\ub4dc \ub77d(Named lock)",id:"\ub124\uc784\ub4dc-\ub77dnamed-lock",level:3},{value:"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)",id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],m={toc:i};function s(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. "),(0,r.kt)("h3",{id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock"},"\uae00\ub85c\ubc8c \ub77d(Global lock)"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.")),(0,r.kt)("p",null,"\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- GLOBAL LOCK\nFLUSH TABLES WITH READ LOCK;\n-- UNLOCK\nUNLOCK TABLES;\n\n-- BACKUP LOCK\nLOCK INSTANCE FOR BACKUP;\n-- UNLOCK\nUNLOCK INSTANCE;\n")),(0,r.kt)("admonition",{title:"MyISAM",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"MySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.")),(0,r.kt)("h3",{id:"\ud14c\uc774\ube14-\ub77dtable-lock"},"\ud14c\uc774\ube14 \ub77d(Table lock)"),(0,r.kt)("p",null,"\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- TABLE LOCK\nLOCK TABLES table_name [ READ | WRITE ]\n\n-- UNLOCK\nUNLOCK TABLES;\n")),(0,r.kt)("h3",{id:"\ub124\uc784\ub4dc-\ub77dnamed-lock"},"\ub124\uc784\ub4dc \ub77d(Named lock)"),(0,r.kt)("p",null,"\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\nSELECT GET_LOCK('aGVyYg==', 1);\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\nSELECT IS_FREE_LOCK('aGVyYg==');\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\nSELECT RELEASE_LOCK('aGVyYg==');\n\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\n\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\nSELECT RELEASE_ALL_LOCKS();\n")),(0,r.kt)("h3",{id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock"},"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gywn.net/2013/12/mysql-user-level-lock/"},"MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 5.7 Reference"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 8.0 Reference")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/95c5de0b.95f0db72.js b/assets/js/95c5de0b.95f0db72.js new file mode 100644 index 000000000..975524938 --- /dev/null +++ b/assets/js/95c5de0b.95f0db72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5686],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=c(r),f=a,b=m["".concat(i,".").concat(f)]||m[f]||s[f]||o;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p.mdxType="string"==typeof e?e:a,l[1]=p;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},53444:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:32,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,p={permalink:"/32",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",description:"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",date:"2023-06-11T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 11\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:2.545,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:"32",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"Docusaurus",permalink:"/33"},nextItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"}},i={authorsImageUrls:[]},c=[{value:"\ud559\uc2b5",id:"\ud559\uc2b5",level:3},{value:"\uc218\uba74",id:"\uc218\uba74",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. "),(0,a.kt)("h3",{id:"\ud559\uc2b5"},"\ud559\uc2b5"),(0,a.kt)("p",null,"\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc218\uba74"},"\uc218\uba74"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/95c5de0b.ccd5c25d.js b/assets/js/95c5de0b.ccd5c25d.js deleted file mode 100644 index 75457b6dc..000000000 --- a/assets/js/95c5de0b.ccd5c25d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5686],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=c(r),f=a,b=m["".concat(i,".").concat(f)]||m[f]||s[f]||o;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p.mdxType="string"==typeof e?e:a,l[1]=p;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},3444:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:32,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,p={permalink:"/32",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",description:"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",date:"2023-06-11T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 11\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:2.545,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",slug:"32",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"Docusaurus",permalink:"/33"},nextItem:{title:"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0",permalink:"/31"}},i={authorsImageUrls:[]},c=[{value:"\ud559\uc2b5",id:"\ud559\uc2b5",level:3},{value:"\uc218\uba74",id:"\uc218\uba74",level:3},{value:"\ud611\uc5c5",id:"\ud611\uc5c5",level:3},{value:"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70",id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70",level:3}],u={toc:c};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. "),(0,a.kt)("h3",{id:"\ud559\uc2b5"},"\ud559\uc2b5"),(0,a.kt)("p",null,"\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc218\uba74"},"\uc218\uba74"),(0,a.kt)("p",null,"\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ud611\uc5c5"},"\ud611\uc5c5"),(0,a.kt)("p",null,"\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\ub808\ubca8-2\ub97c-\ub9c8\ubb34\ub9ac\ud558\uba70"},"\ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70"),(0,a.kt)("p",null,"\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/95dc859f.4c9f81cc.js b/assets/js/95dc859f.4c9f81cc.js new file mode 100644 index 000000000..34743a339 --- /dev/null +++ b/assets/js/95dc859f.4c9f81cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3307],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>d});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?l(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):l(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var u=r.createContext({}),c=function(e){var n=r.useContext(u),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(u.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=c(t),d=a,f=m["".concat(u,".").concat(d)]||m[d]||s[d]||l;return t?r.createElement(f,i(i({ref:n},p),{},{components:t})):r.createElement(f,i({ref:n},p))}));function d(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,i=new Array(l);i[0]=m;var o={};for(var u in n)hasOwnProperty.call(n,u)&&(o[u]=n[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,i[1]=o;for(var c=2;c<l;c++)i[c]=t[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},85162:(e,n,t)=>{t.d(n,{Z:()=>i});var r=t(67294),a=t(86010);const l="tabItem_Ymn6";function i(e){let{children:n,hidden:t,className:i}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l,i),hidden:t},n)}},74866:(e,n,t)=>{t.d(n,{Z:()=>w});var r=t(87462),a=t(67294),l=t(86010),i=t(12466),o=t(16550),u=t(91980),c=t(67392),p=t(50012);function s(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}function m(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??s(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[n,t])}function d(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const r=(0,o.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=m(e),[i,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!d({value:n,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l}))),[u,c]=f({queryString:t,groupId:r}),[s,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,p.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),S=(()=>{const e=u??s;return d({value:e,tabValues:l})?e:null})();(0,a.useEffect)((()=>{S&&o(S)}),[S]);return{selectedValue:i,selectValue:(0,a.useCallback)((e=>{if(!d({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,l]),tabValues:l}}var S=t(72389);const b="tabList__CuJ",y="tabItem_LNqP";function v(e){let{className:n,block:t,selectedValue:o,selectValue:u,tabValues:c}=e;const p=[],{blockElementScrollPositionUntilNextRender:s}=(0,i.o5)(),m=e=>{const n=e.currentTarget,t=p.indexOf(n),r=c[t].value;r!==o&&(s(n),u(r))},d=e=>{let n=null;switch(e.key){case"Enter":m(e);break;case"ArrowRight":{const t=p.indexOf(e.currentTarget)+1;n=p[t]??p[0];break}case"ArrowLeft":{const t=p.indexOf(e.currentTarget)-1;n=p[t]??p[p.length-1];break}}n?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":t},n)},c.map((e=>{let{value:n,label:t,attributes:i}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,key:n,ref:e=>p.push(e),onKeyDown:d,onClick:m},i,{className:(0,l.Z)("tabs__item",y,i?.className,{"tabs__item--active":o===n})}),t??n)})))}function E(e){let{lazy:n,children:t,selectedValue:r}=e;if(n){const e=t.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},t.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))))}function h(e){const n=g(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",b)},a.createElement(v,(0,r.Z)({},e,n)),a.createElement(E,(0,r.Z)({},e,n)))}function w(e){const n=(0,S.Z)();return a.createElement(h,(0,r.Z)({key:String(n)},e))}},86986:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=t(87462),a=(t(67294),t(3905)),l=t(74866),i=t(85162);const o={title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:14,tags:["JDBC","Java"]},u=void 0,c={permalink:"/14",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",description:"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",date:"2023-04-02T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 2\uc77c",tags:[{label:"JDBC",permalink:"/tags/jdbc"},{label:"Java",permalink:"/tags/java"}],readingTime:9.025,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:"14",tags:["JDBC","Java"]},prevItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"}},p={authorsImageUrls:[]},s=[{value:"\uae30\uc874 \ucf54\ub4dc",id:"\uae30\uc874-\ucf54\ub4dc",level:3},{value:"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70",id:"select-delete-\uc911\ubcf5-\uc81c\uac70",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c",level:3},{value:"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30",id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30",level:3},{value:"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30",id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30",level:3}],m={toc:s};function d(e){let{components:n,...t}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uae30\uc874-\ucf54\ub4dc"},"\uae30\uc874 \ucf54\ub4dc"),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"User",label:"User",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class User {\n private final int id;\n private final String name;\n\n public User(final int id, final String name) {\n this.id = id;\n this.name = name;\n }\n\n public int getId() {\n return id;\n }\n\n public String getName() {\n return name;\n }\n}\n"))),(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final ConnectionPool connectionPool;\n\n public UserDao(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void insert(final String name) {\n final Connection connection = connectionPool.getConnection();\n final String query = "INSERT INTO User (name) VALUES (?)";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setString(1, name);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public void delete(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "DELETE FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public User findById(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n final ResultSet resultSet = preparedStatement.executeQuery();\n if (resultSet.next()) {\n return new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n );\n }\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n return null;\n }\n\n public List<User> findAll() {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n final ResultSet resultSet = preparedStatement.executeQuery();\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n ));\n }\n return result;\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n'))),(0,a.kt)(i.Z,{value:"ConnectionPool",label:"ConnectionPool",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ConnectionPool {\n private static final String SERVER = "localhost:13306";\n private static final String DATABASE = "chess";\n private static final String OPTION = "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";\n private static final String URL = "jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION;\n private static final String USERNAME = "root";\n private static final String PASSWORD = "root";\n\n private final AtomicInteger index = new AtomicInteger();\n private final List<Connection> connections;\n\n public ConnectionPool(final int connectionCount) {\n connections = generateConnections(connectionCount);\n }\n\n private List<Connection> generateConnections(final int connectionCount) {\n return Stream.generate(this::generateConnection)\n .limit(connectionCount)\n .collect(toList());\n }\n\n private Connection generateConnection() {\n try {\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\n } catch (SQLException e) {\n throw new IllegalStateException("\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.");\n }\n }\n\n public Connection getConnection() {\n int currentIndex = index.getAndIncrement();\n return connections.get(currentIndex % connections.size());\n }\n}\n')))),(0,a.kt)("h3",{id:"select-delete-\uc911\ubcf5-\uc81c\uac70"},"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70"),(0,a.kt)("p",null,"\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 "),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n executeUpdate(query, name);\n}\n\npublic void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n executeUpdate(query, userId);\n}\n\nprivate void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758"),(0,a.kt)("p",null,"\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"\ucf5c\ubc31(Callback)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("mermaid",{parentName:"admonition",value:"flowchart LR\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31"})),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","executeQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper {\n User mapRow(final ResultSet resultSet) throws SQLException;\n}\n")),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public User findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return queryForSingleResult(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n }, userId);\n}\n\nprivate User queryForSingleResult(\n final String query,\n final RowMapper rowMapper,\n final Object... parameters\n) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return rowMapper.mapRow(resultSet);\n }\n return null;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return query(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n });\n}\n\nprivate List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30"},"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper<T> {\n T mapRow(final ResultSet resultSet) throws SQLException;\n}\n\nprivate <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\nprivate <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\n")),(0,a.kt)("h3",{id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30"},"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4."),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final RowMapper<User> rowMapper = resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n };\n private final JdbcTemplate jdbcTemplate;\n\n public UserDao(final JdbcTemplate jdbcTemplate) {\n this.jdbcTemplate = jdbcTemplate;\n }\n\n public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n jdbcTemplate.executeUpdate(query, name);\n }\n\n public void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n jdbcTemplate.executeUpdate(query, userId);\n }\n\n public Optional<User> findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\n }\n\n public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return jdbcTemplate.query(query, rowMapper);\n }\n}\n'))),(0,a.kt)(i.Z,{value:"JdbcTemplate",label:"JdbcTemplate",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class JdbcTemplate {\n private final ConnectionPool connectionPool;\n\n public JdbcTemplate(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public <T> Optional<T> queryForSingleResult(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return Optional.of(rowMapper.mapRow(resultSet));\n }\n return Optional.empty();\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n private ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters\n ) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n }\n\n public <T> List<T> query(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<T> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/95dc859f.c2500b74.js b/assets/js/95dc859f.c2500b74.js deleted file mode 100644 index b12a21766..000000000 --- a/assets/js/95dc859f.c2500b74.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3307],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>d});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?l(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):l(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var u=r.createContext({}),c=function(e){var n=r.useContext(u),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(u.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=c(t),d=a,f=m["".concat(u,".").concat(d)]||m[d]||s[d]||l;return t?r.createElement(f,i(i({ref:n},p),{},{components:t})):r.createElement(f,i({ref:n},p))}));function d(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,i=new Array(l);i[0]=m;var o={};for(var u in n)hasOwnProperty.call(n,u)&&(o[u]=n[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,i[1]=o;for(var c=2;c<l;c++)i[c]=t[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},5162:(e,n,t)=>{t.d(n,{Z:()=>i});var r=t(7294),a=t(6010);const l="tabItem_Ymn6";function i(e){let{children:n,hidden:t,className:i}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l,i),hidden:t},n)}},4866:(e,n,t)=>{t.d(n,{Z:()=>w});var r=t(7462),a=t(7294),l=t(6010),i=t(2466),o=t(6550),u=t(1980),c=t(7392),p=t(12);function s(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}function m(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??s(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[n,t])}function d(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const r=(0,o.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=m(e),[i,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!d({value:n,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l}))),[u,c]=f({queryString:t,groupId:r}),[s,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,p.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),S=(()=>{const e=u??s;return d({value:e,tabValues:l})?e:null})();(0,a.useEffect)((()=>{S&&o(S)}),[S]);return{selectedValue:i,selectValue:(0,a.useCallback)((e=>{if(!d({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,l]),tabValues:l}}var S=t(2389);const b="tabList__CuJ",y="tabItem_LNqP";function v(e){let{className:n,block:t,selectedValue:o,selectValue:u,tabValues:c}=e;const p=[],{blockElementScrollPositionUntilNextRender:s}=(0,i.o5)(),m=e=>{const n=e.currentTarget,t=p.indexOf(n),r=c[t].value;r!==o&&(s(n),u(r))},d=e=>{let n=null;switch(e.key){case"Enter":m(e);break;case"ArrowRight":{const t=p.indexOf(e.currentTarget)+1;n=p[t]??p[0];break}case"ArrowLeft":{const t=p.indexOf(e.currentTarget)-1;n=p[t]??p[p.length-1];break}}n?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":t},n)},c.map((e=>{let{value:n,label:t,attributes:i}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,key:n,ref:e=>p.push(e),onKeyDown:d,onClick:m},i,{className:(0,l.Z)("tabs__item",y,i?.className,{"tabs__item--active":o===n})}),t??n)})))}function E(e){let{lazy:n,children:t,selectedValue:r}=e;if(n){const e=t.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},t.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))))}function h(e){const n=g(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",b)},a.createElement(v,(0,r.Z)({},e,n)),a.createElement(E,(0,r.Z)({},e,n)))}function w(e){const n=(0,S.Z)();return a.createElement(h,(0,r.Z)({key:String(n)},e))}},5650:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=t(7462),a=(t(7294),t(3905)),l=t(4866),i=t(5162);const o={title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:14,tags:["JDBC","Java"]},u=void 0,c={permalink:"/14",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",description:"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",date:"2023-04-02T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 2\uc77c",tags:[{label:"JDBC",permalink:"/tags/jdbc"},{label:"Java",permalink:"/tags/java"}],readingTime:9.025,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:"14",tags:["JDBC","Java"]},prevItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"}},p={authorsImageUrls:[]},s=[{value:"\uae30\uc874 \ucf54\ub4dc",id:"\uae30\uc874-\ucf54\ub4dc",level:3},{value:"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70",id:"select-delete-\uc911\ubcf5-\uc81c\uac70",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c",level:3},{value:"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30",id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30",level:3},{value:"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30",id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30",level:3}],m={toc:s};function d(e){let{components:n,...t}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uae30\uc874-\ucf54\ub4dc"},"\uae30\uc874 \ucf54\ub4dc"),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"User",label:"User",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class User {\n private final int id;\n private final String name;\n\n public User(final int id, final String name) {\n this.id = id;\n this.name = name;\n }\n\n public int getId() {\n return id;\n }\n\n public String getName() {\n return name;\n }\n}\n"))),(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final ConnectionPool connectionPool;\n\n public UserDao(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void insert(final String name) {\n final Connection connection = connectionPool.getConnection();\n final String query = "INSERT INTO User (name) VALUES (?)";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setString(1, name);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public void delete(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "DELETE FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public User findById(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n final ResultSet resultSet = preparedStatement.executeQuery();\n if (resultSet.next()) {\n return new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n );\n }\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n return null;\n }\n\n public List<User> findAll() {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n final ResultSet resultSet = preparedStatement.executeQuery();\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n ));\n }\n return result;\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n'))),(0,a.kt)(i.Z,{value:"ConnectionPool",label:"ConnectionPool",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ConnectionPool {\n private static final String SERVER = "localhost:13306";\n private static final String DATABASE = "chess";\n private static final String OPTION = "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";\n private static final String URL = "jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION;\n private static final String USERNAME = "root";\n private static final String PASSWORD = "root";\n\n private final AtomicInteger index = new AtomicInteger();\n private final List<Connection> connections;\n\n public ConnectionPool(final int connectionCount) {\n connections = generateConnections(connectionCount);\n }\n\n private List<Connection> generateConnections(final int connectionCount) {\n return Stream.generate(this::generateConnection)\n .limit(connectionCount)\n .collect(toList());\n }\n\n private Connection generateConnection() {\n try {\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\n } catch (SQLException e) {\n throw new IllegalStateException("\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.");\n }\n }\n\n public Connection getConnection() {\n int currentIndex = index.getAndIncrement();\n return connections.get(currentIndex % connections.size());\n }\n}\n')))),(0,a.kt)("h3",{id:"select-delete-\uc911\ubcf5-\uc81c\uac70"},"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70"),(0,a.kt)("p",null,"\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 "),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n executeUpdate(query, name);\n}\n\npublic void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n executeUpdate(query, userId);\n}\n\nprivate void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758"),(0,a.kt)("p",null,"\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"\ucf5c\ubc31(Callback)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("mermaid",{parentName:"admonition",value:"flowchart LR\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31"})),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","executeQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper {\n User mapRow(final ResultSet resultSet) throws SQLException;\n}\n")),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public User findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return queryForSingleResult(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n }, userId);\n}\n\nprivate User queryForSingleResult(\n final String query,\n final RowMapper rowMapper,\n final Object... parameters\n) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return rowMapper.mapRow(resultSet);\n }\n return null;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return query(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n });\n}\n\nprivate List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30"},"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper<T> {\n T mapRow(final ResultSet resultSet) throws SQLException;\n}\n\nprivate <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\nprivate <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\n")),(0,a.kt)("h3",{id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30"},"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4."),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final RowMapper<User> rowMapper = resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n };\n private final JdbcTemplate jdbcTemplate;\n\n public UserDao(final JdbcTemplate jdbcTemplate) {\n this.jdbcTemplate = jdbcTemplate;\n }\n\n public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n jdbcTemplate.executeUpdate(query, name);\n }\n\n public void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n jdbcTemplate.executeUpdate(query, userId);\n }\n\n public Optional<User> findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\n }\n\n public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return jdbcTemplate.query(query, rowMapper);\n }\n}\n'))),(0,a.kt)(i.Z,{value:"JdbcTemplate",label:"JdbcTemplate",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class JdbcTemplate {\n private final ConnectionPool connectionPool;\n\n public JdbcTemplate(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public <T> Optional<T> queryForSingleResult(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return Optional.of(rowMapper.mapRow(resultSet));\n }\n return Optional.empty();\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n private ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters\n ) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n }\n\n public <T> List<T> query(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<T> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/96adae60.2023ae8b.js b/assets/js/96adae60.2023ae8b.js new file mode 100644 index 000000000..c4f082e21 --- /dev/null +++ b/assets/js/96adae60.2023ae8b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[172],{54217:e=>{e.exports=JSON.parse('{"permalink":"/page/19","page":19,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/18","nextPage":"/page/20","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/96adae60.ea4a0881.js b/assets/js/96adae60.ea4a0881.js deleted file mode 100644 index c0e844316..000000000 --- a/assets/js/96adae60.ea4a0881.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[172],{4217:e=>{e.exports=JSON.parse('{"permalink":"/page/19","page":19,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/18","nextPage":"/page/20","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/96b08d81.1ec58c7f.js b/assets/js/96b08d81.1ec58c7f.js deleted file mode 100644 index d53595890..000000000 --- a/assets/js/96b08d81.1ec58c7f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4435],{3905:(e,t,n)=>{n.d(t,{Zo:()=>k,kt:()=>u});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},k=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},s=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,k=i(e,["components","mdxType","originalType","parentName"]),s=c(n),u=r,d=s["".concat(p,".").concat(u)]||s[u]||m[u]||l;return n?a.createElement(d,o(o({ref:t},k),{},{components:n})):a.createElement(d,o({ref:t},k))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var c=2;c<l;c++)o[c]=n[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}s.displayName="MDXCreateElement"},1626:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const l={title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:19,tags:["DataBase","Lock","InnoDB"]},o=void 0,i={permalink:"/19",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-07T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 7\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"InnoDB",permalink:"/tags/inno-db"}],readingTime:5.805,hasTruncateMarker:!1,authors:[],frontMatter:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"19",tags:["DataBase","Lock","InnoDB"]},prevItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"},nextItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"}},p={authorsImageUrls:[]},c=[{value:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"Shared & Exclusive Locks",id:"shared--exclusive-locks",level:3},{value:"Intention Locks",id:"intention-locks",level:3},{value:"Record Locks",id:"record-locks",level:3},{value:"Gap Locks",id:"gap-locks",level:3},{value:"Next-Key Locks",id:"next-key-locks",level:3},{value:"AUTO-INC Locks",id:"auto-inc-locks",level:3},{value:"\uc7a0\uae08 \uc608\uc2dc",id:"\uc7a0\uae08-\uc608\uc2dc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],k={toc:c};function m(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},k,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("p",null,"\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd ")),(0,r.kt)("admonition",{title:"\ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"shared--exclusive-locks"},"Shared & Exclusive Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uacf5\uc720 \uc7a0\uae08(S, shared lock)")),(0,r.kt)("p",null,"\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)")," "),(0,r.kt)("p",null,"\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 FOR UPDATE;")),(0,r.kt)("h3",{id:"intention-locks"},"Intention Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)")),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)")," "),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"}," \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 ")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null},"X"),(0,r.kt)("th",{parentName:"tr",align:null},"IX"),(0,r.kt)("th",{parentName:"tr",align:null},"S"),(0,r.kt)("th",{parentName:"tr",align:null},"IS"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IX"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"S"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IS"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")))),(0,r.kt)("h3",{id:"record-locks"},"Record Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. "),(0,r.kt)("h3",{id:"gap-locks"},"Gap Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"next-key-locks"},"Next-Key Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("h3",{id:"auto-inc-locks"},"AUTO-INC Locks"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," \ubb38\uc7a5\uc5d0\uc11c ",(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc7a0\uae08-\uc608\uc2dc"},"\uc7a0\uae08 \uc608\uc2dc"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id = 10 for update;\n\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id > 100 for update;\n\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking"},"Optimistic and Pessimistic record locking, IBM"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/"},"MySQL Innodb Locks, cecil1018"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html"},"MySQL 8.0 InnoDB Locks, MySQL"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html"},"Locks Set by Different SQL Statements in InnoDB, MySQL")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/96b08d81.88e407aa.js b/assets/js/96b08d81.88e407aa.js new file mode 100644 index 000000000..4fcb1e152 --- /dev/null +++ b/assets/js/96b08d81.88e407aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4435],{3905:(e,t,n)=>{n.d(t,{Zo:()=>k,kt:()=>u});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},k=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},s=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,k=i(e,["components","mdxType","originalType","parentName"]),s=c(n),u=r,d=s["".concat(p,".").concat(u)]||s[u]||m[u]||l;return n?a.createElement(d,o(o({ref:t},k),{},{components:n})):a.createElement(d,o({ref:t},k))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var c=2;c<l;c++)o[c]=n[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}s.displayName="MDXCreateElement"},1626:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const l={title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:19,tags:["DataBase","Lock","InnoDB"]},o=void 0,i={permalink:"/19",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-07T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 7\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"InnoDB",permalink:"/tags/inno-db"}],readingTime:5.805,hasTruncateMarker:!1,authors:[],frontMatter:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"19",tags:["DataBase","Lock","InnoDB"]},prevItem:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",permalink:"/20"},nextItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"}},p={authorsImageUrls:[]},c=[{value:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"Shared & Exclusive Locks",id:"shared--exclusive-locks",level:3},{value:"Intention Locks",id:"intention-locks",level:3},{value:"Record Locks",id:"record-locks",level:3},{value:"Gap Locks",id:"gap-locks",level:3},{value:"Next-Key Locks",id:"next-key-locks",level:3},{value:"AUTO-INC Locks",id:"auto-inc-locks",level:3},{value:"\uc7a0\uae08 \uc608\uc2dc",id:"\uc7a0\uae08-\uc608\uc2dc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],k={toc:c};function m(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},k,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"innodb-\uc2a4\ud1a0\ub9ac\uc9c0-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("p",null,"\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd ")),(0,r.kt)("admonition",{title:"\ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"shared--exclusive-locks"},"Shared & Exclusive Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uacf5\uc720 \uc7a0\uae08(S, shared lock)")),(0,r.kt)("p",null,"\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)")," "),(0,r.kt)("p",null,"\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) ",(0,r.kt)("inlineCode",{parentName:"p"},"SELECT * FROM table_name WHERE id = 1 FOR UPDATE;")),(0,r.kt)("h3",{id:"intention-locks"},"Intention Locks"),(0,r.kt)("p",null,"InnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)")),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)")," "),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"}," \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 ")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null},"X"),(0,r.kt)("th",{parentName:"tr",align:null},"IX"),(0,r.kt)("th",{parentName:"tr",align:null},"S"),(0,r.kt)("th",{parentName:"tr",align:null},"IS"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IX"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"S"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"IS"),(0,r.kt)("td",{parentName:"tr",align:null},"Conflict"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible"),(0,r.kt)("td",{parentName:"tr",align:null},"Compatible")))),(0,r.kt)("h3",{id:"record-locks"},"Record Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. "),(0,r.kt)("h3",{id:"gap-locks"},"Gap Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"next-key-locks"},"Next-Key Locks"),(0,r.kt)("p",null,"\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("h3",{id:"auto-inc-locks"},"AUTO-INC Locks"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"INSERT"),"\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPLACE")," \ubb38\uc7a5\uc5d0\uc11c ",(0,r.kt)("inlineCode",{parentName:"p"},"AUTO_INCREMENT")," \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc7a0\uae08-\uc608\uc2dc"},"\uc7a0\uae08 \uc608\uc2dc"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id = 10 for update;\n\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id > 100 for update;\n\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking"},"Optimistic and Pessimistic record locking, IBM"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/"},"MySQL Innodb Locks, cecil1018"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html"},"MySQL 8.0 InnoDB Locks, MySQL"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html"},"Locks Set by Different SQL Statements in InnoDB, MySQL")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/981f7647.1bc01fec.js b/assets/js/981f7647.1bc01fec.js deleted file mode 100644 index d9f95c821..000000000 --- a/assets/js/981f7647.1bc01fec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2947],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(r),f=a,m=d["".concat(c,".").concat(f)]||d[f]||s[f]||o;return r?n.createElement(m,l(l({ref:t},u),{},{components:r})):n.createElement(m,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:a,l[1]=i;for(var p=2;p<o;p++)l[p]=r[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},1077:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={title:"\ud328\ud0a4\uc9c0",tags:["pacakge"]},l=void 0,i={unversionedId:"\uc124\uacc4/\ud328\ud0a4\uc9c0",id:"\uc124\uacc4/\ud328\ud0a4\uc9c0",title:"\ud328\ud0a4\uc9c0",description:"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0",source:"@site/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0.mdx",sourceDirName:"\uc124\uacc4",slug:"/\uc124\uacc4/\ud328\ud0a4\uc9c0",permalink:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0.mdx",tags:[{label:"pacakge",permalink:"/docs/tags/pacakge"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\ud328\ud0a4\uc9c0",tags:["pacakge"]},sidebar:"tutorialSidebar",previous:{title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",permalink:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c"},next:{title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",permalink:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8"}},c={},p=[{value:"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0",id:"\uacc4\uce35-\uae30\ubc18-\ud328\ud0a4\uc9c0",level:3},{value:"\uae30\ub2a5 \uae30\ubc18 \ud328\ud0a4\uc9c0",id:"\uae30\ub2a5-\uae30\ubc18-\ud328\ud0a4\uc9c0",level:3},{value:"\ud3ec\ud2b8\uc640 \uc5b4\ub311\ud130",id:"\ud3ec\ud2b8\uc640-\uc5b4\ub311\ud130",level:3},{value:"\ucef4\ud3ec\ub10c\ud2b8 \uae30\ubc18 \ud328\ud0a4\uc9c0",id:"\ucef4\ud3ec\ub10c\ud2b8-\uae30\ubc18-\ud328\ud0a4\uc9c0",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:p};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uacc4\uce35-\uae30\ubc18-\ud328\ud0a4\uc9c0"},"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0"),(0,a.kt)("p",null,"\uc804\ud1b5\uc801\uc778 \uc218\ud3c9 \uacc4\uce35\ud615 \uc544\ud0a4\ud14d\ucc98",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ud574\ub2f9 \ucf54\ub4dc\uac00 \ud558\ub294 \uc77c\uc5d0 \uae30\ubc18\ud574 \ucf54\ub4dc\ub97c \ubd84\ud560"),(0,a.kt)("h3",{id:"\uae30\ub2a5-\uae30\ubc18-\ud328\ud0a4\uc9c0"},"\uae30\ub2a5 \uae30\ubc18 \ud328\ud0a4\uc9c0"),(0,a.kt)("p",null,"\uc11c\ub85c \uc5f0\uad00\ub41c \uae30\ub2a5, \ub3c4\uba54\uc778 \uac1c\ub150, \ub610\ub294 Aggregate Root\uc5d0 \uae30\ubc18\ud558\uc5ec \uc218\uc9c1\uc758 \uc587\uc740 \uc870\uac01\uc73c\ub85c \ucf54\ub4dc\ub97c \ub098\ub204\ub294 \ubc29\uc2dd"),(0,a.kt)("h3",{id:"\ud3ec\ud2b8\uc640-\uc5b4\ub311\ud130"},"\ud3ec\ud2b8\uc640 \uc5b4\ub311\ud130"),(0,a.kt)("p",null,"\uc5c5\ubb34/\ub3c4\uba54\uc778\uc5d0 \ucd08\uc810\uc744 \ub454 \ucf54\ub4dc\uac00 \ud504\ub808\uc784\uc6cc\ud06c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac19\uc740 \uae30\uc220\uc801\uc778 \uc138\ubd80 \uad6c\ud604\uacfc \ub3c5\ub9bd\uc801\uc774\uba70 \ubd84\ub9ac\ub41c \uc544\ud0a4\ud14d\ucc98\ub97c \ub9cc\ub4e4\uae30 \uc704\ud574 \uc0ac\uc6a9"),(0,a.kt)("h3",{id:"\ucef4\ud3ec\ub10c\ud2b8-\uae30\ubc18-\ud328\ud0a4\uc9c0"},"\ucef4\ud3ec\ub10c\ud2b8 \uae30\ubc18 \ud328\ud0a4\uc9c0"),(0,a.kt)("p",null,"\ud070 \ub2e8\uc704\uc758 \ub2e8\uc77c \ucef4\ud3ec\ub10c\ud2b8\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \ucc45\uc784\uc744 \ud558\ub098\uc758 \uc790\ubc14 \ud328\ud0a4\uc9c0\ub85c \ubb36\ub294 \ub370 \uc8fc\uc548\uc810\uc744 \ub460",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub178\ub9ac\ud2f1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc798 \uc815\uc758\ud558\uba74 MSA\ub85c \uac00\uae30 \uc704\ud55c \ubc1c\ud310\uc73c\ub85c \uc0bc\uc744 \uc218 \uc788\uc74c"),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 p.316"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/981f7647.2ae342dd.js b/assets/js/981f7647.2ae342dd.js new file mode 100644 index 000000000..8b995525a --- /dev/null +++ b/assets/js/981f7647.2ae342dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2947],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(r),f=a,m=d["".concat(c,".").concat(f)]||d[f]||s[f]||o;return r?n.createElement(m,l(l({ref:t},u),{},{components:r})):n.createElement(m,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:a,l[1]=i;for(var p=2;p<o;p++)l[p]=r[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},51077:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"\ud328\ud0a4\uc9c0",tags:["pacakge"]},l=void 0,i={unversionedId:"\uc124\uacc4/\ud328\ud0a4\uc9c0",id:"\uc124\uacc4/\ud328\ud0a4\uc9c0",title:"\ud328\ud0a4\uc9c0",description:"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0",source:"@site/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0.mdx",sourceDirName:"\uc124\uacc4",slug:"/\uc124\uacc4/\ud328\ud0a4\uc9c0",permalink:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0.mdx",tags:[{label:"pacakge",permalink:"/docs/tags/pacakge"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\ud328\ud0a4\uc9c0",tags:["pacakge"]},sidebar:"tutorialSidebar",previous:{title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",permalink:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c"},next:{title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",permalink:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8"}},c={},p=[{value:"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0",id:"\uacc4\uce35-\uae30\ubc18-\ud328\ud0a4\uc9c0",level:3},{value:"\uae30\ub2a5 \uae30\ubc18 \ud328\ud0a4\uc9c0",id:"\uae30\ub2a5-\uae30\ubc18-\ud328\ud0a4\uc9c0",level:3},{value:"\ud3ec\ud2b8\uc640 \uc5b4\ub311\ud130",id:"\ud3ec\ud2b8\uc640-\uc5b4\ub311\ud130",level:3},{value:"\ucef4\ud3ec\ub10c\ud2b8 \uae30\ubc18 \ud328\ud0a4\uc9c0",id:"\ucef4\ud3ec\ub10c\ud2b8-\uae30\ubc18-\ud328\ud0a4\uc9c0",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:p};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uacc4\uce35-\uae30\ubc18-\ud328\ud0a4\uc9c0"},"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0"),(0,a.kt)("p",null,"\uc804\ud1b5\uc801\uc778 \uc218\ud3c9 \uacc4\uce35\ud615 \uc544\ud0a4\ud14d\ucc98",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\uc220\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ud574\ub2f9 \ucf54\ub4dc\uac00 \ud558\ub294 \uc77c\uc5d0 \uae30\ubc18\ud574 \ucf54\ub4dc\ub97c \ubd84\ud560"),(0,a.kt)("h3",{id:"\uae30\ub2a5-\uae30\ubc18-\ud328\ud0a4\uc9c0"},"\uae30\ub2a5 \uae30\ubc18 \ud328\ud0a4\uc9c0"),(0,a.kt)("p",null,"\uc11c\ub85c \uc5f0\uad00\ub41c \uae30\ub2a5, \ub3c4\uba54\uc778 \uac1c\ub150, \ub610\ub294 Aggregate Root\uc5d0 \uae30\ubc18\ud558\uc5ec \uc218\uc9c1\uc758 \uc587\uc740 \uc870\uac01\uc73c\ub85c \ucf54\ub4dc\ub97c \ub098\ub204\ub294 \ubc29\uc2dd"),(0,a.kt)("h3",{id:"\ud3ec\ud2b8\uc640-\uc5b4\ub311\ud130"},"\ud3ec\ud2b8\uc640 \uc5b4\ub311\ud130"),(0,a.kt)("p",null,"\uc5c5\ubb34/\ub3c4\uba54\uc778\uc5d0 \ucd08\uc810\uc744 \ub454 \ucf54\ub4dc\uac00 \ud504\ub808\uc784\uc6cc\ud06c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac19\uc740 \uae30\uc220\uc801\uc778 \uc138\ubd80 \uad6c\ud604\uacfc \ub3c5\ub9bd\uc801\uc774\uba70 \ubd84\ub9ac\ub41c \uc544\ud0a4\ud14d\ucc98\ub97c \ub9cc\ub4e4\uae30 \uc704\ud574 \uc0ac\uc6a9"),(0,a.kt)("h3",{id:"\ucef4\ud3ec\ub10c\ud2b8-\uae30\ubc18-\ud328\ud0a4\uc9c0"},"\ucef4\ud3ec\ub10c\ud2b8 \uae30\ubc18 \ud328\ud0a4\uc9c0"),(0,a.kt)("p",null,"\ud070 \ub2e8\uc704\uc758 \ub2e8\uc77c \ucef4\ud3ec\ub10c\ud2b8\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \ucc45\uc784\uc744 \ud558\ub098\uc758 \uc790\ubc14 \ud328\ud0a4\uc9c0\ub85c \ubb36\ub294 \ub370 \uc8fc\uc548\uc810\uc744 \ub460",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub178\ub9ac\ud2f1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc798 \uc815\uc758\ud558\uba74 MSA\ub85c \uac00\uae30 \uc704\ud55c \ubc1c\ud310\uc73c\ub85c \uc0bc\uc744 \uc218 \uc788\uc74c"),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 p.316"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9a859616.9498815f.js b/assets/js/9a859616.9498815f.js deleted file mode 100644 index 8ed3277a1..000000000 --- a/assets/js/9a859616.9498815f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8492],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>u});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),i=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=i(e.components);return a.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,c=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),k=i(n),u=r,y=k["".concat(c,".").concat(u)]||k[u]||s[u]||l;return n?a.createElement(y,o(o({ref:t},m),{},{components:n})):a.createElement(y,o({ref:t},m))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=k;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,o[1]=p;for(var i=2;i<l;i++)o[i]=n[i];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}k.displayName="MDXCreateElement"},4553:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var a=n(7462),r=(n(7294),n(3905));const l={title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:18,tags:["DataBase","Lock","MySQL"]},o=void 0,p={permalink:"/18",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-06T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 6\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"MySQL",permalink:"/tags/my-sql"}],readingTime:4.405,hasTruncateMarker:!1,authors:[],frontMatter:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"18",tags:["DataBase","Lock","MySQL"]},prevItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"},nextItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"}},c={authorsImageUrls:[]},i=[{value:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"\uae00\ub85c\ubc8c \ub77d(Global lock)",id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock",level:3},{value:"\ud14c\uc774\ube14 \ub77d(Table lock)",id:"\ud14c\uc774\ube14-\ub77dtable-lock",level:3},{value:"\ub124\uc784\ub4dc \ub77d(Named lock)",id:"\ub124\uc784\ub4dc-\ub77dnamed-lock",level:3},{value:"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)",id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],m={toc:i};function s(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. "),(0,r.kt)("h3",{id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock"},"\uae00\ub85c\ubc8c \ub77d(Global lock)"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.")),(0,r.kt)("p",null,"\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- GLOBAL LOCK\nFLUSH TABLES WITH READ LOCK;\n-- UNLOCK\nUNLOCK TABLES;\n\n-- BACKUP LOCK\nLOCK INSTANCE FOR BACKUP;\n-- UNLOCK\nUNLOCK INSTANCE;\n")),(0,r.kt)("admonition",{title:"MyISAM",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"MySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.")),(0,r.kt)("h3",{id:"\ud14c\uc774\ube14-\ub77dtable-lock"},"\ud14c\uc774\ube14 \ub77d(Table lock)"),(0,r.kt)("p",null,"\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- TABLE LOCK\nLOCK TABLES table_name [ READ | WRITE ]\n\n-- UNLOCK\nUNLOCK TABLES;\n")),(0,r.kt)("h3",{id:"\ub124\uc784\ub4dc-\ub77dnamed-lock"},"\ub124\uc784\ub4dc \ub77d(Named lock)"),(0,r.kt)("p",null,"\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\nSELECT GET_LOCK('aGVyYg==', 1);\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\nSELECT IS_FREE_LOCK('aGVyYg==');\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\nSELECT RELEASE_LOCK('aGVyYg==');\n\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\n\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\nSELECT RELEASE_ALL_LOCKS();\n")),(0,r.kt)("h3",{id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock"},"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gywn.net/2013/12/mysql-user-level-lock/"},"MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 5.7 Reference"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 8.0 Reference")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9a859616.b4d8dc24.js b/assets/js/9a859616.b4d8dc24.js new file mode 100644 index 000000000..00b342621 --- /dev/null +++ b/assets/js/9a859616.b4d8dc24.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8492],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>u});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),i=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=i(e.components);return a.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,c=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),k=i(n),u=r,y=k["".concat(c,".").concat(u)]||k[u]||s[u]||l;return n?a.createElement(y,o(o({ref:t},m),{},{components:n})):a.createElement(y,o({ref:t},m))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=k;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,o[1]=p;for(var i=2;i<l;i++)o[i]=n[i];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}k.displayName="MDXCreateElement"},14553:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var a=n(87462),r=(n(67294),n(3905));const l={title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:18,tags:["DataBase","Lock","MySQL"]},o=void 0,p={permalink:"/18",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",source:"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",description:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",date:"2023-04-06T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 6\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Lock",permalink:"/tags/lock"},{label:"MySQL",permalink:"/tags/my-sql"}],readingTime:4.405,hasTruncateMarker:!1,authors:[],frontMatter:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",slug:"18",tags:["DataBase","Lock","MySQL"]},prevItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"},nextItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"}},c={authorsImageUrls:[]},i=[{value:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08",level:2},{value:"\uae00\ub85c\ubc8c \ub77d(Global lock)",id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock",level:3},{value:"\ud14c\uc774\ube14 \ub77d(Table lock)",id:"\ud14c\uc774\ube14-\ub77dtable-lock",level:3},{value:"\ub124\uc784\ub4dc \ub77d(Named lock)",id:"\ub124\uc784\ub4dc-\ub77dnamed-lock",level:3},{value:"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)",id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],m={toc:i};function s(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"mysql-\uc5d4\uc9c4\uc758-\uc7a0\uae08"},"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. "),(0,r.kt)("h3",{id:"\uae00\ub85c\ubc8c-\ub77dglobal-lock"},"\uae00\ub85c\ubc8c \ub77d(Global lock)"),(0,r.kt)("p",null,"MySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.")),(0,r.kt)("p",null,"\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- GLOBAL LOCK\nFLUSH TABLES WITH READ LOCK;\n-- UNLOCK\nUNLOCK TABLES;\n\n-- BACKUP LOCK\nLOCK INSTANCE FOR BACKUP;\n-- UNLOCK\nUNLOCK INSTANCE;\n")),(0,r.kt)("admonition",{title:"MyISAM",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"MySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.")),(0,r.kt)("h3",{id:"\ud14c\uc774\ube14-\ub77dtable-lock"},"\ud14c\uc774\ube14 \ub77d(Table lock)"),(0,r.kt)("p",null,"\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- TABLE LOCK\nLOCK TABLES table_name [ READ | WRITE ]\n\n-- UNLOCK\nUNLOCK TABLES;\n")),(0,r.kt)("h3",{id:"\ub124\uc784\ub4dc-\ub77dnamed-lock"},"\ub124\uc784\ub4dc \ub77d(Named lock)"),(0,r.kt)("p",null,"\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\nSELECT GET_LOCK('aGVyYg==', 1);\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\nSELECT IS_FREE_LOCK('aGVyYg==');\n\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\nSELECT RELEASE_LOCK('aGVyYg==');\n\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\n\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\nSELECT RELEASE_ALL_LOCKS();\n")),(0,r.kt)("h3",{id:"\uba54\ud0c0\ub370\uc774\ud130-\ub77dmetadata-lock"},"\uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sql"},"-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\n")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gywn.net/2013/12/mysql-user-level-lock/"},"MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 5.7 Reference"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks"},"Locking Functions, MySQL 8.0 Reference")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9b56b618.545f8d38.js b/assets/js/9b56b618.545f8d38.js deleted file mode 100644 index 1d9368e62..000000000 --- a/assets/js/9b56b618.545f8d38.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9538],{7e3:e=>{e.exports=JSON.parse('{"permalink":"/tags/awt","page":1,"postsPerPage":1,"totalPages":2,"totalCount":2,"nextPage":"/tags/awt/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/9b56b618.5822f5e9.js b/assets/js/9b56b618.5822f5e9.js new file mode 100644 index 000000000..745942bed --- /dev/null +++ b/assets/js/9b56b618.5822f5e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9538],{37e3:e=>{e.exports=JSON.parse('{"permalink":"/tags/awt","page":1,"postsPerPage":1,"totalPages":2,"totalCount":2,"nextPage":"/tags/awt/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/9bbc65ac.1299733d.js b/assets/js/9bbc65ac.1299733d.js new file mode 100644 index 000000000..c831b810b --- /dev/null +++ b/assets/js/9bbc65ac.1299733d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7210],{51020:e=>{e.exports=JSON.parse('{"label":"test","permalink":"/docs/tags/test","allTagsPath":"/docs/tags","count":3,"items":[{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","title":"TDD heuristics","description":"TDD heuristics","permalink":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59"},{"id":"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","title":"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8","description":"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)","permalink":"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8"},{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","title":"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd","description":"\ub514\ubc84\uae45 \uac10\uc18c","permalink":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd"}]}')}}]); \ No newline at end of file diff --git a/assets/js/9bbc65ac.8cabc0cf.js b/assets/js/9bbc65ac.8cabc0cf.js deleted file mode 100644 index d52d76228..000000000 --- a/assets/js/9bbc65ac.8cabc0cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7210],{1020:e=>{e.exports=JSON.parse('{"label":"test","permalink":"/docs/tags/test","allTagsPath":"/docs/tags","count":3,"items":[{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","title":"TDD heuristics","description":"TDD heuristics","permalink":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59"},{"id":"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","title":"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8","description":"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)","permalink":"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8"},{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","title":"\ud14c\uc2a4\ud2b8 \ucf54\ub4dc\uac00 \uc8fc\ub294 \ud61c\ud0dd","description":"\ub514\ubc84\uae45 \uac10\uc18c","permalink":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd"}]}')}}]); \ No newline at end of file diff --git a/assets/js/9ca52986.08ff34b4.js b/assets/js/9ca52986.08ff34b4.js new file mode 100644 index 000000000..f6e6525c0 --- /dev/null +++ b/assets/js/9ca52986.08ff34b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3490],{92016:e=>{e.exports=JSON.parse('{"label":"Lock","permalink":"/tags/lock","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/9cfe8fd1.5bf3edc4.js b/assets/js/9cfe8fd1.5bf3edc4.js new file mode 100644 index 000000000..3205384ab --- /dev/null +++ b/assets/js/9cfe8fd1.5bf3edc4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7725],{97113:e=>{e.exports=JSON.parse('{"permalink":"/page/18","page":18,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/17","nextPage":"/page/19","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/9cfe8fd1.62a95eb9.js b/assets/js/9cfe8fd1.62a95eb9.js deleted file mode 100644 index c7cb3c04e..000000000 --- a/assets/js/9cfe8fd1.62a95eb9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7725],{7113:e=>{e.exports=JSON.parse('{"permalink":"/page/18","page":18,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/17","nextPage":"/page/19","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/9d8ee3a8.3e89b3f5.js b/assets/js/9d8ee3a8.3e89b3f5.js new file mode 100644 index 000000000..5d2c77bbe --- /dev/null +++ b/assets/js/9d8ee3a8.3e89b3f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5962],{71297:e=>{e.exports=JSON.parse('{"label":"OOP","permalink":"/tags/oop","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/9d8ee3a8.f1ab8b54.js b/assets/js/9d8ee3a8.f1ab8b54.js deleted file mode 100644 index 9107ff01d..000000000 --- a/assets/js/9d8ee3a8.f1ab8b54.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5962],{1297:e=>{e.exports=JSON.parse('{"label":"OOP","permalink":"/tags/oop","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/9dec6b67.18554824.js b/assets/js/9dec6b67.18554824.js deleted file mode 100644 index f2d529b3e..000000000 --- a/assets/js/9dec6b67.18554824.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8524],{8221:a=>{a.exports=JSON.parse('{"label":"DataBase","permalink":"/tags/data-base","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/9dec6b67.a1bd30cc.js b/assets/js/9dec6b67.a1bd30cc.js new file mode 100644 index 000000000..27d61ac7b --- /dev/null +++ b/assets/js/9dec6b67.a1bd30cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8524],{88221:a=>{a.exports=JSON.parse('{"label":"DataBase","permalink":"/tags/data-base","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.1da97dda.js b/assets/js/9e4087bc.1da97dda.js new file mode 100644 index 000000000..7213fa944 --- /dev/null +++ b/assets/js/9e4087bc.1da97dda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3608],{63169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(67294),l=a(39960),n=a(95999),c=a(10833),m=a(54774);function i(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function s(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(i,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(m.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,i.length>0&&r.createElement(s,{years:i}))))}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.dc541821.js b/assets/js/9e4087bc.dc541821.js deleted file mode 100644 index 818e69ad2..000000000 --- a/assets/js/9e4087bc.dc541821.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3608],{3169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(7294),l=a(9960),n=a(5999),c=a(833),m=a(4774);function i(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function s(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(i,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(m.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,i.length>0&&r.createElement(s,{years:i}))))}}}]); \ No newline at end of file diff --git a/assets/js/9e477a5e.86e2c4e6.js b/assets/js/9e477a5e.86e2c4e6.js deleted file mode 100644 index 3b0b703f4..000000000 --- a/assets/js/9e477a5e.86e2c4e6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8312],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=c(r),d=o,f=u["".concat(l,".").concat(d)]||u[d]||m[d]||a;return r?n.createElement(f,p(p({ref:t},s),{},{components:r})):n.createElement(f,p({ref:t},s))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,p=new Array(a);p[0]=u;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:o,p[1]=i;for(var c=2;c<a;c++)p[c]=r[c];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},4686:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>p,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const a={title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",tags:["postmortem"]},p=void 0,i={unversionedId:"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",id:"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",description:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)",source:"@site/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c.mdx",sourceDirName:"\ubb38\ud654",slug:"/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",permalink:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c.mdx",tags:[{label:"postmortem",permalink:"/docs/tags/postmortem"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",tags:["postmortem"]},sidebar:"tutorialSidebar",previous:{title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",permalink:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131"},next:{title:"\ud328\ud0a4\uc9c0",permalink:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0"}},l={},c=[{value:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)",id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15cpostmortem",level:3},{value:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c\uc5d0 \ub2f4\uaca8\uc57c \ud558\ub294 \ub0b4\uc6a9",id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15c\uc5d0-\ub2f4\uaca8\uc57c-\ud558\ub294-\ub0b4\uc6a9",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],s={toc:c};function m(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15cpostmortem"},"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)"),(0,o.kt)("p",null,"\uc2e4\ud328\ud55c \uadfc\ubcf8 \uc6d0\uc778\uc744 \ubd84\uc11d\ud558\uc5ec \ubb38\uc11c\ub85c \ub0a8\uae30\ub294 \uac83"),(0,o.kt)("h3",{id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15c\uc5d0-\ub2f4\uaca8\uc57c-\ud558\ub294-\ub0b4\uc6a9"},"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c\uc5d0 \ub2f4\uaca8\uc57c \ud558\ub294 \ub0b4\uc6a9"),(0,o.kt)("p",null,"\uc0ac\uac74\uc758 \uac1c\uc694",(0,o.kt)("br",{parentName:"p"}),"\n","\uc0ac\uac74\uc744 \uc778\uc9c0\ud558\uace0 \ud574\uacb0\uc5d0 \uc774\ub974\uae30\uae4c\uc9c0\uc758 \ud0c0\uc784\ub77c\uc778",(0,o.kt)("br",{parentName:"p"}),"\n","\uc0ac\uac74\uc758 \uadfc\ubcf8 \uc6d0\uc778",(0,o.kt)("br",{parentName:"p"}),"\n","\uc601\ud5a5\uacfc \ud53c\ud574 \ud3c9\uac00",(0,o.kt)("br",{parentName:"p"}),"\n","\ubb38\uc81c\ub97c \uc989\uc2dc \ud574\uacb0\ud558\uae30 \uc704\ud55c \uc870\uce58 \ud56d\ubaa9(\uc18c\uc720\uc790 \uba85\uc2dc)",(0,o.kt)("br",{parentName:"p"}),"\n","\uac1c\ubc1c \ubc29\uc9c0\ub97c \uc704\ud55c \uc870\uce58 \ud56d\ubaa9",(0,o.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uacbd\ud5d8\uc5d0\uc11c \uc5bb\uc740 \uad50\ud6c8 "),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,"\uad6c\uae00 \uc5d4\uc9c0\ub2c8\uc5b4\ub294 \uc774\ub807\uac8c \uc77c\ud55c\ub2e4, \ud0c0\uc774\ud130\uc2a4 \uc708\ud130\uc2a4, \ud1b0 \ub9e8\uc26c\ub809, \ud558\uc774\ub7fc \ub77c\uc774\ud2b8 p.86",(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/4886/"},"\uc6b0\uc544\ud55c \uc7a5\uc560\ub300\uc751")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e477a5e.f9b39139.js b/assets/js/9e477a5e.f9b39139.js new file mode 100644 index 000000000..3bd402f00 --- /dev/null +++ b/assets/js/9e477a5e.f9b39139.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8312],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=c(r),d=o,f=u["".concat(l,".").concat(d)]||u[d]||m[d]||a;return r?n.createElement(f,p(p({ref:t},s),{},{components:r})):n.createElement(f,p({ref:t},s))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,p=new Array(a);p[0]=u;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:o,p[1]=i;for(var c=2;c<a;c++)p[c]=r[c];return n.createElement.apply(null,p)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},54686:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>p,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(87462),o=(r(67294),r(3905));const a={title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",tags:["postmortem"]},p=void 0,i={unversionedId:"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",id:"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",description:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)",source:"@site/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c.mdx",sourceDirName:"\ubb38\ud654",slug:"/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",permalink:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c.mdx",tags:[{label:"postmortem",permalink:"/docs/tags/postmortem"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c",tags:["postmortem"]},sidebar:"tutorialSidebar",previous:{title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",permalink:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131"},next:{title:"\ud328\ud0a4\uc9c0",permalink:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0"}},l={},c=[{value:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)",id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15cpostmortem",level:3},{value:"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c\uc5d0 \ub2f4\uaca8\uc57c \ud558\ub294 \ub0b4\uc6a9",id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15c\uc5d0-\ub2f4\uaca8\uc57c-\ud558\ub294-\ub0b4\uc6a9",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],s={toc:c};function m(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15cpostmortem"},"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c(Postmortem)"),(0,o.kt)("p",null,"\uc2e4\ud328\ud55c \uadfc\ubcf8 \uc6d0\uc778\uc744 \ubd84\uc11d\ud558\uc5ec \ubb38\uc11c\ub85c \ub0a8\uae30\ub294 \uac83"),(0,o.kt)("h3",{id:"\ud3ec\uc2a4\ud2b8-\ubaa8\ud15c\uc5d0-\ub2f4\uaca8\uc57c-\ud558\ub294-\ub0b4\uc6a9"},"\ud3ec\uc2a4\ud2b8 \ubaa8\ud15c\uc5d0 \ub2f4\uaca8\uc57c \ud558\ub294 \ub0b4\uc6a9"),(0,o.kt)("p",null,"\uc0ac\uac74\uc758 \uac1c\uc694",(0,o.kt)("br",{parentName:"p"}),"\n","\uc0ac\uac74\uc744 \uc778\uc9c0\ud558\uace0 \ud574\uacb0\uc5d0 \uc774\ub974\uae30\uae4c\uc9c0\uc758 \ud0c0\uc784\ub77c\uc778",(0,o.kt)("br",{parentName:"p"}),"\n","\uc0ac\uac74\uc758 \uadfc\ubcf8 \uc6d0\uc778",(0,o.kt)("br",{parentName:"p"}),"\n","\uc601\ud5a5\uacfc \ud53c\ud574 \ud3c9\uac00",(0,o.kt)("br",{parentName:"p"}),"\n","\ubb38\uc81c\ub97c \uc989\uc2dc \ud574\uacb0\ud558\uae30 \uc704\ud55c \uc870\uce58 \ud56d\ubaa9(\uc18c\uc720\uc790 \uba85\uc2dc)",(0,o.kt)("br",{parentName:"p"}),"\n","\uac1c\ubc1c \ubc29\uc9c0\ub97c \uc704\ud55c \uc870\uce58 \ud56d\ubaa9",(0,o.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uacbd\ud5d8\uc5d0\uc11c \uc5bb\uc740 \uad50\ud6c8 "),(0,o.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,o.kt)("p",null,"\uad6c\uae00 \uc5d4\uc9c0\ub2c8\uc5b4\ub294 \uc774\ub807\uac8c \uc77c\ud55c\ub2e4, \ud0c0\uc774\ud130\uc2a4 \uc708\ud130\uc2a4, \ud1b0 \ub9e8\uc26c\ub809, \ud558\uc774\ub7fc \ub77c\uc774\ud2b8 p.86",(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/4886/"},"\uc6b0\uc544\ud55c \uc7a5\uc560\ub300\uc751")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9f324683.5c982203.js b/assets/js/9f324683.5c982203.js new file mode 100644 index 000000000..b0485cc2d --- /dev/null +++ b/assets/js/9f324683.5c982203.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7974],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),b=a,f=s["".concat(i,".").concat(b)]||s[b]||m[b]||p;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c<p;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}s.displayName="MDXCreateElement"},87998:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"2022\ub144 \ud68c\uace0",slug:2,tags:["Retrospective"]},l=void 0,o={permalink:"/2",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",title:"2022\ub144 \ud68c\uace0",description:"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70",date:"2023-01-02T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 2\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.705,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2022\ub144 \ud68c\uace0",slug:"2",tags:["Retrospective"]},prevItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"},nextItem:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",permalink:"/1"}},i={authorsImageUrls:[]},c=[{value:"\uc804\uc5ed",id:"\uc804\uc5ed",level:3},{value:"\uc790\ubc14",id:"\uc790\ubc14",level:3},{value:"\uc2a4\ud130\ub514",id:"\uc2a4\ud130\ub514",level:3},{value:"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4",id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4",level:3},{value:"2023\ub144\uc5d0\ub294",id:"2023\ub144\uc5d0\ub294",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 "),(0,a.kt)("h3",{id:"\uc804\uc5ed"},"\uc804\uc5ed"),(0,a.kt)("p",null,"\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. "),(0,a.kt)("p",null,"\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uc790\ubc14"},"\uc790\ubc14"),(0,a.kt)("p",null,"\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 ",(0,a.kt)("a",{parentName:"p",href:"https://jojoldu.tistory.com/609"},"\uc790\ubc14 \uacf5\ud654\uad6d")," \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\uc2a4\ud130\ub514"},"\uc2a4\ud130\ub514"),(0,a.kt)("p",null,"\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4"},"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4"),(0,a.kt)("p",null,"\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. "),(0,a.kt)("p",null,"\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"2023\ub144\uc5d0\ub294"},"2023\ub144\uc5d0\ub294"),(0,a.kt)("p",null,"\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9f324683.bc18c704.js b/assets/js/9f324683.bc18c704.js deleted file mode 100644 index 69815e386..000000000 --- a/assets/js/9f324683.bc18c704.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7974],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),b=a,f=s["".concat(i,".").concat(b)]||s[b]||m[b]||p;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c<p;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}s.displayName="MDXCreateElement"},7998:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"2022\ub144 \ud68c\uace0",slug:2,tags:["Retrospective"]},l=void 0,o={permalink:"/2",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",title:"2022\ub144 \ud68c\uace0",description:"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70",date:"2023-01-02T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 2\uc77c",tags:[{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.705,hasTruncateMarker:!1,authors:[],frontMatter:{title:"2022\ub144 \ud68c\uace0",slug:"2",tags:["Retrospective"]},prevItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"},nextItem:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",permalink:"/1"}},i={authorsImageUrls:[]},c=[{value:"\uc804\uc5ed",id:"\uc804\uc5ed",level:3},{value:"\uc790\ubc14",id:"\uc790\ubc14",level:3},{value:"\uc2a4\ud130\ub514",id:"\uc2a4\ud130\ub514",level:3},{value:"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4",id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4",level:3},{value:"2023\ub144\uc5d0\ub294",id:"2023\ub144\uc5d0\ub294",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 "),(0,a.kt)("h3",{id:"\uc804\uc5ed"},"\uc804\uc5ed"),(0,a.kt)("p",null,"\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. "),(0,a.kt)("p",null,"\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uc790\ubc14"},"\uc790\ubc14"),(0,a.kt)("p",null,"\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 ",(0,a.kt)("a",{parentName:"p",href:"https://jojoldu.tistory.com/609"},"\uc790\ubc14 \uacf5\ud654\uad6d")," \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\uc2a4\ud130\ub514"},"\uc2a4\ud130\ub514"),(0,a.kt)("p",null,"\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0",(0,a.kt)("br",{parentName:"p"}),"\n","\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\uc6b0\uc544\ud55c-\ud14c\ud06c\ucf54\uc2a4"},"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4"),(0,a.kt)("p",null,"\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. "),(0,a.kt)("p",null,"\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"2023\ub144\uc5d0\ub294"},"2023\ub144\uc5d0\ub294"),(0,a.kt)("p",null,"\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9fae68e2.72dfd56d.js b/assets/js/9fae68e2.72dfd56d.js new file mode 100644 index 000000000..b6758a499 --- /dev/null +++ b/assets/js/9fae68e2.72dfd56d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[297],{77536:e=>{e.exports=JSON.parse('{"permalink":"/tags/kotlin","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/9fae68e2.b3110e72.js b/assets/js/9fae68e2.b3110e72.js deleted file mode 100644 index 623f1ebc1..000000000 --- a/assets/js/9fae68e2.b3110e72.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[297],{7536:e=>{e.exports=JSON.parse('{"permalink":"/tags/kotlin","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a0333b7c.11cac6ed.js b/assets/js/a0333b7c.11cac6ed.js deleted file mode 100644 index 4278a0e5f..000000000 --- a/assets/js/a0333b7c.11cac6ed.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7306],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},s=Object.keys(e);for(a=0;a<s.length;a++)n=s[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a<s.length;a++)n=s[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),u=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),g=u(n),m=r,d=g["".concat(o,".").concat(m)]||g[m]||p[m]||s;return n?a.createElement(d,l(l({ref:t},c),{},{components:n})):a.createElement(d,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,l=new Array(s);l[0]=g;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var u=2;u<s;u++)l[u]=n[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}g.displayName="MDXCreateElement"},1702:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const s={title:"Docusaurus",slug:33,tags:["Documentation"]},l=void 0,i={permalink:"/33",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",source:"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",title:"Docusaurus",description:"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.",date:"2023-06-18T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 18\uc77c",tags:[{label:"Documentation",permalink:"/tags/documentation"}],readingTime:10.095,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Docusaurus",slug:"33",tags:["Documentation"]},prevItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"}},o={authorsImageUrls:[]},u=[{value:"\uc124\uce58",id:"\uc124\uce58",level:2},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:2},{value:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131",id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131",level:3},{value:"\uc124\uc815 \ud30c\uc77c \uc218\uc815",id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815",level:3},{value:"\ud1a0\ud070 \uc124\uc815",id:"\ud1a0\ud070-\uc124\uc815",level:3},{value:"\ube0c\ub79c\uce58 \uc0dd\uc131",id:"\ube0c\ub79c\uce58-\uc0dd\uc131",level:3},{value:"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131",id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131",level:3},{value:"\ub313\uae00 \uae30\ub2a5",id:"\ub313\uae00-\uae30\ub2a5",level:2},{value:"giscus \uc124\uc815",id:"giscus-\uc124\uc815",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815",level:3},{value:"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30",id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30",level:2},{value:"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778",id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778",level:3},{value:"\ud0a4 \uc0dd\uc131",id:"\ud0a4-\uc0dd\uc131",level:3},{value:".env \ud30c\uc77c \uc0dd\uc131",id:"env-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"config \ud30c\uc77c \uc0dd\uc131",id:"config-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1",id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815-1",level:3},{value:"\ubd80\uac00 \uc124\uc815",id:"\ubd80\uac00-\uc124\uc815",level:2},{value:"\ud654\uba74 \uc0c1\ub2e8 Github Icon",id:"\ud654\uba74-\uc0c1\ub2e8-github-icon",level:3},{value:"\ucf54\ub4dc\ube14\ub7ed",id:"\ucf54\ub4dc\ube14\ub7ed",level:3},{value:"mermaid",id:"mermaid",level:3},{value:"\uad6d\uc81c\ud654 \uc124\uc815",id:"\uad6d\uc81c\ud654-\uc124\uc815",level:3},{value:"\ube14\ub85c\uadf8 \uae00 author",id:"\ube14\ub85c\uadf8-\uae00-author",level:3}],c={toc:u};function p(e){let{components:t,...s}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. "),(0,r.kt)("h2",{id:"\uc124\uce58"},"\uc124\uce58"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/installation"},"\uacf5\uc2dd \ud648\ud398\uc774\uc9c0"),"\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn create docusaurus\n")),(0,r.kt)("h2",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/next/deployment#deploying-to-github-pages"},"\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c"),(0,r.kt)("br",{parentName:"p"}),"\n","netlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131"},"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131"),(0,r.kt)("p",null,"github pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/greeng00se/greeng00se.github.io"},"\uc608\uc2dc"),"\uc640 \uac19\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"username.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"organization.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815"},"\uc124\uc815 \ud30c\uc77c \uc218\uc815"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"module.exports = {\n // ...\n url: 'https://greeng00se.github.io',\n baseUrl: '/',\n projectName: 'greeng00se.github.io',\n organizationName: 'greeng00se',\n trailingSlash: false,\n // ...\n};\n")),(0,r.kt)("h3",{id:"\ud1a0\ud070-\uc124\uc815"},"\ud1a0\ud070 \uc124\uc815"),(0,r.kt)("p",null,"github action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 ","[repo, user, workflow]"," \uc744 \uc124\uc815\ud588\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"github",src:n(7707).Z,width:"1598",height:"1670"})),(0,r.kt)("h3",{id:"\ube0c\ub79c\uce58-\uc0dd\uc131"},"\ube0c\ub79c\uce58 \uc0dd\uc131"),(0,r.kt)("p",null,"github\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","repository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131"},"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131"),(0,r.kt)("p",null,"Docusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title=".github/workflows/deploy.yml"',title:'".github/workflows/deploy.yml"'},"name: blog\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n name: Deploy to GitHub Pages\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v3\n with:\n node-version: 18\n cache: yarn\n\n - name: Install dependencies\n run: yarn install --frozen-lockfile\n - name: Build website\n run: yarn build\n\n - name: Deploy to GitHub Pages\n uses: peaceiris/actions-gh-pages@v3\n with:\n github_token: ${{ secrets.DEPLOY_TOKEN }}\n publish_dir: ./build\n user_name: github-actions[bot]\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\n")),(0,r.kt)("h2",{id:"\ub313\uae00-\uae30\ub2a5"},"\ub313\uae00 \uae30\ub2a5"),(0,r.kt)("p",null,"giscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"giscus-\uc124\uc815"},"giscus \uc124\uc815"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://giscus.app/ko"},"giscus"),"\ub97c \ud655\uc778\ud558\uc790."),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/ko/docs/next/swizzling"},"swizzling"),"\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\n")),(0,r.kt)("p",null,"\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"/src/theme/BlogPostItem/index.js")," \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="/src/theme/BlogPostItem/index.js"',title:'"/src/theme/BlogPostItem/index.js"'},'import OriginalBlogPostItem from "@theme-original/BlogPostItem";\nimport React, { useEffect, useRef } from "react";\n// @ts-expect-error internal code\nimport { useColorMode } from "@docusaurus/theme-common";\nimport { useBlogPost } from "@docusaurus/theme-common/internal";\n\nconst giscusSelector = "iframe.giscus-frame";\n\nfunction BlogPostItem(props) {\n const { colorMode } = useColorMode();\n const { isBlogPostPage } = useBlogPost();\n const giscusTheme = colorMode === "dark" ? "dark" : "light";\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (!isBlogPostPage) return;\n\n const giscusEl = containerRef.current.querySelector(giscusSelector);\n\n const createGiscusEl = () => {\n const script = document.createElement("script");\n\n script.src = "https://giscus.app/client.js";\n script.setAttribute("data-repo", "teco-chat/teco-chat.github.io");\n script.setAttribute("data-repo-id", "R_kgDOJZ5j0Q");\n script.setAttribute("data-category", "Announcements");\n script.setAttribute("data-category-id", "DIC_kwDOJZ5j0c4CXS_Q");\n script.setAttribute("data-mapping", "pathname");\n script.setAttribute("data-strict", "0");\n script.setAttribute("data-reactions-enabled", "1");\n script.setAttribute("data-emit-metadata", "0");\n script.setAttribute("data-input-position", "bottom");\n script.setAttribute("data-theme", giscusTheme);\n script.setAttribute("data-lang", "ko");\n script.crossOrigin = "anonymous";\n script.async = true;\n \n containerRef.current.appendChild(script);\n };\n\n const postThemeMessage = () => {\n const message = {\n setConfig: {\n theme: giscusTheme,\n }\n };\n\n giscusEl.contentWindow.postMessage({ giscus: message }, "https://giscus.app");\n };\n\n giscusEl ? postThemeMessage() : createGiscusEl();\n }, [giscusTheme]);\n\n return (\n <>\n <OriginalBlogPostItem {...props} />\n {isBlogPostPage && <div ref={containerRef} />}\n </>\n );\n}\n\nexport default BlogPostItem;\n')),(0,r.kt)("h2",{id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30"},"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30"),(0,r.kt)("p",null,"\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. "),(0,r.kt)("p",null,"\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/"},"docsearch"),"\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","docsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/run-your-own/"},"\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\uc124\uc815 \ud30c\uc77c"))),(0,r.kt)("h3",{id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778"},"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778"),(0,r.kt)("p",null,"\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"algolia",src:n(6451).Z,width:"3194",height:"1520"})),(0,r.kt)("h3",{id:"\ud0a4-\uc0dd\uc131"},"\ud0a4 \uc0dd\uc131"),(0,r.kt)("p",null,"\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","addObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"key",src:n(9350).Z,width:"2496",height:"832"})),(0,r.kt)("h3",{id:"env-\ud30c\uc77c-\uc0dd\uc131"},".env \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title=".env"',title:'".env"'},"APPLICATION_ID=MVIU5UEMOM\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\n")),(0,r.kt)("h3",{id:"config-\ud30c\uc77c-\uc0dd\uc131"},"config \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\ub9c1\ud06c"),"\ub97c \ucc38\uace0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub610\ub294 Docusaurus\uc758 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json"},"\uc124\uc815 \ud30c\uc77c"),"\uc744 \ucc38\uace0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="config.json"',title:'"config.json"'},'{\n "index_name": "teco",\n "start_urls": [\n "https://teco-chat.github.io/"\n ],\n "sitemap_urls": [\n "https://teco-chat.github.io/sitemap.xml"\n ],\n "sitemap_alternate_links": true,\n "stop_urls": [\n "/tests"\n ],\n "selectors": {\n "lvl0": {\n "selector": "(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]",\n "type": "xpath",\n "global": true,\n "default_value": "Documentation"\n },\n "lvl1": "header h1",\n "lvl2": "article h2",\n "lvl3": "article h3",\n "lvl4": "article h4",\n "lvl5": "article h5, article td:first-child",\n "lvl6": "article h6",\n "text": "article p, article li, article td:last-child"\n },\n "strip_chars": " .,;:#",\n "custom_settings": {\n "separatorsToIndex": "_",\n "attributesForFaceting": [\n "language",\n "version",\n "type",\n "docusaurus_tag"\n ],\n "attributesToRetrieve": [\n "hierarchy",\n "content",\n "anchor",\n "url",\n "url_without_anchor",\n "type"\n ]\n },\n "conversation_id": [\n "833762294"\n ],\n "nb_hits": 46250\n}\n')),(0,r.kt)("h3",{id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1"},"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1"),(0,r.kt)("p",null,"docker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","jq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"brew install jq\n")),(0,r.kt)("p",null,"\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper\n')),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815-1"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,"\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n algolia: {\n appId: 'MVIU5UEMOM', // Application ID\n apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key\n indexName: 'teco', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\n contextualSearch: true,\n },\n })\n")),(0,r.kt)("h2",{id:"\ubd80\uac00-\uc124\uc815"},"\ubd80\uac00 \uc124\uc815"),(0,r.kt)("h3",{id:"\ud654\uba74-\uc0c1\ub2e8-github-icon"},"\ud654\uba74 \uc0c1\ub2e8 Github Icon"),(0,r.kt)("p",null,"\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-css",metastring:'title="/src/css/custom.css"',title:'"/src/css/custom.css"'},".header-github-link:hover {\n opacity: 0.6;\n}\n\n.header-github-link:before {\n content: '';\n width: 24px;\n height: 24px;\n display: flex;\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n\nhtml[data-theme='dark'] .header-github-link:before {\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n")),(0,r.kt)("p",null,"themeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"navbar: {\n title: 'HELLO',\n items: [\n {\n href: 'https://github.com/greeng00se',\n position: 'right',\n className: 'header-github-link',\n 'aria-label': 'GitHub repository',\n },\n ],\n},\n")),(0,r.kt)("h3",{id:"\ucf54\ub4dc\ube14\ub7ed"},"\ucf54\ub4dc\ube14\ub7ed"),(0,r.kt)("p",null,"java\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","prism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"prism: {\n theme: lightCodeTheme,\n darkTheme: darkCodeTheme,\n additionalLanguages: ['java', 'kotlin'],\n}\n")),(0,r.kt)("h3",{id:"mermaid"},"mermaid"),(0,r.kt)("p",null,"mermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"@docusaurus/theme-mermaid")," \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn add @docusaurus/theme-mermaid\n")),(0,r.kt)("p",null,"\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"const config = {\n ...\n markdown: {\n mermaid: true,\n },\n themes: [\n '@docusaurus/theme-mermaid'\n ],\n};\n")),(0,r.kt)("p",null,"themeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n mermaid: {\n theme: {\n light: 'neutral', \n dark: 'dark'\n },\n },\n }),\n")),(0,r.kt)("h3",{id:"\uad6d\uc81c\ud654-\uc124\uc815"},"\uad6d\uc81c\ud654 \uc124\uc815"),(0,r.kt)("p",null,"\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"Older Entries")," \ud615\ud0dc\uc758 \uc124\uba85\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"\ub2e4\uc74c \ud398\uc774\uc9c0")," \ub85c \ubcc0\uacbd\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},'i18n: {\n defaultLocale: "ko",\n locales: ["ko"],\n},\n')),(0,r.kt)("h3",{id:"\ube14\ub85c\uadf8-\uae00-author"},"\ube14\ub85c\uadf8 \uae00 author"),(0,r.kt)("p",null,"\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"author",src:n(2942).Z,width:"2362",height:"1076"})),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"authors.yml")," \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title="/blog/authors.yml"',title:'"/blog/authors.yml"'},"herb:\n name: \ud5c8\ube0c\n title: Backend\n url: https://github.com/greeng00se\n image_url: https://github.com/greeng00se.png\n\nmallang:\n name: \ub9d0\ub791\n title: Backend\n url: https://github.com/shin-mallang\n image_url: https://github.com/shin-mallang.png\n")),(0,r.kt)("p",null,"\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-mdx"},"---\nslug: 1\ntitle: Hello World\nauthors: [herb, mallang]\ntags: [hello, docusaurus]\n---\n\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\n")))}p.isMDXComponent=!0},6451:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/algolia-3dbac5c1606f7f0daed9cb27a429db50.png"},2942:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/author-1bd517bb7763257e2139e1063fd92492.png"},7707:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/github-d866f69755a1e17d4f17a262bd30d56d.png"},9350:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/key-2d0b59e69e9ca0b21c49b76159266e74.png"}}]); \ No newline at end of file diff --git a/assets/js/a0333b7c.d4f32a9d.js b/assets/js/a0333b7c.d4f32a9d.js new file mode 100644 index 000000000..9527eb738 --- /dev/null +++ b/assets/js/a0333b7c.d4f32a9d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7306],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},s=Object.keys(e);for(a=0;a<s.length;a++)n=s[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a<s.length;a++)n=s[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),u=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),g=u(n),m=r,d=g["".concat(o,".").concat(m)]||g[m]||p[m]||s;return n?a.createElement(d,l(l({ref:t},c),{},{components:n})):a.createElement(d,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,l=new Array(s);l[0]=g;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var u=2;u<s;u++)l[u]=n[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}g.displayName="MDXCreateElement"},61702:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const s={title:"Docusaurus",slug:33,tags:["Documentation"]},l=void 0,i={permalink:"/33",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",source:"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",title:"Docusaurus",description:"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.",date:"2023-06-18T00:00:00.000Z",formattedDate:"2023\ub144 6\uc6d4 18\uc77c",tags:[{label:"Documentation",permalink:"/tags/documentation"}],readingTime:10.095,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Docusaurus",slug:"33",tags:["Documentation"]},prevItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0",permalink:"/32"}},o={authorsImageUrls:[]},u=[{value:"\uc124\uce58",id:"\uc124\uce58",level:2},{value:"\ubc30\ud3ec",id:"\ubc30\ud3ec",level:2},{value:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131",id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131",level:3},{value:"\uc124\uc815 \ud30c\uc77c \uc218\uc815",id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815",level:3},{value:"\ud1a0\ud070 \uc124\uc815",id:"\ud1a0\ud070-\uc124\uc815",level:3},{value:"\ube0c\ub79c\uce58 \uc0dd\uc131",id:"\ube0c\ub79c\uce58-\uc0dd\uc131",level:3},{value:"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131",id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131",level:3},{value:"\ub313\uae00 \uae30\ub2a5",id:"\ub313\uae00-\uae30\ub2a5",level:2},{value:"giscus \uc124\uc815",id:"giscus-\uc124\uc815",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815",level:3},{value:"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30",id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30",level:2},{value:"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778",id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778",level:3},{value:"\ud0a4 \uc0dd\uc131",id:"\ud0a4-\uc0dd\uc131",level:3},{value:".env \ud30c\uc77c \uc0dd\uc131",id:"env-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"config \ud30c\uc77c \uc0dd\uc131",id:"config-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1",id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1",level:3},{value:"docusaurus \uc124\uc815",id:"docusaurus-\uc124\uc815-1",level:3},{value:"\ubd80\uac00 \uc124\uc815",id:"\ubd80\uac00-\uc124\uc815",level:2},{value:"\ud654\uba74 \uc0c1\ub2e8 Github Icon",id:"\ud654\uba74-\uc0c1\ub2e8-github-icon",level:3},{value:"\ucf54\ub4dc\ube14\ub7ed",id:"\ucf54\ub4dc\ube14\ub7ed",level:3},{value:"mermaid",id:"mermaid",level:3},{value:"\uad6d\uc81c\ud654 \uc124\uc815",id:"\uad6d\uc81c\ud654-\uc124\uc815",level:3},{value:"\ube14\ub85c\uadf8 \uae00 author",id:"\ube14\ub85c\uadf8-\uae00-author",level:3}],c={toc:u};function p(e){let{components:t,...s}=e;return(0,r.kt)("wrapper",(0,a.Z)({},c,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. "),(0,r.kt)("h2",{id:"\uc124\uce58"},"\uc124\uce58"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/installation"},"\uacf5\uc2dd \ud648\ud398\uc774\uc9c0"),"\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn create docusaurus\n")),(0,r.kt)("h2",{id:"\ubc30\ud3ec"},"\ubc30\ud3ec"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/next/deployment#deploying-to-github-pages"},"\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c"),(0,r.kt)("br",{parentName:"p"}),"\n","netlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub808\ud3ec\uc9c0\ud1a0\ub9ac-\uc0dd\uc131"},"\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131"),(0,r.kt)("p",null,"github pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/greeng00se/greeng00se.github.io"},"\uc608\uc2dc"),"\uc640 \uac19\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"username.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"organization.github.io")," \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc124\uc815-\ud30c\uc77c-\uc218\uc815"},"\uc124\uc815 \ud30c\uc77c \uc218\uc815"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"module.exports = {\n // ...\n url: 'https://greeng00se.github.io',\n baseUrl: '/',\n projectName: 'greeng00se.github.io',\n organizationName: 'greeng00se',\n trailingSlash: false,\n // ...\n};\n")),(0,r.kt)("h3",{id:"\ud1a0\ud070-\uc124\uc815"},"\ud1a0\ud070 \uc124\uc815"),(0,r.kt)("p",null,"github action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 ","[repo, user, workflow]"," \uc744 \uc124\uc815\ud588\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"github",src:n(67707).Z,width:"1598",height:"1670"})),(0,r.kt)("h3",{id:"\ube0c\ub79c\uce58-\uc0dd\uc131"},"\ube0c\ub79c\uce58 \uc0dd\uc131"),(0,r.kt)("p",null,"github\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","repository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\uc6cc\ud06c\ud50c\ub85c-\uc791\uc131"},"\uc6cc\ud06c\ud50c\ub85c \uc791\uc131"),(0,r.kt)("p",null,"Docusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title=".github/workflows/deploy.yml"',title:'".github/workflows/deploy.yml"'},"name: blog\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n name: Deploy to GitHub Pages\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v3\n with:\n node-version: 18\n cache: yarn\n\n - name: Install dependencies\n run: yarn install --frozen-lockfile\n - name: Build website\n run: yarn build\n\n - name: Deploy to GitHub Pages\n uses: peaceiris/actions-gh-pages@v3\n with:\n github_token: ${{ secrets.DEPLOY_TOKEN }}\n publish_dir: ./build\n user_name: github-actions[bot]\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\n")),(0,r.kt)("h2",{id:"\ub313\uae00-\uae30\ub2a5"},"\ub313\uae00 \uae30\ub2a5"),(0,r.kt)("p",null,"giscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. "),(0,r.kt)("h3",{id:"giscus-\uc124\uc815"},"giscus \uc124\uc815"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://giscus.app/ko"},"giscus"),"\ub97c \ud655\uc778\ud558\uc790."),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docusaurus.io/ko/docs/next/swizzling"},"swizzling"),"\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\n")),(0,r.kt)("p",null,"\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"/src/theme/BlogPostItem/index.js")," \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="/src/theme/BlogPostItem/index.js"',title:'"/src/theme/BlogPostItem/index.js"'},'import OriginalBlogPostItem from "@theme-original/BlogPostItem";\nimport React, { useEffect, useRef } from "react";\n// @ts-expect-error internal code\nimport { useColorMode } from "@docusaurus/theme-common";\nimport { useBlogPost } from "@docusaurus/theme-common/internal";\n\nconst giscusSelector = "iframe.giscus-frame";\n\nfunction BlogPostItem(props) {\n const { colorMode } = useColorMode();\n const { isBlogPostPage } = useBlogPost();\n const giscusTheme = colorMode === "dark" ? "dark" : "light";\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (!isBlogPostPage) return;\n\n const giscusEl = containerRef.current.querySelector(giscusSelector);\n\n const createGiscusEl = () => {\n const script = document.createElement("script");\n\n script.src = "https://giscus.app/client.js";\n script.setAttribute("data-repo", "teco-chat/teco-chat.github.io");\n script.setAttribute("data-repo-id", "R_kgDOJZ5j0Q");\n script.setAttribute("data-category", "Announcements");\n script.setAttribute("data-category-id", "DIC_kwDOJZ5j0c4CXS_Q");\n script.setAttribute("data-mapping", "pathname");\n script.setAttribute("data-strict", "0");\n script.setAttribute("data-reactions-enabled", "1");\n script.setAttribute("data-emit-metadata", "0");\n script.setAttribute("data-input-position", "bottom");\n script.setAttribute("data-theme", giscusTheme);\n script.setAttribute("data-lang", "ko");\n script.crossOrigin = "anonymous";\n script.async = true;\n \n containerRef.current.appendChild(script);\n };\n\n const postThemeMessage = () => {\n const message = {\n setConfig: {\n theme: giscusTheme,\n }\n };\n\n giscusEl.contentWindow.postMessage({ giscus: message }, "https://giscus.app");\n };\n\n giscusEl ? postThemeMessage() : createGiscusEl();\n }, [giscusTheme]);\n\n return (\n <>\n <OriginalBlogPostItem {...props} />\n {isBlogPostPage && <div ref={containerRef} />}\n </>\n );\n}\n\nexport default BlogPostItem;\n')),(0,r.kt)("h2",{id:"\uc54c\uace0\ub9ac\uc544-\uc124\uc815-\ubc0f-\uc9c1\uc811-\uad00\ub9ac\ud558\uae30"},"\uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30"),(0,r.kt)("p",null,"\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. "),(0,r.kt)("p",null,"\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/"},"docsearch"),"\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","docsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/run-your-own/"},"\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\uc124\uc815 \ud30c\uc77c"))),(0,r.kt)("h3",{id:"\uc54c\uace0\ub9ac\uc544-\uc560\ud50c\ub9ac\ucf00\uc774\uc158-\uc0dd\uc131-\ubc0f-\ud0a4-\ud655\uc778"},"\uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778"),(0,r.kt)("p",null,"\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"algolia",src:n(26451).Z,width:"3194",height:"1520"})),(0,r.kt)("h3",{id:"\ud0a4-\uc0dd\uc131"},"\ud0a4 \uc0dd\uc131"),(0,r.kt)("p",null,"\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","addObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"key",src:n(99350).Z,width:"2496",height:"832"})),(0,r.kt)("h3",{id:"env-\ud30c\uc77c-\uc0dd\uc131"},".env \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title=".env"',title:'".env"'},"APPLICATION_ID=MVIU5UEMOM\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\n")),(0,r.kt)("h3",{id:"config-\ud30c\uc77c-\uc0dd\uc131"},"config \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 ",(0,r.kt)("a",{parentName:"p",href:"https://docsearch.algolia.com/docs/legacy/config-file"},"\ub9c1\ud06c"),"\ub97c \ucc38\uace0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub610\ub294 Docusaurus\uc758 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json"},"\uc124\uc815 \ud30c\uc77c"),"\uc744 \ucc38\uace0\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="config.json"',title:'"config.json"'},'{\n "index_name": "teco",\n "start_urls": [\n "https://teco-chat.github.io/"\n ],\n "sitemap_urls": [\n "https://teco-chat.github.io/sitemap.xml"\n ],\n "sitemap_alternate_links": true,\n "stop_urls": [\n "/tests"\n ],\n "selectors": {\n "lvl0": {\n "selector": "(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]",\n "type": "xpath",\n "global": true,\n "default_value": "Documentation"\n },\n "lvl1": "header h1",\n "lvl2": "article h2",\n "lvl3": "article h3",\n "lvl4": "article h4",\n "lvl5": "article h5, article td:first-child",\n "lvl6": "article h6",\n "text": "article p, article li, article td:last-child"\n },\n "strip_chars": " .,;:#",\n "custom_settings": {\n "separatorsToIndex": "_",\n "attributesForFaceting": [\n "language",\n "version",\n "type",\n "docusaurus_tag"\n ],\n "attributesToRetrieve": [\n "hierarchy",\n "content",\n "anchor",\n "url",\n "url_without_anchor",\n "type"\n ]\n },\n "conversation_id": [\n "833762294"\n ],\n "nb_hits": 46250\n}\n')),(0,r.kt)("h3",{id:"docker-\uc774\uc6a9\ud558\uc5ec-\ud06c\ub864\ub9c1"},"docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1"),(0,r.kt)("p",null,"docker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","jq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"brew install jq\n")),(0,r.kt)("p",null,"\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper\n')),(0,r.kt)("h3",{id:"docusaurus-\uc124\uc815-1"},"docusaurus \uc124\uc815"),(0,r.kt)("p",null,"\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n algolia: {\n appId: 'MVIU5UEMOM', // Application ID\n apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key\n indexName: 'teco', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\n contextualSearch: true,\n },\n })\n")),(0,r.kt)("h2",{id:"\ubd80\uac00-\uc124\uc815"},"\ubd80\uac00 \uc124\uc815"),(0,r.kt)("h3",{id:"\ud654\uba74-\uc0c1\ub2e8-github-icon"},"\ud654\uba74 \uc0c1\ub2e8 Github Icon"),(0,r.kt)("p",null,"\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-css",metastring:'title="/src/css/custom.css"',title:'"/src/css/custom.css"'},".header-github-link:hover {\n opacity: 0.6;\n}\n\n.header-github-link:before {\n content: '';\n width: 24px;\n height: 24px;\n display: flex;\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n\nhtml[data-theme='dark'] .header-github-link:before {\n background: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n no-repeat;\n}\n")),(0,r.kt)("p",null,"themeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"navbar: {\n title: 'HELLO',\n items: [\n {\n href: 'https://github.com/greeng00se',\n position: 'right',\n className: 'header-github-link',\n 'aria-label': 'GitHub repository',\n },\n ],\n},\n")),(0,r.kt)("h3",{id:"\ucf54\ub4dc\ube14\ub7ed"},"\ucf54\ub4dc\ube14\ub7ed"),(0,r.kt)("p",null,"java\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","prism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"prism: {\n theme: lightCodeTheme,\n darkTheme: darkCodeTheme,\n additionalLanguages: ['java', 'kotlin'],\n}\n")),(0,r.kt)("h3",{id:"mermaid"},"mermaid"),(0,r.kt)("p",null,"mermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"@docusaurus/theme-mermaid")," \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn add @docusaurus/theme-mermaid\n")),(0,r.kt)("p",null,"\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"const config = {\n ...\n markdown: {\n mermaid: true,\n },\n themes: [\n '@docusaurus/theme-mermaid'\n ],\n};\n")),(0,r.kt)("p",null,"themeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},"themeConfig:\n /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n ({\n ...\n mermaid: {\n theme: {\n light: 'neutral', \n dark: 'dark'\n },\n },\n }),\n")),(0,r.kt)("h3",{id:"\uad6d\uc81c\ud654-\uc124\uc815"},"\uad6d\uc81c\ud654 \uc124\uc815"),(0,r.kt)("p",null,"\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"Older Entries")," \ud615\ud0dc\uc758 \uc124\uba85\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"\ub2e4\uc74c \ud398\uc774\uc9c0")," \ub85c \ubcc0\uacbd\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config"',title:'"docusaurus.config"'},'i18n: {\n defaultLocale: "ko",\n locales: ["ko"],\n},\n')),(0,r.kt)("h3",{id:"\ube14\ub85c\uadf8-\uae00-author"},"\ube14\ub85c\uadf8 \uae00 author"),(0,r.kt)("p",null,"\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"author",src:n(32942).Z,width:"2362",height:"1076"})),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"authors.yml")," \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yml",metastring:'title="/blog/authors.yml"',title:'"/blog/authors.yml"'},"herb:\n name: \ud5c8\ube0c\n title: Backend\n url: https://github.com/greeng00se\n image_url: https://github.com/greeng00se.png\n\nmallang:\n name: \ub9d0\ub791\n title: Backend\n url: https://github.com/shin-mallang\n image_url: https://github.com/shin-mallang.png\n")),(0,r.kt)("p",null,"\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-mdx"},"---\nslug: 1\ntitle: Hello World\nauthors: [herb, mallang]\ntags: [hello, docusaurus]\n---\n\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\n")))}p.isMDXComponent=!0},26451:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/algolia-3dbac5c1606f7f0daed9cb27a429db50.png"},32942:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/author-1bd517bb7763257e2139e1063fd92492.png"},67707:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/github-d866f69755a1e17d4f17a262bd30d56d.png"},99350:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/key-2d0b59e69e9ca0b21c49b76159266e74.png"}}]); \ No newline at end of file diff --git a/assets/js/a0410ab5.0ed80b02.js b/assets/js/a0410ab5.0ed80b02.js deleted file mode 100644 index d2b4920aa..000000000 --- a/assets/js/a0410ab5.0ed80b02.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7843],{6970:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/a0410ab5.64383bba.js b/assets/js/a0410ab5.64383bba.js new file mode 100644 index 000000000..cf8932973 --- /dev/null +++ b/assets/js/a0410ab5.64383bba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7843],{76970:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/a1877440.7a23249c.js b/assets/js/a1877440.7a23249c.js new file mode 100644 index 000000000..95245c6d8 --- /dev/null +++ b/assets/js/a1877440.7a23249c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7648],{23235:e=>{e.exports=JSON.parse('{"permalink":"/tags/async","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a1877440.cebbc169.js b/assets/js/a1877440.cebbc169.js deleted file mode 100644 index da6ad6317..000000000 --- a/assets/js/a1877440.cebbc169.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7648],{3235:e=>{e.exports=JSON.parse('{"permalink":"/tags/async","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a1cea306.2441f096.js b/assets/js/a1cea306.2441f096.js deleted file mode 100644 index c6dce3cb8..000000000 --- a/assets/js/a1cea306.2441f096.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9537],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var l=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,l,a=function(e,t){if(null==e)return{};var n,l,a={},r=Object.keys(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=l.createContext({}),s=function(e){var t=l.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):u(u({},t),e)),n},c=function(e){var t=s(e.components);return l.createElement(i.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||r;return n?l.createElement(f,u(u({ref:t},c),{},{components:n})):l.createElement(f,u({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,u=new Array(r);u[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,u[1]=o;for(var s=2;s<r;s++)u[s]=n[s];return l.createElement.apply(null,u)}return l.createElement.apply(null,n)}d.displayName="MDXCreateElement"},5162:(e,t,n)=>{n.d(t,{Z:()=>u});var l=n(7294),a=n(6010);const r="tabItem_Ymn6";function u(e){let{children:t,hidden:n,className:u}=e;return l.createElement("div",{role:"tabpanel",className:(0,a.Z)(r,u),hidden:n},t)}},4866:(e,t,n)=>{n.d(t,{Z:()=>w});var l=n(7462),a=n(7294),r=n(6010),u=n(2466),o=n(6550),i=n(1980),s=n(7392),c=n(12);function p(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:l,default:a}}=e;return{value:t,label:n,attributes:l,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??p(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const l=(0,o.k6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,i._X)(r),(0,a.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:l}=e,r=d(e),[u,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=n.find((e=>e.default))??n[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,s]=f({queryString:n,groupId:l}),[p,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,c.Nk)(n);return[l,(0,a.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:l}),k=(()=>{const e=i??p;return m({value:e,tabValues:r})?e:null})();(0,a.useEffect)((()=>{k&&o(k)}),[k]);return{selectedValue:u,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),s(e),b(e)}),[s,b,r]),tabValues:r}}var k=n(2389);const g="tabList__CuJ",v="tabItem_LNqP";function h(e){let{className:t,block:n,selectedValue:o,selectValue:i,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,u.o5)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),l=s[n].value;l!==o&&(p(t),i(l))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:u}=e;return a.createElement("li",(0,l.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},u,{className:(0,r.Z)("tabs__item",v,u?.className,{"tabs__item--active":o===t})}),n??t)})))}function N(e){let{lazy:t,children:n,selectedValue:l}=e;if(t){const e=n.find((e=>e.props.value===l));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function y(e){const t=b(e);return a.createElement("div",{className:(0,r.Z)("tabs-container",g)},a.createElement(h,(0,l.Z)({},e,t)),a.createElement(N,(0,l.Z)({},e,t)))}function w(e){const t=(0,k.Z)();return a.createElement(y,(0,l.Z)({key:String(t)},e))}},3179:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var l=n(7462),a=(n(7294),n(3905)),r=n(4866),u=n(5162);const o={title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:5,tags:["Kotlin"]},i=void 0,s={permalink:"/5",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",source:"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",description:"nullable \ud0c0\uc785",date:"2023-01-16T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 16\uc77c",tags:[{label:"Kotlin",permalink:"/tags/kotlin"}],readingTime:4.225,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:"5",tags:["Kotlin"]},prevItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"},nextItem:{title:"JSR-310",permalink:"/4"}},c={authorsImageUrls:[]},p=[{value:"nullable \ud0c0\uc785",id:"nullable-\ud0c0\uc785",level:3},{value:"<code>?.</code> Safe Calls \uc5f0\uc0b0\uc790",id:"-safe-calls-\uc5f0\uc0b0\uc790",level:3},{value:"<code>?:</code> \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790",id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790",level:3},{value:"<code>!!</code> \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790",id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790",level:3},{value:"<code>as?</code> \uc548\uc804\ud55c \uce90\uc2a4\ud305",id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305",level:3},{value:"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac",id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],d={toc:p};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,l.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"nullable-\ud0c0\uc785"},"nullable \ud0c0\uc785"),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 ",(0,a.kt)("inlineCode",{parentName:"p"},"NullPointerException")," \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val number: Int?\n")),(0,a.kt)("p",null,"\ud0c0\uc785 \ub4a4\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4."),(0,a.kt)("h3",{id:"-safe-calls-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?.")," Safe Calls \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"?.")," \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public String repeat(String word) {\n if (word == null) {\n return null;\n }\n return word.repeat(2);\n}\n"))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"fun repeat(word: String?): String? {\n return word?.repeat(2)\n}\n")))),(0,a.kt)("h3",{id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?:")," \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4."),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public String stringSafe(String word) {\n if (word == null) {\n return "";\n }\n return word;\n}\n'))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'fun stringSafe(word: String?): String {\n return word ?: ""\n}\n')))),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"userRepository.findByName(name) ?: throw IllegalArgumentException()\n")),(0,a.kt)("h3",{id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"!!")," \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val length: Int = word!!.length\n")),(0,a.kt)("h3",{id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305"},(0,a.kt)("inlineCode",{parentName:"h3"},"as?")," \uc548\uc804\ud55c \uce90\uc2a4\ud305"),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"ClassCastException"),"\uc774 \ubc1c\uc0dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val value: Int? = something as? Int\n")),(0,a.kt)("h3",{id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac"},"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac"),(0,a.kt)("p",null,"List\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 ",(0,a.kt)("inlineCode",{parentName:"p"},"filterNotNull")," \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")\nval foods = foodsWithNull.filterNotNull()\n')),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001804588"},"Kotlin in Action")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001033129"},"Effective Kotlin Item 8")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/kotlin/null-safety"},"Comprehensive Guide to Null Safety in Kotlin")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://kotlinlang.org/docs/null-safety.html"},"Kotlin NullSafety"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a1cea306.b8a75a51.js b/assets/js/a1cea306.b8a75a51.js new file mode 100644 index 000000000..3a3c66d49 --- /dev/null +++ b/assets/js/a1cea306.b8a75a51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9537],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var l=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,l,a=function(e,t){if(null==e)return{};var n,l,a={},r=Object.keys(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l<r.length;l++)n=r[l],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=l.createContext({}),s=function(e){var t=l.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):u(u({},t),e)),n},c=function(e){var t=s(e.components);return l.createElement(i.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||r;return n?l.createElement(f,u(u({ref:t},c),{},{components:n})):l.createElement(f,u({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,u=new Array(r);u[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,u[1]=o;for(var s=2;s<r;s++)u[s]=n[s];return l.createElement.apply(null,u)}return l.createElement.apply(null,n)}d.displayName="MDXCreateElement"},85162:(e,t,n)=>{n.d(t,{Z:()=>u});var l=n(67294),a=n(86010);const r="tabItem_Ymn6";function u(e){let{children:t,hidden:n,className:u}=e;return l.createElement("div",{role:"tabpanel",className:(0,a.Z)(r,u),hidden:n},t)}},74866:(e,t,n)=>{n.d(t,{Z:()=>w});var l=n(87462),a=n(67294),r=n(86010),u=n(12466),o=n(16550),i=n(91980),s=n(67392),c=n(50012);function p(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:t,label:n,attributes:l,default:a}}=e;return{value:t,label:n,attributes:l,default:a}}))}function d(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??p(n);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:n}=e;const l=(0,o.k6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,i._X)(r),(0,a.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function b(e){const{defaultValue:t,queryString:n=!1,groupId:l}=e,r=d(e),[u,o]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=n.find((e=>e.default))??n[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,s]=f({queryString:n,groupId:l}),[p,b]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,c.Nk)(n);return[l,(0,a.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:l}),k=(()=>{const e=i??p;return m({value:e,tabValues:r})?e:null})();(0,a.useEffect)((()=>{k&&o(k)}),[k]);return{selectedValue:u,selectValue:(0,a.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),s(e),b(e)}),[s,b,r]),tabValues:r}}var k=n(72389);const g="tabList__CuJ",v="tabItem_LNqP";function h(e){let{className:t,block:n,selectedValue:o,selectValue:i,tabValues:s}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,u.o5)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),l=s[n].value;l!==o&&(p(t),i(l))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":n},t)},s.map((e=>{let{value:t,label:n,attributes:u}=e;return a.createElement("li",(0,l.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},u,{className:(0,r.Z)("tabs__item",v,u?.className,{"tabs__item--active":o===t})}),n??t)})))}function N(e){let{lazy:t,children:n,selectedValue:l}=e;if(t){const e=n.find((e=>e.props.value===l));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},n.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function y(e){const t=b(e);return a.createElement("div",{className:(0,r.Z)("tabs-container",g)},a.createElement(h,(0,l.Z)({},e,t)),a.createElement(N,(0,l.Z)({},e,t)))}function w(e){const t=(0,k.Z)();return a.createElement(y,(0,l.Z)({key:String(t)},e))}},53179:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var l=n(87462),a=(n(67294),n(3905)),r=n(74866),u=n(85162);const o={title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:5,tags:["Kotlin"]},i=void 0,s={permalink:"/5",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",source:"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",description:"nullable \ud0c0\uc785",date:"2023-01-16T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 16\uc77c",tags:[{label:"Kotlin",permalink:"/tags/kotlin"}],readingTime:4.225,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",slug:"5",tags:["Kotlin"]},prevItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"},nextItem:{title:"JSR-310",permalink:"/4"}},c={authorsImageUrls:[]},p=[{value:"nullable \ud0c0\uc785",id:"nullable-\ud0c0\uc785",level:3},{value:"<code>?.</code> Safe Calls \uc5f0\uc0b0\uc790",id:"-safe-calls-\uc5f0\uc0b0\uc790",level:3},{value:"<code>?:</code> \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790",id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790",level:3},{value:"<code>!!</code> \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790",id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790",level:3},{value:"<code>as?</code> \uc548\uc804\ud55c \uce90\uc2a4\ud305",id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305",level:3},{value:"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac",id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],d={toc:p};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,l.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"nullable-\ud0c0\uc785"},"nullable \ud0c0\uc785"),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 ",(0,a.kt)("inlineCode",{parentName:"p"},"NullPointerException")," \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val number: Int?\n")),(0,a.kt)("p",null,"\ud0c0\uc785 \ub4a4\uc5d0 ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4."),(0,a.kt)("h3",{id:"-safe-calls-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?.")," Safe Calls \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4."),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 ",(0,a.kt)("inlineCode",{parentName:"p"},"?.")," \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public String repeat(String word) {\n if (word == null) {\n return null;\n }\n return word.repeat(2);\n}\n"))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"fun repeat(word: String?): String? {\n return word?.repeat(2)\n}\n")))),(0,a.kt)("h3",{id:"-\uc5d8\ube44\uc2a4-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"?:")," \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4."),(0,a.kt)(r.Z,{mdxType:"Tabs"},(0,a.kt)(u.Z,{value:"Java",label:"Java",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public String stringSafe(String word) {\n if (word == null) {\n return "";\n }\n return word;\n}\n'))),(0,a.kt)(u.Z,{value:"Kotlin",label:"Kotlin",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'fun stringSafe(word: String?): String {\n return word ?: ""\n}\n')))),(0,a.kt)("p",null,"\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"userRepository.findByName(name) ?: throw IllegalArgumentException()\n")),(0,a.kt)("h3",{id:"-\ub110-\uc544\ub2d8-\ub2e8\uc5b8-\uc5f0\uc0b0\uc790"},(0,a.kt)("inlineCode",{parentName:"h3"},"!!")," \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790"),(0,a.kt)("p",null,"!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val length: Int = word!!.length\n")),(0,a.kt)("h3",{id:"as-\uc548\uc804\ud55c-\uce90\uc2a4\ud305"},(0,a.kt)("inlineCode",{parentName:"h3"},"as?")," \uc548\uc804\ud55c \uce90\uc2a4\ud305"),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"ClassCastException"),"\uc774 \ubc1c\uc0dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("p",null,"\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},"val value: Int? = something as? Int\n")),(0,a.kt)("h3",{id:"list\uc5d0\uc11c\uc758-null-\ucc98\ub9ac"},"List\uc5d0\uc11c\uc758 null \ucc98\ub9ac"),(0,a.kt)("p",null,"List\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 ",(0,a.kt)("inlineCode",{parentName:"p"},"filterNotNull")," \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-kotlin"},'val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")\nval foods = foodsWithNull.filterNotNull()\n')),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001804588"},"Kotlin in Action")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001033129"},"Effective Kotlin Item 8")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/kotlin/null-safety"},"Comprehensive Guide to Null Safety in Kotlin")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://kotlinlang.org/docs/null-safety.html"},"Kotlin NullSafety"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a413785b.4378f941.js b/assets/js/a413785b.4378f941.js deleted file mode 100644 index 1ee7d8756..000000000 --- a/assets/js/a413785b.4378f941.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5142],{3905:(e,t,a)=>{a.d(t,{Zo:()=>b,kt:()=>s});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),m=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},b=function(e){var t=m(e.components);return n.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,b=o(e,["components","mdxType","originalType","parentName"]),c=m(a),s=r,u=c["".concat(p,".").concat(s)]||c[s]||d[s]||l;return a?n.createElement(u,i(i({ref:t},b),{},{components:a})):n.createElement(u,i({ref:t},b))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var m=2;m<l;m++)i[m]=a[m];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},4236:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var n=a(7462),r=(a(7294),a(3905));const l={title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:17,tags:["DataBase","Transaction","Isolation"]},i=void 0,o={permalink:"/17",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",source:"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",description:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",date:"2023-04-05T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 5\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Transaction",permalink:"/tags/transaction"},{label:"Isolation",permalink:"/tags/isolation"}],readingTime:9.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:"17",tags:["DataBase","Transaction","Isolation"]},prevItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"},nextItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"}},p={authorsImageUrls:[]},m=[{value:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",id:"\ud2b8\ub79c\uc7ad\uc158transaction",level:2},{value:"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)",id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid",level:3},{value:"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d",id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d",level:3},{value:"\uaca9\ub9ac \uc218\uc900(Isolation level)",id:"\uaca9\ub9ac-\uc218\uc900isolation-level",level:2},{value:"READ UNCOMMITTED",id:"read-uncommitted",level:3},{value:"READ COMMITTED",id:"read-committed",level:3},{value:"REPEATABLE READ",id:"repeatable-read",level:3},{value:"SERIALIZABLE",id:"serializable",level:3},{value:"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c",id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c",level:2},{value:"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)",id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read",level:3},{value:"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)",id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read",level:3},{value:"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)",id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],b={toc:m};function d(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},b,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\ud2b8\ub79c\uc7ad\uc158transaction"},"\ud2b8\ub79c\uc7ad\uc158(Transaction)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid"},"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)"),(0,r.kt)("p",null,"\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d"},"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c)",(0,r.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)"),(0,r.kt)("li",{parentName:"ul"},"\ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)"))),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900isolation-level"},"\uaca9\ub9ac \uc218\uc900(Isolation level)"),(0,r.kt)("p",null,"\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, ",(0,r.kt)("inlineCode",{parentName:"p"},"SERIALIZABLE"),"\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"read-uncommitted"},"READ UNCOMMITTED"),(0,r.kt)("p",null,"\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"ROLLBACK")," \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c ",(0,r.kt)("inlineCode",{parentName:"p"},"READ COMMITTED")," \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ UNCOMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: INSERT(Alice)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: COMMIT(Alice)"}),(0,r.kt)("h3",{id:"read-committed"},"READ COMMITTED"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uba70, \uc628\ub77c\uc778 \uc11c\ube44\uc2a4\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc120\ud0dd\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ"),"\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"NON-REPEATABLE READ")," \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ COMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)\n Alice->>Database: COMMIT"}),(0,r.kt)("h3",{id:"repeatable-read"},"REPEATABLE READ"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. ")),(0,r.kt)("p",null,"InnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)"}),(0,r.kt)("admonition",{title:"\uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.")),(0,r.kt)("admonition",{title:"MVCC(Multi Version Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Oracle, InnoDB\ub294 ",(0,r.kt)("inlineCode",{parentName:"li"},"Undo log"),"\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)")),(0,r.kt)("p",{parentName:"admonition"},"\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.")),(0,r.kt)("h3",{id:"serializable"},"SERIALIZABLE"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. "),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c"},"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("p",null,"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ub354\ud2f0 \ub9ac\ub4dc"),(0,r.kt)("th",{parentName:"tr",align:null},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud32c\ud140 \ub9ac\ub4dc"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ UNCOMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ COMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REPEATABLE READ"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O(InnoDB\ub294 X)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SERIALIZABLE"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X")))),(0,r.kt)("h3",{id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read"},"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)"),(0,r.kt)("p",null,"\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0"),(0,r.kt)("h3",{id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read"},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: NON REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Bob"}),(0,r.kt)("h3",{id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row"},"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: PHANTOM READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 1\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: INSERT(Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 2"}),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html"},"Isolation Level, MySQL")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a413785b.bd413362.js b/assets/js/a413785b.bd413362.js new file mode 100644 index 000000000..360b4789b --- /dev/null +++ b/assets/js/a413785b.bd413362.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5142],{3905:(e,t,a)=>{a.d(t,{Zo:()=>b,kt:()=>s});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),m=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},b=function(e){var t=m(e.components);return n.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,b=o(e,["components","mdxType","originalType","parentName"]),c=m(a),s=r,u=c["".concat(p,".").concat(s)]||c[s]||d[s]||l;return a?n.createElement(u,i(i({ref:t},b),{},{components:a})):n.createElement(u,i({ref:t},b))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var m=2;m<l;m++)i[m]=a[m];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},74236:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var n=a(87462),r=(a(67294),a(3905));const l={title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:17,tags:["DataBase","Transaction","Isolation"]},i=void 0,o={permalink:"/17",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",source:"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",description:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",date:"2023-04-05T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 5\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Transaction",permalink:"/tags/transaction"},{label:"Isolation",permalink:"/tags/isolation"}],readingTime:9.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:"17",tags:["DataBase","Transaction","Isolation"]},prevItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"},nextItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"}},p={authorsImageUrls:[]},m=[{value:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",id:"\ud2b8\ub79c\uc7ad\uc158transaction",level:2},{value:"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)",id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid",level:3},{value:"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d",id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d",level:3},{value:"\uaca9\ub9ac \uc218\uc900(Isolation level)",id:"\uaca9\ub9ac-\uc218\uc900isolation-level",level:2},{value:"READ UNCOMMITTED",id:"read-uncommitted",level:3},{value:"READ COMMITTED",id:"read-committed",level:3},{value:"REPEATABLE READ",id:"repeatable-read",level:3},{value:"SERIALIZABLE",id:"serializable",level:3},{value:"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c",id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c",level:2},{value:"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)",id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read",level:3},{value:"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)",id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read",level:3},{value:"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)",id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],b={toc:m};function d(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},b,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\ud2b8\ub79c\uc7ad\uc158transaction"},"\ud2b8\ub79c\uc7ad\uc158(Transaction)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid"},"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)"),(0,r.kt)("p",null,"\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d"},"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c)",(0,r.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)"),(0,r.kt)("li",{parentName:"ul"},"\ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)"))),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900isolation-level"},"\uaca9\ub9ac \uc218\uc900(Isolation level)"),(0,r.kt)("p",null,"\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, ",(0,r.kt)("inlineCode",{parentName:"p"},"SERIALIZABLE"),"\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"read-uncommitted"},"READ UNCOMMITTED"),(0,r.kt)("p",null,"\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"ROLLBACK")," \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c ",(0,r.kt)("inlineCode",{parentName:"p"},"READ COMMITTED")," \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ UNCOMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: INSERT(Alice)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: COMMIT(Alice)"}),(0,r.kt)("h3",{id:"read-committed"},"READ COMMITTED"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uba70, \uc628\ub77c\uc778 \uc11c\ube44\uc2a4\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc120\ud0dd\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ"),"\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"NON-REPEATABLE READ")," \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ COMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)\n Alice->>Database: COMMIT"}),(0,r.kt)("h3",{id:"repeatable-read"},"REPEATABLE READ"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. ")),(0,r.kt)("p",null,"InnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)"}),(0,r.kt)("admonition",{title:"\uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.")),(0,r.kt)("admonition",{title:"MVCC(Multi Version Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Oracle, InnoDB\ub294 ",(0,r.kt)("inlineCode",{parentName:"li"},"Undo log"),"\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)")),(0,r.kt)("p",{parentName:"admonition"},"\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.")),(0,r.kt)("h3",{id:"serializable"},"SERIALIZABLE"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. "),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c"},"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("p",null,"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ub354\ud2f0 \ub9ac\ub4dc"),(0,r.kt)("th",{parentName:"tr",align:null},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud32c\ud140 \ub9ac\ub4dc"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ UNCOMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ COMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REPEATABLE READ"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O(InnoDB\ub294 X)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SERIALIZABLE"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X")))),(0,r.kt)("h3",{id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read"},"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)"),(0,r.kt)("p",null,"\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0"),(0,r.kt)("h3",{id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read"},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: NON REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Bob"}),(0,r.kt)("h3",{id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row"},"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: PHANTOM READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 1\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: INSERT(Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 2"}),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html"},"Isolation Level, MySQL")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a43f2942.1ae0a8ca.js b/assets/js/a43f2942.1ae0a8ca.js deleted file mode 100644 index 74895e433..000000000 --- a/assets/js/a43f2942.1ae0a8ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[104],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),f=l(r),d=a,m=f["".concat(c,".").concat(d)]||f[d]||u[d]||o;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l<o;l++)i[l]=r[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},7894:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const o={title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",tags:["test"]},i=void 0,s={unversionedId:"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",id:"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",description:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)",source:"@site/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8.mdx",sourceDirName:"\ud14c\uc2a4\ud2b8",slug:"/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",permalink:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8.mdx",tags:[{label:"test",permalink:"/docs/tags/test"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",tags:["test"]},sidebar:"tutorialSidebar",previous:{title:"\ud328\ud0a4\uc9c0",permalink:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0"},next:{title:"TDD heuristics",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59"}},c={},l=[{value:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)",id:"\uacc4\ub2e8-\ud14c\uc2a4\ud2b8stairstep-test",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],p={toc:l};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uacc4\ub2e8-\ud14c\uc2a4\ud2b8stairstep-test"},"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)"),(0,a.kt)("p",null,"\ucd94\ud6c4\uc5d0 \ud544\uc694\ub85c \ud560 \ud074\ub798\uc2a4, \ud568\uc218, \ub2e4\ub978 \uad6c\uc870\ub97c \ub9cc\ub4e4\ub3c4\ub85d \uac15\uc81c\ud558\uae30 \uc704\ud574 \uc791\uc131\ud558\ub294 \ud14c\uc2a4\ud2b8",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ubb34\ub7f0 \ub2e8\uc815\ubb38\uc774 \uc5c6\uc744 \uc218\ub3c4 \uc788\uace0, \uae30\ub2a5\uc774 \uc870\uae08 \ub354 \uad6c\ud604\ub41c\ub2e4\uba74 \uc81c\uac70\ud558\uace0 \ud3ec\uad04\uc801\uc778 \ud14c\uc2a4\ud2b8\ub85c \ub300\uc2e0\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf5\uc7a1\ub3c4\ub97c \ud544\uc694\ud55c \uc218\uc900\uae4c\uc9c0 \uc810\uc9c4\uc801\uc73c\ub85c \uc99d\uac00\uc2dc\ud0ac \uc218 \uc788\uac8c \ub3c4\uc640\uc8fc\ub294 \uacc4\ub2e8 \uc5ed\ud560\uc744 \ud558\uae30 \ub54c\ubb38\uc5d0 \uacc4\ub2e8 \ud14c\uc2a4\ud2b8\ub77c\uace0 \ubd80\ub978\ub2e4. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 p.74"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a43f2942.31658ee0.js b/assets/js/a43f2942.31658ee0.js new file mode 100644 index 000000000..cb3789c62 --- /dev/null +++ b/assets/js/a43f2942.31658ee0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[104],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),f=l(r),d=a,m=f["".concat(c,".").concat(d)]||f[d]||u[d]||o;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l<o;l++)i[l]=r[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},7894:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(87462),a=(r(67294),r(3905));const o={title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",tags:["test"]},i=void 0,s={unversionedId:"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",id:"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",description:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)",source:"@site/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8.mdx",sourceDirName:"\ud14c\uc2a4\ud2b8",slug:"/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",permalink:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8.mdx",tags:[{label:"test",permalink:"/docs/tags/test"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8",tags:["test"]},sidebar:"tutorialSidebar",previous:{title:"\ud328\ud0a4\uc9c0",permalink:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0"},next:{title:"TDD heuristics",permalink:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59"}},c={},l=[{value:"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)",id:"\uacc4\ub2e8-\ud14c\uc2a4\ud2b8stairstep-test",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],p={toc:l};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uacc4\ub2e8-\ud14c\uc2a4\ud2b8stairstep-test"},"\uacc4\ub2e8 \ud14c\uc2a4\ud2b8(Stairstep Test)"),(0,a.kt)("p",null,"\ucd94\ud6c4\uc5d0 \ud544\uc694\ub85c \ud560 \ud074\ub798\uc2a4, \ud568\uc218, \ub2e4\ub978 \uad6c\uc870\ub97c \ub9cc\ub4e4\ub3c4\ub85d \uac15\uc81c\ud558\uae30 \uc704\ud574 \uc791\uc131\ud558\ub294 \ud14c\uc2a4\ud2b8",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ubb34\ub7f0 \ub2e8\uc815\ubb38\uc774 \uc5c6\uc744 \uc218\ub3c4 \uc788\uace0, \uae30\ub2a5\uc774 \uc870\uae08 \ub354 \uad6c\ud604\ub41c\ub2e4\uba74 \uc81c\uac70\ud558\uace0 \ud3ec\uad04\uc801\uc778 \ud14c\uc2a4\ud2b8\ub85c \ub300\uc2e0\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf5\uc7a1\ub3c4\ub97c \ud544\uc694\ud55c \uc218\uc900\uae4c\uc9c0 \uc810\uc9c4\uc801\uc73c\ub85c \uc99d\uac00\uc2dc\ud0ac \uc218 \uc788\uac8c \ub3c4\uc640\uc8fc\ub294 \uacc4\ub2e8 \uc5ed\ud560\uc744 \ud558\uae30 \ub54c\ubb38\uc5d0 \uacc4\ub2e8 \ud14c\uc2a4\ud2b8\ub77c\uace0 \ubd80\ub978\ub2e4. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 p.74"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a4a1e915.0fc33612.js b/assets/js/a4a1e915.0fc33612.js new file mode 100644 index 000000000..eaacdee50 --- /dev/null +++ b/assets/js/a4a1e915.0fc33612.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3671],{60166:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective","page":1,"postsPerPage":1,"totalPages":15,"totalCount":15,"nextPage":"/tags/retrospective/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a4a1e915.221e2a42.js b/assets/js/a4a1e915.221e2a42.js deleted file mode 100644 index ebdcd2200..000000000 --- a/assets/js/a4a1e915.221e2a42.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3671],{166:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective","page":1,"postsPerPage":1,"totalPages":15,"totalCount":15,"nextPage":"/tags/retrospective/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a5557bb9.912b4b2f.js b/assets/js/a5557bb9.912b4b2f.js deleted file mode 100644 index 8a9d3d6d1..000000000 --- a/assets/js/a5557bb9.912b4b2f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5991],{3885:e=>{e.exports=JSON.parse('{"permalink":"/","page":1,"postsPerPage":1,"totalPages":40,"totalCount":40,"nextPage":"/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a5557bb9.d0f17dfb.js b/assets/js/a5557bb9.d0f17dfb.js new file mode 100644 index 000000000..abc5d5105 --- /dev/null +++ b/assets/js/a5557bb9.d0f17dfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5991],{93885:e=>{e.exports=JSON.parse('{"permalink":"/","page":1,"postsPerPage":1,"totalPages":41,"totalCount":41,"nextPage":"/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a571ae8c.e0419b3c.js b/assets/js/a571ae8c.e0419b3c.js deleted file mode 100644 index 662787143..000000000 --- a/assets/js/a571ae8c.e0419b3c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1329],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||u[k]||p;return r?n.createElement(b,o(o({ref:t},m),{},{components:r})):n.createElement(b,o({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=s;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c<p;c++)o[c]=r[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}s.displayName="MDXCreateElement"},7999:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:10,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/10",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",description:"\ube14\ub799\uc7ad",date:"2023-03-14T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.105,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:"10",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"},nextItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"}},i={authorsImageUrls:[]},c=[{value:"\ube14\ub799\uc7ad",id:"\ube14\ub799\uc7ad",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ube14\ub799\uc7ad"},"\ube14\ub799\uc7ad"),(0,a.kt)("p",null,"\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. "),(0,a.kt)("p",null,"\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",'"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?" '),(0,a.kt)("p",null,"\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. "),(0,a.kt)("p",null,"\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uccb4\ub825 \uad00\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0c1\ud0dc \ud328\ud134"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0dd\uac01 \uc815\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a571ae8c.f11626e0.js b/assets/js/a571ae8c.f11626e0.js new file mode 100644 index 000000000..27891d5f1 --- /dev/null +++ b/assets/js/a571ae8c.f11626e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1329],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||u[k]||p;return r?n.createElement(b,o(o({ref:t},m),{},{components:r})):n.createElement(b,o({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=s;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c<p;c++)o[c]=r[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}s.displayName="MDXCreateElement"},7999:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:10,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/10",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",description:"\ube14\ub799\uc7ad",date:"2023-03-14T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:5.105,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",slug:"10",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"},nextItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"}},i={authorsImageUrls:[]},c=[{value:"\ube14\ub799\uc7ad",id:"\ube14\ub799\uc7ad",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ube14\ub799\uc7ad"},"\ube14\ub799\uc7ad"),(0,a.kt)("p",null,"\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. "),(0,a.kt)("p",null,"\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n",'"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?" '),(0,a.kt)("p",null,"\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. "),(0,a.kt)("p",null,"\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uccb4\ub825 \uad00\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0c1\ud0dc \ud328\ud134"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0dd\uac01 \uc815\ub9ac"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a5b179f0.4d2e8fd3.js b/assets/js/a5b179f0.4d2e8fd3.js deleted file mode 100644 index 214ca2e3f..000000000 --- a/assets/js/a5b179f0.4d2e8fd3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9761],{3905:(e,t,l)=>{l.d(t,{Zo:()=>c,kt:()=>m});var n=l(7294);function r(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function a(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,n)}return l}function o(e){for(var t=1;t<arguments.length;t++){var l=null!=arguments[t]?arguments[t]:{};t%2?a(Object(l),!0).forEach((function(t){r(e,t,l[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(l)):a(Object(l)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(l,t))}))}return e}function i(e,t){if(null==e)return{};var l,n,r=function(e,t){if(null==e)return{};var l,n,r={},a=Object.keys(e);for(n=0;n<a.length;n++)l=a[n],t.indexOf(l)>=0||(r[l]=e[l]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)l=a[n],t.indexOf(l)>=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),l=t;return e&&(l="function"==typeof e?e(t):o(o({},t),e)),l},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var l=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(l),m=r,d=s["".concat(p,".").concat(m)]||s[m]||k[m]||a;return l?n.createElement(d,o(o({ref:t},c),{},{components:l})):n.createElement(d,o({ref:t},c))}));function m(e,t){var l=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=l.length,o=new Array(a);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var u=2;u<a;u++)o[u]=l[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,l)}s.displayName="MDXCreateElement"},7971:(e,t,l)=>{l.r(t),l.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>k,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var n=l(7462),r=(l(7294),l(3905));const a={title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:11,tags:["GRASP","OOP"]},o=void 0,i={permalink:"/11",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-30-GRASP.mdx",source:"@site/blog/2023/2023-03-30-GRASP.mdx",title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",description:"GRASP(General Responsibility Assignment Software Pattern)",date:"2023-03-30T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 30\uc77c",tags:[{label:"GRASP",permalink:"/tags/grasp"},{label:"OOP",permalink:"/tags/oop"}],readingTime:8.085,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:"11",tags:["GRASP","OOP"]},prevItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"},nextItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"}},p={authorsImageUrls:[]},u=[{value:"GRASP(General Responsibility Assignment Software Pattern)",id:"graspgeneral-responsibility-assignment-software-pattern",level:3},{value:"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)",id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert",level:3},{value:"\ucc3d\uc870\uc790 \ud328\ud134(Creator)",id:"\ucc3d\uc870\uc790-\ud328\ud134creator",level:3},{value:"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)",id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling",level:3},{value:"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)",id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion",level:3},{value:"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)",id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller",level:3},{value:"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)",id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism",level:3},{value:"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)",id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations",level:3},{value:"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)",id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection",level:3},{value:"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)",id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:u};function k(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"graspgeneral-responsibility-assignment-software-pattern"},"GRASP(General Responsibility Assignment Software Pattern)"),(0,r.kt)("p",null,"\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134"),(0,r.kt)("p",null,"\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert"},"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)"),(0,r.kt)("p",null,"Q: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?"),(0,r.kt)("p",null,"A: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\ucc3d\uc870\uc790-\ud328\ud134creator"},"\ucc3d\uc870\uc790 \ud328\ud134(Creator)"),(0,r.kt)("p",null,"Q: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?"),(0,r.kt)("p",null,"A: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.")),(0,r.kt)("p",null,"\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)"),(0,r.kt)("p",null,"Q: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?"),(0,r.kt)("p",null,"A: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uacb0\ud569\ub3c4(Coupling)\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.17"))),(0,r.kt)("p",null,"\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)")),(0,r.kt)("h3",{id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion"},"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uc751\uc9d1\ub3c4(Cohesion)\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.26"))),(0,r.kt)("p",null,"\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)"),(0,r.kt)("li",{parentName:"ul"},"\uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.")),(0,r.kt)("h3",{id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller"},"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)"),(0,r.kt)("p",null,"Q. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?"),(0,r.kt)("p",null,"A. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("p",null,"\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.")),(0,r.kt)("h3",{id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism"},"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)"),(0,r.kt)("p",null,"\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4."),(0,r.kt)("p",null,"\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations"},"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)"),(0,r.kt)("p",null,"Q. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?"),(0,r.kt)("p",null,"A. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection"},"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)"),(0,r.kt)("p",null,"Q. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication"},"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)"),(0,r.kt)("p",null,"Q. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("p",null,"\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, ",(0,r.kt)("a",{parentName:"p",href:"http://aeternum.egloos.com/"},"\uc870\uc601\ud638")),(0,r.kt)("p",null,"Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397"},"GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a5b179f0.9026f1ba.js b/assets/js/a5b179f0.9026f1ba.js new file mode 100644 index 000000000..a96b6342b --- /dev/null +++ b/assets/js/a5b179f0.9026f1ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9761],{3905:(e,t,l)=>{l.d(t,{Zo:()=>c,kt:()=>m});var n=l(67294);function r(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function a(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,n)}return l}function o(e){for(var t=1;t<arguments.length;t++){var l=null!=arguments[t]?arguments[t]:{};t%2?a(Object(l),!0).forEach((function(t){r(e,t,l[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(l)):a(Object(l)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(l,t))}))}return e}function i(e,t){if(null==e)return{};var l,n,r=function(e,t){if(null==e)return{};var l,n,r={},a=Object.keys(e);for(n=0;n<a.length;n++)l=a[n],t.indexOf(l)>=0||(r[l]=e[l]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)l=a[n],t.indexOf(l)>=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),l=t;return e&&(l="function"==typeof e?e(t):o(o({},t),e)),l},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var l=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(l),m=r,d=s["".concat(p,".").concat(m)]||s[m]||k[m]||a;return l?n.createElement(d,o(o({ref:t},c),{},{components:l})):n.createElement(d,o({ref:t},c))}));function m(e,t){var l=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=l.length,o=new Array(a);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var u=2;u<a;u++)o[u]=l[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,l)}s.displayName="MDXCreateElement"},77971:(e,t,l)=>{l.r(t),l.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>k,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var n=l(87462),r=(l(67294),l(3905));const a={title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:11,tags:["GRASP","OOP"]},o=void 0,i={permalink:"/11",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-30-GRASP.mdx",source:"@site/blog/2023/2023-03-30-GRASP.mdx",title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",description:"GRASP(General Responsibility Assignment Software Pattern)",date:"2023-03-30T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 30\uc77c",tags:[{label:"GRASP",permalink:"/tags/grasp"},{label:"OOP",permalink:"/tags/oop"}],readingTime:8.085,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",slug:"11",tags:["GRASP","OOP"]},prevItem:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",permalink:"/12"},nextItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"}},p={authorsImageUrls:[]},u=[{value:"GRASP(General Responsibility Assignment Software Pattern)",id:"graspgeneral-responsibility-assignment-software-pattern",level:3},{value:"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)",id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert",level:3},{value:"\ucc3d\uc870\uc790 \ud328\ud134(Creator)",id:"\ucc3d\uc870\uc790-\ud328\ud134creator",level:3},{value:"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)",id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling",level:3},{value:"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)",id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion",level:3},{value:"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)",id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller",level:3},{value:"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)",id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism",level:3},{value:"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)",id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations",level:3},{value:"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)",id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection",level:3},{value:"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)",id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:u};function k(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"graspgeneral-responsibility-assignment-software-pattern"},"GRASP(General Responsibility Assignment Software Pattern)"),(0,r.kt)("p",null,"\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134"),(0,r.kt)("p",null,"\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uc815\ubcf4-\uc804\ubb38\uac00-\ud328\ud134information-expert"},"\uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)"),(0,r.kt)("p",null,"Q: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?"),(0,r.kt)("p",null,"A: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\ucc3d\uc870\uc790-\ud328\ud134creator"},"\ucc3d\uc870\uc790 \ud328\ud134(Creator)"),(0,r.kt)("p",null,"Q: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?"),(0,r.kt)("p",null,"A: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.")),(0,r.kt)("p",null,"\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ub0ae\uc740-\uacb0\ud569\ub3c4-\ud328\ud134low-coupling"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)"),(0,r.kt)("p",null,"Q: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?"),(0,r.kt)("p",null,"A: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uacb0\ud569\ub3c4(Coupling)\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.17"))),(0,r.kt)("p",null,"\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)")),(0,r.kt)("h3",{id:"\ub192\uc740-\uc751\uc9d1\ub3c4-\ud328\ud134high-cohesion"},"\ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\uc751\uc9d1\ub3c4(Cohesion)\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4."),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"\uc624\ube0c\uc81d\ud2b8 p.26"))),(0,r.kt)("p",null,"\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)"),(0,r.kt)("li",{parentName:"ul"},"\uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.")),(0,r.kt)("h3",{id:"\ucee8\ud2b8\ub864\ub7ec-\ud328\ud134controller"},"\ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)"),(0,r.kt)("p",null,"Q. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?"),(0,r.kt)("p",null,"A. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("p",null,"\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.")),(0,r.kt)("h3",{id:"\ub2e4\ud615\uc131-\ud328\ud134polymorphism"},"\ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)"),(0,r.kt)("p",null,"Q. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)"),(0,r.kt)("p",null,"\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4."),(0,r.kt)("p",null,"\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\ubcc0\uacbd-\ubcf4\ud638-\ud328\ud134protected-variations"},"\ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)"),(0,r.kt)("p",null,"Q. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?"),(0,r.kt)("p",null,"A. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\uac04\uc811-\ucc38\uc870-\ud328\ud134indirection"},"\uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)"),(0,r.kt)("p",null,"Q. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4."),(0,r.kt)("h3",{id:"\uc21c\uc218\ud55c-\uac00\uacf5\ubb3c-\ud328\ud134pure-fabrication"},"\uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)"),(0,r.kt)("p",null,"Q. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?"),(0,r.kt)("p",null,"A. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,"\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4."),(0,r.kt)("p",null,"\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4."),(0,r.kt)("p",null,"\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"\ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, ",(0,r.kt)("a",{parentName:"p",href:"http://aeternum.egloos.com/"},"\uc870\uc601\ud638")),(0,r.kt)("p",null,"Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397"},"GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.7b54bae2.js b/assets/js/a6aa9e1f.7b54bae2.js new file mode 100644 index 000000000..c9e01f764 --- /dev/null +++ b/assets/js/a6aa9e1f.7b54bae2.js @@ -0,0 +1 @@ +(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3089],{80046:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>p});var n=a(67294),r=a(86010),i=a(52263),s=a(10833),o=a(35281),l=a(39058),c=a(99703),u=a(90197),m=a(79985);function g(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,i.Z)(),{blogDescription:r,blogTitle:o,permalink:l}=t,c="/"===l?a:o;return n.createElement(n.Fragment,null,n.createElement(s.d,{title:c,description:r}),n.createElement(u.Z,{tag:"blog_posts_list"}))}function d(e){const{metadata:t,items:a,sidebar:r}=e;return n.createElement(l.Z,{sidebar:r},n.createElement(m.Z,{items:a}),n.createElement(c.Z,{metadata:t}))}function p(e){return n.createElement(s.FG,{className:(0,r.Z)(o.k.wrapper.blogPages,o.k.page.blogListPage)},n.createElement(g,e),n.createElement(d,e))}},99703:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});var n=a(67294),r=a(95999),i=a(32244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,r.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(i.Z,{permalink:a,title:n.createElement(r.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(i.Z,{permalink:s,title:n.createElement(r.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},79985:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});var n=a(67294),r=a(9460),i=a(857);function s(e){let{items:t,component:a=i.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(r.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},857:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});var n=a(30390),r=a(67294),i=a(92949),s=a(9460);const o=function(e){const{colorMode:t}=(0,i.I)(),{isBlogPostPage:a}=(0,s.C)(),o="dark"===t?"dark":"light",l=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(!a)return;const e=l.current.querySelector("iframe.giscus-frame");e?(()=>{const t={setConfig:{theme:o}};e.contentWindow.postMessage({giscus:t},"https://giscus.app")})():(()=>{const e=document.createElement("script");e.src="https://giscus.app/client.js",e.setAttribute("data-repo","greeng00se/greeng00se.github.io"),e.setAttribute("data-repo-id","R_kgDOIRAC3w"),e.setAttribute("data-category","Announcements"),e.setAttribute("data-category-id","DIC_kwDOIRAC384CTcGg"),e.setAttribute("data-mapping","pathname"),e.setAttribute("data-strict","0"),e.setAttribute("data-reactions-enabled","1"),e.setAttribute("data-emit-metadata","0"),e.setAttribute("data-input-position","bottom"),e.setAttribute("data-theme",o),e.setAttribute("data-lang","ko"),e.crossOrigin="anonymous",e.async=!0,l.current.appendChild(e)})()}),[o]),r.createElement(r.Fragment,null,r.createElement(n.Z,e),a&&r.createElement("div",{ref:l}))}},11748:(e,t,a)=>{var n={"./locale":89234,"./locale.js":89234};function r(e){var t=i(e);return a(t)}function i(e){if(!a.o(n,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return n[e]}r.keys=function(){return Object.keys(n)},r.resolve=i,e.exports=r,r.id=11748}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.b3e1566e.js b/assets/js/a6aa9e1f.b3e1566e.js deleted file mode 100644 index 0b3f801f3..000000000 --- a/assets/js/a6aa9e1f.b3e1566e.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3089],{46:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>p});var n=a(7294),r=a(6010),i=a(2263),s=a(833),o=a(5281),l=a(9058),c=a(9703),u=a(197),m=a(9985);function g(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,i.Z)(),{blogDescription:r,blogTitle:o,permalink:l}=t,c="/"===l?a:o;return n.createElement(n.Fragment,null,n.createElement(s.d,{title:c,description:r}),n.createElement(u.Z,{tag:"blog_posts_list"}))}function d(e){const{metadata:t,items:a,sidebar:r}=e;return n.createElement(l.Z,{sidebar:r},n.createElement(m.Z,{items:a}),n.createElement(c.Z,{metadata:t}))}function p(e){return n.createElement(s.FG,{className:(0,r.Z)(o.k.wrapper.blogPages,o.k.page.blogListPage)},n.createElement(g,e),n.createElement(d,e))}},9703:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});var n=a(7294),r=a(5999),i=a(2244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,r.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(i.Z,{permalink:a,title:n.createElement(r.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(i.Z,{permalink:s,title:n.createElement(r.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{"use strict";a.d(t,{Z:()=>s});var n=a(7294),r=a(9460),i=a(857);function s(e){let{items:t,component:a=i.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(r.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},857:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});var n=a(390),r=a(7294),i=a(2949),s=a(9460);const o=function(e){const{colorMode:t}=(0,i.I)(),{isBlogPostPage:a}=(0,s.C)(),o="dark"===t?"dark":"light",l=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(!a)return;const e=l.current.querySelector("iframe.giscus-frame");e?(()=>{const t={setConfig:{theme:o}};e.contentWindow.postMessage({giscus:t},"https://giscus.app")})():(()=>{const e=document.createElement("script");e.src="https://giscus.app/client.js",e.setAttribute("data-repo","greeng00se/greeng00se.github.io"),e.setAttribute("data-repo-id","R_kgDOIRAC3w"),e.setAttribute("data-category","Announcements"),e.setAttribute("data-category-id","DIC_kwDOIRAC384CTcGg"),e.setAttribute("data-mapping","pathname"),e.setAttribute("data-strict","0"),e.setAttribute("data-reactions-enabled","1"),e.setAttribute("data-emit-metadata","0"),e.setAttribute("data-input-position","bottom"),e.setAttribute("data-theme",o),e.setAttribute("data-lang","ko"),e.crossOrigin="anonymous",e.async=!0,l.current.appendChild(e)})()}),[o]),r.createElement(r.Fragment,null,r.createElement(n.Z,e),a&&r.createElement("div",{ref:l}))}},1748:(e,t,a)=>{var n={"./locale":9234,"./locale.js":9234};function r(e){var t=i(e);return a(t)}function i(e){if(!a.o(n,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return n[e]}r.keys=function(){return Object.keys(n)},r.resolve=i,e.exports=r,r.id=1748}}]); \ No newline at end of file diff --git a/assets/js/a85e626a.14258449.js b/assets/js/a85e626a.14258449.js new file mode 100644 index 000000000..856a75322 --- /dev/null +++ b/assets/js/a85e626a.14258449.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9092],{48458:e=>{e.exports=JSON.parse('{"label":"JDBC","permalink":"/tags/jdbc","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/a85e626a.9c3a5752.js b/assets/js/a85e626a.9c3a5752.js deleted file mode 100644 index 2517e194c..000000000 --- a/assets/js/a85e626a.9c3a5752.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9092],{8458:e=>{e.exports=JSON.parse('{"label":"JDBC","permalink":"/tags/jdbc","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/a896be03.6e674e35.js b/assets/js/a896be03.6e674e35.js new file mode 100644 index 000000000..7c4fe8e2c --- /dev/null +++ b/assets/js/a896be03.6e674e35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2526],{64030:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/a896be03.e9f0961e.js b/assets/js/a896be03.e9f0961e.js deleted file mode 100644 index 3f20157f0..000000000 --- a/assets/js/a896be03.e9f0961e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2526],{4030:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/a9221bd5.1e1fec7d.js b/assets/js/a9221bd5.1e1fec7d.js deleted file mode 100644 index 3864883e9..000000000 --- a/assets/js/a9221bd5.1e1fec7d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5507],{319:e=>{e.exports=JSON.parse('{"permalink":"/tags/inno-db","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a9221bd5.3bfa9f2c.js b/assets/js/a9221bd5.3bfa9f2c.js new file mode 100644 index 000000000..01d4cdf64 --- /dev/null +++ b/assets/js/a9221bd5.3bfa9f2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5507],{40319:e=>{e.exports=JSON.parse('{"permalink":"/tags/inno-db","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ab2128e5.4f40f26a.js b/assets/js/ab2128e5.4f40f26a.js deleted file mode 100644 index a80d06f82..000000000 --- a/assets/js/ab2128e5.4f40f26a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7921],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>d});var a=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?s(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):s(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,i=function(e,n){if(null==e)return{};var t,a,i={},s=Object.keys(e);for(a=0;a<s.length;a++)t=s[a],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a<s.length;a++)t=s[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var o=a.createContext({}),p=function(e){var n=a.useContext(o),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(o.Provider,{value:n},e.children)},k={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,i=e.mdxType,s=e.originalType,o=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(t),d=i,m=u["".concat(o,".").concat(d)]||u[d]||k[d]||s;return t?a.createElement(m,r(r({ref:n},c),{},{components:t})):a.createElement(m,r({ref:n},c))}));function d(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var s=t.length,r=new Array(s);r[0]=u;var l={};for(var o in n)hasOwnProperty.call(n,o)&&(l[o]=n[o]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p<s;p++)r[p]=t[p];return a.createElement.apply(null,r)}return a.createElement.apply(null,t)}u.displayName="MDXCreateElement"},5914:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>k,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var a=t(7462),i=(t(7294),t(3905));const s={title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:22,tags:["Jenkins","Elastic Beanstalk"]},r=void 0,l={permalink:"/22",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",source:"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",title:"Jenkins\ub85c CI/CD \uc124\uc815",description:"\uc124\uc815 \ud658\uacbd",date:"2023-04-30T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 30\uc77c",tags:[{label:"Jenkins",permalink:"/tags/jenkins"},{label:"Elastic Beanstalk",permalink:"/tags/elastic-beanstalk"}],readingTime:7.495,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:"22",tags:["Jenkins","Elastic Beanstalk"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"},nextItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"}},o={authorsImageUrls:[]},p=[{value:"\uc124\uc815 \ud658\uacbd",id:"\uc124\uc815-\ud658\uacbd",level:3},{value:"[EC2 CLI] Swap \uba54\ubaa8\ub9ac \uc124\uc815",id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815",level:3},{value:"[EC2 CLI] jenkins \uc124\uce58",id:"ec2-cli-jenkins-\uc124\uce58",level:3},{value:"[EC2 CLI] Jenkins \uc2dc\uc791",id:"ec2-cli-jenkins-\uc2dc\uc791",level:3},{value:"[EC2 CLI] nginx & git \uc124\uce58",id:"ec2-cli-nginx--git-\uc124\uce58",level:3},{value:"[EC2 CLI] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815",id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815",level:3},{value:"[Jenkins] Jenkins \uc811\uc18d",id:"jenkins-jenkins-\uc811\uc18d",level:3},{value:"[Jenkins] Jenkins Blue Ocean \uc124\uce58",id:"jenkins-jenkins-blue-ocean-\uc124\uce58",level:3},{value:"[AWS IAM & EC2] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30",id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30",level:3},{value:"[AWS S3] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131",id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131",level:3},{value:"[Github] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131",id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131",level:3},{value:"[Jenkins] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791",id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791",level:3},{value:"[Github Repsoitory] Jenkinsfile \uc124\uc815",id:"github-repsoitory-jenkinsfile-\uc124\uc815",level:3},{value:"[Github] Webhooks \uc124\uc815",id:"github-webhooks-\uc124\uc815",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:p};function k(e){let{components:n,...s}=e;return(0,i.kt)("wrapper",(0,a.Z)({},c,s,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"\uc124\uc815-\ud658\uacbd"},"\uc124\uc815 \ud658\uacbd"),(0,i.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ud0a4\ud14d\uccd0: ARM",(0,i.kt)("br",{parentName:"p"}),"\n","\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small",(0,i.kt)("br",{parentName:"p"}),"\n","\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk",(0,i.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository"),(0,i.kt)("h3",{id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815"},"[","EC2 CLI","]"," Swap \uba54\ubaa8\ub9ac \uc124\uc815"),(0,i.kt)("p",null,"t4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\nsudo fallocate -l 2G /swapfile\n\n# \uad8c\ud55c \uc124\uc815\nsudo chmod 600 /swapfile\n\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\nsudo mkswap /swapfile\nsudo swapon /swapfile\n\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\nsudo vim /etc/fstab\n")),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc124\uce58"},"[","EC2 CLI","]"," jenkins \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo wget -O /etc/yum.repos.d/jenkins.repo \\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\nsudo yum upgrade\nsudo yum install java-17-amazon-corretto-devel\nsudo yum install jenkins\nsudo systemctl daemon-reload\n")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0")," \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc2dc\uc791"},"[","EC2 CLI","]"," Jenkins \uc2dc\uc791"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl enable jenkins\nsudo systemctl start jenkins\n")),(0,i.kt)("p",null,"enable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx--git-\uc124\uce58"},"[","EC2 CLI","]"," nginx & git \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo yum install nginx\nsudo systemctl enable nginx\nsudo systemctl start nginx\n\nsudo yum install git\n")),(0,i.kt)("p",null,"nginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815"},"[","EC2 CLI","]"," nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815"),(0,i.kt)("p",null,"\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'upstream jenkins {\n keepalive 32; # keepalive connections\n server 127.0.0.1:8080; # jenkins ip and port\n}\n\n# Required for Jenkins websocket agents\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n \'\' close;\n}\n\nserver {\n listen 80; # Listen on port 80 for IPv4 requests\n\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\n\n # this is the jenkins web root directory\n # (mentioned in the output of "systemctl cat jenkins")\n root /var/run/jenkins/war/;\n\n access_log /var/log/nginx/jenkins.access.log;\n error_log /var/log/nginx/jenkins.error.log;\n\n # pass through headers from Jenkins that Nginx considers invalid\n ignore_invalid_headers off;\n\n location ~ "^/static/[0-9a-fA-F]{8}\\/(.*)$" {\n # rewrite all static files into requests to the root\n # E.g /static/12345678/css/something.css will become /css/something.css\n rewrite "^/static/[0-9a-fA-F]{8}\\/(.*)" /$1 last;\n }\n\n location /userContent {\n # have nginx handle all the static requests to userContent folder\n # note : This is the $JENKINS_HOME dir\n root /var/lib/jenkins/;\n if (!-f $request_filename){\n # this file does not exist, might be a directory or a /**view** url\n rewrite (.*) /$1 last;\n break;\n }\n sendfile on;\n }\n\n location / {\n sendfile off;\n proxy_pass http://jenkins;\n proxy_redirect default;\n proxy_http_version 1.1;\n\n # Required for Jenkins websocket agents\n proxy_set_header Connection $connection_upgrade;\n proxy_set_header Upgrade $http_upgrade;\n\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_max_temp_file_size 0;\n\n #this is the maximum upload size\n client_max_body_size 10m;\n client_body_buffer_size 128k;\n\n proxy_connect_timeout 90;\n proxy_send_timeout 90;\n proxy_read_timeout 90;\n proxy_buffering off;\n proxy_request_buffering off; # Required for HTTP CLI commands\n proxy_set_header Connection ""; # Clear for keepalive\n }\n\n}\n')),(0,i.kt)("p",null,"Jenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d"),"\xa0\uc544\ub798\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"default.conf"),"\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","nginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"include /etc/nginx/conf.d/*.conf;"),"\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0",(0,i.kt)("inlineCode",{parentName:"p"},".conf"),"\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc124\uc815 \ud6c4\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo nginx -t"),"\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo systemctl restart nginx"),"\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-\uc811\uc18d"},"[","Jenkins","]"," Jenkins \uc811\uc18d"),(0,i.kt)("p",null,"Jenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","EC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-start",src:t(3374).Z,width:"2008",height:"1836"})),(0,i.kt)("p",null,"\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo cat /var/lib/jenkins/secrets/initialAdminPasswor")," \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"install suggested plugins"),"\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-blue-ocean-\uc124\uce58"},"[","Jenkins","]"," Jenkins Blue Ocean \uc124\uce58"),(0,i.kt)("p",null,"Jenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30"},"[","AWS IAM & EC2","]"," IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30"),(0,i.kt)("p",null,"S3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","IAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"\uc5d4\ud130\ud2f0 \uc120\ud0dd")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam1",src:t(2994).Z,width:"2282",height:"1028"})),(0,i.kt)("ol",{start:2},(0,i.kt)("li",{parentName:"ol"},"\uad8c\ud55c \ucd94\uac00")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam2",src:t(7345).Z,width:"2300",height:"880"})),(0,i.kt)("ol",{start:3},(0,i.kt)("li",{parentName:"ol"},"\uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam3",src:t(2542).Z,width:"1872",height:"1724"})),(0,i.kt)("ol",{start:4},(0,i.kt)("li",{parentName:"ol"},"\uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam4",src:t(333).Z,width:"2264",height:"602"})),(0,i.kt)("h3",{id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131"},"[","AWS S3","]"," Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131"),(0,i.kt)("p",null,"\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8"))),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-s3",src:t(3649).Z,width:"1636",height:"1258"})),(0,i.kt)("h3",{id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131"},"[","Github","]"," Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131"),(0,i.kt)("p",null,"repo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791"},"[","Jenkins","]"," \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean1",src:t(4590).Z,width:"2390",height:"1372"})),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","Jenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean2",src:t(9685).Z,width:"2076",height:"638"})),(0,i.kt)("p",null,"\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean3",src:t(658).Z,width:"1084",height:"626"})),(0,i.kt)("h3",{id:"github-repsoitory-jenkinsfile-\uc124\uc815"},"[","Github Repsoitory","]"," Jenkinsfile \uc124\uc815"),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pipeline {\n agent any\n stages {\n stage('build and test') {\n steps {\n sh '/gradlew clean build'\n }\n }\n stage('zip') {\n steps {\n sh 'mv ./build/libs/woowachat.jar .'\n sh 'zip -r woowachat.zip .platform delivery.jar Procfile'\n }\n }\n stage('upload') {\n steps {\n sh 'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2'\n }\n }\n stage('deploy') {\n steps {\n sh 'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\"woowa-chat\",S3Key=\"woowachat.zip\"'\n sh 'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}'\n }\n }\n }\n}\n")),(0,i.kt)("h3",{id:"github-webhooks-\uc124\uc815"},"[","Github","]"," Webhooks \uc124\uc815"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"github-hook",src:t(2326).Z,width:"1428",height:"1148"})),(0,i.kt)("p",null,"push \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c ",(0,i.kt)("inlineCode",{parentName:"p"},"http://Jenkins\uc8fc\uc18c/github-webhook/")," \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Install Jenkins - CentOS, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/"},"Nginx Reverse Proxy Configuration, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html"},"Amazon Corretto 17 JDK Install, AWS"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html"},"Amazon Linux 2023 packages, AWS")))}k.isMDXComponent=!0},2994:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam1-e6d63be6b9f41d63e91d604138e6b07c.png"},7345:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam2-557683fc91b1c22330d081d6050dfe82.png"},2542:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam3-94248e9194dd58bb16d0289af47a4260.png"},333:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam4-54ccc5a4e64d31f7eeab89d39ebf772f.png"},3649:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-s3-757380d36e5492c962f75dae024994e5.png"},2326:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/github-hook-e9ebe0acb3ff0086ecebbd8c857ffe39.png"},4590:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean1-bd108d887d700ea081e4b0a3d83ad459.png"},9685:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean2-408c6c90e4a5371becc4d1013fba1212.png"},658:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean3-4050a206b3efe95a3c9f39c3f7a47ad7.png"},3374:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-start-dce0d7051054c398d2a707c75c685234.png"}}]); \ No newline at end of file diff --git a/assets/js/ab2128e5.aa615b26.js b/assets/js/ab2128e5.aa615b26.js new file mode 100644 index 000000000..b13a64e71 --- /dev/null +++ b/assets/js/ab2128e5.aa615b26.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7921],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>d});var a=t(67294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?s(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):s(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,i=function(e,n){if(null==e)return{};var t,a,i={},s=Object.keys(e);for(a=0;a<s.length;a++)t=s[a],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a<s.length;a++)t=s[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var o=a.createContext({}),p=function(e){var n=a.useContext(o),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(o.Provider,{value:n},e.children)},k={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,i=e.mdxType,s=e.originalType,o=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(t),d=i,m=u["".concat(o,".").concat(d)]||u[d]||k[d]||s;return t?a.createElement(m,r(r({ref:n},c),{},{components:t})):a.createElement(m,r({ref:n},c))}));function d(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var s=t.length,r=new Array(s);r[0]=u;var l={};for(var o in n)hasOwnProperty.call(n,o)&&(l[o]=n[o]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p<s;p++)r[p]=t[p];return a.createElement.apply(null,r)}return a.createElement.apply(null,t)}u.displayName="MDXCreateElement"},55914:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>k,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var a=t(87462),i=(t(67294),t(3905));const s={title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:22,tags:["Jenkins","Elastic Beanstalk"]},r=void 0,l={permalink:"/22",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",source:"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",title:"Jenkins\ub85c CI/CD \uc124\uc815",description:"\uc124\uc815 \ud658\uacbd",date:"2023-04-30T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 30\uc77c",tags:[{label:"Jenkins",permalink:"/tags/jenkins"},{label:"Elastic Beanstalk",permalink:"/tags/elastic-beanstalk"}],readingTime:7.495,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Jenkins\ub85c CI/CD \uc124\uc815",slug:"22",tags:["Jenkins","Elastic Beanstalk"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"},nextItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"}},o={authorsImageUrls:[]},p=[{value:"\uc124\uc815 \ud658\uacbd",id:"\uc124\uc815-\ud658\uacbd",level:3},{value:"[EC2 CLI] Swap \uba54\ubaa8\ub9ac \uc124\uc815",id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815",level:3},{value:"[EC2 CLI] jenkins \uc124\uce58",id:"ec2-cli-jenkins-\uc124\uce58",level:3},{value:"[EC2 CLI] Jenkins \uc2dc\uc791",id:"ec2-cli-jenkins-\uc2dc\uc791",level:3},{value:"[EC2 CLI] nginx & git \uc124\uce58",id:"ec2-cli-nginx--git-\uc124\uce58",level:3},{value:"[EC2 CLI] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815",id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815",level:3},{value:"[Jenkins] Jenkins \uc811\uc18d",id:"jenkins-jenkins-\uc811\uc18d",level:3},{value:"[Jenkins] Jenkins Blue Ocean \uc124\uce58",id:"jenkins-jenkins-blue-ocean-\uc124\uce58",level:3},{value:"[AWS IAM & EC2] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30",id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30",level:3},{value:"[AWS S3] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131",id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131",level:3},{value:"[Github] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131",id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131",level:3},{value:"[Jenkins] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791",id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791",level:3},{value:"[Github Repsoitory] Jenkinsfile \uc124\uc815",id:"github-repsoitory-jenkinsfile-\uc124\uc815",level:3},{value:"[Github] Webhooks \uc124\uc815",id:"github-webhooks-\uc124\uc815",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:p};function k(e){let{components:n,...s}=e;return(0,i.kt)("wrapper",(0,a.Z)({},c,s,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"\uc124\uc815-\ud658\uacbd"},"\uc124\uc815 \ud658\uacbd"),(0,i.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ud0a4\ud14d\uccd0: ARM",(0,i.kt)("br",{parentName:"p"}),"\n","\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small",(0,i.kt)("br",{parentName:"p"}),"\n","\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk",(0,i.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository"),(0,i.kt)("h3",{id:"ec2-cli-swap-\uba54\ubaa8\ub9ac-\uc124\uc815"},"[","EC2 CLI","]"," Swap \uba54\ubaa8\ub9ac \uc124\uc815"),(0,i.kt)("p",null,"t4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\nsudo fallocate -l 2G /swapfile\n\n# \uad8c\ud55c \uc124\uc815\nsudo chmod 600 /swapfile\n\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\nsudo mkswap /swapfile\nsudo swapon /swapfile\n\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\nsudo vim /etc/fstab\n")),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc124\uce58"},"[","EC2 CLI","]"," jenkins \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo wget -O /etc/yum.repos.d/jenkins.repo \\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\nsudo yum upgrade\nsudo yum install java-17-amazon-corretto-devel\nsudo yum install jenkins\nsudo systemctl daemon-reload\n")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0")," \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-jenkins-\uc2dc\uc791"},"[","EC2 CLI","]"," Jenkins \uc2dc\uc791"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl enable jenkins\nsudo systemctl start jenkins\n")),(0,i.kt)("p",null,"enable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx--git-\uc124\uce58"},"[","EC2 CLI","]"," nginx & git \uc124\uce58"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo yum install nginx\nsudo systemctl enable nginx\nsudo systemctl start nginx\n\nsudo yum install git\n")),(0,i.kt)("p",null,"nginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"ec2-cli-nginx-\ub9ac\ubc84\uc2a4-\ud504\ub85d\uc2dc-\uc124\uc815"},"[","EC2 CLI","]"," nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815"),(0,i.kt)("p",null,"\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'upstream jenkins {\n keepalive 32; # keepalive connections\n server 127.0.0.1:8080; # jenkins ip and port\n}\n\n# Required for Jenkins websocket agents\nmap $http_upgrade $connection_upgrade {\n default upgrade;\n \'\' close;\n}\n\nserver {\n listen 80; # Listen on port 80 for IPv4 requests\n\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\n\n # this is the jenkins web root directory\n # (mentioned in the output of "systemctl cat jenkins")\n root /var/run/jenkins/war/;\n\n access_log /var/log/nginx/jenkins.access.log;\n error_log /var/log/nginx/jenkins.error.log;\n\n # pass through headers from Jenkins that Nginx considers invalid\n ignore_invalid_headers off;\n\n location ~ "^/static/[0-9a-fA-F]{8}\\/(.*)$" {\n # rewrite all static files into requests to the root\n # E.g /static/12345678/css/something.css will become /css/something.css\n rewrite "^/static/[0-9a-fA-F]{8}\\/(.*)" /$1 last;\n }\n\n location /userContent {\n # have nginx handle all the static requests to userContent folder\n # note : This is the $JENKINS_HOME dir\n root /var/lib/jenkins/;\n if (!-f $request_filename){\n # this file does not exist, might be a directory or a /**view** url\n rewrite (.*) /$1 last;\n break;\n }\n sendfile on;\n }\n\n location / {\n sendfile off;\n proxy_pass http://jenkins;\n proxy_redirect default;\n proxy_http_version 1.1;\n\n # Required for Jenkins websocket agents\n proxy_set_header Connection $connection_upgrade;\n proxy_set_header Upgrade $http_upgrade;\n\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_max_temp_file_size 0;\n\n #this is the maximum upload size\n client_max_body_size 10m;\n client_body_buffer_size 128k;\n\n proxy_connect_timeout 90;\n proxy_send_timeout 90;\n proxy_read_timeout 90;\n proxy_buffering off;\n proxy_request_buffering off; # Required for HTTP CLI commands\n proxy_set_header Connection ""; # Clear for keepalive\n }\n\n}\n')),(0,i.kt)("p",null,"Jenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d"),"\xa0\uc544\ub798\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"default.conf"),"\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","nginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"include /etc/nginx/conf.d/*.conf;"),"\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0",(0,i.kt)("inlineCode",{parentName:"p"},".conf"),"\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\uc124\uc815 \ud6c4\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo nginx -t"),"\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"sudo systemctl restart nginx"),"\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-\uc811\uc18d"},"[","Jenkins","]"," Jenkins \uc811\uc18d"),(0,i.kt)("p",null,"Jenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","EC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-start",src:t(83374).Z,width:"2008",height:"1836"})),(0,i.kt)("p",null,"\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo cat /var/lib/jenkins/secrets/initialAdminPasswor")," \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 ",(0,i.kt)("inlineCode",{parentName:"p"},"install suggested plugins"),"\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-jenkins-blue-ocean-\uc124\uce58"},"[","Jenkins","]"," Jenkins Blue Ocean \uc124\uce58"),(0,i.kt)("p",null,"Jenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4."),(0,i.kt)("h3",{id:"aws-iam--ec2-iam\uc73c\ub85c-ec2-\uc778\uc2a4\ud134\uc2a4-\uad8c\ud55c-\uc124\uc815\ud558\uae30"},"[","AWS IAM & EC2","]"," IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30"),(0,i.kt)("p",null,"S3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","IAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"\uc5d4\ud130\ud2f0 \uc120\ud0dd")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam1",src:t(82994).Z,width:"2282",height:"1028"})),(0,i.kt)("ol",{start:2},(0,i.kt)("li",{parentName:"ol"},"\uad8c\ud55c \ucd94\uac00")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam2",src:t(67345).Z,width:"2300",height:"880"})),(0,i.kt)("ol",{start:3},(0,i.kt)("li",{parentName:"ol"},"\uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam3",src:t(30328).Z,width:"1872",height:"1724"})),(0,i.kt)("ol",{start:4},(0,i.kt)("li",{parentName:"ol"},"\uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-iam4",src:t(30290).Z,width:"2264",height:"602"})),(0,i.kt)("h3",{id:"aws-s3-jar-\ud30c\uc77c\uc744-\uc5c5\ub85c\ub4dc-\ud560-s3-\ubc84\ud0b7-\uc0dd\uc131"},"[","AWS S3","]"," Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131"),(0,i.kt)("p",null,"\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8"))),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"aws-s3",src:t(63649).Z,width:"1636",height:"1258"})),(0,i.kt)("h3",{id:"github-blue-ocean\uc5d0\uc11c-\ud30c\uc774\ud504\ub77c\uc778-\uc0dd\uc131\uc5d0-\ud544\uc694\ud55c-github-token-\uc0dd\uc131"},"[","Github","]"," Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131"),(0,i.kt)("p",null,"repo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. "),(0,i.kt)("h3",{id:"jenkins-\ube14\ub8e8-\uc624\uc158-\uc2dc\uc791"},"[","Jenkins","]"," \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean1",src:t(34590).Z,width:"2390",height:"1372"})),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","Jenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean2",src:t(69685).Z,width:"2076",height:"638"})),(0,i.kt)("p",null,"\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"jenkins-blue-ocean3",src:t(60658).Z,width:"1084",height:"626"})),(0,i.kt)("h3",{id:"github-repsoitory-jenkinsfile-\uc124\uc815"},"[","Github Repsoitory","]"," Jenkinsfile \uc124\uc815"),(0,i.kt)("p",null,"\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pipeline {\n agent any\n stages {\n stage('build and test') {\n steps {\n sh '/gradlew clean build'\n }\n }\n stage('zip') {\n steps {\n sh 'mv ./build/libs/woowachat.jar .'\n sh 'zip -r woowachat.zip .platform delivery.jar Procfile'\n }\n }\n stage('upload') {\n steps {\n sh 'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2'\n }\n }\n stage('deploy') {\n steps {\n sh 'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\"woowa-chat\",S3Key=\"woowachat.zip\"'\n sh 'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}'\n }\n }\n }\n}\n")),(0,i.kt)("h3",{id:"github-webhooks-\uc124\uc815"},"[","Github","]"," Webhooks \uc124\uc815"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"github-hook",src:t(2326).Z,width:"1428",height:"1148"})),(0,i.kt)("p",null,"push \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c ",(0,i.kt)("inlineCode",{parentName:"p"},"http://Jenkins\uc8fc\uc18c/github-webhook/")," \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4."),(0,i.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos"},"Install Jenkins - CentOS, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/"},"Nginx Reverse Proxy Configuration, Jenkins"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html"},"Amazon Corretto 17 JDK Install, AWS"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html"},"Amazon Linux 2023 packages, AWS")))}k.isMDXComponent=!0},82994:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam1-e6d63be6b9f41d63e91d604138e6b07c.png"},67345:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam2-557683fc91b1c22330d081d6050dfe82.png"},30328:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam3-94248e9194dd58bb16d0289af47a4260.png"},30290:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-iam4-54ccc5a4e64d31f7eeab89d39ebf772f.png"},63649:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/aws-s3-757380d36e5492c962f75dae024994e5.png"},2326:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/github-hook-e9ebe0acb3ff0086ecebbd8c857ffe39.png"},34590:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean1-bd108d887d700ea081e4b0a3d83ad459.png"},69685:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean2-408c6c90e4a5371becc4d1013fba1212.png"},60658:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-blue-ocean3-4050a206b3efe95a3c9f39c3f7a47ad7.png"},83374:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/jenkins-start-dce0d7051054c398d2a707c75c685234.png"}}]); \ No newline at end of file diff --git a/assets/js/abb0816f.02d8af89.js b/assets/js/abb0816f.02d8af89.js deleted file mode 100644 index 72e11d467..000000000 --- a/assets/js/abb0816f.02d8af89.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4174],{2969:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/7","page":7,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/6","nextPage":"/tags/woowahan-techcourse/page/8","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/abb0816f.f85866a6.js b/assets/js/abb0816f.f85866a6.js new file mode 100644 index 000000000..263aa5a46 --- /dev/null +++ b/assets/js/abb0816f.f85866a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4174],{82969:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/7","page":7,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/6","nextPage":"/tags/woowahan-techcourse/page/8","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ac23d7ee.7ae18010.js b/assets/js/ac23d7ee.7ae18010.js new file mode 100644 index 000000000..aa5b8381e --- /dev/null +++ b/assets/js/ac23d7ee.7ae18010.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3213],{43943:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/3","page":3,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/2","nextPage":"/tags/woowahan-techcourse/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ac23d7ee.e12a8152.js b/assets/js/ac23d7ee.e12a8152.js deleted file mode 100644 index fdf3f286a..000000000 --- a/assets/js/ac23d7ee.e12a8152.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3213],{3943:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/3","page":3,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/2","nextPage":"/tags/woowahan-techcourse/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ae1d6508.7207778d.js b/assets/js/ae1d6508.7207778d.js deleted file mode 100644 index d1c33f505..000000000 --- a/assets/js/ae1d6508.7207778d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2181],{3486:e=>{e.exports=JSON.parse('{"permalink":"/tags/composite","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/3972c49f.cb768b45.js b/assets/js/ae1d6508.f635198e.js similarity index 50% rename from assets/js/3972c49f.cb768b45.js rename to assets/js/ae1d6508.f635198e.js index 67cc71ba2..cb6d52524 100644 --- a/assets/js/3972c49f.cb768b45.js +++ b/assets/js/ae1d6508.f635198e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6629],{1782:e=>{e.exports=JSON.parse('{"permalink":"/tags/web-socket","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2181],{83486:e=>{e.exports=JSON.parse('{"permalink":"/tags/composite","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ae3384b2.0c83fa76.js b/assets/js/ae3384b2.0c83fa76.js deleted file mode 100644 index 979c9ffd8..000000000 --- a/assets/js/ae3384b2.0c83fa76.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2965],{5745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/ae3384b2.95cb14ea.js b/assets/js/ae3384b2.95cb14ea.js new file mode 100644 index 000000000..c8808f1b1 --- /dev/null +++ b/assets/js/ae3384b2.95cb14ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2965],{15745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/ae6a2dc6.1f9afce8.js b/assets/js/ae6a2dc6.1f9afce8.js new file mode 100644 index 000000000..46547e526 --- /dev/null +++ b/assets/js/ae6a2dc6.1f9afce8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7374],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>d});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),g=u(n),d=r,c=g["".concat(s,".").concat(d)]||g[d]||p[d]||i;return n?a.createElement(c,o(o({ref:t},m),{},{components:n})):a.createElement(c,o({ref:t},m))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,o[1]=l;for(var u=2;u<i;u++)o[u]=n[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}g.displayName="MDXCreateElement"},98532:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const i={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:39,tags:["image","awt"]},o=void 0,l={permalink:"/39",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",source:"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",description:"\uac1c\uc694",date:"2023-08-02T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 2\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:11.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:"39",tags:["image","awt"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",permalink:"/40"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"}},s={authorsImageUrls:[]},u=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uad6c\ud604 \uacb0\uacfc",id:"\uad6c\ud604-\uacb0\uacfc",level:3},{value:"IMAGE_SIZE & ROUTE_SIZE",id:"image_size--route_size",level:3},{value:"\uc8fc\uc694 \ud074\ub798\uc2a4",id:"\uc8fc\uc694-\ud074\ub798\uc2a4",level:2},{value:"\uc694\uc57d",id:"\uc694\uc57d",level:3},{value:"\uc758\uc874\uad00\uacc4",id:"\uc758\uc874\uad00\uacc4",level:3},{value:"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)",id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158",level:3},{value:"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)",id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58",level:3},{value:"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)",id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4",level:3},{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow",level:2},{value:"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44",id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44",level:3},{value:"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad",id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad",id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"4. \uc5c5\ub85c\ub4dc \uc694\uccad",id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad",level:3},{value:"\uc804\uccb4 Flow",id:"\uc804\uccb4-flow",level:3}],m={toc:u};function p(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"./36"},"\ub9c1\ud06c"),"\uc5d0 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uad6c\ud604-\uacb0\uacfc"},"\uad6c\ud604 \uacb0\uacfc"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./result.png",src:n(10452).Z,width:"1840",height:"714"})),(0,r.kt)("p",null,"\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"\uc11c\uc6b8\uc5ed(\uc810)")," \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 ",(0,r.kt)("strong",{parentName:"p"},"\uad6c\ub85c\uc5ed(\uc810)")," \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="\uc608\uc2dc \ub370\uc774\ud130"',title:'"\uc608\uc2dc','\ub370\uc774\ud130"':!0},"List<Double> x = List.of(\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\n);\nList<Double> y = List.of(\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\n);\nList<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);\nList<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);\n")),(0,r.kt)("h3",{id:"image_size--route_size"},"IMAGE_SIZE & ROUTE_SIZE"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator.java"',title:'"RouteImageGenerator.java"'},"private static final int IMAGE_SIZE = 800;\nprivate static final int ROUTE_SIZE = 600;\n")),(0,r.kt)("p",null,"\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc774\ubbf8\uc9c0 \ud06c\uae30\uc640 \uacbd\ub85c \ud06c\uae30\uac00 \uc788\uc2b5\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \ud06c\uae30\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \ud06c\uae30\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uadf8\ub824\uc9c0\ub294 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./600.png",src:n(35804).Z,width:"976",height:"970"})),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720")),(0,r.kt)("p",null,"255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370 \ud654\uc9c8\uc774 \ub108\ubb34 \uc548\uc88b\uc544\uc11c 800\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc8fc\uc694-\ud074\ub798\uc2a4"},"\uc8fc\uc694 \ud074\ub798\uc2a4"),(0,r.kt)("h3",{id:"\uc694\uc57d"},"\uc694\uc57d"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\ud074\ub798\uc2a4\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud2b9\uc774\uc0ac\ud56d"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc Point\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinates"),(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Position"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Positions"),(0,r.kt)("td",{parentName:"tr",align:null},"Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageDrawer"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageUploader"),(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageGenerator"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Graphics2D(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc"),(0,r.kt)("td",{parentName:"tr",align:null},"JDK1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131")))),(0,r.kt)("h3",{id:"\uc758\uc874\uad00\uacc4"},"\uc758\uc874\uad00\uacc4"),(0,r.kt)("mermaid",{value:'graph TD\n C1[Coordinates] --\x3e C[Coordinate]\n P1[Positions] --\x3e P[Position]\n\n\tRID[RouteImageDrawer] -- "\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131" --\x3e P1\n\tRID --\x3e B[BufferedImage]\n\tRID --\x3e G[Graphics2D]\n\n\tC1 -- "calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0" --\x3e P1\n\n\tRIU[RouteImageUploader] --\x3e B\n\tRIG[RouteImageGenerator] --\x3e RID\n\tRIG --\x3e RIU\n\tRIG --\x3e C1\n\tRIG --\x3e P1'}),(0,r.kt)("h3",{id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158"},"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"List<Double>")," 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Coordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658"),(0,r.kt)("li",{parentName:"ul"},"indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 ")),(0,r.kt)("p",null,"Positions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Coordinates.java"',title:'"Coordinates.java"'},"// \ud638\ucd9c\n// List<Integer> xPositions = toPositions(xValues, maxDifference, routeImageSize);\n// List<Integer> yPositions = toPositions(yValues, maxDifference, routeImageSize);\n\nprivate List<Integer> toPositions(List<Double> values, Double maxDifference, Integer routeImageSize) {\n Double minValue = Collections.min(values);\n return values.stream()\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\n .map(value -> mapToPosition(value, routeImageSize))\n .toList();\n}\n\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\n return (coordinate - minValue) / maxDifference;\n}\n\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\n return (int) (coordinate * routeImageSize);\n}\n")),(0,r.kt)("p",null,"\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Collections.min(values) \u2192 \uc704\ub3c4\ub97c \ubc1b\uc544 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"normalizeCoordinate \u2192 \uac01 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 ",(0,r.kt)("strong",{parentName:"li"},"\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774"),"\ub85c \ub098\ub208\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58"},"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)"),(0,r.kt)("p",null,"Positions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Positions.java"',title:'"Positions.java"'},"public Positions align(int imageSize, int routeSize) {\n int xOffset = calculateOffset(Position::x, imageSize);\n int yOffset = calculateOffset(Position::y, imageSize);\n\n return items.stream()\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\n .collect(collectingAndThen(toList(), Positions::new));\n}\n\nprivate int calculateOffset(ToIntFunction<Position> positionToInteger, int imageSize) {\n List<Integer> positions = items.stream()\n .mapToInt(positionToInteger)\n .boxed()\n .toList();\n\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\n return imageSize / 2 - midValue;\n}\n")),(0,r.kt)("p",null,"\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","BufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./800.png",src:n(3959).Z,width:"968",height:"978"})),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4."),(0,r.kt)("p",null,"x \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","y \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. "),(0,r.kt)("h3",{id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4"},"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)"),(0,r.kt)("p",null,"BufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageDrawer.java"',title:'"RouteImageDrawer.java"'},"// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\n// \ubc30\uacbd \ud22c\uba85\uc0c9\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\nprivate static final int LINE_STROKE_WIDTH = 7;\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\nprivate static final int POINT_STROKE_WIDTH = 20;\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8\uc774 \uc548\uc88b\uc740 \uc774\ubbf8\uc9c0\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud55c \uc124\uc815\nprivate static final Map<Object, Object> renderingHints = Map.of(\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\n);\n")),(0,r.kt)("p",null,"RouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. ")),(0,r.kt)("p",null,"dispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4."),(0,r.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow"),(0,r.kt)("h3",{id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44"},"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n"}),(0,r.kt)("h3",{id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad"},"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad"},"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad"},"4. \uc5c5\ub85c\ub4dc \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n \tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n \tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658"}),(0,r.kt)("h3",{id:"\uc804\uccb4-flow"},"\uc804\uccb4 Flow"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n\t"}))}p.isMDXComponent=!0},35804:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/600-50ee65176288cb73d2c777d255460f4f.png"},3959:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/800-88542ba3914ad40b45b999e95df96cdf.png"},10452:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/result-c2887223d62510a96c9c8f733bf5edf6.png"}}]); \ No newline at end of file diff --git a/assets/js/ae6a2dc6.e92617ec.js b/assets/js/ae6a2dc6.e92617ec.js deleted file mode 100644 index 9a030dbd0..000000000 --- a/assets/js/ae6a2dc6.e92617ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7374],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>d});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),g=u(n),d=r,c=g["".concat(s,".").concat(d)]||g[d]||p[d]||i;return n?a.createElement(c,o(o({ref:t},m),{},{components:n})):a.createElement(c,o({ref:t},m))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,o[1]=l;for(var u=2;u<i;u++)o[u]=n[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}g.displayName="MDXCreateElement"},8532:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const i={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:39,tags:["image","awt"]},o=void 0,l={permalink:"/39",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",source:"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",description:"\uac1c\uc694",date:"2023-08-02T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 2\uc77c",tags:[{label:"image",permalink:"/tags/image"},{label:"awt",permalink:"/tags/awt"}],readingTime:11.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",slug:"39",tags:["image","awt"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",permalink:"/40"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"}},s={authorsImageUrls:[]},u=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:2},{value:"\uad6c\ud604 \uacb0\uacfc",id:"\uad6c\ud604-\uacb0\uacfc",level:3},{value:"IMAGE_SIZE & ROUTE_SIZE",id:"image_size--route_size",level:3},{value:"\uc8fc\uc694 \ud074\ub798\uc2a4",id:"\uc8fc\uc694-\ud074\ub798\uc2a4",level:2},{value:"\uc694\uc57d",id:"\uc694\uc57d",level:3},{value:"\uc758\uc874\uad00\uacc4",id:"\uc758\uc874\uad00\uacc4",level:3},{value:"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)",id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158",level:3},{value:"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)",id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58",level:3},{value:"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)",id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4",level:3},{value:"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow",id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow",level:2},{value:"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44",id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44",level:3},{value:"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad",id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad",id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad",level:3},{value:"4. \uc5c5\ub85c\ub4dc \uc694\uccad",id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad",level:3},{value:"\uc804\uccb4 Flow",id:"\uc804\uccb4-flow",level:3}],m={toc:u};function p(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,a.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"./36"},"\ub9c1\ud06c"),"\uc5d0 \uc788\ub2e4."),(0,r.kt)("h3",{id:"\uad6c\ud604-\uacb0\uacfc"},"\uad6c\ud604 \uacb0\uacfc"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./result.png",src:n(452).Z,width:"1840",height:"714"})),(0,r.kt)("p",null,"\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("strong",{parentName:"p"},"\uc11c\uc6b8\uc5ed(\uc810)")," \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 ",(0,r.kt)("strong",{parentName:"p"},"\uad6c\ub85c\uc5ed(\uc810)")," \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="\uc608\uc2dc \ub370\uc774\ud130"',title:'"\uc608\uc2dc','\ub370\uc774\ud130"':!0},"List<Double> x = List.of(\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\n);\nList<Double> y = List.of(\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\n);\nList<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);\nList<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);\n")),(0,r.kt)("h3",{id:"image_size--route_size"},"IMAGE_SIZE & ROUTE_SIZE"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageGenerator.java"',title:'"RouteImageGenerator.java"'},"private static final int IMAGE_SIZE = 800;\nprivate static final int ROUTE_SIZE = 600;\n")),(0,r.kt)("p",null,"\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc774\ubbf8\uc9c0 \ud06c\uae30\uc640 \uacbd\ub85c \ud06c\uae30\uac00 \uc788\uc2b5\ub2c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \ud06c\uae30\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \ud06c\uae30\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uadf8\ub824\uc9c0\ub294 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./600.png",src:n(5804).Z,width:"976",height:"970"})),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720")),(0,r.kt)("p",null,"255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370 \ud654\uc9c8\uc774 \ub108\ubb34 \uc548\uc88b\uc544\uc11c 800\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc8fc\uc694-\ud074\ub798\uc2a4"},"\uc8fc\uc694 \ud074\ub798\uc2a4"),(0,r.kt)("h3",{id:"\uc694\uc57d"},"\uc694\uc57d"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\ud074\ub798\uc2a4\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud2b9\uc774\uc0ac\ud56d"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc Point\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Coordinates"),(0,r.kt)("td",{parentName:"tr",align:null},"Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Position"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12"),(0,r.kt)("td",{parentName:"tr",align:null},"Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Positions"),(0,r.kt)("td",{parentName:"tr",align:null},"Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageDrawer"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageUploader"),(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RouteImageGenerator"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"BufferedImage(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Graphics2D(AWT)"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc"),(0,r.kt)("td",{parentName:"tr",align:null},"JDK1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131")))),(0,r.kt)("h3",{id:"\uc758\uc874\uad00\uacc4"},"\uc758\uc874\uad00\uacc4"),(0,r.kt)("mermaid",{value:'graph TD\n C1[Coordinates] --\x3e C[Coordinate]\n P1[Positions] --\x3e P[Position]\n\n\tRID[RouteImageDrawer] -- "\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131" --\x3e P1\n\tRID --\x3e B[BufferedImage]\n\tRID --\x3e G[Graphics2D]\n\n\tC1 -- "calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0" --\x3e P1\n\n\tRIU[RouteImageUploader] --\x3e B\n\tRIG[RouteImageGenerator] --\x3e RID\n\tRIG --\x3e RIU\n\tRIG --\x3e C1\n\tRIG --\x3e P1'}),(0,r.kt)("h3",{id:"coordinates\uc704\ub3c4-\uacbd\ub3c4\uc758-\uc77c\uae09-\uceec\ub809\uc158"},"Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"List<Double>")," 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Coordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658"),(0,r.kt)("li",{parentName:"ul"},"indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 ")),(0,r.kt)("p",null,"Positions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Coordinates.java"',title:'"Coordinates.java"'},"// \ud638\ucd9c\n// List<Integer> xPositions = toPositions(xValues, maxDifference, routeImageSize);\n// List<Integer> yPositions = toPositions(yValues, maxDifference, routeImageSize);\n\nprivate List<Integer> toPositions(List<Double> values, Double maxDifference, Integer routeImageSize) {\n Double minValue = Collections.min(values);\n return values.stream()\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\n .map(value -> mapToPosition(value, routeImageSize))\n .toList();\n}\n\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\n return (coordinate - minValue) / maxDifference;\n}\n\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\n return (int) (coordinate * routeImageSize);\n}\n")),(0,r.kt)("p",null,"\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Collections.min(values) \u2192 \uc704\ub3c4\ub97c \ubc1b\uc544 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"normalizeCoordinate \u2192 \uac01 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 ",(0,r.kt)("strong",{parentName:"li"},"\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774"),"\ub85c \ub098\ub208\ub2e4."),(0,r.kt)("li",{parentName:"ol"},"mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.")),(0,r.kt)("h3",{id:"positions\uc2e4\uc81c-\uc774\ubbf8\uc9c0-\uc0dd\uc131\uc5d0-\uc0ac\uc6a9\ud560-\uc704\uce58"},"Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)"),(0,r.kt)("p",null,"Positions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.")),(0,r.kt)("p",null,"\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="Positions.java"',title:'"Positions.java"'},"public Positions align(int imageSize, int routeSize) {\n int xOffset = calculateOffset(Position::x, imageSize);\n int yOffset = calculateOffset(Position::y, imageSize);\n\n return items.stream()\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\n .collect(collectingAndThen(toList(), Positions::new));\n}\n\nprivate int calculateOffset(ToIntFunction<Position> positionToInteger, int imageSize) {\n List<Integer> positions = items.stream()\n .mapToInt(positionToInteger)\n .boxed()\n .toList();\n\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\n return imageSize / 2 - midValue;\n}\n")),(0,r.kt)("p",null,"\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","BufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./800.png",src:n(3959).Z,width:"968",height:"978"})),(0,r.kt)("p",null,"\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4."),(0,r.kt)("p",null,"x \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","y \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. "),(0,r.kt)("h3",{id:"routeimagedrawer\uc2e4\uc81c-\uc774\ubbf8\uc9c0\uc5d0-\uacbd\ub85c\ub97c-\uadf8\ub824\uc8fc\ub294-\ud074\ub798\uc2a4"},"RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)"),(0,r.kt)("p",null,"BufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java",metastring:'title="RouteImageDrawer.java"',title:'"RouteImageDrawer.java"'},"// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\n// \ubc30\uacbd \ud22c\uba85\uc0c9\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\nprivate static final int LINE_STROKE_WIDTH = 7;\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\nprivate static final int POINT_STROKE_WIDTH = 20;\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8\uc774 \uc548\uc88b\uc740 \uc774\ubbf8\uc9c0\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud55c \uc124\uc815\nprivate static final Map<Object, Object> renderingHints = Map.of(\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\n);\n")),(0,r.kt)("p",null,"RouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. ")),(0,r.kt)("p",null,"dispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4."),(0,r.kt)("h2",{id:"\uc774\ubbf8\uc9c0-\uc0dd\uc131-flow"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow"),(0,r.kt)("h3",{id:"1-\uc774\ubbf8\uc9c0-\uc0dd\uc131-\uc900\ube44"},"1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n"}),(0,r.kt)("h3",{id:"2-\uc120-\uadf8\ub9ac\uae30-\uc694\uccad"},"2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"3-\uc704\uce58-\uc810-\uadf8\ub9ac\uae30-\uc694\uccad"},"3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad"}),(0,r.kt)("h3",{id:"4-\uc5c5\ub85c\ub4dc-\uc694\uccad"},"4. \uc5c5\ub85c\ub4dc \uc694\uccad"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n \tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n \tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658"}),(0,r.kt)("h3",{id:"\uc804\uccb4-flow"},"\uc804\uccb4 Flow"),(0,r.kt)("mermaid",{value:"sequenceDiagram\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\n\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\n\t"}))}p.isMDXComponent=!0},5804:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/600-50ee65176288cb73d2c777d255460f4f.png"},3959:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/800-88542ba3914ad40b45b999e95df96cdf.png"},452:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/result-c2887223d62510a96c9c8f733bf5edf6.png"}}]); \ No newline at end of file diff --git a/assets/js/af81a133.368d17fb.js b/assets/js/af81a133.368d17fb.js deleted file mode 100644 index 4b7dfb650..000000000 --- a/assets/js/af81a133.368d17fb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7787],{3800:e=>{e.exports=JSON.parse('{"label":"TecoChat","permalink":"/tags/teco-chat","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/af81a133.7821cdd8.js b/assets/js/af81a133.7821cdd8.js new file mode 100644 index 000000000..d896531ac --- /dev/null +++ b/assets/js/af81a133.7821cdd8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7787],{13800:e=>{e.exports=JSON.parse('{"label":"TecoChat","permalink":"/tags/teco-chat","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/b1d2ea98.5e1fa5d1.js b/assets/js/b1d2ea98.5e1fa5d1.js new file mode 100644 index 000000000..498e3c8a9 --- /dev/null +++ b/assets/js/b1d2ea98.5e1fa5d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8533],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,m=c(e,["components","mdxType","originalType","parentName"]),u=p(r),k=a,d=u["".concat(l,".").concat(k)]||u[k]||s[k]||o;return r?n.createElement(d,i(i({ref:t},m),{},{components:r})):n.createElement(d,i({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},8767:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:37,tags:["Mockito","static"]},i=void 0,c={permalink:"/37",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",source:"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",description:"\uac1c\uc694",date:"2023-07-30T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 30\uc77c",tags:[{label:"Mockito",permalink:"/tags/mockito"},{label:"static",permalink:"/tags/static"}],readingTime:2.66,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:"37",tags:["Mockito","static"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"}},l={authorsImageUrls:[]},p=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"Mocking static methods",id:"mocking-static-methods",level:3},{value:"\ub9c8\uce58\uba70",id:"\ub9c8\uce58\uba70",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:p};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. "),(0,a.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public void upload(BufferedImage bufferedImage) {\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\n try {\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\n } catch (IOException e) {\n throw new DrawException(IMAGE_SAVE_FAIL);\n }\n}\n")),(0,a.kt)("h3",{id:"mocking-static-methods"},"Mocking static methods"),(0,a.kt)("p",null,"Mockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. "),(0,a.kt)("p",null,"JUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"// given\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\nRouteImageUploader routeImageUploader = new RouteImageUploader();\n\n// expect\ntry (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {\n routeImageUploader.upload(bufferedImage);\n imageIO.verify(\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\n times(1)\n );\n}\n")),(0,a.kt)("h3",{id:"\ub9c8\uce58\uba70"},"\ub9c8\uce58\uba70"),(0,a.kt)("p",null,"\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uae30 \ub54c\ubb38\uc5d0 \ucd5c\ub300\ud55c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks"},"Mocking static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/mockito-mock-static-methods"},"Mockito mock static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/mockito/mockito/issues/1013"},"Enable mocking static methods in Mockito")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b1d2ea98.60d02b1b.js b/assets/js/b1d2ea98.60d02b1b.js deleted file mode 100644 index d20ade34b..000000000 --- a/assets/js/b1d2ea98.60d02b1b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8533],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,m=c(e,["components","mdxType","originalType","parentName"]),u=p(r),k=a,d=u["".concat(l,".").concat(k)]||u[k]||s[k]||o;return r?n.createElement(d,i(i({ref:t},m),{},{components:r})):n.createElement(d,i({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},9267:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:37,tags:["Mockito","static"]},i=void 0,c={permalink:"/37",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",source:"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",description:"\uac1c\uc694",date:"2023-07-30T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 30\uc77c",tags:[{label:"Mockito",permalink:"/tags/mockito"},{label:"static",permalink:"/tags/static"}],readingTime:2.66,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:"37",tags:["Mockito","static"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"}},l={authorsImageUrls:[]},p=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"Mocking static methods",id:"mocking-static-methods",level:3},{value:"\ub9c8\uce58\uba70",id:"\ub9c8\uce58\uba70",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:p};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. "),(0,a.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public void upload(BufferedImage bufferedImage) {\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\n try {\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\n } catch (IOException e) {\n throw new DrawException(IMAGE_SAVE_FAIL);\n }\n}\n")),(0,a.kt)("h3",{id:"mocking-static-methods"},"Mocking static methods"),(0,a.kt)("p",null,"Mockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. "),(0,a.kt)("p",null,"JUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"// given\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\nRouteImageUploader routeImageUploader = new RouteImageUploader();\n\n// expect\ntry (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {\n routeImageUploader.upload(bufferedImage);\n imageIO.verify(\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\n times(1)\n );\n}\n")),(0,a.kt)("h3",{id:"\ub9c8\uce58\uba70"},"\ub9c8\uce58\uba70"),(0,a.kt)("p",null,"\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uae30 \ub54c\ubb38\uc5d0 \ucd5c\ub300\ud55c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks"},"Mocking static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/mockito-mock-static-methods"},"Mockito mock static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/mockito/mockito/issues/1013"},"Enable mocking static methods in Mockito")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.19bf6f8c.js b/assets/js/b2b675dd.19bf6f8c.js deleted file mode 100644 index 835e53d1a..000000000 --- a/assets/js/b2b675dd.19bf6f8c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[533],{8017:n=>{n.exports=JSON.parse('{"blogPosts":[{"id":"40","metadata":{"permalink":"/40","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","source":"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","description":"\uc774\uc804 \uae00","date":"2023-08-13T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 13\uc77c","tags":[{"label":"async","permalink":"/tags/async"},{"label":"event","permalink":"/tags/event"}],"readingTime":11.2,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","slug":"40","tags":["async","event"]},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/39"}},"content":"## \uc774\uc804 \uae00\\n\\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd](./36) \\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604](./39)\\n\\n## \uac1c\uc694\\n\\n\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120\\n\\n\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4. \\n\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. \\n\\n### \ud655\uc7a5\uc131 \ub300\ube44\\n\\n\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4. \\n\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. \\n\\n## \ube44\ub3d9\uae30 \ucc98\ub9ac\\n\\n@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. \\n\\n### \ube44\ub3d9\uae30 \uc124\uc815\\n\\n\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4. \\n\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. \\n\\n```java title=\\"AsyncConfig\\"\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig {\\n}\\n```\\n\\n\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. \\n\\n> In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\\n> 7.7. Task Execution and Scheduling, Spring Boot Docs\\n\\n### @Async \uc801\uc6a9\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java title=\\"RouteImageGenerator\\"\\n@Async\\npublic void generate(\\n List<Double> latitudes,\\n List<Double> longitudes,\\n List<Double> pointedLatitudes,\\n List<Double> pointedLongitudes,\\n Long tripId\\n) {\\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\\n\\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\\n\\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\\n routeImageDrawer.dispose();\\n\\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\\n Trip trip = tripRepository.findById(tripId)\\n .orElseThrow();\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n}\\n```\\n\\n### \ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810\\n\\n\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. \\n\\n```mermaid\\ngraph LR\\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\\n draw --\x3e trip\\n```\\n\\n\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph draw\\n\\t\\tdirection LR\\n\\t\\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\\n\\tend\\n subgraph trip\\n\\t\\tdirection LR\\n\\t\\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\\n\\t\\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\\n\\tend\\n\\n\\ttrip --\x3e draw\\n```\\n\\n\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n## \uc774\ubca4\ud2b8 \uc0ac\uc6a9\\n\\n\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.\\n\\n### \uc774\ubca4\ud2b8 \ubc1c\ud589\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4. \\n\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. \\n\\n```java title=\\"TripService & TripUpdateEvent\\"\\npublic void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\\n ...\\n\\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\\n}\\n\\npublic record TripUpdateEvent(Long tripId) {\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4. \\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4. \\n\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. \\n\\n### \uc774\ubca4\ud2b8 \uad6c\ub3c5\\n\\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec `@Async` \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4. \\n\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 `@TransactionalEventListener`\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n:::note TransactionPhase \uc124\uc815\\nTransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\nAFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nBEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\n:::\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```java title=\\"TripUpdateEventHandler\\"\\n@Component\\npublic class TripUpdateEventHandler {\\n\\n private final RouteImageGenerator routeImageGenerator;\\n private final TripRepository tripRepository;\\n\\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\\n this.routeImageGenerator = routeImageGenerator;\\n this.tripRepository = tripRepository;\\n }\\n\\n @Async\\n @TransactionalEventListener(phase = AFTER_COMMIT)\\n public void handle(TripUpdateEvent tripUpdateEvent) {\\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\\n\\n String imageUrl = routeImageGenerator.generate(\\n trip.getLatitudes(),\\n trip.getLongitudes(),\\n trip.getPointedLatitudes(),\\n trip.getPointedLongitudes()\\n );\\n\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n }\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4. \\n\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4.\\n\\n```mermaid\\ngraph LR\\n subgraph trip\\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\\n TripRepository\\n end\\n\\n subgraph draw\\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\\n end\\n```\\n\\n### \ud14c\uc2a4\ud2b8\\n\\n\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n<Tabs>\\n<TabItem value=\\"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d\\" label=\\"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d\\">\\n\\n```java\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(Mockito.timeout(5000).times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n</TabItem>\\n\\n<TabItem value=\\"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d\\" label=\\"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d\\" default>\\n\\n```java\\n@ContextConfiguration(classes = TestSyncConfig.class)\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4. \\n\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 `\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0` \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c `Mockito.timeout` \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. \\n\\n## \uacb0\uacfc\\n\\n![./time.png](./time.png)\\n\\n\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4. \\n\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[7.7. Task Execution and Scheduling, Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling) \\n[Spring Events, Baeldung](https://www.baeldung.com/spring-events) \\n[\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30](https://techblog.woowahan.com/7835/)"},{"id":"39","metadata":{"permalink":"/39","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","source":"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","description":"\uac1c\uc694","date":"2023-08-02T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 2\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":11.725,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","slug":"39","tags":["image","awt"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/40"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/38"}},"content":"## \uac1c\uc694\\n\\n\uc704\uc640 \uac19\uc774 \uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 [\ub9c1\ud06c](./36)\uc5d0 \uc788\ub2e4.\\n\\n### \uad6c\ud604 \uacb0\uacfc\\n\\n![./result.png](./result.png)\\n\\n\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n**\uc11c\uc6b8\uc5ed(\uc810)** \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 **\uad6c\ub85c\uc5ed(\uc810)** \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed\\n\\n```java title=\\"\uc608\uc2dc \ub370\uc774\ud130\\"\\nList<Double> x = List.of(\\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\\n);\\nList<Double> y = List.of(\\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\\n);\\nList<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);\\nList<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);\\n```\\n\\n### IMAGE_SIZE & ROUTE_SIZE\\n\\n```java title=\\"RouteImageGenerator.java\\"\\nprivate static final int IMAGE_SIZE = 800;\\nprivate static final int ROUTE_SIZE = 600;\\n```\\n\\n\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc774\ubbf8\uc9c0 \ud06c\uae30\uc640 \uacbd\ub85c \ud06c\uae30\uac00 \uc788\uc2b5\ub2c8\ub2e4. \\n\uc774\ubbf8\uc9c0 \ud06c\uae30\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4. \\n\uacbd\ub85c \ud06c\uae30\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uadf8\ub824\uc9c0\ub294 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. \\n\\n![./600.png](./600.png)\\n\\n**\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720**\\n\\n255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370 \ud654\uc9c8\uc774 \ub108\ubb34 \uc548\uc88b\uc544\uc11c 800\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4.\\n\\n## \uc8fc\uc694 \ud074\ub798\uc2a4\\n\\n### \uc694\uc57d\\n\\n| \ud074\ub798\uc2a4\uba85 | \uc124\uba85 | \ud2b9\uc774\uc0ac\ud56d |\\n| --- | --- | --- |\\n| Coordinate | \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12 | \uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc Point\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9 |\\n| Coordinates | Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| Position | \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12 | Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9 |\\n| Positions | Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| RouteImageDrawer | \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c | \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c |\\n| RouteImageUploader | BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4 | \ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131 |\\n| RouteImageGenerator | \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4 | \uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad |\\n| BufferedImage(AWT) | \uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9 | \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0) |\\n| Graphics2D(AWT) | \uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc | JDK1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131 |\\n\\n### \uc758\uc874\uad00\uacc4\\n\\n```mermaid\\ngraph TD\\n C1[Coordinates] --\x3e C[Coordinate]\\n P1[Positions] --\x3e P[Position]\\n\\n\\tRID[RouteImageDrawer] -- \\"\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131\\" --\x3e P1\\n\\tRID --\x3e B[BufferedImage]\\n\\tRID --\x3e G[Graphics2D]\\n\\n\\tC1 -- \\"calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0\\" --\x3e P1\\n\\n\\tRIU[RouteImageUploader] --\x3e B\\n\\tRIG[RouteImageGenerator] --\x3e RID\\n\\tRIG --\x3e RIU\\n\\tRIG --\x3e C1\\n\\tRIG --\x3e P1\\n```\\n\\n### Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)\\n\\n`List<Double>` 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4. \\nCoordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658\\n- indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 \\n\\nPositions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n```java title=\\"Coordinates.java\\"\\n// \ud638\ucd9c\\n// List<Integer> xPositions = toPositions(xValues, maxDifference, routeImageSize);\\n// List<Integer> yPositions = toPositions(yValues, maxDifference, routeImageSize);\\n\\nprivate List<Integer> toPositions(List<Double> values, Double maxDifference, Integer routeImageSize) {\\n Double minValue = Collections.min(values);\\n return values.stream()\\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\\n .map(value -> mapToPosition(value, routeImageSize))\\n .toList();\\n}\\n\\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\\n return (coordinate - minValue) / maxDifference;\\n}\\n\\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\\n return (int) (coordinate * routeImageSize);\\n}\\n```\\n\\n\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4.\\n\\n1. Collections.min(values) \u2192 \uc704\ub3c4\ub97c \ubc1b\uc544 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4.\\n2. normalizeCoordinate \u2192 \uac01 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 **\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774**\ub85c \ub098\ub208\ub2e4.\\n3. mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n### Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)\\n\\nPositions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4.\\n- getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4.\\n- xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. \\n\\n```java title=\\"Positions.java\\"\\npublic Positions align(int imageSize, int routeSize) {\\n int xOffset = calculateOffset(Position::x, imageSize);\\n int yOffset = calculateOffset(Position::y, imageSize);\\n\\n return items.stream()\\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\\n .collect(collectingAndThen(toList(), Positions::new));\\n}\\n\\nprivate int calculateOffset(ToIntFunction<Position> positionToInteger, int imageSize) {\\n List<Integer> positions = items.stream()\\n .mapToInt(positionToInteger)\\n .boxed()\\n .toList();\\n\\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\\n return imageSize / 2 - midValue;\\n}\\n```\\n\\n\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4. \\nBufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. \\n\\n![./800.png](./800.png)\\n\\n\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4.\\n\\nx \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4. \\ny \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. \\n\\n### RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)\\n\\nBufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4. \\n\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.\\n\\n```java title=\\"RouteImageDrawer.java\\"\\n// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\\n// \ubc30\uacbd \ud22c\uba85\uc0c9\\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\\nprivate static final int LINE_STROKE_WIDTH = 7;\\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\\nprivate static final int POINT_STROKE_WIDTH = 20;\\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8\uc774 \uc548\uc88b\uc740 \uc774\ubbf8\uc9c0\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud55c \uc124\uc815\\nprivate static final Map<Object, Object> renderingHints = Map.of(\\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\\n);\\n```\\n\\nRouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4.\\n- drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4.\\n- dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. \\n\\ndispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4.\\n\\n## \uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow\\n\\n### 1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n\\n```\\n\\n### 2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 4. \uc5c5\ub85c\ub4dc \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n \\tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n \\tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n \\tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n```\\n\\n### \uc804\uccb4 Flow\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n\\t\\n```"},{"id":"38","metadata":{"permalink":"/38","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","source":"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","description":"\uac1c\uc694","date":"2023-07-31T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 31\uc77c","tags":[{"label":"Image","permalink":"/tags/image"},{"label":"Python","permalink":"/tags/python"}],"readingTime":6.185,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","slug":"38","tags":["Image","Python"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/39"},"nextItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/37"}},"content":"### \uac1c\uc694\\n\\n\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. \\n\\n### \uc0ac\uc6a9 \uae30\uc220\\n\\n\uc5b8\uc5b4: Python 3.10 \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib \\n\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront \\n\\n\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```mermaid\\ngraph LR\\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\\n Client --\x3e CloudFront --\x3e S3\\n```\\n\\n### \uc694\uad6c\uc0ac\ud56d\\n\\n![./route.png](./route.png)\\n\\n\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. \\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n- \uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\\n\\n1. \uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n2. \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n\\n\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4. \\n\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604\\n\\n```python\\nimport time\\n\\nimport matplotlib.pyplot as plt\\n\\n\\ndef draw(point):\\n start = time.time()\\n x, y = zip(*point)\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n draw_lines(pixel_x, pixel_y)\\n end = time.time()\\n print(end - start)\\n \\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n return scaled_coordinates\\n\\n\\ndef draw_lines(x, y):\\n figure = plt.gcf()\\n figure.set_size_inches(5, 5)\\n plt.plot(x, y, c = \'w\',linewidth=5)\\n plt.scatter(x[3],y[3], c = \'w\', s = 125)\\n plt.axis(\'off\')\\n plt.savefig(\'name.png\', transparent=True, format=\'png\')\\n\\npoint = [\\n [126.96352960597338, 37.590841000217125],\\n [126.96987292787792, 37.58435564234159],\\n [126.98128481452298, 37.58594375113966],\\n [126.99360339342958, 37.58248524741927],\\n [126.99867565340067, 37.56778118088622],\\n [127.001935378366117, 37.55985240444085],\\n [126.9831048919687, 37.548030119488665],\\n [126.97189273528845, 37.5119879225856],\\n [127.02689859997221, 37.48488593333883]\\n]\\n\\ndraw(point)\\n```\\n\\n\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)\\n\\n![./routeImage.png](./routeImage.png)\\n\\n### AWS Lambda\\n\\n\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4. \\n\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131\\n\\nAmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc\\n\\n\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```python\\n\\nimport io\\nimport uuid\\n\\nimport boto3\\nimport matplotlib.pyplot as plt\\n\\nPIXEL = 255\\nBUCKET_NAME = \'image-plot\'\\nS3 = \'s3\'\\n\\ndef lambda_handler(event, context):\\n x = event[\'x\']\\n y = event[\'y\']\\n image_name = str(uuid.uuid4())\\n\\n img_data = draw(x, y)\\n s3 = boto3.client(S3)\\n s3.put_object(Body=img_data.getvalue(), ContentType=\'image/png\', Bucket=BUCKET_NAME, Key=image_name)\\n url = f\'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}\'\\n\\n return {\\n \'statusCode\': 200,\\n \'body\': url\\n }\\n\\ndef draw(x, y):\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n img_data = draw_lines(pixel_x, pixel_y)\\n plt.close()\\n return img_data\\n\\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\\n return pixel_values\\n\\ndef draw_lines(x, y):\\n plt.plot(x, y, \'k-\', linewidth=10)\\n plt.axis(\'off\')\\n img_data = io.BytesIO()\\n plt.savefig(img_data, transparent=True, format=\'png\')\\n img_data.seek(0)\\n return img_data\\n\\n```\\n\\n### Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131\\n\\nmatplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4. \\nzip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4. \\n\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4. \\n\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```\\npillow.zip\\n\u2502 python/PIL\\n\u2514 python/Pillow-5.3.0.dist-info\\n```\\n\\nUbuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\\n```\\nsudo apt update\\nsudo apt install zip\\nsudo apt install python3-pip\\n\\nmkdir python\\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\\n```\\n\\n### `No module named \'numpy.core._multiarray_umath\'` \uc5d0\ub7ec\\n\\nLayer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4. \\n\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4. \\n\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### \uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01\\n\\n\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4. \\nAWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. \\n\\n**\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.**\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[AWS Lambda](https://aws.amazon.com/ko/lambda/) \\n[Lambda Layer](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html) \\n[Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html) \\n[No module named \'numpy.core._multiarray_umath\'](https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b) \\n[\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc](https://techblog.woowahan.com/6217/)"},{"id":"37","metadata":{"permalink":"/37","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","source":"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","description":"\uac1c\uc694","date":"2023-07-30T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 30\uc77c","tags":[{"label":"Mockito","permalink":"/tags/mockito"},{"label":"static","permalink":"/tags/static"}],"readingTime":2.66,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","slug":"37","tags":["Mockito","static"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/38"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/36"}},"content":"### \uac1c\uc694\\n\\n\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \\n\\n\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4. \\n\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4. \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. \\n\\n```java\\npublic void upload(BufferedImage bufferedImage) {\\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\\n try {\\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\\n } catch (IOException e) {\\n throw new DrawException(IMAGE_SAVE_FAIL);\\n }\\n}\\n```\\n\\n### Mocking static methods\\n\\nMockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\nmockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 `MockedStatic<T>`\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. \\n\\nJUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc `MockedStatic<T>`\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. \\n\\n```java\\n// given\\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\\nRouteImageUploader routeImageUploader = new RouteImageUploader();\\n\\n// expect\\ntry (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {\\n routeImageUploader.upload(bufferedImage);\\n imageIO.verify(\\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\\n times(1)\\n );\\n}\\n```\\n\\n### \ub9c8\uce58\uba70\\n\\n\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uae30 \ub54c\ubb38\uc5d0 \ucd5c\ub300\ud55c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790. \\n\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4. \\n\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Mocking static methods](https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks) \\n[Mockito mock static methods](https://www.baeldung.com/mockito-mock-static-methods) \\n[Enable mocking static methods in Mockito](https://github.com/mockito/mockito/issues/1013)"},{"id":"36","metadata":{"permalink":"/36","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","source":"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","description":"./route.png","date":"2023-07-27T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 27\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":5.28,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","slug":"36","tags":["image","awt"]},"prevItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/37"},"nextItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/35"}},"content":"![./route.png](./route.png)\\n\\n## \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784\\n\\n\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c `\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac`\uc640 `\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0`\uc758 \uacbd\uc6b0, \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4.\\n\\n\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.\\n\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n\\n\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4.\\n\\n## \uace0\ub824\ud55c \uae30\uc220\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. \\n\\n- Python\uc758 Matplotlib\\n- **AWT(Abstract Window Toolkit) [\ucd5c\uc885 \uc120\ud0dd]**\\n- \uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)\\n- Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)\\n\\n## Python & Matplotlib\\n\\n\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 \\n\\n- \ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. \\n- AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.\\n- Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.\\n\\n## Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\\n\\nPython\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4.\\n\\n\ub77c\uc774\ube0c\ub7ec\ub9ac | \uc124\uba85 | \uc81c\uc678 \uc774\uc720\\n-- | -- | --\\nSwing | AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\nJavaFX | Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\n[simple-java-plot](https://github.com/yuriy-g/simple-java-plot) | AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac | AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c\\n[matplotlib4j](https://github.com/sh0nk/matplotlib4j) | Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac | \ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c\\n\\n## Java & AWT(Abstract Window Toolkit)\\n\\n\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 \\n\\n- \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4.\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.\\n- \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n\\n## \uae30\uc220 \uc120\ud0dd\\n\\nAWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.\\n\\n## \uc720\uc9c0 \ubcf4\uc218\\n\\nAWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n1. \ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. \\n2. AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4."},{"id":"35","metadata":{"permalink":"/35","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","source":"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","description":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","date":"2023-07-24T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 24\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Spring Boot","permalink":"/tags/spring-boot"},{"label":"Spring","permalink":"/tags/spring"}],"readingTime":4.725,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","slug":"35","tags":["Java","Spring Boot","Spring"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/36"},"nextItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/34"}},"content":"## \uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\\n\\n\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4. \\n2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4.\\n\\n## \uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### Switch Expressions(Java 14)\\n\\nJava 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n```java\\nenum RESULT {\\n WIN, LOSE, DRAW\\n}\\n\\nRESULT result = RESULT.WIN;\\n\\nint prize = switch (result) {\\n case WIN -> 10_000_000;\\n case LOSE, DRAW -> 5_000_000;\\n\\tdefault -> 0;\\n};\\n```\\n\\n\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- `->` \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.\\n- case\ub97c \ucf64\ub9c8(`,`)\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n- break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4.\\n- default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\n### Text Block(Java 15)\\n\\nJava 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@Repository\\npublic interface PostRepository extends JpaRepository<Post, Long> {\\n @Query(\\"\\"\\"\\n SELECT p FROM Post p\\n WHERE p.title LIKE %:keyword%\\n OR p.content LIKE %:keyword%\\n \\"\\"\\")\\n List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);\\n}\\n```\\n\\n### NPE \uba54\uc2dc\uc9c0(Java 15)\\n\\n```java\\nString name = null;\\nname.chars();\\n\\n/** \\n# before\\njava.lang.NullPointerException\\n\\tat com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\\n\\n# after\\nCannot invoke \\"String.chars()\\" because \\"name\\" is null\\njava.lang.NullPointerException: Cannot invoke \\"String.chars()\\" because \\"name\\" is null\\n*/\\n```\\n\\n### Record(Java 16)\\n\\nLombok\uc758 `@Data`, kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nRecord\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4. \\n\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. \\n\\n```java\\npublic record PostDto(String title, String content) {\\n}\\n```\\n\\n### \ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d\\n\\n\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n## \uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. \\n\\n### \uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d\\n\\nJava 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n### \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd\\n\\nJakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. \\n\\n### PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c\\n\\n6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c `@GetMapping(\\"/hello\\")`\uc640 `@GetMapping(\\"/hello/\\")`\uac00 \ub3d9\uc77c\ud588\ub2e4. \\n6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, `/hello`\uc640 `/hello/`\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. \\n\\n> PathPatternParser used by default (with the ability to opt into PathMatcher). \\n\\n### HTTP interface client\\n\\n\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [\ud1a0\ube44\ub2d8\uc758 \uac15\uc758](https://www.youtube.com/watch?v=Kb37Q5GCyZs)\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d\\n\\nGradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6 \\n\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30](https://www.youtube.com/watch?v=1WT6oxchM9M) \\n[\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30](https://www.youtube.com/watch?v=7SlDdzVk6GE) \\n[Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658](https://www.samsungsds.com/kr/insights/java_jakarta.html) \\n[Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529](https://www.youtube.com/watch?v=Kb37Q5GCyZs) \\n[What\'s New in Spring Framework 6.x](https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x) \\n[Spring Boot 3.0 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes) \\n[Spring Boot 3.1 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes)"},{"id":"34","metadata":{"permalink":"/34","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-26-WebSocket.mdx","source":"@site/blog/2023/2023-06-26-WebSocket.mdx","title":"\uc6f9\uc18c\ucf13","description":"\uc6f9\uc18c\ucf13","date":"2023-06-26T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 26\uc77c","tags":[{"label":"WebSocket","permalink":"/tags/web-socket"}],"readingTime":2.965,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9\uc18c\ucf13","slug":"34","tags":["WebSocket"]},"prevItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/35"},"nextItem":{"title":"Docusaurus","permalink":"/33"}},"content":"### \uc6f9\uc18c\ucf13\\n\\n\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c \\n\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\\n\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. \\n\\n### \uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd\\n\\n\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4. \\n\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\\n### \uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791\\n\\n```mermaid\\nsequenceDiagram\\n participant Client\\n participant Server\\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\\n\\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\\n Server->>Client: \\n\\n Client->>Server: \uc885\ub8cc\\n Server->>Client: \\n```\\n\\n### 1. Upgrade \uc694\uccad\\n\\nWebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4. \\n\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4. \\nSec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4. \\nSec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. \\n\\n```\\nGET /chats HTTP/1.1\\nHost: localhost:8080\\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\\nSec-WebSocket-Version: 13\\nOrigin: http://localhost:8080\\n```\\n\\n### 2. Switching Protocols\\n\\n\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4. \\nSec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 `258EAFA5-E914-47DA-95CA-C5AB0DC85B11`\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\\n```\\nHTTP/1.1 101 Switching Protocols \\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\\nSec-WebSocket-Protocol: v10.stomp\\n```\\n\\n### 3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc\\n\\n\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4. \\n\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\nhttps://datatracker.ietf.org/doc/html/rfc6455\\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications \\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers \\nhttps://docs.spring.io/spring-framework/reference/web/websocket.html"},{"id":"33","metadata":{"permalink":"/33","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","source":"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","title":"Docusaurus","description":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.","date":"2023-06-18T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 18\uc77c","tags":[{"label":"Documentation","permalink":"/tags/documentation"}],"readingTime":10.095,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Docusaurus","slug":"33","tags":["Documentation"]},"prevItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/34"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/32"}},"content":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. \\n\\n## \uc124\uce58\\n\\n[\uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://docusaurus.io/docs/installation)\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. \\n\\n```bash\\nyarn create docusaurus\\n````\\n\\n## \ubc30\ud3ec\\n\\n[\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c](https://docusaurus.io/docs/next/deployment#deploying-to-github-pages) \\nnetlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4.\\n\\n### \ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131\\n\\ngithub pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 [\uc608\uc2dc](https://github.com/greeng00se/greeng00se.github.io)\uc640 \uac19\uc774 `username.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\n\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 `organization.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n### \uc124\uc815 \ud30c\uc77c \uc218\uc815\\n\\n```js title=\\"docusaurus.config\\"\\nmodule.exports = {\\n // ...\\n url: \'https://greeng00se.github.io\',\\n baseUrl: \'/\',\\n projectName: \'greeng00se.github.io\',\\n organizationName: \'greeng00se\',\\n trailingSlash: false,\\n // ...\\n};\\n```\\n\\n### \ud1a0\ud070 \uc124\uc815\\n\\ngithub action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 [repo, user, workflow] \uc744 \uc124\uc815\ud588\ub2e4. \\n\\n![github](./github.png)\\n\\n### \ube0c\ub79c\uce58 \uc0dd\uc131\\n\\ngithub\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4. \\nrepository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4. \\n\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\\n### \uc6cc\ud06c\ud50c\ub85c \uc791\uc131\\n\\nDocusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. \\n\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. \\n\\n```yml title=\\".github/workflows/deploy.yml\\"\\nname: blog\\n\\non:\\n push:\\n branches: [main]\\n\\njobs:\\n deploy:\\n name: Deploy to GitHub Pages\\n runs-on: ubuntu-latest\\n steps:\\n - uses: actions/checkout@v2\\n - uses: actions/setup-node@v3\\n with:\\n node-version: 18\\n cache: yarn\\n\\n - name: Install dependencies\\n run: yarn install --frozen-lockfile\\n - name: Build website\\n run: yarn build\\n\\n - name: Deploy to GitHub Pages\\n uses: peaceiris/actions-gh-pages@v3\\n with:\\n github_token: ${{ secrets.DEPLOY_TOKEN }}\\n publish_dir: ./build\\n user_name: github-actions[bot]\\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\\n```\\n\\n## \ub313\uae00 \uae30\ub2a5\\n\\ngiscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. \\n\\n### giscus \uc124\uc815\\n\\n1. \uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4.\\n2. giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n3. Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n\\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [giscus](https://giscus.app/ko)\ub97c \ud655\uc778\ud558\uc790.\\n\\n### docusaurus \uc124\uc815\\n\\n[swizzling](https://docusaurus.io/ko/docs/next/swizzling)\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4. \\n\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nyarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\\n```\\n\\n\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 `/src/theme/BlogPostItem/index.js` \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4. \\n\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. \\n\\n```js title=\\"/src/theme/BlogPostItem/index.js\\"\\nimport OriginalBlogPostItem from \\"@theme-original/BlogPostItem\\";\\nimport React, { useEffect, useRef } from \\"react\\";\\n// @ts-expect-error internal code\\nimport { useColorMode } from \\"@docusaurus/theme-common\\";\\nimport { useBlogPost } from \\"@docusaurus/theme-common/internal\\";\\n\\nconst giscusSelector = \\"iframe.giscus-frame\\";\\n\\nfunction BlogPostItem(props) {\\n const { colorMode } = useColorMode();\\n const { isBlogPostPage } = useBlogPost();\\n const giscusTheme = colorMode === \\"dark\\" ? \\"dark\\" : \\"light\\";\\n const containerRef = useRef(null);\\n\\n useEffect(() => {\\n if (!isBlogPostPage) return;\\n\\n const giscusEl = containerRef.current.querySelector(giscusSelector);\\n\\n const createGiscusEl = () => {\\n const script = document.createElement(\\"script\\");\\n\\n script.src = \\"https://giscus.app/client.js\\";\\n script.setAttribute(\\"data-repo\\", \\"teco-chat/teco-chat.github.io\\");\\n script.setAttribute(\\"data-repo-id\\", \\"R_kgDOJZ5j0Q\\");\\n script.setAttribute(\\"data-category\\", \\"Announcements\\");\\n script.setAttribute(\\"data-category-id\\", \\"DIC_kwDOJZ5j0c4CXS_Q\\");\\n script.setAttribute(\\"data-mapping\\", \\"pathname\\");\\n script.setAttribute(\\"data-strict\\", \\"0\\");\\n script.setAttribute(\\"data-reactions-enabled\\", \\"1\\");\\n script.setAttribute(\\"data-emit-metadata\\", \\"0\\");\\n script.setAttribute(\\"data-input-position\\", \\"bottom\\");\\n script.setAttribute(\\"data-theme\\", giscusTheme);\\n script.setAttribute(\\"data-lang\\", \\"ko\\");\\n script.crossOrigin = \\"anonymous\\";\\n script.async = true;\\n \\n containerRef.current.appendChild(script);\\n };\\n\\n const postThemeMessage = () => {\\n const message = {\\n setConfig: {\\n theme: giscusTheme,\\n }\\n };\\n\\n giscusEl.contentWindow.postMessage({ giscus: message }, \\"https://giscus.app\\");\\n };\\n\\n giscusEl ? postThemeMessage() : createGiscusEl();\\n }, [giscusTheme]);\\n\\n return (\\n <>\\n <OriginalBlogPostItem {...props} />\\n {isBlogPostPage && <div ref={containerRef} />}\\n </>\\n );\\n}\\n\\nexport default BlogPostItem;\\n```\\n\\n## \uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30\\n\\n\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4. \\n\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. \\n\\n\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, [docsearch](https://docsearch.algolia.com/)\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\ndocsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n- [\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1](https://docsearch.algolia.com/docs/legacy/run-your-own/) \\n- [\uc124\uc815 \ud30c\uc77c](https://docsearch.algolia.com/docs/legacy/config-file)\\n\\n### \uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778\\n\\n\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4. \\n\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n![algolia](./algolia.png)\\n\\n### \ud0a4 \uc0dd\uc131\\n\\n\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4. \\naddObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. \\n\\n![key](./key.png)\\n\\n### .env \ud30c\uc77c \uc0dd\uc131\\n\\n\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\\n```bash title=\\".env\\"\\nAPPLICATION_ID=MVIU5UEMOM\\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\\n```\\n\\n### config \ud30c\uc77c \uc0dd\uc131\\n\\n\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 [\ub9c1\ud06c](https://docsearch.algolia.com/docs/legacy/config-file)\ub97c \ucc38\uace0\ud55c\ub2e4. \\n\ub610\ub294 Docusaurus\uc758 [\uc124\uc815 \ud30c\uc77c](https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json)\uc744 \ucc38\uace0\ud55c\ub2e4.\\n\\n```json title=\\"config.json\\"\\n{\\n \\"index_name\\": \\"teco\\",\\n \\"start_urls\\": [\\n \\"https://teco-chat.github.io/\\"\\n ],\\n \\"sitemap_urls\\": [\\n \\"https://teco-chat.github.io/sitemap.xml\\"\\n ],\\n \\"sitemap_alternate_links\\": true,\\n \\"stop_urls\\": [\\n \\"/tests\\"\\n ],\\n \\"selectors\\": {\\n \\"lvl0\\": {\\n \\"selector\\": \\"(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]\\",\\n \\"type\\": \\"xpath\\",\\n \\"global\\": true,\\n \\"default_value\\": \\"Documentation\\"\\n },\\n \\"lvl1\\": \\"header h1\\",\\n \\"lvl2\\": \\"article h2\\",\\n \\"lvl3\\": \\"article h3\\",\\n \\"lvl4\\": \\"article h4\\",\\n \\"lvl5\\": \\"article h5, article td:first-child\\",\\n \\"lvl6\\": \\"article h6\\",\\n \\"text\\": \\"article p, article li, article td:last-child\\"\\n },\\n \\"strip_chars\\": \\" .,;:#\\",\\n \\"custom_settings\\": {\\n \\"separatorsToIndex\\": \\"_\\",\\n \\"attributesForFaceting\\": [\\n \\"language\\",\\n \\"version\\",\\n \\"type\\",\\n \\"docusaurus_tag\\"\\n ],\\n \\"attributesToRetrieve\\": [\\n \\"hierarchy\\",\\n \\"content\\",\\n \\"anchor\\",\\n \\"url\\",\\n \\"url_without_anchor\\",\\n \\"type\\"\\n ]\\n },\\n \\"conversation_id\\": [\\n \\"833762294\\"\\n ],\\n \\"nb_hits\\": 46250\\n}\\n```\\n\\n### docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\\n\\ndocker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4. \\njq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nbrew install jq\\n```\\n\\n\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. \\n\\n```bash\\ndocker run -it --env-file=.env -e \\"CONFIG=$(cat ./config.json | jq -r tostring)\\" algolia/docsearch-scraper\\n```\\n\\n### docusaurus \uc124\uc815\\n\\n\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n algolia: {\\n appId: \'MVIU5UEMOM\', // Application ID\\n apiKey: \'b68f378013817d9a190df88cdde226a0\', // Search-Only API Key\\n indexName: \'teco\', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\\n contextualSearch: true,\\n },\\n })\\n```\\n\\n## \ubd80\uac00 \uc124\uc815\\n\\n### \ud654\uba74 \uc0c1\ub2e8 Github Icon\\n\\n\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```css title=\\"/src/css/custom.css\\"\\n.header-github-link:hover {\\n opacity: 0.6;\\n}\\n\\n.header-github-link:before {\\n content: \'\';\\n width: 24px;\\n height: 24px;\\n display: flex;\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n\\nhtml[data-theme=\'dark\'] .header-github-link:before {\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath fill=\'white\' d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n```\\n\\nthemeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nnavbar: {\\n title: \'HELLO\',\\n items: [\\n {\\n href: \'https://github.com/greeng00se\',\\n position: \'right\',\\n className: \'header-github-link\',\\n \'aria-label\': \'GitHub repository\',\\n },\\n ],\\n},\\n```\\n\\n### \ucf54\ub4dc\ube14\ub7ed\\n\\njava\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4. \\nprism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nprism: {\\n theme: lightCodeTheme,\\n darkTheme: darkCodeTheme,\\n additionalLanguages: [\'java\', \'kotlin\'],\\n}\\n```\\n\\n### mermaid\\n\\nmermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 `@docusaurus/theme-mermaid` \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4.\\n\\n```bash\\nyarn add @docusaurus/theme-mermaid\\n```\\n\\n\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```js title=\\"docusaurus.config\\"\\nconst config = {\\n ...\\n markdown: {\\n mermaid: true,\\n },\\n themes: [\\n \'@docusaurus/theme-mermaid\'\\n ],\\n};\\n```\\n\\nthemeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n mermaid: {\\n theme: {\\n light: \'neutral\', \\n dark: \'dark\'\\n },\\n },\\n }),\\n```\\n\\n### \uad6d\uc81c\ud654 \uc124\uc815\\n\\n\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 `Older Entries` \ud615\ud0dc\uc758 \uc124\uba85\uc774 `\ub2e4\uc74c \ud398\uc774\uc9c0` \ub85c \ubcc0\uacbd\ub41c\ub2e4. \\n\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\ni18n: {\\n defaultLocale: \\"ko\\",\\n locales: [\\"ko\\"],\\n},\\n```\\n\\n### \ube14\ub85c\uadf8 \uae00 author\\n\\n\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. \\n\\n![author](./author.png)\\n\\n`authors.yml` \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n```yml title=\\"/blog/authors.yml\\"\\nherb:\\n name: \ud5c8\ube0c\\n title: Backend\\n url: https://github.com/greeng00se\\n image_url: https://github.com/greeng00se.png\\n\\nmallang:\\n name: \ub9d0\ub791\\n title: Backend\\n url: https://github.com/shin-mallang\\n image_url: https://github.com/shin-mallang.png\\n```\\n\\n\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. \\n\\n```mdx\\n---\\nslug: 1\\ntitle: Hello World\\nauthors: [herb, mallang]\\ntags: [hello, docusaurus]\\n---\\n\\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\\n```"},{"id":"32","metadata":{"permalink":"/32","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","description":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.","date":"2023-06-11T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 11\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":2.545,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","slug":"32","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"Docusaurus","permalink":"/33"},"nextItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/31"}},"content":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4. \\n\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. \\n\\n### \ud559\uc2b5\\n\\n\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4. \\n\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. \\n\\n\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4. \\n\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. \\n\\n\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4. \\n\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc218\uba74\\n\\n\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### \ud611\uc5c5\\n\\n\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4. \\n\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. \\n\\n\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4. \\n\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70\\n\\n\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."},{"id":"31","metadata":{"permalink":"/31","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","description":"\ub808\ubca8 \uc778\ud130\ubdf0","date":"2023-06-08T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 8\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.435,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","slug":"31","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/32"},"nextItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/30"}},"content":"### \ub808\ubca8 \uc778\ud130\ubdf0\\n\\n\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4. \\n\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd\\n\\n\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4. \\n\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4.\\n\\n\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4.\\n\\n> \ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c. \\n> \uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d\\n>\\n\\n### PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158\\n\\nPUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4. \\n\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. \\n\\n\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. \\n\\n### \uadf8 \uc678 \uac1c\uc120\ud560 \uc810\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30 \\n\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c \\"\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?\\"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30 \\n\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30 \\n\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"},{"id":"30","metadata":{"permalink":"/30","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","description":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158","date":"2023-06-04T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 4\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.595,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","slug":"30","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/31"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/29"}},"content":"### \uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158\\n\\n\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. \\n\\n### \ubc30\ud3ec\\n\\n\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4. \\n\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4.\\n\\n```bash\\necho \\"Start Deploy Script\\"\\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\\nPROJECT_NAME=jwp-shopping-order\\n\\necho \\"Change Directory\\"\\ncd $REPOSITORY_NAME\\n\\necho \\"Git Pull\\"\\ngit pull origin step2\\n\\necho \\"Build\\"\\n./gradlew bootJar\\n\\necho \\"Copy, Start Server\\"\\nmv ./build/libs/$PROJECT_NAME.jar .\\n\\nPID=$(pgrep -f $PROJECT_NAME)\\n\\nif [ -n $PID ]; then\\n kill -9 $PID\\n\\tsleep 5\\nfi\\n\\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\\n```\\n\\n### \ud611\uc5c5\\n\\n\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4. \\n\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30**\\n\\n\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c? \\n\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84\\n\\n**expose headers**\\n\\n\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c [\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354](https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header)\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nnginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. \\n\\n```bash\\nadd_header \'Access-Control-Expose-Headers\' \'Location\'\\n```\\n\\n**\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158** \\n\\n\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4. \\nTransactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4.\\n\\nsetReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4.\\n- h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. \\n- MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.\\n\\nORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. \\n\\n**DAO\uc5d0 `@Transactional` \uc801\uc6a9** \\n\\nDAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nService \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\nDAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) `@Transactional`\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."},{"id":"29","metadata":{"permalink":"/29","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","source":"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","description":"\uac1c\uc694","date":"2023-06-01T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.005,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","slug":"29","tags":["TecoChat","Retrospective"]},"prevItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/30"},"nextItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/28"}},"content":"### \uac1c\uc694\\n\\n\uc6d0\ub798 \ubaa9\uc801\uc778 `\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0`\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### \ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\nGPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. \\n\\n![chat1](./chat1.png)\\n\\n### \uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5\\n\\n\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4. \\n\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.\\n\\n### \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\\n\\n\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4. \\n\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\nCSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. \\n\\n![chat2](./chat2.png)\\n\\n### \ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\n\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. \\n\\n### \uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30\\n\\n![chat3](./chat3.png)\\n\\n\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4. \\n\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4. \\n\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ud5a5\ud6c4 \uacc4\ud68d\\n\\n\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4. \\n\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4. \\n\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."},{"id":"28","metadata":{"permalink":"/28","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","source":"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","description":"\uc694\uad6c\uc0ac\ud56d","date":"2023-05-26T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 26\uc77c","tags":[{"label":"Pattern","permalink":"/tags/pattern"},{"label":"Composite","permalink":"/tags/composite"}],"readingTime":4.74,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","slug":"28","tags":["Pattern","Composite"]},"prevItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/29"},"nextItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/27"}},"content":"### \uc694\uad6c\uc0ac\ud56d\\n\\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.\\n\\n- \uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4. \\n\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4.\\n\\n```java\\npublic interface FarePolicy {\\n int calculate(Path path, Passenger passenger, int fare);\\n}\\n\\npublic class BaseFarePolicy implements FarePolicy { ... }\\npublic class DistanceFarePolicy implements FarePolicy { ... }\\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\\n```\\n\\n![composite1](./composite1.png)\\n\\n### \ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30\\n\\n\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \\n\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n```java\\npublic class SubwayFarePolicy implements FarePolicy {\\n\\n private final List<FarePolicy> farePolicies;\\n\\n public SubwayFarePolicy(final List<FarePolicy> farePolicies) {\\n this.farePolicies = farePolicies;\\n }\\n\\n @Override\\n public int calculate(final Path path, final Passenger passenger, final int fare) {\\n int calculatedFare = fare;\\n for (FarePolicy farePolicy : farePolicies) {\\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\\n }\\n return calculatedFare;\\n }\\n}\\n```\\n\\n\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4.\\n\\n![composite2](./composite2.png)\\n\\n### \uc815\ucc45\uc758 \uc21c\uc11c\\n\\n\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4. \\n\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4. \\nConfiguration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. \\n\\n```java\\n@Configuration\\npublic class FareConfiguration {\\n\\n @Bean\\n public FarePolicy farePolicy() {\\n return new SubwayFarePolicy(List.of(\\n new BaseFarePolicy(),\\n new DistanceFarePolicy(),\\n new AgeDiscountFarePolicy()\\n ));\\n }\\n}\\n```\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?\\n\\n![composite3](./composite3.png)\\n\\nGOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n> \ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4. \\n\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.\\n> \\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c\\n\\nComponent\\n\\n- \uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 \\n- ex) \uc694\uae08 \uc815\ucc45(FarePolicy) \\n\\nLeaf\\n\\n- \uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 \\n- ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) \\n\\nComposite\\n\\n- \uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 \\n- ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) \\n\\nClient\\n\\n- \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c\\n\\n\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c \\nClient \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c\\n\\n### \ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84\\n\\n\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4. \\n\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4. \\n\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134 \\n\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"},{"id":"27","metadata":{"permalink":"/27","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","description":"\uc9c0\ud558\ucca0 \ubbf8\uc158","date":"2023-05-25T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 25\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.91,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","slug":"27","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/28"},"nextItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/26"}},"content":"### \uc9c0\ud558\ucca0 \ubbf8\uc158\\n\\n\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4. \\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nAPI\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4.\\n\\n**\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c**\\n\\n\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4.\\n\\n1. \uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95\\n2. \ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4. \\n\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654**\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4.\\n\\n**\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac**\\n\\n\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4. \\n\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4. \\n\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n:::note \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n:::\\n\\n**\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131**\\n\\n\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4. \\n\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4. \\n\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4. \\n\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4.\\n\\n\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4.\\n\\n```java\\n@Nested\\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\\n\\n @Test\\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\\n // given\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", 5);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \uc624\ub978\ucabd, 5);\\n\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", 3);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\", \uc624\ub978\ucabd, 7);\\n\\n // when\\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\\n\\n // then\\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\\n \uc870\ud68c_\uacb0\uacfc,\\n \ub178\uc120_\uc815\ubcf4(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0, \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\"),\\n \ub178\uc120_\uc815\ubcf4(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0, \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\")\\n );\\n }\\n}\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc758\uacac \uc870\uc728\ud558\uae30**\\n\\n\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4. \\n\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30**\\n\\n\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4. \\n\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! \\n\\n**\ud3b8\ud55c \ubd84\uc704\uae30**\\n\\n\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"},{"id":"26","metadata":{"permalink":"/26","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","source":"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","description":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.","date":"2023-05-24T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 24\uc77c","tags":[{"label":"DTO","permalink":"/tags/dto"}],"readingTime":7.525,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","slug":"26","tags":["DTO"]},"prevItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/27"},"nextItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/25"}},"content":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4.\\n\\n### \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815\\n\\n![\uc911\ubcf51](./\uc911\ubcf51.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?\\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4.\\n\\n> `ProductSaveRequest`\uc640 `ProductUpdateRequest`\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e\\n> \\n\\n\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4.\\n\\n> \uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!\\n> \\n\\n### \uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5\\n\\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n### \ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\\n\\n\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c? \\n\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c? \\n\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! \\n\\n### \uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc\\n\\n\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4. \\nController\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\\n\u251c\u2500\u2500 dto\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n![\uc911\ubcf52](./\uc911\ubcf52.png)\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf53](./\uc911\ubcf53.png)\\n\\n\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic interface ProductSaveRequest {\\n\\n String getName();\\n\\n String getImage();\\n\\n Long getPrice();\\n}\\n\\n// ProductService\\npublic Long save(final ProductSaveRequest request) {\\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\\n return productDao.saveAndGetId(product);\\n}\\n```\\n\\n### \uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf54](./\uc911\ubcf54.png)\\n\\n\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4. \\n\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\\n\\n @NotBlank(message = \\"\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n @Size(min = 1, max = 100, message = \\"\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final String name;\\n\\n @NotBlank(message = \\"\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n private final String image;\\n\\n @Range(message = \\"\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final long price;\\n\\n public ProductRequest(final String name, final String image, final long price) {\\n this.name = name;\\n this.image = image;\\n this.price = price;\\n }\\n\\n @Override\\n public String getName() {\\n return name;\\n }\\n\\n @Override\\n public String getImage() {\\n return image;\\n }\\n\\n @Override\\n public long getPrice() {\\n return price;\\n }\\n}\\n\\n// ProductController\\n@PostMapping(\\"/products\\")\\npublic ResponseEntity<Void> save(@Valid @RequestBody final ProductRequest request) {\\n final Long id = productService.save(request);\\n return ResponseEntity.created(URI.create(\\"/products/\\" + id)).build();\\n}\\n```\\n\\n### \uc815\ub9ac\\n\\n\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\\n1. Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n2. \uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4.\\n3. \uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n[https://techblog.woowahan.com/2647/](https://techblog.woowahan.com/2647/) \\n[https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/](https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/)"},{"id":"25","metadata":{"permalink":"/25","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","description":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158","date":"2023-05-12T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 12\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.78,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","slug":"25","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/26"},"nextItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/24"}},"content":"### \uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\nInterceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4. \\n\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5**\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\\n![dto1](./dto1.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. \\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4. \\n\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. \\n\\n![dto2](./dto2.png)\\n\\n**Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9**\\n\\n\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. \\n\\n\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4. \\n\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4. \\n\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uae30\ub85d**\\n\\n\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4. \\n\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4. \\n\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!\\n\\n**\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30**\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"},{"id":"24","metadata":{"permalink":"/24","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","description":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158","date":"2023-05-02T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 2\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.535,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","slug":"24","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/25"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/23"}},"content":"### \uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\\n\\n\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4. \\n\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4. \\n\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4. \\n\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. \\n\\n\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4. \\n\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4. \\n\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. \\n\\n\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 `\ub09c\uc774\ub3c4 \ub192\uc774\uae30`\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30**\\n\\n```java\\n@SuppressWarnings(\\"NonAsciiCharacters\\")\\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\\n@Transactional\\n@AutoConfigureMockMvc\\n@SpringBootTest\\npublic class RacingGameIntegrationTest {\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ube44\ubc84\uc758 \uc131\uaca9** \\n\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84** \\n\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4. \\n\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00? \\n\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n**\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815** \\n\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."},{"id":"23","metadata":{"permalink":"/23","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","source":"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","description":"\ud504\ub860\ud2b8\uc5d4\ud2b8","date":"2023-05-01T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.67,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","slug":"23","tags":["TecoChat","Retrospective"]},"prevItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/24"},"nextItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/22"}},"content":"### \ud504\ub860\ud2b8\uc5d4\ud2b8\\n\\n\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4. \\n\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4. \\n\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. \\n\\n### \ubc31\uc5d4\ub4dc\\n\\n\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4. \\n\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Http Request Header\\n\\n\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n```ts\\nconst encodedName = () => {\\n const uriComponent = unescape(encodeURIComponent(name.value));\\n return btoa(uriComponent);\\n};\\n```\\n\\n### Elastic Beanstalk\\n\\n\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\nElastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\n\\n### Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac\\n\\n\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4. \\nRDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4. \\n\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. \\n\\n### Elastic Beanstalk nginx \uc124\uc815\\n\\n\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 `.platform/nginx/conf.d/` \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### Jenkins\\n\\n\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nt4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4. \\n\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. \\n\\n```groovy\\ntest {\\n maxHeapSize = \\"1024m\\"\\n}\\n```\\n\\n### Jenkins Blue Ocean\\n\\nBlue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4. \\n\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4. \\n\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 \\"Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?\\" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Elastic Beanstalk, AWS](https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html) \\n[EC2 AWS Graviton, AWS](https://aws.amazon.com/ko/ec2/graviton/) \\n[Default Memory Settings, AWS](https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings)"},{"id":"22","metadata":{"permalink":"/22","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","source":"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","title":"Jenkins\ub85c CI/CD \uc124\uc815","description":"\uc124\uc815 \ud658\uacbd","date":"2023-04-30T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 30\uc77c","tags":[{"label":"Jenkins","permalink":"/tags/jenkins"},{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk"}],"readingTime":7.495,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","slug":"22","tags":["Jenkins","Elastic Beanstalk"]},"prevItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/23"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/21"}},"content":"### \uc124\uc815 \ud658\uacbd\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI \\n\uc544\ud0a4\ud14d\uccd0: ARM \\n\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small \\n\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk \\n\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository\\n\\n### \\\\[EC2 CLI\\\\] Swap \uba54\ubaa8\ub9ac \uc124\uc815\\n\\nt4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n``` bash\\n# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\\nsudo fallocate -l 2G /swapfile\\n\\n# \uad8c\ud55c \uc124\uc815\\nsudo chmod 600 /swapfile\\n\\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\\nsudo mkswap /swapfile\\nsudo swapon /swapfile\\n\\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\\nsudo vim /etc/fstab\\n```\\n\\n\\n### \\\\[EC2 CLI\\\\] jenkins \uc124\uce58\\n\\n```bash\\nsudo wget -O /etc/yum.repos.d/jenkins.repo \\\\\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\\nsudo yum upgrade\\nsudo yum install java-17-amazon-corretto-devel\\nsudo yum install jenkins\\nsudo systemctl daemon-reload\\n```\\n\\n[Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] Jenkins \uc2dc\uc791\\n\\n```bash\\nsudo systemctl enable jenkins\\nsudo systemctl start jenkins\\n```\\n\\nenable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx & git \uc124\uce58\\n\\n```bash\\nsudo yum install nginx\\nsudo systemctl enable nginx\\nsudo systemctl start nginx\\n\\nsudo yum install git\\n```\\n\\nnginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815\\n\\n\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4.\\n\\n```bash\\nupstream jenkins {\\n keepalive 32; # keepalive connections\\n server 127.0.0.1:8080; # jenkins ip and port\\n}\\n\\n# Required for Jenkins websocket agents\\nmap $http_upgrade $connection_upgrade {\\n default upgrade;\\n \'\' close;\\n}\\n\\nserver {\\n listen 80; # Listen on port 80 for IPv4 requests\\n\\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\\n\\n # this is the jenkins web root directory\\n # (mentioned in the output of \\"systemctl cat jenkins\\")\\n root /var/run/jenkins/war/;\\n\\n access_log /var/log/nginx/jenkins.access.log;\\n error_log /var/log/nginx/jenkins.error.log;\\n\\n # pass through headers from Jenkins that Nginx considers invalid\\n ignore_invalid_headers off;\\n\\n location ~ \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)$\\" {\\n # rewrite all static files into requests to the root\\n # E.g /static/12345678/css/something.css will become /css/something.css\\n rewrite \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)\\" /$1 last;\\n }\\n\\n location /userContent {\\n # have nginx handle all the static requests to userContent folder\\n # note : This is the $JENKINS_HOME dir\\n root /var/lib/jenkins/;\\n if (!-f $request_filename){\\n # this file does not exist, might be a directory or a /**view** url\\n rewrite (.*) /$1 last;\\n break;\\n }\\n sendfile on;\\n }\\n\\n location / {\\n sendfile off;\\n proxy_pass http://jenkins;\\n proxy_redirect default;\\n proxy_http_version 1.1;\\n\\n # Required for Jenkins websocket agents\\n proxy_set_header Connection $connection_upgrade;\\n proxy_set_header Upgrade $http_upgrade;\\n\\n proxy_set_header Host $host;\\n proxy_set_header X-Real-IP $remote_addr;\\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\\n proxy_set_header X-Forwarded-Proto $scheme;\\n proxy_max_temp_file_size 0;\\n\\n #this is the maximum upload size\\n client_max_body_size 10m;\\n client_body_buffer_size 128k;\\n\\n proxy_connect_timeout 90;\\n proxy_send_timeout 90;\\n proxy_read_timeout 90;\\n proxy_buffering off;\\n proxy_request_buffering off; # Required for HTTP CLI commands\\n proxy_set_header Connection \\"\\"; # Clear for keepalive\\n }\\n\\n}\\n```\\n\\nJenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4. \\n`/etc/nginx/conf.d`\xa0\uc544\ub798\xa0`default.conf`\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4. \\nnginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0`include /etc/nginx/conf.d/*.conf;`\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0`.conf`\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4. \\n\uc124\uc815 \ud6c4\xa0`sudo nginx -t`\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0`sudo systemctl restart nginx`\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins \uc811\uc18d\\n\\nJenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\nEC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4.\\n\\n![jenkins-start](./jenkins-start.png)\\n\\n\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 `sudo cat /var/lib/jenkins/secrets/initialAdminPasswor` \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 `install suggested plugins`\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4. \\n\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins Blue Ocean \uc124\uce58\\n\\nJenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[AWS IAM & EC2\\\\] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30\\n\\nS3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\nIAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4.\\n\\n1. \uc5d4\ud130\ud2f0 \uc120\ud0dd\\n\\n![aws-iam1](./aws-iam1.png)\\n\\n2. \uad8c\ud55c \ucd94\uac00\\n\\n![aws-iam2](./aws-iam2.png)\\n\\n3. \uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131\\n\\n![aws-iam3](./aws-iam3.png)\\n\\n4. \uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815\\n\\n![aws-iam4](./aws-iam4.png)\\n\\n### \\\\[AWS S3\\\\] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131\\n\\n\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4.\\n\\n- `\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8`\\n\\n![aws-s3](./aws-s3.png)\\n\\n### \\\\[Github\\\\] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131\\n\\nrepo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. \\n\\n### \\\\[Jenkins\\\\] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\\n\\n![jenkins-blue-ocean1](./jenkins-blue-ocean1.png)\\n\\n\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4. \\nJenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. \\n\\n![jenkins-blue-ocean2](./jenkins-blue-ocean2.png)\\n\\n\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4.\\n\\n![jenkins-blue-ocean3](./jenkins-blue-ocean3.png)\\n\\n### \\\\[Github Repsoitory\\\\] Jenkinsfile \uc124\uc815\\n\\n\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n```bash\\npipeline {\\n agent any\\n stages {\\n stage(\'build and test\') {\\n steps {\\n sh \'/gradlew clean build\'\\n }\\n }\\n stage(\'zip\') {\\n steps {\\n sh \'mv ./build/libs/woowachat.jar .\'\\n sh \'zip -r woowachat.zip .platform delivery.jar Procfile\'\\n }\\n }\\n stage(\'upload\') {\\n steps {\\n sh \'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2\'\\n }\\n }\\n stage(\'deploy\') {\\n steps {\\n sh \'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\\"woowa-chat\\",S3Key=\\"woowachat.zip\\"\'\\n sh \'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}\'\\n }\\n }\\n }\\n}\\n```\\n\\n### \\\\[Github\\\\] Webhooks \uc124\uc815\\n\\n![github-hook](./github-hook.png)\\n\\npush \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c `http://Jenkins\uc8fc\uc18c/github-webhook/` \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Install Jenkins - CentOS, Jenkins](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \\n[Nginx Reverse Proxy Configuration, Jenkins](https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/) \\n[Amazon Corretto 17 JDK Install, AWS](https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html) \\n[Amazon Linux 2023 packages, AWS](https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html)"},{"id":"21","metadata":{"permalink":"/21","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","description":"4\uc6d4 21\uc77c \uae08\uc694\uc77c","date":"2023-04-22T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 22\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.68,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","slug":"21","tags":["TecoChat","Retrospective"]},"prevItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/22"},"nextItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/20"}},"content":"### 4\uc6d4 21\uc77c \uae08\uc694\uc77c\\n\\n\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. \\n\\n\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4. \\n`Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?` \\n\\n\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4. \\n\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. \\n\\n\uc774\uac74 \ubabb\ucc38\uc9c0\\n\\n### \ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?\\n\\n\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4. \\n\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4. \\ndev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4.\\n\\n### \ub9d0\ub791\uc758 DM\\n\\n\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4. \\n\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\\n\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4. \\n\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!\\n\\n### \ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec\\n\\n\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4. \\n\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. \\n\\n### GPT\\n\\n\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. \\n\\n### Sonarcloud\\n\\n\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4. \\nSonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4. \\n\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4. \\nSonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4. \\n\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124\\n\\n### Tiptap\\n\\n\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\nTiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4. \\n\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4. \\napi \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c `<pre><code>`\ub85c \ubcc0\ud658\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c `\\\\n`\ub97c `<br>`\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4. \\n\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. \\n\\n```ts\\nconst replaceCodeFences = (input: String) => {\\n const codeFencesRegex = /```([\\\\w-]*)\\\\n([\\\\s\\\\S]*?)\\\\n```/g;\\n return input\\n .replace(codeFencesRegex, (match, p1, p2) => {\\n const languageClass = p1 ? ` class=\\"language-${p1}\\"` : \\"\\";\\n return `<pre><code${languageClass}>${p2}</code></pre>`;\\n })\\n .replace(/\\\\n/g, \\"<br>\\");\\n};\\n```\\n\\nTiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\\n![tecochat](./teco-chat.png)\\n\\n### \ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9\\n\\n\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."},{"id":"20","metadata":{"permalink":"/20","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","source":"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","description":"\ucc45 \uc815\ubcf4","date":"2023-04-08T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 8\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.16,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","slug":"20","tags":["Book"]},"prevItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/21"},"nextItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/19"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c \\n> \uc544\ube48\uc800\uc5f0\uad6c\uc18c\\n> \\n\\n### \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\\n\\n\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. \\n- \uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 \\n- \uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704\\n\\n\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4. \\n\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. \\n\\n\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098 \\n\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4. \\n\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\\n\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4. \\n\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. \\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4. \\nR. D. \ub7ad \\np.19\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4. \\np.66\\n>\\n\\n> \ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4. \\n\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4. \\n\uc54c\ub7ad, \ud0c1\ub2db\ud55c \\np.103\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. \\n\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. \\n\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\np.175\\n> \\n\\n> \uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0. \\np.188\\n> \\n\\n> \ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4. \\np.214\\n> \\n\\n> \ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. \\n\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4. \\np.224\\n>\\n\\n> \uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. \\np.280\\n>"},{"id":"19","metadata":{"permalink":"/19","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-07T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 7\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"InnoDB","permalink":"/tags/inno-db"}],"readingTime":5.805,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"19","tags":["DataBase","Lock","InnoDB"]},"prevItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/20"},"nextItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/18"}},"content":"## InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4. \\nInnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n:::note \ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd \\n\\n:::\\n\\n:::note \ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd \\n\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.\\n\\n:::\\n\\n### Shared & Exclusive Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n**\uacf5\uc720 \uc7a0\uae08(S, shared lock)**\\n\\n\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;`\\n\\n**\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)** \\n\\n\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 FOR UPDATE;`\\n\\n### Intention Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4. \\n\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n**\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)**\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n**\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)** \\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n** \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 **\\n\\n| | X | IX | S | IS |\\n| --- | --- | --- | --- | --- |\\n| X | Conflict | Conflict | Conflict | Conflict |\\n| IX | Conflict | Compatible | Conflict | Compatible |\\n| S | Conflict | Conflict | Compatible | Compatible |\\n| IS | Conflict | Compatible | Compatible | Compatible |\\n\\n### Record Locks\\n\\n\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. \\n\\n### Gap Locks\\n\\n\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### Next-Key Locks\\n\\n\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4. \\n`REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. \\n\\n### AUTO-INC Locks\\n\\n`AUTO_INCREMENT` \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 `INSERT`\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. \\nInnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 `INSERT`\ub098 `REPLACE` \ubb38\uc7a5\uc5d0\uc11c `AUTO_INCREMENT` \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4.\\n\\n### \uc7a0\uae08 \uc608\uc2dc\\n\\n```sql\\n-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id = 10 for update;\\n\\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id > 100 for update;\\n\\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Optimistic and Pessimistic record locking, IBM](https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking) \\n[MySQL Innodb Locks, cecil1018](https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/) \\n[MySQL 8.0 InnoDB Locks, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html) \\n[Locks Set by Different SQL Statements in InnoDB, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html)"},{"id":"18","metadata":{"permalink":"/18","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-06T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 6\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"MySQL","permalink":"/tags/my-sql"}],"readingTime":4.405,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"18","tags":["DataBase","Lock","MySQL"]},"prevItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/19"},"nextItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/17"}},"content":"## MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4. \\nMySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. \\n\\n### \uae00\ub85c\ubc8c \ub77d(Global lock)\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. \\n - \uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4.\\n - \uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.\\n\\n\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- GLOBAL LOCK\\nFLUSH TABLES WITH READ LOCK;\\n-- UNLOCK\\nUNLOCK TABLES;\\n\\n-- BACKUP LOCK\\nLOCK INSTANCE FOR BACKUP;\\n-- UNLOCK\\nUNLOCK INSTANCE;\\n```\\n\\n:::note MyISAM\\n\\nMySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.\\n\\n:::\\n\\n### \ud14c\uc774\ube14 \ub77d(Table lock)\\n\\n\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4. \\n\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4. \\nInnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4.\\n\\n```sql\\n-- TABLE LOCK\\nLOCK TABLES table_name [ READ | WRITE ]\\n\\n-- UNLOCK\\nUNLOCK TABLES;\\n```\\n\\n### \ub124\uc784\ub4dc \ub77d(Named lock)\\n\\n\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\\nSELECT GET_LOCK(\'aGVyYg==\', 1);\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\\nSELECT IS_FREE_LOCK(\'aGVyYg==\');\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\\nSELECT RELEASE_LOCK(\'aGVyYg==\');\\n\\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\\nSELECT RELEASE_ALL_LOCKS();\\n```\\n\\n### \uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4.\\n\\n```sql\\n-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi](https://gywn.net/2013/12/mysql-user-level-lock/) \\n[Locking Functions, MySQL 5.7 Reference](https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks) \\n[Locking Functions, MySQL 8.0 Reference](https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks)"},{"id":"17","metadata":{"permalink":"/17","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","source":"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","description":"\ud2b8\ub79c\uc7ad\uc158(Transaction)","date":"2023-04-05T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 5\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Transaction","permalink":"/tags/transaction"},{"label":"Isolation","permalink":"/tags/isolation"}],"readingTime":9.68,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","slug":"17","tags":["DataBase","Transaction","Isolation"]},"prevItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/18"},"nextItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/16"}},"content":"## \ud2b8\ub79c\uc7ad\uc158(Transaction)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4. \\n\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)\\n\\n\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4. \\n\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4. \\n\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4. \\n\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c) \\n\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\\n:::info \uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14\\n\\n\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \\n- \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)\\n- \ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)\\n\\n:::\\n\\n## \uaca9\ub9ac \uc218\uc900(Isolation level)\\n\\n\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4. \\n\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, `SERIALIZABLE`\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### READ UNCOMMITTED\\n\\n\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 `COMMIT`\uc774\ub098 `ROLLBACK` \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4. \\n\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c `READ COMMITTED` \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ UNCOMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: INSERT(Alice)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: COMMIT(Alice)\\n```\\n\\n### READ COMMITTED\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\n\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uba70, \uc628\ub77c\uc778 \uc11c\ube44\uc2a4\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc120\ud0dd\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\n`REPEATABLE READ`\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 `NON-REPEATABLE READ` \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ COMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n Alice->>Database: COMMIT\\n```\\n\\n### REPEATABLE READ\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\nMySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4. \\n\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n - \ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4.\\n - Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4.\\n - Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4.\\n - `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\nInnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n```\\n\\n:::note \uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)\\n\\n\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.\\n\\n:::\\n\\n:::note MVCC(Multi Version Concurrency Control)\\n\\n\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4.\\n - PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4.\\n - Oracle, InnoDB\ub294 `Undo log`\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)\\n\\n\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.\\n\\n:::\\n\\n### SERIALIZABLE\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4. \\nInnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. \\n\\n## \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c\\n\\n\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n| \uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c | \ub354\ud2f0 \ub9ac\ub4dc | \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c | \ud32c\ud140 \ub9ac\ub4dc |\\n| --- | --- | --- | --- |\\n| READ UNCOMMITTED | O | O | O |\\n| READ COMMITTED | X | O | O |\\n| REPEATABLE READ | X | X | O(InnoDB\ub294 X) |\\n| SERIALIZABLE | X | X | X |\\n\\n### \ub354\ud2f0 \ub9ac\ub4dc(Dirty read)\\n\\n\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1 \\n\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4. \\n\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0\\n\\n### \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: NON REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Bob\\n```\\n\\n### \ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: PHANTOM READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 1\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: INSERT(Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 2\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Isolation Level, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html)"},{"id":"16","metadata":{"permalink":"/16","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","source":"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","description":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?","date":"2023-04-04T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 4\uc77c","tags":[{"label":"Test","permalink":"/tags/test"},{"label":"Mock","permalink":"/tags/mock"}],"readingTime":4.52,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","slug":"16","tags":["Test","Mock"]},"prevItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/17"},"nextItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/15"}},"content":"### \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?\\n\\n\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4. \\nGerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4.\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. \\n\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870**\\n\\n```mermaid\\nflowchart LR\\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\\n Fake --\x3e TestDouble\\n```\\n\\n### \ub354\ubbf8(Dummy)\\n\\n\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n### \uc2a4\ud141(Stub)\\n\\n\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n### \uc2a4\ud30c\uc774(Spy)\\n\\n\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4. \\n\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. \\n\\n### \ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)\\n\\n\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4. \\n\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### \uac00\uc9dc(Fake)\\n\\nDOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4. \\n\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note DOC(depended-on component)\\n\\n\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4. \\n\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. \\n\\n:::\\n\\n### \uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84\\n\\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4. \\n\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. \\n\\n| TestDouble | Mock | Stub |\\n| --- | --- | --- |\\n| \ud3ec\ud568 \uc720\ud615 | \ubaa9, \uc2a4\ud30c\uc774 | \uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c |\\n| \uc6a9\ub3c4 | \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9 | \ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9 |\\n| \uc124\uba85 | SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9 | SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9\\n| \uc608\uc2dc | \uc774\uba54\uc77c \ubc1c\uc1a1 | \ub370\uc774\ud130 \uac80\uc0c9 |\\n\\n:::note SUT(system under test)\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c \\n\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1\\n\\n:::\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504 \\n\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0 \\n[\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler](https://www.martinfowler.com/bliki/TestDouble.html) \\n[\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib](https://johngrib.github.io/wiki/test-terms/) \\n[Test Double, Gerard Meszaros](http://xunitpatterns.com/Test%20Double.html)"},{"id":"15","metadata":{"permalink":"/15","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","source":"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","description":"\ud074\ub798\uc2a4 \ud30c\uc77c","date":"2023-04-03T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 3\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Class","permalink":"/tags/class"}],"readingTime":5.63,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","slug":"15","tags":["Java","Class"]},"prevItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/16"},"nextItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/14"}},"content":"### \ud074\ub798\uc2a4 \ud30c\uc77c\\n\\n\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?\\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd\\n\\n8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4. \\n16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4. \\n\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. \\n\\nu1 \u2192 unsigned 1byte \\nu2 \u2192 unsigned 2byte \\nu4 \u2192 unsigned 4byte \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870\\n\\n```\\nClassFile {\\n u4 magic;\\n u2 minor_version;\\n u2 major_version;\\n u2 constant_pool_count;\\n cp_info constant_pool[constant_pool_count-1];\\n u2 access_flags;\\n u2 this_class;\\n u2 super_class;\\n u2 interfaces_count;\\n u2 interfaces[interfaces_count];\\n u2 fields_count;\\n field_info fields[fields_count];\\n u2 methods_count;\\n method_info methods[methods_count];\\n u2 attributes_count;\\n attribute_info attributes[attributes_count];\\n}\\n```\\n\\n### \ub9e4\uc9c1\ub118\ubc84\\n\\n\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804\\n\\n\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. \\n- Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D\\n\\n\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 `UnsupportedClassVersionError` \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n**class\xa0file format major versions**\\n\\n| Java SE | Released | Major | Supported majors |\\n| --- | --- | --- | --- |\\n| 8 | March 2014 | 52 | 45 .. 52 |\\n| 9 | September 2017 | 53 | 45 .. 53 |\\n| 10 | March 2018 | 54 | 45 .. 54 |\\n| 11 | September 2018 | 55 | 45 .. 55 |\\n| 12 | March 2019 | 56 | 45 .. 56 |\\n| 13 | September 2019 | 57 | 45 .. 57 |\\n| 14 | March 2020 | 58 | 45 .. 58 |\\n| 15 | September 2020 | 59 | 45 .. 59 |\\n| 16 | March 2021 | 60 | 45 .. 60 |\\n| 17 | September 2021 | 61 | 45 .. 61 |\\n\\n### \uc0c1\uc218 \ud480\\n\\n2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4. \\n\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4. \\nJVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4.\\n\\n### \uc561\uc138\uc2a4 \ud50c\ub798\uadf8\\n\\n\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. \\n- \uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. `ACC_PUBLIC` xor `ACC_INTERFACE` xor `ACC_ABSTRACT`\\n\\n\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4.\\n\\n**Class access and property modifiers**\\n\\n| Flag Name | Value | Interpretation |\\n| --- | --- | --- |\\n| ACC_PUBLIC | 0x0001 | Declared\xa0public; may be accessed from outside its package. |\\n| ACC_FINAL | 0x0010 | Declared\xa0final; no subclasses allowed. |\\n| ACC_SUPER | 0x0020 | Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction. |\\n| ACC_INTERFACE | 0x0200 | Is an interface, not a class. |\\n| ACC_ABSTRACT | 0x0400 | Declared\xa0abstract; must not be instantiated. |\\n| ACC_SYNTHETIC | 0x1000 | Declared synthetic; not present in the source code. |\\n| ACC_ANNOTATION | 0x2000 | Declared as an annotation type. |\\n| ACC_ENUM | 0x4000 | Declared as an\xa0enum\xa0type. |\\n| ACC_MODULE | 0x8000 | Is a module, not a class or interface. |\\n\\n### this_class\\n\\n\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 `CONSTANT_Class_infoclass` \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### super_class\\n\\n\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 `java.lang.Object`\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.\\n\\n### interface, field, method\\n\\n\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4. \\ninterface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4.\\n\\n### attributes\\n\\n\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85 \\n\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234\\n\\nIntelliJ plugin - BinEd \\nIntelliJ plugin - jclasslib Bytecode Viewer\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654 \\n[Class file in Java, File Format](https://docs.fileformat.com/ko/programming/class/) \\n[java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html) \\n[java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html)"},{"id":"14","metadata":{"permalink":"/14","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","description":"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.","date":"2023-04-02T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 2\uc77c","tags":[{"label":"JDBC","permalink":"/tags/jdbc"},{"label":"Java","permalink":"/tags/java"}],"readingTime":9.025,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","slug":"14","tags":["JDBC","Java"]},"prevItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/15"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/13"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. \\n\\n### \uae30\uc874 \ucf54\ub4dc\\n\\n<Tabs>\\n<TabItem value=\\"User\\" label=\\"User\\" default>\\n\\n```java\\npublic class User {\\n private final int id;\\n private final String name;\\n\\n public User(final int id, final String name) {\\n this.id = id;\\n this.name = name;\\n }\\n\\n public int getId() {\\n return id;\\n }\\n\\n public String getName() {\\n return name;\\n }\\n}\\n```\\n\\n</TabItem>\\n\\n<TabItem value=\\"UserDao\\" label=\\"UserDao\\">\\n\\n```java\\npublic class UserDao {\\n private final ConnectionPool connectionPool;\\n\\n public UserDao(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void insert(final String name) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setString(1, name);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public void delete(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"DELETE FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public User findById(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n if (resultSet.next()) {\\n return new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n );\\n }\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n return null;\\n }\\n\\n public List<User> findAll() {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n final List<User> result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n ));\\n }\\n return result;\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n</TabItem>\\n\\n<TabItem value=\\"ConnectionPool\\" label=\\"ConnectionPool\\">\\n\\n```java\\npublic class ConnectionPool {\\n private static final String SERVER = \\"localhost:13306\\";\\n private static final String DATABASE = \\"chess\\";\\n private static final String OPTION = \\"?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true\\";\\n private static final String URL = \\"jdbc:mysql://\\" + SERVER + \\"/\\" + DATABASE + OPTION;\\n private static final String USERNAME = \\"root\\";\\n private static final String PASSWORD = \\"root\\";\\n\\n private final AtomicInteger index = new AtomicInteger();\\n private final List<Connection> connections;\\n\\n public ConnectionPool(final int connectionCount) {\\n connections = generateConnections(connectionCount);\\n }\\n\\n private List<Connection> generateConnections(final int connectionCount) {\\n return Stream.generate(this::generateConnection)\\n .limit(connectionCount)\\n .collect(toList());\\n }\\n\\n private Connection generateConnection() {\\n try {\\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\\n } catch (SQLException e) {\\n throw new IllegalStateException(\\"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\");\\n }\\n }\\n\\n public Connection getConnection() {\\n int currentIndex = index.getAndIncrement();\\n return connections.get(currentIndex % connections.size());\\n }\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n### SELECT, DELETE \uc911\ubcf5 \uc81c\uac70\\n\\n\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1 \\n\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 \\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n```java\\npublic void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n executeUpdate(query, name);\\n}\\n\\npublic void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n executeUpdate(query, userId);\\n}\\n\\nprivate void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758\\n\\n\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. \\n\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \ucf5c\ubc31(Callback)\\n\\n\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4. \\n\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n```mermaid\\nflowchart LR\\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31\\n```\\n\\n:::\\n\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\nexecuteQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4. \\n\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper {\\n User mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c\\n\\n\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c? \\n\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java\\npublic User findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return queryForSingleResult(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n }, userId);\\n}\\n\\nprivate User queryForSingleResult(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return rowMapper.mapRow(resultSet);\\n }\\n return null;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c\\n\\n\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4.\\n\\n```java\\npublic List<User> findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return query(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n });\\n}\\n\\nprivate List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List<User> result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30\\n\\n\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper<T> {\\n T mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n\\nprivate <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\\nprivate <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\\n```\\n\\n### \uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30\\n\\n\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4. \\n\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4.\\n\\n<Tabs>\\n<TabItem value=\\"UserDao\\" label=\\"UserDao\\" default>\\n\\n```java\\npublic class UserDao {\\n private final RowMapper<User> rowMapper = resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n };\\n private final JdbcTemplate jdbcTemplate;\\n\\n public UserDao(final JdbcTemplate jdbcTemplate) {\\n this.jdbcTemplate = jdbcTemplate;\\n }\\n\\n public void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n jdbcTemplate.executeUpdate(query, name);\\n }\\n\\n public void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n jdbcTemplate.executeUpdate(query, userId);\\n }\\n\\n public Optional<User> findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\\n }\\n\\n public List<User> findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return jdbcTemplate.query(query, rowMapper);\\n }\\n}\\n```\\n\\n</TabItem>\\n<TabItem value=\\"JdbcTemplate\\" label=\\"JdbcTemplate\\" default>\\n\\n```java\\npublic class JdbcTemplate {\\n private final ConnectionPool connectionPool;\\n\\n public JdbcTemplate(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public <T> Optional<T> queryForSingleResult(\\n final String query,\\n final RowMapper<T> rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return Optional.of(rowMapper.mapRow(resultSet));\\n }\\n return Optional.empty();\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n private ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters\\n ) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n }\\n\\n public <T> List<T> query(\\n final String query,\\n final RowMapper<T> rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List<T> result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n</TabItem>\\n</Tabs>"},{"id":"13","metadata":{"permalink":"/13","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","description":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.","date":"2023-04-01T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 1\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.48,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","slug":"13","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/14"},"nextItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/12"}},"content":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4. \\n\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4. \\n\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. \\n\\n### Keep\\n\\n**\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30** \\n\\n\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0 \\n\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0 \\n\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4. \\n\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 \\n\\n\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. \\n\\n**\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30** \\n\\n10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) \\n\\n**\uae00\uc4f0\uae30** \\n\\n\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4. \\n\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4. \\n\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n**\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514** \\n\\n\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4. \\n\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4. \\n\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? \\n\\n**\ub808\ubca8 \uc778\ud130\ubdf0**\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370 \\n\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4. \\n\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n- \ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 \\n- \ub450\uad04\uc2dd \ud45c\ud604\\n- \uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 \\n- \uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30\\n- \uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30\\n- \ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)\\n- \uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30\\n- \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30\\n\\n### Problem\\n\\n**\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4. \\n\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4. \\n\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. \\n\\n**\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871** \\n\\n\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Try\\n\\n**\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?** \\n\\n\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 `\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)` \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4. \\n\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? \\n\\n**\uae30\uc220\uc801\uc778 \ubd80\ubd84** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4. \\n\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70 \\n\\n\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4. \\n\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."},{"id":"12","metadata":{"permalink":"/12","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","description":"\uccb4\uc2a4","date":"2023-03-31T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 31\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.63,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","slug":"12","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/13"},"nextItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/11"}},"content":"### \uccb4\uc2a4\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4! \\n\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. \\n \\n\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n**\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80** \\nRank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4. \\n\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2) \\n\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n**\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80** \\n\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. \\n\\n**\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80** \\n\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. \\n\\n**\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9** \\n\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4. \\n\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n- \uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 \\n- \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 \\n\\n\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4. \\n\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n- \ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. \\n- \uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. \\n- \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. \\n\\n\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4. \\n\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac) \\n\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)\\n\\n\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d \\n\\n**\ubd80\uac00\uc801\uc778 \ubd80\ubd84**\\n\\n\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. \\n- \ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 \\n- ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac \\n- \uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) \\n\\n\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84** \\nDB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n**\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10** \\n\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4. \\n\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DAO \uc911\ubcf5 \uc81c\uac70**\\n\\n\ud504\ub864\ub85c\uadf8\uc5d0 [\uae00](https://prolog.techcourse.co.kr/studylogs/2947)\uc744 \uc791\uc131\ud588\ub2e4. \\nDAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc0dd\uac01\ud558\uae30** \\n\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! \\n\\n**\ubbf8\uc158 \ubab0\uc785\ud558\uae30** \\n\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4. \\n\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 \\n\\n**\uc194\uc9c1\ud568** \\n\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. \\n\\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"},{"id":"11","metadata":{"permalink":"/11","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-30-GRASP.mdx","source":"@site/blog/2023/2023-03-30-GRASP.mdx","title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","description":"GRASP(General Responsibility Assignment Software Pattern)","date":"2023-03-30T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 30\uc77c","tags":[{"label":"GRASP","permalink":"/tags/grasp"},{"label":"OOP","permalink":"/tags/oop"}],"readingTime":8.085,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","slug":"11","tags":["GRASP","OOP"]},"prevItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/12"},"nextItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/10"}},"content":"### GRASP(General Responsibility Assignment Software Pattern)\\n\\n\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134\\n\\n\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4.\\n\\n### \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)\\n\\nQ: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?\\n\\nA: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4.\\n\\n### \ucc3d\uc870\uc790 \ud328\ud134(Creator)\\n\\nQ: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?\\n\\nA: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)\\n\\nQ: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?\\n\\nA: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uacb0\ud569\ub3c4(Coupling)\\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.17\\n> \\n\\n\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4.\\n- \uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4.\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)\\n\\n### \ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)\\n\\nQ. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uc751\uc9d1\ub3c4(Cohesion)\\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.26\\n> \\n\\n\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)\\n- \uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4.\\n- \ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4.\\n- \uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.\\n\\n### \ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)\\n\\nQ. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?\\n\\nA. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n\\n\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c\\n\\n- \uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4.\\n- \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4.\\n- \ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.\\n\\n### \ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)\\n\\nQ. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?\\n\\nA. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)\\n\\n\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.\\n\\n\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\\n\\nQ. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?\\n\\nA. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n### \uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)\\n\\nQ. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4.\\n\\n### \uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)\\n\\nQ. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4.\\n\\n\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815\\n\\n- \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4.\\n- \ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, [\uc870\uc601\ud638](http://aeternum.egloos.com/)\\n\\nApplying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman\\n\\n[GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c](https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397)"},{"id":"10","metadata":{"permalink":"/10","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","description":"\ube14\ub799\uc7ad","date":"2023-03-14T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.105,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","slug":"10","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/11"},"nextItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/9"}},"content":"### \ube14\ub799\uc7ad\\n\\n\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. \\n\\n\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc \\n\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4. \\n\\"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?\\" \\n\\n\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c? \\n\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4. \\n\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. \\n\\n\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30** \\n\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4. \\n\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?\\n\\n**\uccb4\ub825 \uad00\ub9ac** \\n\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4.\\n\\n**\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30** \\n\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc0c1\ud0dc \ud328\ud134** \\n\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4. \\n\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. \\n\\n**\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654** \\n\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4! \\n\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4. \\n\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc \\n\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4. \\n\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc0dd\uac01 \uc815\ub9ac** \\n\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4. \\n\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84** \\n\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4. \\n\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84** \\n\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. \\n\\n\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"},{"id":"9","metadata":{"permalink":"/9","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","description":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30","date":"2023-02-26T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 26\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":10.22,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","slug":"9","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/10"},"nextItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/8"}},"content":"### \uc0ac\ub2e4\ub9ac \ud0c0\uae30\\n\\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4.\\n\\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4.\\n\\n1. LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n2. Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95\\n\\n### Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\n\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4. \\n\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4. \\n\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n\\n LadderGame --\x3e Position\\n Ladder --\x3e Position\\n Items --\x3e Position\\n Line --\x3e Position\\n Players --\x3e Position\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item\\n Players --\x3e Player\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n final Map<Player, Item> result = new LinkedHashMap<>();\\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\\n for (Position position : Position.range(players.count())) {\\n final Position resultPosition = ladder.play(position);\\n result.put(players.get(position), items.get(resultPosition));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\nPosition\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\n\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n Line --\x3e Position\\n\\n Players --\x3e Ladder\\n Player --\x3e Ladder\\n\\n Item --\x3e Position\\n Player --\x3e Position\\n\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item --\x3e ItemName\\n Players --\x3e Player --\x3e PlayerName\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n OutputView --\x3e LadderMessageGenerator\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\\n final Map<Player, Position> playResult = players.play(ladder);\\n\\n final Map<Player, Item> result = new LinkedHashMap<>();\\n for (Player player : playResult.keySet()) {\\n result.put(player, toItem(playResult.get(player)));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30** \\n\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. \\n\\n**\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30** \\n\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72\\n\\n**README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c** \\n\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4.\\n\\n**\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30** \\n\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. \\n\\n**PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30** \\n\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4. \\nPR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4. \\ngithub pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30** \\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784** \\nPlayers\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\\n\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. \\n\\n\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4.\\n\\n**\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900** \\n\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. \\n\\n**\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30** \\nPosition\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4. \\n\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4. \\n\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! \\n\\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4. \\n\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!\\n\\n\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"},{"id":"8","metadata":{"permalink":"/8","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","description":"\uc790\ub3d9\ucc28 \uacbd\uc8fc","date":"2023-02-14T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.56,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","slug":"8","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/9"},"nextItem":{"title":"Parameterized Tests","permalink":"/7"}},"content":"### \uc790\ub3d9\ucc28 \uacbd\uc8fc\\n\\n\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. \\n\\n\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. \\n\\n\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4. \\nmermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n- \ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. \\n- github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```mermaid\\n---\\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\\n---\\ngraph TD\\n Cars --\x3e Car\\n Car --\x3e Name\\n Car --\x3e Position\\n RacingGame --\x3e Count\\n RacingGame --\x3e NumberGenerator\\n RacingGame --\x3e Cars\\n RacingCarController --\x3e RacingGame\\n RandomNumberGenerator -.-> NumberGenerator\\n RacingCarController --\x3e InputView\\n InputView --\x3e InputValidator\\n RacingCarController --\x3e OutputView\\n```\\n\\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4.\\n\\n\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4. \\n\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4. \\n\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc \\n\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4.\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**Assertions extracting**\\n\\n\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4. \\n\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4.\\n\\n```java\\n@Test\\nvoid extracting() {\\n final Cars cars = new Cars(List.of(\\"car1\\", \\"car2\\"));\\n\\n assertThat(cars.getCars())\\n .extracting(Car::getName)\\n .containsExactly(\\"car1\\", \\"car2\\");\\n}\\n```\\n\\n---\\n\\n\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4.\\n\\n**\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4. \\n\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n**\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4. \\n\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc \\n\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9**\\n\\n\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4. \\n\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4. \\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4. \\n\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4. \\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4. \\n\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?) \\n\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4.\\n\\n\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4. \\n\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4. \\n\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4. \\n\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00? \\n\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\\n\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc. \\n\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."},{"id":"7","metadata":{"permalink":"/7","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-12-Parameterized Tests.mdx","source":"@site/blog/2023/2023-02-12-Parameterized Tests.mdx","title":"Parameterized Tests","description":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.","date":"2023-02-12T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 12\uc77c","tags":[{"label":"Java","permalink":"/tags/java"}],"readingTime":3.17,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Parameterized Tests","slug":"7","tags":["Java"]},"prevItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/8"},"nextItem":{"title":"IntelliJ \uc124\uc815","permalink":"/6"}},"content":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4. \\n\uc774 \ub54c `@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4.\\n\\n## Argument Sources\\n\\n`@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4. \\nJUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### Value Source\\n\\n\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. \\n- short, int, long, float, double\\n- byte, char, boolean, String, Class \\n\\n```java\\n@ParameterizedTest\\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\\nvoid valueTest(final int value) {\\n Assertions.assertThat(value).isPositive();\\n}\\n```\\n\\n### Null & Empty Source\\n\\nnull \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nEmpty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n- String\\n- java.util.List, java.util.Set, java.util.Map\\n- primitive arrays \u2014 ex) int[]\\n- object arrays \u2014 ex) String[]\\n\\n```java\\n@ParameterizedTest\\n@NullAndEmptySource\\nvoid nullAndEmptyTest(final String value) {\\n Assertions.assertThat(value).isNullOrEmpty();\\n}\\n```\\n\\n### Enum Source\\n\\nEnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\nenum Day {\\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\\n}\\n\\n@ParameterizedTest\\n@EnumSource(Day.class)\\nvoid enumTest(final Day day) {\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)\\n\\n```java\\n@ParameterizedTest\\n@EnumSource(value = Day.class, names = {\\"SATURDAY\\", \\"SUNDAY\\"}, mode = Mode.EXCLUDE)\\nvoid enumTest(final Day day) {\\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n### CSV Source\\n\\ncsv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@CsvSource({\\"1,1\\", \\"2,4\\", \\"3,9\\", \\"4,16\\"})\\nvoid csvTest(final int number, final int result) {\\n assertThat(number * number).isEqualTo(result);\\n}\\n```\\n\\n### Method Source\\n\\n\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@MethodSource\\nvoid methodTest(final List<Integer> numbers, final int count) {\\n assertThat(numbers).hasSize(count);\\n}\\n\\nprivate static Stream<Arguments> methodTest() {\\n return Stream.of(\\n Arguments.of(List.of(1), 1),\\n Arguments.of(List.of(1, 2), 2),\\n Arguments.of(List.of(1, 2, 3), 3)\\n );\\n}\\n```\\n\\n### ETC.\\n\\n\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n- CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource\\n- ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5)"},{"id":"6","metadata":{"permalink":"/6","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","source":"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","title":"IntelliJ \uc124\uc815","description":"Import \uc790\ub3d9 \uc801\uc6a9","date":"2023-01-30T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 30\uc77c","tags":[{"label":"IntelliJ","permalink":"/tags/intelli-j"}],"readingTime":0.465,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"IntelliJ \uc124\uc815","slug":"6","tags":["IntelliJ"]},"prevItem":{"title":"Parameterized Tests","permalink":"/7"},"nextItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/5"}},"content":"### Import \uc790\ub3d9 \uc801\uc6a9\\n\\nPrefrences > Editor > General > Auto Import > Add unambiguous imports on the fly\\n\\n![auto-import](./auto-import.png)\\n\\n### \uc800\uc7a5\uc2dc \ub3d9\uc791\\n\\nPrefrences > Tools > Actions on Save\\n\\n![actions-on-save](./actions-on-save.png)\\n\\nReformat Code: Code Reformmating\\n\\nOptimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70\\n\\nRearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c\\n\\n### \uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9\\n\\nPrefrences > Editor > Code Style > Java > Code Generation > Final Modifier\\n\\n![final-modifier](./final-modifier.png)"},{"id":"5","metadata":{"permalink":"/5","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","source":"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","description":"nullable \ud0c0\uc785","date":"2023-01-16T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 16\uc77c","tags":[{"label":"Kotlin","permalink":"/tags/kotlin"}],"readingTime":4.225,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","slug":"5","tags":["Kotlin"]},"prevItem":{"title":"IntelliJ \uc124\uc815","permalink":"/6"},"nextItem":{"title":"JSR-310","permalink":"/4"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n### nullable \ud0c0\uc785\\n\\n\ucf54\ud2c0\ub9b0\uc740 `NullPointerException` \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4. \\n\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4.\\n\\n```kotlin\\nval number: Int?\\n```\\n\\n\ud0c0\uc785 \ub4a4\uc5d0 `?`\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4. \\n\ub9cc\uc57d `?`\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4.\\n\\n### `?.` Safe Calls \uc5f0\uc0b0\uc790\\n\\n\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 `?.` \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n<Tabs>\\n<TabItem value=\\"Java\\" label=\\"Java\\" default>\\n\\n```java\\npublic String repeat(String word) {\\n if (word == null) {\\n return null;\\n }\\n return word.repeat(2);\\n}\\n```\\n\\n</TabItem>\\n<TabItem value=\\"Kotlin\\" label=\\"Kotlin\\">\\n\\n```kotlin\\nfun repeat(word: String?): String? {\\n return word?.repeat(2)\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n### `?:` \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\\n\\n\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c? \\n\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.\\n\\n<Tabs>\\n<TabItem value=\\"Java\\" label=\\"Java\\" default>\\n\\n```java\\npublic String stringSafe(String word) {\\n if (word == null) {\\n return \\"\\";\\n }\\n return word;\\n}\\n```\\n\\n</TabItem>\\n<TabItem value=\\"Kotlin\\" label=\\"Kotlin\\">\\n\\n```kotlin\\nfun stringSafe(word: String?): String {\\n return word ?: \\"\\"\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```kotlin\\nuserRepository.findByName(name) ?: throw IllegalArgumentException()\\n```\\n\\n### `!!` \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790\\n\\n!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4. \\n\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4. \\n\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n```kotlin\\nval length: Int = word!!.length\\n```\\n\\n### `as?` \uc548\uc804\ud55c \uce90\uc2a4\ud305\\n\\n\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 `ClassCastException`\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. \\n\\n\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n```kotlin\\nval value: Int? = something as? Int\\n```\\n\\n### List\uc5d0\uc11c\uc758 null \ucc98\ub9ac\\n\\nList\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 `filterNotNull` \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4.\\n\\n```kotlin\\nval foodsWithNull: List<String?> = listOf(\\"Pizza\\", \\"Cheese\\", null, \\"Potato\\")\\nval foods = foodsWithNull.filterNotNull()\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [Kotlin in Action](https://product.kyobobook.co.kr/detail/S000001804588)\\n- [Effective Kotlin Item 8](https://product.kyobobook.co.kr/detail/S000001033129)\\n- [Comprehensive Guide to Null Safety in Kotlin](https://www.baeldung.com/kotlin/null-safety)\\n- [Kotlin NullSafety](https://kotlinlang.org/docs/null-safety.html)"},{"id":"4","metadata":{"permalink":"/4","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-08-JSR-310.mdx","source":"@site/blog/2023/2023-01-08-JSR-310.mdx","title":"JSR-310","description":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API","date":"2023-01-08T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 8\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Time","permalink":"/tags/time"}],"readingTime":1.685,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"JSR-310","slug":"4","tags":["Java","Time"]},"prevItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/5"},"nextItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/3"}},"content":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API \\nISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131 \\n\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131\\n\\n:::note ISO-8601\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900\\n\\n:::\\n\\n### LocalDate, LocalTime, LocalDateTime\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### Instant\\n\\n\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4 \\n\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604\\n\\n### Duration, Period\\n\\n\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### TemporalAdjusters\\n\\n\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9 \\n\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5\\n\\n```java\\n@FunctionalInterface\\npublic interface TemporalAdjuster {\\n Temporal adjustInto(Temporal temporal);\\n}\\n```\\n\\n### DateTimeFormatter\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4 \\n\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5\\n\\n### ZoneId, ZoneOffset\\n\\nZoneId\ub294 \uc9c0\uc5ed ID\ub294 `\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019` \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9 \\nZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9\\n\\n```java\\nInstant instant = Instant.now();\\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158](https://product.kyobobook.co.kr/detail/S000001810171)\\n- [Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API](https://d2.naver.com/helloworld/645609)\\n- [ISO-8601](https://www.w3.org/TR/NOTE-datetime)\\n- [JSR-310 Spec](https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4)\\n- [Temporal Adjuster](https://www.baeldung.com/java-temporal-adjuster)\\n- [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)"},{"id":"3","metadata":{"permalink":"/3","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","source":"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","description":"\ucc45 \uc815\ubcf4","date":"2023-01-07T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 7\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.415,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","slug":"3","tags":["Book"]},"prevItem":{"title":"JSR-310","permalink":"/4"},"nextItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574 \\n> \uc870\uc601\ud638\\n> \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4. \\n\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4. \\n\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. \\n\\n\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0 \\n\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4.\\n\\n### \ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173\\n\\n\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4.\\n\\n- \uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558\\n- \ucc45\uc784\uc758 \ucd94\uc0c1\ud654\\n\\n\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4.\\n\\n- \uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac\\n\\n\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4.\\n\\n- \ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558\\n\\n\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4.\\n\\n- \uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00\\n\\n\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4.\\n\\n- \uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\np.21\\n> \\n\\n> \uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\\np.33\\n> \\n\\n> **\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8**\\n> \\n> \\n> \uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95\\n> \\n> \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\\n> p.35\\n> \\n\\n> \ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\np.38\\n> \\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\\np.105\\n> \\n\\n> \ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\\np.158\\n>"},{"id":"2","metadata":{"permalink":"/2","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx","title":"2022\ub144 \ud68c\uace0","description":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70","date":"2023-01-02T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 2\uc77c","tags":[{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.705,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"2022\ub144 \ud68c\uace0","slug":"2","tags":["Retrospective"]},"prevItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/3"},"nextItem":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","permalink":"/1"}},"content":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 \\n\\n### \uc804\uc5ed\\n\\n\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4. \\n\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. \\n\\n\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4. \\n\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4. \\n\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. \\n\\n### \uc790\ubc14\\n\\n\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 [\uc790\ubc14 \uacf5\ud654\uad6d](https://jojoldu.tistory.com/609) \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4.\\n\\n23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4. \\n\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud130\ub514\\n\\n\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0 \\n\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4. \\n\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\\n\\n\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4. \\n\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4. \\n\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. \\n\\n\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### 2023\ub144\uc5d0\ub294\\n\\n\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."},{"id":"1","metadata":{"permalink":"/1","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","source":"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","description":"\ucc45 \uc815\ubcf4","date":"2023-01-01T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 1\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":4.425,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","slug":"1","tags":["Book"]},"prevItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \\n> \ubc15\uc194\ubbf8 \\n>\\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4. \\n\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. \\n\\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4. \\n\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4. \\n\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.\\n> \\n\\n> \ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.\\n> \\n\\n> \uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.\\n> \\n\\n> \uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.\\n> \\n\\n> \uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c\\n> \\n\\n> \uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.\\n> \\n\\n> \uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.\\n> \\n\\n> \ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.\\n> \\n\\n> \uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.\\n>"}]}')}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.bce3d397.js b/assets/js/b2b675dd.bce3d397.js new file mode 100644 index 000000000..0814143ba --- /dev/null +++ b/assets/js/b2b675dd.bce3d397.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[533],{28017:n=>{n.exports=JSON.parse('{"blogPosts":[{"id":"41","metadata":{"permalink":"/41","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md","source":"@site/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md","title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","description":"CloudWatch","date":"2023-08-17T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 17\uc77c","tags":[{"label":"cloudwatch","permalink":"/tags/cloudwatch"},{"label":"log","permalink":"/tags/log"},{"label":"monitoring","permalink":"/tags/monitoring"}],"readingTime":5.185,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","slug":"41","tags":["cloudwatch","log","monitoring"]},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/40"}},"content":"## CloudWatch\\n\\nAWS \ub9ac\uc18c\uc2a4\uc640 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc9c0\ud45c\uc640 \ub85c\uadf8\uc5d0 \ub300\ud55c \ubaa8\ub2c8\ud130\ub9c1\uc744 \uc81c\uacf5\ud558\ub294 \uc11c\ube44\uc2a4\ub2e4. \\n\uc9c0\ud45c\ub97c \uac10\uc2dc\ud558\uc5ec \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \uae30\ub2a5\ub3c4 \uc81c\uacf5\ud55c\ub2e4. \\n\ud504\ub9ac\ud2f0\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \ub300\uc2dc\ubcf4\ub4dc\ub2f9 3$/M \uc758 \ube44\uc6a9\uc774 \uccad\uad6c\ub418\uace0, \uc9c0\ud45c\ub098 \ub85c\uadf8\uc758 \uc591\uc5d0 \ub530\ub77c \ube44\uc6a9\uc774 \ucd94\uac00\uc801\uc73c\ub85c \uccad\uad6c\ub41c\ub2e4. \\n\uc694\uae08 \uc815\ubcf4\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub294 [\ub2e4\uc74c \ub9c1\ud06c](https://aws.amazon.com/ko/cloudwatch/pricing/)\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n## CloudWatch Metrics\\n\\n\uae30\ubcf8\uc801\uc73c\ub85c 5\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc218\uc9d1\ub41c\ub2e4. \\n\uc138\ubd80 \ubaa8\ub2c8\ud130\ub9c1(Detailed Monitoring)\uc744 \ud65c\uc131\ud654\ud558\uba74 1\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\ub97c \uc218\uc9d1\ud55c\ub2e4. \\n\ub300\uc2dc\ubcf4\ub4dc\uc5d0\uc11c InstanceId\ub85c \uac80\uc0c9\ud558\uc5ec \uc218\uc9d1\ub41c \uc9c0\ud45c\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.\\n\\n![./cloudwatch1.png](./cloudwatch1.png)\\n\\nCPUUtilization, NetworkIn, NetworkOut\uacfc \uac19\uc740 \uae30\ubcf8\uc801\uc778 \uc9c0\ud45c\ub97c \uc81c\uacf5\ud558\uace0, \uba54\ubaa8\ub9ac, \ub514\uc2a4\ud06c \uacf5\uac04\uacfc \uac19\uc740 \uc9c0\ud45c\ub97c \ud655\uc778\ud558\ub824\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\ub97c \uc124\uc815\ud574\uc57c \ud55c\ub2e4.\\n\\n## CloudWatch Agent \uc124\uce58\\n\\nCloudWatch Agent \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\uc640 \ub85c\uadf8\ub97c \uc218\uc9d1\ud560 \uc218 \uc788\ub2e4. \\n\\n### IAM \uc5ed\ud560 \uc124\uc815\\n\\n\uae30\ubcf8\uc801\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4\uac00 CloudWatchAgentServerPolicy\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4. \\nIAM \u2192 \uc5ed\ud560\uc5d0\uc11c \uc5ed\ud560 \uc0dd\uc131\uc744 \ud074\ub9ad\ud55c\ub2e4.\\n\\n![./cloudwatch2.png](./cloudwatch2.png)\\n\\nCloudWatchAgentServerPolicy \uad8c\ud55c \uc815\ucc45\uc744 \uc120\ud0dd\ud558\uace0, \uc801\ub2f9\ud55c \uc5ed\ud560 \uc774\ub984\uc744 \uc785\ub825\ud574\uc11c \uc5ed\ud560\uc744 \uc0dd\uc131\ud55c\ub2e4.\\n\\n![./cloudwatch3.png](./cloudwatch3.png)\\n\\nEC2 \uc778\uc2a4\ud134\uc2a4 \ubaa9\ub85d\uc73c\ub85c \ub4e4\uc5b4\uac00\uc11c, CloudWatch Agent\ub97c \uc124\uce58\ud560 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud074\ub9ad\ud55c\ub2e4. \\n\uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc5d0\uc11c \uc774\uc804\uc5d0 \uc0dd\uc131\ud55c \uc5ed\ud560\uc744 \uc9c0\uc815\ud55c\ub2e4.\\n\\n![./cloudwatch4.png](./cloudwatch4.png)\\n\\n### \uc124\uce58\\n\\n\ud658\uacbd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\nOS: ubuntu 22.04 \\n\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small (ARM64) \\n\\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uce58\ud55c\ub2e4.\\n\\n```bash\\nwget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb\\nsudo dpkg -i -E ./amazon-cloudwatch-agent.deb\\n```\\n\\n[\uc0ac\uc6a9 \uc124\uba85\uc11c](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)\uc5d0 \uac01 \uc778\uc2a4\ud134\uc2a4 \uc720\ud615\ub9c8\ub2e4 \ub2e4\uc6b4\ub85c\ub4dc \ub9c1\ud06c\uac00 \uc790\uc138\ud558\uac8c \uc548\ub0b4\ub418\uc5b4 \uc788\ub2e4.\\n\\n### Wizard\\n\\nCloudWatch Wizard\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uc124\uc815 \ud30c\uc77c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4. \\n\ub85c\uadf8\ub97c \uc218\uc9d1\ud558\ub3c4\ub85d \uc124\uc815\ud558\ub294 \uacbd\uc6b0 Wizard \uc2e4\ud589 \uba85\ub839\uc5b4 \uc785\ub825 \uc804 log \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \ubcf5\uc0ac\ud574\ub450\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec Wizard\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nsudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard\\n```\\n\\n\uc124\uc815\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74 \uc124\uc815 \ud30c\uc77c\uc774 \uc5b4\ub5bb\uac8c \uad6c\uc131\ub420\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\ub85c\uadf8\ub97c \ucd94\uac00\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \uc785\ub825\ucc3d\uc774 \ub098\uc624\uba74 \uc900\ube44\ud574\ub480\ub358 \ub85c\uadf8 \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \uc785\ub825\ud55c\ub2e4. \\n\\n![./cloudwatch5.png](./cloudwatch5.png)\\n\\n\uc911\uac04\uc5d0 SSM parameter store\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4. \\n\\n```bash\\nDo you want to store the config in the SSM parameter store?\\n1. yes\\n2. no\\n```\\n\\n\ucd94\uac00\uc801\uc73c\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 2\ubc88\uc744 \uc120\ud0dd\ud55c\ub2e4. \\nParameter Store \uad00\ub9ac\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc758 [\ubb38\uc11c](https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/)\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac70 \uac19\ub2e4. \\n\uc124\uc815\uc774 \uc644\ub8cc\ub418\uba74 `/opt/aws/amazon-cloudwatch-agent/bin/config.json` \uc5d0 \uc124\uc815\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc774 \uc800\uc7a5\ub41c\ub2e4. \\n\\n### \uc124\uc815 \ud30c\uc77c \uc801\uc6a9\\n\\n\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uc815\ud30c\uc77c\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4. \\nfile \ub4a4\uc5d0\ub294 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub300\ud55c \uc808\ub300\uacbd\ub85c(\uc544\ub798 \uba85\ub839\uc5b4 \uae30\uc900 \uae30\ubcf8 \uc0dd\uc131 \uc704\uce58)\ub97c \uc785\ub825\ud558\uba74 \ub41c\ub2e4. \\n\\n```bash\\nsudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json\\n```\\n\\n### types.db: no such file or directory \uc5d0\ub7ec\\n\\n\ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 types.db \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4.\\n\\n```bash\\nError running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory\\n```\\n\\ntypes.db \ud30c\uc77c \uc0dd\uc131\\n\\n```bash\\nsudo mkdir /usr/share/collectd\\nsudo touch /usr/share/collectd/types.db\\n```\\n\\n### \uc9c0\ud45c \ud655\uc778\\n\\nCloudWatch Metrics\uc5d0 \uac00\ubcf4\uba74 CWAgent\ub77c\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\uac00 \ucd94\uac00\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \\n\uc124\uc815 \ud30c\uc77c\uc5d0 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \ucd94\uac00\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4. \\n\\n![./cloudwatch6.png](./cloudwatch6.png)\\n\\n### \ub85c\uadf8\\n\\nCloudWatch \u2192 \ub85c\uadf8 \uadf8\ub8f9\uc73c\ub85c \uac00\uba74 Wizard\ub85c \ucd94\uac00\ud55c \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.\\n\\n![./cloudwatch7.png](./cloudwatch7.png)\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[CloudWatch\ub780 \ubb34\uc5c7\uc785\ub2c8\uae4c?](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) \\n[Amazon CloudWatch \uc694\uae08](https://aws.amazon.com/ko/cloudwatch/pricing/) \\n[Linux \uc778\uc2a4\ud134\uc2a4 \uc9c0\ud45c](https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html) \\n[\uc11c\ubc84\uc5d0 CloudWatch \uc5d0\uc774\uc804\ud2b8 \uc124\uce58 \ubc0f \uc2e4\ud589](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html) \\n[CloudWatch Agent\ub97c Parameter Store\uc5d0\uc11c \uad00\ub9ac\ud574 \ubcf4\uae30](https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/)"},{"id":"40","metadata":{"permalink":"/40","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","source":"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","description":"\uc774\uc804 \uae00","date":"2023-08-13T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 13\uc77c","tags":[{"label":"async","permalink":"/tags/async"},{"label":"event","permalink":"/tags/event"}],"readingTime":11.2,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","slug":"40","tags":["async","event"]},"prevItem":{"title":"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131","permalink":"/41"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/39"}},"content":"## \uc774\uc804 \uae00\\n\\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd](./36) \\n[\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604](./39)\\n\\n## \uac1c\uc694\\n\\n\ud604\uc7ac \uc5ec\ud589\uc744 \ub9c8\uce58\ub294 \uacbd\uc6b0, \uac10\uc0c1\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \uc704\uce58 \uc815\ubcf4\uc758 \uac1c\uc218\uc5d0 \uc815\ube44\ub840\ud558\uc5ec \uc0dd\uc131 \uc2dc\uac04\uc774 \uc99d\uac00\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ube44\ub3d9\uae30\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uacbd\ud5d8\uc744 \uac1c\uc120\uc2dc\ud0ac \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \uc8fc\uae30\ub2a5\uc758 \uc751\ub2f5\uc18d\ub3c4 \uac1c\uc120\\n\\n\uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc774 \uc8fc\uae30\ub2a5\uc774\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc740 \ubd80\uae30\ub2a5\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131\uc758 \uc751\ub2f5 \uc18d\ub3c4\uac00 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uace0 \uc788\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uc5ec\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0ac\uc6a9\uc5d0 \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4. \\n\uc18c\uc694 \uc2dc\uac04\uc774 1\ucd08 \uc774\uc0c1 \uac78\ub9ac\ub294 \uacbd\uc6b0\uac00 \uc874\uc7ac\ud558\uae30\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ube44\ub3d9\uae30 \ucc98\ub9ac\ud558\uace0 \uc5ec\ud589 \uc885\ub8cc\uc640 \uac10\uc0c1 \uc0dd\uc131 \uae30\ub2a5\uc758 \uc751\ub2f5 \uc2dc\uac04\uc744 \uac1c\uc120\ud558\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4. \\n\\n### \ud655\uc7a5\uc131 \ub300\ube44\\n\\n\ud604\uc7ac 10\ubd84 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uace0 \uc788\ub2e4. \\n\uc870\uae08 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uadf8\ub9ac\ub294 \uacbd\uc6b0 \ud558\ub098\uc758 \uc5ec\ud589\uc5d0 \ub9ce\uc740 \uc704\uce58 \uc815\ubcf4\uac00 \uc800\uc7a5\ub420 \uc218\ubc16\uc5d0 \uc5c6\uace0 \ub530\ub77c\uc11c \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uac78\ub9ac\ub294 \uc2dc\uac04\uc774 \ub354 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ucd94\ud6c4\uc5d0 \ub354 \uc9e7\uc740 \uac04\uaca9\uc73c\ub85c \uc704\uce58 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc740 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \ud569\ub2f9\ud558\ub2e4. \\n\\n## \ube44\ub3d9\uae30 \ucc98\ub9ac\\n\\n@Async\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uba54\uc11c\ub4dc\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4. \\n\\n### \ube44\ub3d9\uae30 \uc124\uc815\\n\\n\uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c EnableAsync \uc124\uc815\uc744 \ud574\uc57c\ud55c\ub2e4. \\n\ud574\ub2f9 \uc124\uc815\uc744 \uc801\uc6a9\ud558\uba74 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\ub824\ub294 \uba54\uc11c\ub4dc\uc5d0 @Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc8fc\uae30\ub9cc \ud558\uba74 \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud55c\ub2e4. \\n\\n```java title=\\"AsyncConfig\\"\\n@EnableAsync\\n@Configuration\\npublic class AsyncConfig {\\n}\\n```\\n\\n\uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \ud560 \ub54c \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \ud480 \uc124\uc815\uc744 \ub530\ub85c \ud574\uc918\uc57c \ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 ThreadPoolTaskExecutor\ub97c \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uac00 \uc0dd\uc131\uc744 \ub3c4\uc640\uc900\ub2e4. \\n\\n> In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.\\n> 7.7. Task Execution and Scheduling, Spring Boot Docs\\n\\n### @Async \uc801\uc6a9\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\uc5d0 Async \uc560\ub108\ud14c\uc774\uc158\uc744 \ubd99\uc5ec \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java title=\\"RouteImageGenerator\\"\\n@Async\\npublic void generate(\\n List<Double> latitudes,\\n List<Double> longitudes,\\n List<Double> pointedLatitudes,\\n List<Double> pointedLongitudes,\\n Long tripId\\n) {\\n // \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);\\n Coordinates coordinates = Coordinates.of(latitudes, longitudes);\\n Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);\\n drawImage(coordinates, routeImageDrawer, pointedCoordinates);\\n\\n // \uc774\ubbf8\uc9c0 \uc800\uc7a5\\n String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());\\n\\n // \uc790\uc6d0 \ud560\ub2f9 \ud574\uc81c\\n routeImageDrawer.dispose();\\n\\n // \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac12 \ubcc0\uacbd\\n Trip trip = tripRepository.findById(tripId)\\n .orElseThrow();\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n}\\n```\\n\\n### \ube44\ub3d9\uae30 \ucc98\ub9ac\uc2dc \ubb38\uc81c\uc810\\n\\n\ud604\uc7ac \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \ud558\uace0 \uc800\uc7a5 \ud6c4, \uc800\uc7a5 \uacbd\ub85c\ub97c DB\uc5d0 \ubc18\uc601\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ud615\ud0dc\uac00 \ub418\uba70 \uc758\uc874\uc131 \ubc29\ud5a5\uc774 \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. \\n\\n```mermaid\\ngraph LR\\n trip[trip: \uc5ec\ud589 \uad00\ub828 \ud328\ud0a4\uc9c0] --\x3e draw[draw: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294 \ud328\ud0a4\uc9c0]\\n draw --\x3e trip\\n```\\n\\n\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uacfc \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4. \\n\\n```mermaid\\ngraph LR\\n\\tsubgraph draw\\n\\t\\tdirection LR\\n\\t\\tRG[RouteImageGenerator] -- DB \ubc18\uc601 \uc694\uccad --\x3e ILR[ImageLinkTripRepository]\\n\\tend\\n subgraph trip\\n\\t\\tdirection LR\\n\\t\\tTS[TripService] -- \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e RG\\n\\t\\tILRI[ImageLinkTripRepositoryImpl] -- \uad6c\ud604 --\x3e ILR\\n\\tend\\n\\n\\ttrip --\x3e draw\\n```\\n\\n\ud328\ud0a4\uc9c0 \uac04 \uc758\uc874\uc131\uc740 \ud574\uacb0\ub418\uc5c8\uc9c0\ub9cc, \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5\uc744 \uc704\ud574 tripId\ub97c \ubc1b\uc544\uc57c\ud558\ub294 \ub4f1\uc758 \ub17c\ub9ac\uc801\uc778 \uc758\uc874\uc131\uc740 \uc544\uc9c1 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n## \uc774\ubca4\ud2b8 \uc0ac\uc6a9\\n\\n\uc2a4\ud504\ub9c1\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \ube44\uad00\uc2ec\uc0ac(ex. \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131)\uc744 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.\\n\\n### \uc774\ubca4\ud2b8 \ubc1c\ud589\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uba3c\uc800 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud574\uc57c \ud55c\ub2e4. \\n\uc2a4\ud504\ub9c1\uc5d0\uc11c\ub294 ApplicationEventPublisher \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \uc218 \uc788\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c ApplicationContext\uac00 \uad6c\ud604\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud55c\ub2e4. \\n\\n```java title=\\"TripService & TripUpdateEvent\\"\\npublic void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {\\n ...\\n\\n // \uc774\ubca4\ud2b8 \ubc1c\ud589\\n applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));\\n}\\n\\npublic record TripUpdateEvent(Long tripId) {\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \ubc1c\ud589\ud560 \ub54c \ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc774 \uc911\uc694\ud558\ub2e4. \\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\ub294 \ub3c4\uba54\uc778\uc758 \ud589\uc704\ub97c \ub2f4\uace0 \uc788\ub294 \uc774\ubca4\ud2b8\ub97c \ubc1c\ud589(ex. RouteImageGenerateEvent)\ud55c\ub2e4\uba74 \ub17c\ub9ac\uc801\uc778 \uc758\uc874 \uad00\uacc4\uac00 \ub0a8\uc544\uc788\uae30\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc801\uc808\ud788 \uc0ac\uc6a9\ud588\ub2e4\uace0 \ubcf4\uae30 \uc5b4\ub835\ub2e4. \\n\ubc1c\ud589\ud558\ub294 \uc774\ubca4\ud2b8\uba85\uc740 \uc8fc\uae30\ub2a5\uc774 \uc5b4\ub5a4 \ud589\uc704(ex. TripUpdateEvent)\ub97c \ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294 \uc774\ubca4\ud2b8\uba85\uc73c\ub85c \ubc1c\ud589\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4. \\n\\n### \uc774\ubca4\ud2b8 \uad6c\ub3c5\\n\\n\uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc2e4\ud589\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ube44\ub3d9\uae30\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud558\uc5ec `@Async` \uc560\ub108\ud14c\uc774\uc158\uc744 \uc801\uc6a9\ud588\ub2e4. \\n\uc774\ubca4\ud2b8\uc758 \uad6c\ub3c5\uc740 \uc5ec\ud589\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub420 \ub54c \uc5ec\ud589\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 `@TransactionalEventListener`\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n:::note TransactionPhase \uc124\uc815\\nTransactionPhase\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5a4 \ub2e8\uacc4\uc5d0\uc11c \uc218\uc2e0\ud558\uace0 \ucc98\ub9ac\ud560\uc9c0\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\nAFTER_COMMIT(\uae30\ubcf8\uac12): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ucee4\ubc0b \ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_ROLLBACK: \ud2b8\ub79c\uc7ad\uc158\uc774 \ub864\ubc31\ub418\ub294 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nAFTER_COMPLETION: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub610\ub294 \ub864\ubc31 \ub418\uc5c8\uc744 \uacbd\uc6b0 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\nBEFORE_COMMIT: \ud2b8\ub79c\uc7ad\uc158\uc774 \ucee4\ubc0b \ub418\uae30 \uc804 \uc774\ubca4\ud2b8 \uc2e4\ud589 \\n:::\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uae30 \uc704\ud574 @Transactional \uc560\ub108\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```java title=\\"TripUpdateEventHandler\\"\\n@Component\\npublic class TripUpdateEventHandler {\\n\\n private final RouteImageGenerator routeImageGenerator;\\n private final TripRepository tripRepository;\\n\\n public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {\\n this.routeImageGenerator = routeImageGenerator;\\n this.tripRepository = tripRepository;\\n }\\n\\n @Async\\n @TransactionalEventListener(phase = AFTER_COMMIT)\\n public void handle(TripUpdateEvent tripUpdateEvent) {\\n Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());\\n\\n String imageUrl = routeImageGenerator.generate(\\n trip.getLatitudes(),\\n trip.getLongitudes(),\\n trip.getPointedLatitudes(),\\n trip.getPointedLongitudes()\\n );\\n\\n trip.changeRouteImageUrl(imageUrl);\\n tripRepository.save(trip);\\n }\\n}\\n```\\n\\n\uc774\ubca4\ud2b8\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \ud328\ud0a4\uc9c0 \uac04 \uc21c\ud658 \ucc38\uc870 \ubb38\uc81c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \ud574\uacb0\ub418\uc5c8\ub2e4. \\n\ub610\ud55c \uc8fc\uae30\ub2a5\uacfc \ubd80\uae30\ub2a5\uc744 \ubd84\ub9ac\ud568\uc73c\ub85c\uc368 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5c8\ub2e4.\\n\\n```mermaid\\ngraph LR\\n subgraph trip\\n TripServcie -- \ubc1c\ud589 --\x3e TripUpdateEvent\\n TripRepository\\n end\\n\\n subgraph draw\\n TripUpdateEventHandler -- \uad6c\ub3c5 \ud6c4 \uc774\ubbf8\uc9c0 \uc0dd\uc131 --\x3e TripUpdateEvent\\n TripUpdateEventHandler -- \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uacbd\ub85c \uc800\uc7a5 --\x3e TripRepository\\n end\\n```\\n\\n### \ud14c\uc2a4\ud2b8\\n\\n\ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \ubc29\ubc95\uc774 \uc788\ub2e4. \\n\\nimport Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n<Tabs>\\n<TabItem value=\\"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d\\" label=\\"\ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \uc885\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30 \ud6c4 \uac80\uc99d\\">\\n\\n```java\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(Mockito.timeout(5000).times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n</TabItem>\\n\\n<TabItem value=\\"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d\\" label=\\"\ud14c\uc2a4\ud2b8 \ud560 \ub54c\ub9cc \ube44\ub3d9\uae30\ub97c \ub3d9\uae30\ub85c \ubcc0\uacbd\ud558\uc5ec \uac80\uc99d\\" default>\\n\\n```java\\n@ContextConfiguration(classes = TestSyncConfig.class)\\n@SpringBootTest\\npublic class TripUpdateEventHandlerIntegrationTest {\\n\\n ...\\n\\n @Test\\n void \uc5ec\ud589\uc218\uc815_\uc774\ubca4\ud2b8\ub97c_\ubc1c\uc0dd\uc2dc\ud0a4\uba74_\uc774\ubbf8\uc9c0\ub97c_\uc0dd\uc131_\uc694\uccad\uc744_\ud55c\ub2e4() {\\n // given\\n TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);\\n given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))\\n .willReturn(\uc5ec\ud589());\\n\\n // when\\n transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));\\n\\n // then\\n then(routeImageGenerator)\\n .should(times(1))\\n .generate(any(), any(), any(), any());\\n }\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n\ucc98\uc74c\uc5d0\ub294 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub9cc \ub3d9\uae30\ub85c \uc124\uc815 \ud6c4 \uac80\uc99d\ud558\ub824\uace0 \ud588\ub2e4. \\n\ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc120 `\ud2b8\ub79c\uc7ad\uc158\uc774 \uc815\uc0c1 \uc885\ub8cc\ub418\uc5c8\uc744 \ub54c \ube44\ub3d9\uae30\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ub3c5\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0` \uac80\uc99d\uc774 \ud544\uc694\ud588\uae30 \ub54c\ubb38\uc5d0 \ucd5c\uc885\uc801\uc73c\ub85c `Mockito.timeout` \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub3d9\uae30 \uba54\uc11c\ub4dc\uac00 \ud1b5\uacfc\ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. \\n\\n## \uacb0\uacfc\\n\\n![./time.png](./time.png)\\n\\n\uc704 \uc751\ub2f5 \uc2dc\uac04\uc740 \uc704\uce58 \uc815\ubcf4 1000\uac1c\ub97c \uae30\uc900\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud55c \uac12\uc774\ub2e4. \\n\uc751\ub2f5 \uc2dc\uac04\uc5d0 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc544\uc11c \uc131\ub2a5\uc774 \uac1c\uc120\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[7.7. Task Execution and Scheduling, Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling) \\n[Spring Events, Baeldung](https://www.baeldung.com/spring-events) \\n[\ud68c\uc6d0\uc2dc\uc2a4\ud15c \uc774\ubca4\ud2b8\uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 \uad6c\ucd95\ud558\uae30](https://techblog.woowahan.com/7835/)"},{"id":"39","metadata":{"permalink":"/39","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","source":"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","description":"\uac1c\uc694","date":"2023-08-02T00:00:00.000Z","formattedDate":"2023\ub144 8\uc6d4 2\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":11.725,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","slug":"39","tags":["image","awt"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac","permalink":"/40"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/38"}},"content":"## \uac1c\uc694\\n\\n\uc704\uc640 \uac19\uc774 \uc5ec\ud589\uc5d0 \ub300\ud55c \uacbd\ub85c\ub97c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d \ubc0f \uae30\uc220 \uc120\ud0dd\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 [\ub9c1\ud06c](./36)\uc5d0 \uc788\ub2e4.\\n\\n### \uad6c\ud604 \uacb0\uacfc\\n\\n![./result.png](./result.png)\\n\\n\uc608\uc2dc \ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n**\uc11c\uc6b8\uc5ed(\uc810)** \u2192 \uc2e0\uc0ac\uc5ed \u2192 \ub178\ub7c9\uc9c4\uc5ed \u2192 \ud64d\ub300\uc785\uad6c\uc5ed \u2192 \uc885\ub85c3\uac00\uc5ed \u2192 \uc625\uc218\uc5ed \u2192 **\uad6c\ub85c\uc5ed(\uc810)** \u2192 \uc2e0\ub9bc\uc5ed \u2192 \ubc1c\uc0b0\uc5ed\\n\\n```java title=\\"\uc608\uc2dc \ub370\uc774\ud130\\"\\nList<Double> x = List.of(\\n 126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,\\n 126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639\\n);\\nList<Double> y = List.of(\\n 37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,\\n 37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184\\n);\\nList<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);\\nList<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);\\n```\\n\\n### IMAGE_SIZE & ROUTE_SIZE\\n\\n```java title=\\"RouteImageGenerator.java\\"\\nprivate static final int IMAGE_SIZE = 800;\\nprivate static final int ROUTE_SIZE = 600;\\n```\\n\\n\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc774\ubbf8\uc9c0 \ud06c\uae30\uc640 \uacbd\ub85c \ud06c\uae30\uac00 \uc788\uc2b5\ub2c8\ub2e4. \\n\uc774\ubbf8\uc9c0 \ud06c\uae30\ub294 \ub9d0 \uadf8\ub300\ub85c \uc774\ubbf8\uc9c0\uc758 width\uc640 height\ub97c \uc758\ubbf8\ud55c\ub2e4. \\n\uacbd\ub85c \ud06c\uae30\uc758 \uacbd\uc6b0 \uc0c1\ud558\uc88c\uc6b0 100px \ub9cc\ud07c\uc758 \uac04\uaca9\uc744 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc2e4\uc81c \uacbd\ub85c \uadf8\ub824\uc9c0\ub294 \ud06c\uae30\ub294 600 * 600 \uc0ac\uc774\uc988\ub85c \uc0dd\uc131\ub41c\ub2e4. \\n\\n![./600.png](./600.png)\\n\\n**\uc0ac\uc774\uc988 \ubcc0\uacbd\uc758 \uc774\uc720**\\n\\n255 * 255 \uc815\ub3c4\uc758 \uc791\uc740 \uc0ac\uc774\uc988\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud574\ubcf4\ub824\uace0 \ud588\ub294\ub370 \ud654\uc9c8\uc774 \ub108\ubb34 \uc548\uc88b\uc544\uc11c 800\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4.\\n\\n## \uc8fc\uc694 \ud074\ub798\uc2a4\\n\\n### \uc694\uc57d\\n\\n| \ud074\ub798\uc2a4\uba85 | \uc124\uba85 | \ud2b9\uc774\uc0ac\ud56d |\\n| --- | --- | --- |\\n| Coordinate | \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \uc704\uce58 \uac12 | \uc88c\ud45c\ub97c \ub73b\ud558\uc9c0\ub9cc Point\uc640 \uad6c\ubd84\ud558\uae30 \uc704\ud574 longitude, latitude\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 x, y \uc0ac\uc6a9 |\\n| Coordinates | Coordinate\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| Position | \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58 \uac12 | Integer \ud0c0\uc785\uc758 x, y \uc0ac\uc6a9 |\\n| Positions | Positions\uc758 \uc77c\uae09 \uceec\ub809\uc158 | - |\\n| RouteImageDrawer | \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4 BufferedImage, Graphics2D\ub97c \uac00\uc9c0\uace0 \uc788\uc74c | \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc0c1\uc218\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc74c |\\n| RouteImageUploader | BufferedImage\ub97c \ubc1b\uc544 \uc11c\ubc84\uc5d0 \uc5c5\ub85c\ub4dc \ud558\ub294 \ud074\ub798\uc2a4 | \ud604\uc7ac \uc5c5\ub85c\ub4dc \uc704\uce58\uac00 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc544 \uc77c\ub2e8 \uae30\ubcf8(\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8) \uc704\uce58\uc5d0 \uc0dd\uc131 |\\n| RouteImageGenerator | \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uace0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc11c\ube44\uc2a4 | \uc5ec\ud589 \uc885\ub8cc, \uac10\uc0c1 \uc800\uc7a5\uc2dc \ud574\ub2f9 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad |\\n| BufferedImage(AWT) | \uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0 \uc870\uc791\ud558\ub294 \ub370 \uc0ac\uc6a9 | \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c\uac00 (0, 0) |\\n| Graphics2D(AWT) | \uc120 \uadf8\ub9ac\uae30, \uc0c9\uc0c1 \uad00\ub9ac \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub798\uc2a4 \uc2e4\uc81c \ud574\ub2f9 \ud074\ub798\uc2a4\uc758 draw \uba54\uc11c\ub4dc\ub97c \uacbd\ub85c\ub97c \uadf8\ub9bc | JDK1.2 \uc774\ud6c4\uc5d0 \ucd94\uac00\ub428, 2D(\ud3c9\uba74) \uadf8\ub798\ud53d \ud658\uacbd\uc744 \uc9c0\uc6d0, bufferedImage.createGraphics \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 \uc0dd\uc131 |\\n\\n### \uc758\uc874\uad00\uacc4\\n\\n```mermaid\\ngraph TD\\n C1[Coordinates] --\x3e C[Coordinate]\\n P1[Positions] --\x3e P[Position]\\n\\n\\tRID[RouteImageDrawer] -- \\"\uc911\uc559 \uc815\ub82c\ub41c Positions\ub97c \ubc1b\uc544 \uc774\ubbf8\uc9c0 \uc0dd\uc131\\" --\x3e P1\\n\\tRID --\x3e B[BufferedImage]\\n\\tRID --\x3e G[Graphics2D]\\n\\n\\tC1 -- \\"calculatePositions \uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c \uc704\uce58 \uacc4\uc0b0\\" --\x3e P1\\n\\n\\tRIU[RouteImageUploader] --\x3e B\\n\\tRIG[RouteImageGenerator] --\x3e RID\\n\\tRIG --\x3e RIU\\n\\tRIG --\x3e C1\\n\\tRIG --\x3e P1\\n```\\n\\n### Coordinates(\uc704\ub3c4, \uacbd\ub3c4\uc758 \uc77c\uae09 \uceec\ub809\uc158)\\n\\n`List<Double>` 2\uac1c(\uc704\ub3c4, \uacbd\ub3c4)\uc778 \ud615\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc5c8\uc9c0\ub9cc, \uc704\uce58 \uc810\uc744 \uc5ec\ub7ec\uac1c \ucc0d\ub294 \ubd80\ubd84\uc5d0\uc11c \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574 \uc9c8 \uac83 \uac19\uc544\uc11c Coordinate(x, y)\uc640 \uc77c\uae09 \uceec\ub809\uc158\uc778 Coordinates\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4. \\nCoordinates \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub450 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- calculatePositions: \uacbd\ub85c \uc774\ubbf8\uc9c0\uc758 \ud06c\uae30\ub97c \ubc1b\uc544 \uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \uc0ac\uc6a9\ub420 Positions\ub97c \ubc18\ud658\\n- indexOf: \ub2e4\ub978 Coordinates\ub97c \ubc1b\uc544 \ub3d9\uc77c\ud55c \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4\ub97c \ubc18\ud658\ud558\ub294 \\n\\nPositions \uacc4\uc0b0 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\uc704\ub3c4, \uacbd\ub3c4 \uac01\uac01\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc2dc \ud544\uc694\ud55c \uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n```java title=\\"Coordinates.java\\"\\n// \ud638\ucd9c\\n// List<Integer> xPositions = toPositions(xValues, maxDifference, routeImageSize);\\n// List<Integer> yPositions = toPositions(yValues, maxDifference, routeImageSize);\\n\\nprivate List<Integer> toPositions(List<Double> values, Double maxDifference, Integer routeImageSize) {\\n Double minValue = Collections.min(values);\\n return values.stream()\\n .map(value -> normalizeCoordinate(value, maxDifference, minValue))\\n .map(value -> mapToPosition(value, routeImageSize))\\n .toList();\\n}\\n\\nprivate double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {\\n return (coordinate - minValue) / maxDifference;\\n}\\n\\nprivate int mapToPosition(Double coordinate, Integer routeImageSize) {\\n return (int) (coordinate * routeImageSize);\\n}\\n```\\n\\n\uc704\ub3c4\ub85c \uc608\uc2dc\ub4e0 \ub0b4\uc6a9\uc774\ub2e4.\\n\\n1. Collections.min(values) \u2192 \uc704\ub3c4\ub97c \ubc1b\uc544 \uc704\ub3c4 \ub9ac\uc2a4\ud2b8\uc758 \ucd5c\uc18c\uac12\uc744 \uad6c\ud55c\ub2e4.\\n2. normalizeCoordinate \u2192 \uac01 \uac12\uc5d0\uc11c \ucd5c\uc18c\uac12\uc744 \ube7c\uace0 0 ~ 1 \uc0ac\uc774 \uac12\uc73c\ub85c \ubcc0\ud658 \ud6c4 **\uc704\uacbd\ub3c4\uc758 \ucd5c\ub300 \ucc28\uc774**\ub85c \ub098\ub208\ub2e4.\\n3. mapToPosition \u2192 \uadf8\ub798\ud504 \ud06c\uae30\ub97c \ubc1b\uc544 0 ~ 1 \uc0ac\uc774 \uac12\uc744 \uc2e4\uc81c \uc774\ubbf8\uc9c0\ub97c \uc704\ud55c \uc704\uce58\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\\n\\n### Positions(\uc2e4\uc81c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ud560 \uc704\uce58)\\n\\nPositions \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \ub2e4\uc12f \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- align: \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\uc640 \uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0ac\uc774\uc988\ub97c \ubc1b\uc544 Position \uac12\ub4e4\uc744 \uc911\uc559 \uc815\ub82c\ud55c\ub2e4.\\n- getPositionsByIndexes: \uc778\ub371\uc2a4 \ub9ac\uc2a4\ud2b8\ub97c \ubc1b\uc544 \uc785\ub825\ubc1b\uc740 \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- size: \ud06c\uae30\ub97c \ubc18\ud658\ud55c\ub2e4.\\n- xPositions: x \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n- yPositions: y \uac12\ub4e4\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n\uc911\uc559 \uc815\ub82c \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. \\n\\n```java title=\\"Positions.java\\"\\npublic Positions align(int imageSize, int routeSize) {\\n int xOffset = calculateOffset(Position::x, imageSize);\\n int yOffset = calculateOffset(Position::y, imageSize);\\n\\n return items.stream()\\n .map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))\\n .collect(collectingAndThen(toList(), Positions::new));\\n}\\n\\nprivate int calculateOffset(ToIntFunction<Position> positionToInteger, int imageSize) {\\n List<Integer> positions = items.stream()\\n .mapToInt(positionToInteger)\\n .boxed()\\n .toList();\\n\\n int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;\\n return imageSize / 2 - midValue;\\n}\\n```\\n\\n\uc0c1\ud558\uc88c\uc6b0 \uc5ec\ubc31\uc744 \ub3d9\uc77c\ud558\uac8c \uc8fc\uae30 \uc704\ud574\uc11c offset \uac12\uc744 \uad6c\ud574\uc11c x, y \uac12\uc5d0 \uac01\uac01 \ub354\ud558\ub294 \ud615\ud0dc\ub85c \uc911\uc559 \uc815\ub82c\uc744 \uc218\ud589\ud588\ub2e4. \\nBufferedImage\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc67c\ucabd \uc0c1\ub2e8\uc758 \uc88c\ud45c (0, 0) \uae30\uc900\uc73c\ub85c \uc544\ub798\ub85c \ub0b4\ub824\uac08\uc218\ub85d y \uac12\uc774 \ucee4\uc9c0\uace0, \uc624\ub978\ucabd\uc73c\ub85c \uac08 \uc218\ub85d x \uac12\uc774 \ucee4\uc9c4\ub2e4. \\n\\n![./800.png](./800.png)\\n\\n\ub530\ub77c\uc11c \ucd5c\uc885\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \uac12\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud588\ub2e4.\\n\\nx \uac12 \u2192 \uacc4\uc0b0\ud55c offset \uadf8\ub300\ub85c \ub354\ud55c\ub2e4. \\ny \uac12 \u2192 imageSize(800)\uc5d0\uc11c y + offset \uac12\uc744 \ube80\ub2e4. \\n\\n### RouteImageDrawer(\uc2e4\uc81c \uc774\ubbf8\uc9c0\uc5d0 \uacbd\ub85c\ub97c \uadf8\ub824\uc8fc\ub294 \ud074\ub798\uc2a4)\\n\\nBufferedImage, Graphics2D\ub97c \ud544\ub4dc\ub85c \uac00\uc9c0\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub2e4. \\n\uadf8\ub9bc\uc744 \uadf8\ub9ac\uae30 \uc704\ud574 \uc124\uc815\ud55c \uc0c1\uc218\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.\\n\\n```java title=\\"RouteImageDrawer.java\\"\\n// RGB\uc5d0 \uac01\uac01 8\ube44\ud2b8\uc529 \ud560\ub2f9\ud55c \uac12\uc744 24\ube44\ud2b8 \ud2b8\ub8e8\uceec\ub7ec\ub77c \ubd80\ub978\ub2e4.\\n// \ud574\ub2f9 \uc124\uc815\uc740 24\ube44\ud2b8 + 8\ube44\ud2b8(alpha, \ud22c\uba85\ub3c4)\ub97c \ucd94\uac00\ud55c 32\ube44\ud2b8 \uc774\ubbf8\uc9c0 \ud0c0\uc785\uc774\ub2e4.\\n// \uc774\ub97c RGBA\ub77c\uace0 \ubd80\ub978\ub2e4.\\nprivate static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;\\n// \ubc30\uacbd \ud22c\uba85\uc0c9\\nprivate static final Color TRANSPARENT = new Color(0, 0, 0, 0);\\n// \uacbd\ub85c\ub97c \uc704\ud55c STROKE\\nprivate static final int LINE_STROKE_WIDTH = 7;\\nprivate static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc704\uce58 \uc810\uc744 \uc704\ud55c STROKE\\nprivate static final int POINT_STROKE_WIDTH = 20;\\nprivate static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);\\n// \uc548\ud2f0\uc568\ub9ac\uc5b4\uc2f1 \ub4f1 \ud654\uc9c8\uc774 \uc548\uc88b\uc740 \uc774\ubbf8\uc9c0\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud55c \uc124\uc815\\nprivate static final Map<Object, Object> renderingHints = Map.of(\\n RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,\\n RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,\\n RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC\\n);\\n```\\n\\nRouteImageDrawer \ud074\ub798\uc2a4\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac1c\uc758 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud55c\ub2e4.\\n\\n- drawLine: \uc120\uc744 \uadf8\ub9b0\ub2e4.\\n- drawPoint: \uc810\uc744 \ucc0d\ub294\ub2e4.\\n- dispose: \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud55c\ub2e4. \\n\\ndispose\uc758 \uacbd\uc6b0 \ub0b4\ubd80\uc5d0\uc11c \uc0dd\uc131\ub41c graphics2D\uc5d0 \ub300\ud55c \uc790\uc6d0 \ud560\ub2f9\uc744 \ud574\uc81c\ud558\ub294 \uba54\uc11c\ub4dc\uc778 graphics2D.dispose\ub97c \ud638\ucd9c\ud55c\ub2e4.\\n\\n## \uc774\ubbf8\uc9c0 \uc0dd\uc131 Flow\\n\\n### 1. \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc900\ube44\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n\\n```\\n\\n### 2. \uc120 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 3. \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n```\\n\\n### 4. \uc5c5\ub85c\ub4dc \uc694\uccad\\n\\n```mermaid\\nsequenceDiagram\\n \\tRouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n \\tRouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n \\tRouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n```\\n\\n### \uc804\uccb4 Flow\\n\\n```mermaid\\nsequenceDiagram\\n \uc678\ubd80 \ud074\ub798\uc2a4 ->> RouteImageGenerator: \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc694\uccad(\uc704\uacbd\ub3c4, \uc704\uce58 \uc810\uc744 \ucc0d\uc744 \uac12 \uc804\ub2ec)\\n RouteImageGenerator->>RouteImageDrawer: ImageSize\ub97c \uc804\ub2ec\ud558\uc5ec \uac1d\uccb4 \uc0dd\uc131, \ub0b4\ubd80\uc5d0\uc11c BufferedImage, Graphincs2D \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc704\uacbd\ub3c4 \uc774\uc6a9\ud558\uc5ec Coordinates1 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates2(\uc704\uce58\uc810): \uc704\uce58\uc810 \uc774\uc6a9\ud558\uc5ec Coordinates2 \uc0dd\uc131\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): \uc815\ub82c\ub41c Positions\ub97c \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc815\ub82c\ub41c Positions \ubc18\ud658\\n RouteImageGenerator->>RouteImageDrawer: \uc815\ub82c\ub41c Positions\ub97c \uacbd\ub85c \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>Coordinates1(\uc704\uacbd\ub3c4): Coordinate2(\uc704\uce58\uc810)\ub97c \uc804\ub2ec\ud558\uace0 \ud574\ub2f9 \uc704\uce58\uc810\uacfc \uc77c\uce58\ud558\ub294 Coordinate\uc758 \uc778\ub371\uc2a4 \uc0dd\uc131 \uc694\uccad\\n Coordinates1(\uc704\uacbd\ub3c4)->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ub371\uc2a4(List<Integer>) \ubc18\ud658\\n RouteImageGenerator->>\uc815\ub82c\ub41c Positions: \uc778\ub371\uc2a4(List<Integer>)\ub97c \uc804\ub2ec\ud558\uc5ec \uc778\ub371\uc2a4\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \uc0dd\uc131 \uc694\uccad\\n \uc815\ub82c\ub41c Positions->>RouteImageGenerator: \uc704\uce58\uc810\uc5d0 \ud574\ub2f9\ud558\ub294 Positions \ubc18\ud658(pointPositions)\\n\\n RouteImageGenerator->>RouteImageDrawer: pointPositions\ub97c \uc804\ub2ec\ud558\uc5ec \uc704\uce58 \uc810 \uadf8\ub9ac\uae30 \uc694\uccad\\n RouteImageGenerator->>RouteImageUploader: bufferedImage(RouteImageDrawer\uc5d0\uc11c getter \uc0ac\uc6a9)\ub97c \uc804\ub2ec\ud558\uc5ec \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc694\uccad\\n RouteImageUploader->>RouteImageGenerator: \uc800\uc7a5 \ud6c4 \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n RouteImageGenerator->>\uc678\ubd80 \ud074\ub798\uc2a4: \uc800\uc7a5\ub41c \uc774\ubbf8\uc9c0\uba85(\ub610\ub294 url) \ubc18\ud658\\n\\t\\n```"},{"id":"38","metadata":{"permalink":"/38","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","source":"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","description":"\uac1c\uc694","date":"2023-07-31T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 31\uc77c","tags":[{"label":"Image","permalink":"/tags/image"},{"label":"Python","permalink":"/tags/python"}],"readingTime":6.185,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","slug":"38","tags":["Image","Python"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604","permalink":"/39"},"nextItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/37"}},"content":"### \uac1c\uc694\\n\\n\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. \\n\\n### \uc0ac\uc6a9 \uae30\uc220\\n\\n\uc5b8\uc5b4: Python 3.10 \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib \\n\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront \\n\\n\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n```mermaid\\ngraph LR\\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\\n Client --\x3e CloudFront --\x3e S3\\n```\\n\\n### \uc694\uad6c\uc0ac\ud56d\\n\\n![./route.png](./route.png)\\n\\n\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4. \\n\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- \uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. \\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n- \uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\\n\\n1. \uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n2. \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5\\n\\n\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4. \\n\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604\\n\\n```python\\nimport time\\n\\nimport matplotlib.pyplot as plt\\n\\n\\ndef draw(point):\\n start = time.time()\\n x, y = zip(*point)\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n draw_lines(pixel_x, pixel_y)\\n end = time.time()\\n print(end - start)\\n \\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n return scaled_coordinates\\n\\n\\ndef draw_lines(x, y):\\n figure = plt.gcf()\\n figure.set_size_inches(5, 5)\\n plt.plot(x, y, c = \'w\',linewidth=5)\\n plt.scatter(x[3],y[3], c = \'w\', s = 125)\\n plt.axis(\'off\')\\n plt.savefig(\'name.png\', transparent=True, format=\'png\')\\n\\npoint = [\\n [126.96352960597338, 37.590841000217125],\\n [126.96987292787792, 37.58435564234159],\\n [126.98128481452298, 37.58594375113966],\\n [126.99360339342958, 37.58248524741927],\\n [126.99867565340067, 37.56778118088622],\\n [127.001935378366117, 37.55985240444085],\\n [126.9831048919687, 37.548030119488665],\\n [126.97189273528845, 37.5119879225856],\\n [127.02689859997221, 37.48488593333883]\\n]\\n\\ndraw(point)\\n```\\n\\n\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)\\n\\n![./routeImage.png](./routeImage.png)\\n\\n### AWS Lambda\\n\\n\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4. \\n\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131\\n\\nAmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n### \ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc\\n\\n\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\\n```python\\n\\nimport io\\nimport uuid\\n\\nimport boto3\\nimport matplotlib.pyplot as plt\\n\\nPIXEL = 255\\nBUCKET_NAME = \'image-plot\'\\nS3 = \'s3\'\\n\\ndef lambda_handler(event, context):\\n x = event[\'x\']\\n y = event[\'y\']\\n image_name = str(uuid.uuid4())\\n\\n img_data = draw(x, y)\\n s3 = boto3.client(S3)\\n s3.put_object(Body=img_data.getvalue(), ContentType=\'image/png\', Bucket=BUCKET_NAME, Key=image_name)\\n url = f\'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}\'\\n\\n return {\\n \'statusCode\': 200,\\n \'body\': url\\n }\\n\\ndef draw(x, y):\\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\\n img_data = draw_lines(pixel_x, pixel_y)\\n plt.close()\\n return img_data\\n\\ndef convert_to_pixel_values(x, y):\\n max_diff = max(max(x) - min(x), max(y) - min(y))\\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\\n\\ndef scale_to_pixel_values(points, max_diff):\\n min_value = min(points)\\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\\n return pixel_values\\n\\ndef draw_lines(x, y):\\n plt.plot(x, y, \'k-\', linewidth=10)\\n plt.axis(\'off\')\\n img_data = io.BytesIO()\\n plt.savefig(img_data, transparent=True, format=\'png\')\\n img_data.seek(0)\\n return img_data\\n\\n```\\n\\n### Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131\\n\\nmatplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4. \\nzip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4. \\n\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4. \\n\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```\\npillow.zip\\n\u2502 python/PIL\\n\u2514 python/Pillow-5.3.0.dist-info\\n```\\n\\nUbuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\\n```\\nsudo apt update\\nsudo apt install zip\\nsudo apt install python3-pip\\n\\nmkdir python\\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\\n```\\n\\n### `No module named \'numpy.core._multiarray_umath\'` \uc5d0\ub7ec\\n\\nLayer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4. \\n\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4. \\n\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### \uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01\\n\\n\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4. \\nAWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. \\n\\n**\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.**\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[AWS Lambda](https://aws.amazon.com/ko/lambda/) \\n[Lambda Layer](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html) \\n[Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html) \\n[No module named \'numpy.core._multiarray_umath\'](https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b) \\n[\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc](https://techblog.woowahan.com/6217/)"},{"id":"37","metadata":{"permalink":"/37","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","source":"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx","title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","description":"\uac1c\uc694","date":"2023-07-30T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 30\uc77c","tags":[{"label":"Mockito","permalink":"/tags/mockito"},{"label":"static","permalink":"/tags/static"}],"readingTime":2.66,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","slug":"37","tags":["Mockito","static"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c","permalink":"/38"},"nextItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/36"}},"content":"### \uac1c\uc694\\n\\n\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4. \\n\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \\n\\n\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4. \\n\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4. \\n\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. \\n\\n```java\\npublic void upload(BufferedImage bufferedImage) {\\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\\n try {\\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\\n } catch (IOException e) {\\n throw new DrawException(IMAGE_SAVE_FAIL);\\n }\\n}\\n```\\n\\n### Mocking static methods\\n\\nMockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\nmockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 `MockedStatic<T>`\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. \\n\\nJUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc `MockedStatic<T>`\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. \\n\\n```java\\n// given\\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\\nRouteImageUploader routeImageUploader = new RouteImageUploader();\\n\\n// expect\\ntry (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {\\n routeImageUploader.upload(bufferedImage);\\n imageIO.verify(\\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\\n times(1)\\n );\\n}\\n```\\n\\n### \ub9c8\uce58\uba70\\n\\n\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uae30 \ub54c\ubb38\uc5d0 \ucd5c\ub300\ud55c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790. \\n\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4. \\n\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Mocking static methods](https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks) \\n[Mockito mock static methods](https://www.baeldung.com/mockito-mock-static-methods) \\n[Enable mocking static methods in Mockito](https://github.com/mockito/mockito/issues/1013)"},{"id":"36","metadata":{"permalink":"/36","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","source":"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx","title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","description":"./route.png","date":"2023-07-27T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 27\uc77c","tags":[{"label":"image","permalink":"/tags/image"},{"label":"awt","permalink":"/tags/awt"}],"readingTime":5.28,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","slug":"36","tags":["image","awt"]},"prevItem":{"title":"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30","permalink":"/37"},"nextItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/35"}},"content":"![./route.png](./route.png)\\n\\n## \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc758 \ucc45\uc784\\n\\n\uc704 \uc640\uc774\uc5b4 \ud504\ub808\uc784\uc5d0\uc11c `\uc5ec\ud589 \ud788\uc2a4\ud1a0\ub9ac`\uc640 `\uc5ec\ud589\uc5d0 \ub300\ud55c \uac10\uc0c1\uc744 \uc704\ud55c \uacbd\ub85c \uc774\ubbf8\uc9c0`\uc758 \uacbd\uc6b0, \ub9f5 API\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub3c4\ud615 \uadf8\ub9ac\uae30 API(\ub124\uc774\ubc84 \ub9f5 API \uae30\uc900 Polyline)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4. \\n\ub530\ub77c\uc11c \uc774\ubbf8\uc9c0\ub97c \uc9c1\uc811 \uc0dd\uc131\ud558\uac70\ub098, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc9c1\uc811 \uc704\uacbd\ub3c4\ub97c \uc774\uc6a9\ud558\uc5ec \uadf8\ub824\uc57c \ud55c\ub2e4.\\n\\n\ud574\ub2f9 \uc694\uad6c\uc0ac\ud56d\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uac00\uc9c4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.\\n\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131\\n- \uc120\uacfc \uc810 \ud45c\ud604\\n- \ud22c\uba85\ud55c \ubc30\uacbd\uc0c9\\n\\n\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ubc14\uc05c \uc77c\uc815\uacfc \uae30\ub2a5 \uad6c\ud604\uc5d0 \uc788\uc5b4 \uc57d\uac04\uc758 \uc5f0\uc0b0\uc774 \ub4e4\uc5b4\uac04\ub2e4\ub294 \ubd80\ubd84\uc5d0\uc11c \ubc31\uc5d4\ub4dc\uc5d0\uc11c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30\ub85c \uacb0\uc815\uc744 \ub0b4\ub838\ub2e4.\\n\\n## \uace0\ub824\ud55c \uae30\uc220\\n\\n\uc774\ubbf8\uc9c0 \uc0dd\uc131\uc744 \uc704\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uae30\uc220\ub4e4\uc744 \ud655\uc778\ud574 \ubcf4\uc558\ub2e4. \\n\\n- Python\uc758 Matplotlib\\n- **AWT(Abstract Window Toolkit) [\ucd5c\uc885 \uc120\ud0dd]**\\n- \uc774\ubbf8\uc9c0 \ucc98\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc0f Java\uc5d0\uc11c \ub0b4\ubd80\uc801\uc73c\ub85c Matplotlib \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac (\uc6d0\ud558\ub294 \uae30\ub2a5 \uc5c6\uc74c)\\n- Java Swing, Java FX (\ub2e8\uc21c\ud55c \uc120 \uadf8\ub9ac\uae30 + \uc810 \ucc0d\uae30\ub77c \ubd88\ud544\uc694)\\n\\n## Python & Matplotlib\\n\\n\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ub77c\uc774\ube0c\ub7ec\ub9ac \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 0.2\ucd08 \\n\\n- \ucf54\ub4dc\uac00 \uac04\ub2e8\ud574\uc11c \uc720\uc9c0 \ubcf4\uc218\uc131\uc774 \uc88b\ub2e4. \\n- AWS Lambda \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ucef4\ud4e8\ud305 \uc11c\ube44\uc2a4\ub098 FastAPI\uc640 \uac19\uc740 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ucd94\uac00\uc801\uc778 API\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.\\n- Spring Boot\uc5d0\uc11c \ucd94\uac00\uc801\uc778 API \ud638\ucd9c\uc744 \ud574\uc57c\ud558\uace0, \ud655\uc7a5\uc131\uacfc \ube44\ub3d9\uae30 \ucc98\ub9ac \ub4f1 \uace0\ub824 \ud574\uc57c \ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4.\\n\\n## Java AWT \uc774\uc678\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\\n\\nPython\uc774 \uc544\ub2cc Java\uc5d0\uc11c\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uace0\ub824\ub97c \ud574\ubd24\uc9c0\ub9cc \uc694\uad6c\uc0ac\ud56d\uc5d0 \uc801\ud569\ud558\uc9c0 \uc54a\uac70\ub098, \uc801\uc740 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac70\uc6b4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 \ub9ce\uc544\uc11c \uc81c\uc678\ud588\ub2e4.\\n\\n\ub77c\uc774\ube0c\ub7ec\ub9ac | \uc124\uba85 | \uc81c\uc678 \uc774\uc720\\n-- | -- | --\\nSwing | AWT \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, \ub124\uc774\ud2f0\ube0c UI\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 \ubaa8\ub4e0 \uc6b4\uc601\uccb4\uc81c \uc0c1\uc5d0\uc11c \ub3d9\uc77c\ud55c UI\ub97c \uac00\uc9c0\ub3c4\ub85d \ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\nJavaFX | Swing \uc774\ud6c4\uc5d0 \ub098\uc628 GUI \ub77c\uc774\ube0c\ub7ec\ub9ac, 3\ucc28\uc6d0 \uadf8\ub798\ud53d\uc744 \uc9c0\uc6d0\ud568 | \uc694\uad6c\uc0ac\ud56d\uc5d0 \ube44\ud574 \ubb34\uac81\uace0 \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc74c\\n[simple-java-plot](https://github.com/yuriy-g/simple-java-plot) | AWT\ub85c \uad6c\ud604\ub41c \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac | AWT \uae30\ubc18\uc774\uae34 \ud558\uc9c0\ub9cc \uc9c1\uc811 AWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc5d0 \ube44\ud574 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c, \ucee4\uc2a4\ud140 \uc124\uc815 \uae30\ub2a5\uc774 \uc5c6\uc74c\\n[matplotlib4j](https://github.com/sh0nk/matplotlib4j) | Matplotlib\ub97c Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac | \ub0b4\ubd80\uc801\uc73c\ub85c \ud30c\uc774\uc36c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ubb34\uac70\uc6c0, \ubc30\uacbd \ud22c\uba85\ud654 \uae30\ub2a5 \uc5c6\uc74c\\n\\n## Java & AWT(Abstract Window Toolkit)\\n\\n\uadf8\ub798\ud53d\uacfc \uc774\ubbf8\uc9c0\ub97c \uadf8\ub9ac\uae30 \uc704\ud55c \ub3c4\uad6c \\n\uc774\ubbf8\uc9c0 \uc0dd\uc131 \ubc0f \ub85c\uceec\uc5d0 \uc800\uc7a5\uae4c\uc9c0 \uac78\ub9ac\ub294 \uc2dc\uac04: 1.75\ucd08 \\n\\n- \ud50c\ub85c\ud305 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ubcf4\ub2e4 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc874\uc7ac\ud55c\ub2e4.\\n- \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub2e4\uc18c \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0 \ube60\ub978 \uc751\ub2f5 \ubc18\ud658\uc744 \uc704\ud574 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uace0\ub824\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4.\\n- \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n\\n## \uae30\uc220 \uc120\ud0dd\\n\\nAWT\uc758 \uacbd\uc6b0 Matplotlib\uc5d0 \ube44\ud574 \uad6c\ud604\uc758 \ub09c\uc774\ub3c4\uac00 \ub2e4\uc18c \uc788\uace0, \uc774\ubbf8\uc9c0 \uc0dd\uc131 \uc2dc\uac04\uc774 \ub354 \ub9ce\uc774 \uac78\ub9ac\ub294 \ub2e8\uc810\uc774 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc \ucd94\uac00\uc801\uc778 api \ud638\ucd9c\uc744 \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub294 \ubd80\ubd84, Python\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ucd94\uac00\uc801\uc778 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uace0\ub824\ud558\uc5ec AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.\\n\\n## \uc720\uc9c0 \ubcf4\uc218\\n\\nAWT\ub77c\ub294 \uc0dd\uc18c\ud55c \uae30\uc220\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc720\uc9c0 \ubcf4\uc218\uc131\uc744 \uc704\ud574 \ud300\uc6d0\ub4e4\uacfc \uacf5\uc720\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uacf5\uc720\ud558\uae30\ub85c \ud588\ub2e4. \\n\\n1. \ucf54\ub4dc \ub9ac\ubdf0\uc640 PR\uc744 \ud1b5\ud574 \uc791\uc131\ud55c AWT \ucf54\ub4dc\uc5d0 \ub300\ud55c \uc124\uba85 \ubc0f \ub9ac\ubdf0 \ubc1b\ub294\ub2e4. \\n2. AWT\ub97c \uc0ac\uc6a9\ud55c \ubd80\ubd84\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \uacf5\uc720\ud55c\ub2e4."},{"id":"35","metadata":{"permalink":"/35","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","source":"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx","title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","description":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","date":"2023-07-24T00:00:00.000Z","formattedDate":"2023\ub144 7\uc6d4 24\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Spring Boot","permalink":"/tags/spring-boot"},{"label":"Spring","permalink":"/tags/spring"}],"readingTime":4.725,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","slug":"35","tags":["Java","Spring Boot","Spring"]},"prevItem":{"title":"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd","permalink":"/36"},"nextItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/34"}},"content":"## \uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\\n\\n\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4. \\n2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4.\\n\\n## \uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### Switch Expressions(Java 14)\\n\\nJava 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n```java\\nenum RESULT {\\n WIN, LOSE, DRAW\\n}\\n\\nRESULT result = RESULT.WIN;\\n\\nint prize = switch (result) {\\n case WIN -> 10_000_000;\\n case LOSE, DRAW -> 5_000_000;\\n\\tdefault -> 0;\\n};\\n```\\n\\n\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.\\n\\n- `->` \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.\\n- case\ub97c \ucf64\ub9c8(`,`)\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n- break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4.\\n- default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.\\n\\n### Text Block(Java 15)\\n\\nJava 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@Repository\\npublic interface PostRepository extends JpaRepository<Post, Long> {\\n @Query(\\"\\"\\"\\n SELECT p FROM Post p\\n WHERE p.title LIKE %:keyword%\\n OR p.content LIKE %:keyword%\\n \\"\\"\\")\\n List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);\\n}\\n```\\n\\n### NPE \uba54\uc2dc\uc9c0(Java 15)\\n\\n```java\\nString name = null;\\nname.chars();\\n\\n/** \\n# before\\njava.lang.NullPointerException\\n\\tat com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\\n\\n# after\\nCannot invoke \\"String.chars()\\" because \\"name\\" is null\\njava.lang.NullPointerException: Cannot invoke \\"String.chars()\\" because \\"name\\" is null\\n*/\\n```\\n\\n### Record(Java 16)\\n\\nLombok\uc758 `@Data`, kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nRecord\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4. \\n\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. \\n\\n```java\\npublic record PostDto(String title, String content) {\\n}\\n```\\n\\n### \ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d\\n\\n\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n## \uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d\\n\\n\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. \\n\\n### \uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d\\n\\nJava 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n### \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd\\n\\nJakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. \\n\\n### PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c\\n\\n6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c `@GetMapping(\\"/hello\\")`\uc640 `@GetMapping(\\"/hello/\\")`\uac00 \ub3d9\uc77c\ud588\ub2e4. \\n6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, `/hello`\uc640 `/hello/`\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. \\n\\n> PathPatternParser used by default (with the ability to opt into PathMatcher). \\n\\n### HTTP interface client\\n\\n\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [\ud1a0\ube44\ub2d8\uc758 \uac15\uc758](https://www.youtube.com/watch?v=Kb37Q5GCyZs)\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d\\n\\nGradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6 \\n\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n[\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30](https://www.youtube.com/watch?v=1WT6oxchM9M) \\n[\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30](https://www.youtube.com/watch?v=7SlDdzVk6GE) \\n[Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658](https://www.samsungsds.com/kr/insights/java_jakarta.html) \\n[Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529](https://www.youtube.com/watch?v=Kb37Q5GCyZs) \\n[What\'s New in Spring Framework 6.x](https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x) \\n[Spring Boot 3.0 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes) \\n[Spring Boot 3.1 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes)"},{"id":"34","metadata":{"permalink":"/34","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-26-WebSocket.mdx","source":"@site/blog/2023/2023-06-26-WebSocket.mdx","title":"\uc6f9\uc18c\ucf13","description":"\uc6f9\uc18c\ucf13","date":"2023-06-26T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 26\uc77c","tags":[{"label":"WebSocket","permalink":"/tags/web-socket"}],"readingTime":2.965,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9\uc18c\ucf13","slug":"34","tags":["WebSocket"]},"prevItem":{"title":"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1","permalink":"/35"},"nextItem":{"title":"Docusaurus","permalink":"/33"}},"content":"### \uc6f9\uc18c\ucf13\\n\\n\ub2e8\uc77c TCP \uc5f0\uacb0\uc744 \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc804\uc774\uc911 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub85c\ud1a0\ucf5c \\n\uc6f9 \ud658\uacbd\uc5d0\uc11c \uc5f0\uc18d\ub41c \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\\n\uc6f9\uc18c\ucf13\uc740 HTTP\uc758 \ud3ec\ud2b8\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uace0 \uac01\uac01 \ud3ec\ud2b8 80\uacfc \ud3ec\ud2b8 443\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP(ws://) \ubc0f HTTPS(wss://)\ub85c \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud55c\ub2e4. \\n\\n### \uc6f9\uc18c\ucf13 \ub4f1\uc7a5 \ubc30\uacbd\\n\\n\uc6f9\uc18c\ucf13\uc774 \ub4f1\uc7a5\ud558\uae30 \uc774\uc804, \uc2e4\uc2dc\uac04\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 Polling, Streaming \uac19\uc740 \uae30\uc220\uc744 \uc0ac\uc6a9\ud588\uc5b4\uc57c \ud588\ub2e4. \\n\uc774\ub294 \uc2e4\uc2dc\uac04\uc131\uc774\ub098 \uc591\ubc29\ud5a5\uc131\uc744 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud588\uace0, HTTP\ub97c \uc774\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uacfc\ub3c4\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \ubc1c\uc0dd\ud588\ub2e4. \\n\\n### \uc6f9\uc18c\ucf13\uc758 \ub3d9\uc791\\n\\n```mermaid\\nsequenceDiagram\\n participant Client\\n participant Server\\n Client->>Server: Handshake - Upgrade\ub97c \uc774\uc6a9\ud55c WebSocket \uc804\ud658 \uc694\uccad\\n Server->>Client: Handshake - HttpStatus 101(Switching Protocols)\\n\\n Client->>Server: \uc591\ubc29\ud5a5 \ud1b5\uc2e0\\n Server->>Client: \\n\\n Client->>Server: \uc885\ub8cc\\n Server->>Client: \\n```\\n\\n### 1. Upgrade \uc694\uccad\\n\\nWebSocket \ud504\ub85c\ud1a0\ucf5c\ub85c \uc804\ud658\ud558\ub294 HTTP \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4. \\n\uc774\ub294 HTTP\uc640 \uac19\uc774 80, 443 \ud3ec\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uc6f9\uc18c\ucf13\uc73c\ub85c \uc804\ud658\ud558\uae30 \uc704\ud574\uc11c\ub294 Upgrade: websocket, Connection: Upgrade \ud5e4\ub354\uac00 \ud544\uc694\ud558\ub2e4. \\nSec-WebSocket-Key\ub294 \uc11c\ubc84\uc5d0\uc11c Sec-WebSocket-Accept\ub97c \uacc4\uc0b0\ud558\uc5ec \uc751\ub2f5\ud558\uace0 \uc774 \uac12\uc774 \uc608\uc0c1\ud55c \uac12\uacfc \ub2e4\ub974\uba74 \uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uc9c0 \uc54a\ub294\ub2e4. \\nSec-WebSocket-Protocol\uc758 \uacbd\uc6b0 \uc11c\ube0c\ud504\ub85c\ud1a0\ucf5c\uc758 \ubaa9\ub85d\uc73c\ub85c \uc11c\ubc84 \uce21\uc5d0\uc11c\ub294 \ud574\ub2f9 \ubaa9\ub85d \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\uc5ec \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ub9cc\uc57d \uc11c\ubc84\uce21\uc5d0\uc11c \uc5ec\ub7ec \uac1c \uc9c0\uc6d0\uc774 \uac00\ub2a5\ud55c \uacbd\uc6b0 \uc9c0\uc6d0 \uac00\ub2a5\ud55c \ud504\ub85c\ud1a0\ucf5c \uc911 \uccab\ubc88\uc9f8 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8\uce21\uc73c\ub85c \ubcf4\ub0b8\ub2e4. \\n\\n```\\nGET /chats HTTP/1.1\\nHost: localhost:8080\\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==\\nSec-WebSocket-Protocol: v10.stomp, v11.stomp\\nSec-WebSocket-Version: 13\\nOrigin: http://localhost:8080\\n```\\n\\n### 2. Switching Protocols\\n\\n\uc11c\ubc84\ub294 101 Switching Protocols \uc751\ub2f5\uc744 \ubc18\ud658\ud55c\ub2e4. \\nSec-WebSocket-Accept\uc740 Sec-WebSocket-Key \ub4a4\uc5d0 `258EAFA5-E914-47DA-95CA-C5AB0DC85B11`\ub97c \ubd99\uc774\uace0 SHA1\ub85c \ud574\uc2f1 \ud6c4 Base64\ub85c \uc778\ucf54\ub529\ud558\uc5ec \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub294 \uc11c\ubc84 \uc6f9\uc18c\ucf13 \ud504\ub85c\ud1a0\ucf5c\uc758 \uc9c0\uc6d0 \uc5ec\ubd80\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uba85\ud655\ud788 \uc54c\ub9ac\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \\n\\n```\\nHTTP/1.1 101 Switching Protocols \\nUpgrade: websocket\\nConnection: Upgrade\\nSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=\\nSec-WebSocket-Protocol: v10.stomp\\n```\\n\\n### 3. \ud1b5\uc2e0 \ud6c4 \uc885\ub8cc\\n\\n\uc5f0\uacb0\uc774 \uc218\ub9bd\ub418\uba74 \uc6f9\uc18c\ucf13 \ud504\ub808\uc784 \ub2e8\uc704\ub85c \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc744 \ud55c\ub2e4. \\n\uc5f0\uacb0 \uc885\ub8cc\ub97c \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc11c\ubc84 \ubaa8\ub450 \uc5f0\uacb0 \uc885\ub8cc\ub97c \uc694\uccad\ud560 \uc218 \uc788\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\nhttps://datatracker.ietf.org/doc/html/rfc6455\\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications \\nhttps://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers \\nhttps://docs.spring.io/spring-framework/reference/web/websocket.html"},{"id":"33","metadata":{"permalink":"/33","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","source":"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx","title":"Docusaurus","description":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.","date":"2023-06-18T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 18\uc77c","tags":[{"label":"Documentation","permalink":"/tags/documentation"}],"readingTime":10.095,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Docusaurus","slug":"33","tags":["Documentation"]},"prevItem":{"title":"\uc6f9\uc18c\ucf13","permalink":"/34"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/32"}},"content":"\ud300 \ube14\ub85c\uadf8 \ub610\ub294 \ubb38\uc11c\ud654\ub97c \uc704\ud574 Docusaurus\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4. \\n\\n## \uc124\uce58\\n\\n[\uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://docusaurus.io/docs/installation)\uc5d0 \ub4e4\uc5b4\uac00\uc11c \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud55c\ub2e4. \\n\\n```bash\\nyarn create docusaurus\\n````\\n\\n## \ubc30\ud3ec\\n\\n[\ubc30\ud3ec \uc548\ub0b4 \ubb38\uc11c](https://docusaurus.io/docs/next/deployment#deploying-to-github-pages) \\nnetlify\ub098 vercel \uac19\uc740 \uc11c\ubc84\ub9ac\uc2a4 \ud50c\ub7ab\ud3fc\uc744 \ucd94\ucc9c\ud558\uace0 \uc788\uace0, \uac04\ub2e8\ud558\uace0, \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \ubc30\ud3ec\ub97c \ud560 \uc218 \uc788\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 github pages\ub97c \uc774\uc6a9\ud574\uc11c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud55c\ub2e4.\\n\\n### \ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc0dd\uc131\\n\\ngithub pages\ub97c \uc774\uc6a9\ud558\ub824\uba74 [\uc608\uc2dc](https://github.com/greeng00se/greeng00se.github.io)\uc640 \uac19\uc774 `username.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\n\uc774\ub54c organization\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 `organization.github.io` \ud615\ud0dc\uc758 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n### \uc124\uc815 \ud30c\uc77c \uc218\uc815\\n\\n```js title=\\"docusaurus.config\\"\\nmodule.exports = {\\n // ...\\n url: \'https://greeng00se.github.io\',\\n baseUrl: \'/\',\\n projectName: \'greeng00se.github.io\',\\n organizationName: \'greeng00se\',\\n trailingSlash: false,\\n // ...\\n};\\n```\\n\\n### \ud1a0\ud070 \uc124\uc815\\n\\ngithub action\uc744 \uc704\ud574 \ubc30\ud3ec\uc6a9 \ud1a0\ud070\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uc5ec \uc0dd\uc131\ud55c \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \ud1a0\ud070\uc744 \ud074\ub798\uc2dd \ubc29\uc2dd\uc73c\ub85c \uc0dd\uc131\ud588\uace0 \uc2a4\ucf54\ud504\ub294 [repo, user, workflow] \uc744 \uc124\uc815\ud588\ub2e4. \\n\\n![github](./github.png)\\n\\n### \ube0c\ub79c\uce58 \uc0dd\uc131\\n\\ngithub\uc5d0\uc11c gh-pages \ube0c\ub79c\uce58\ub97c \ud558\ub098 \uc0dd\uc131\ud55c\ub2e4. \\nrepository -> settings -> pages -> branch\uc5d0\uc11c \uc0dd\uc131\ud55c gh-pages\ub85c \ube0c\ub79c\uce58\ub97c \ubcc0\uacbd\ud55c\ub2e4. \\n\uc124\uc815\ud55c \ube0c\ub79c\uce58\uac00 \ubc30\ud3ec \ube0c\ub79c\uce58\uac00 \ub418\uba70, \ud574\ub2f9 \ube0c\ub79c\uce58\uc5d0 \uc788\ub294 \ud30c\uc77c\ub4e4\uc744 \uc774\uc6a9\ud574\uc11c \uc815\uc801 \uc6f9\uc0ac\uc774\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\\n### \uc6cc\ud06c\ud50c\ub85c \uc791\uc131\\n\\nDocusaurus 2.0 \uae30\uc900 Node.js 16.14 \uc774\uc0c1\uc758 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. \\n\ubc30\ud3ec\uc2dc\uc5d0\ub294 Repository secrets\uc73c\ub85c \uc124\uc815\ud55c DEPLOY_TOKEN \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. \\n\\n```yml title=\\".github/workflows/deploy.yml\\"\\nname: blog\\n\\non:\\n push:\\n branches: [main]\\n\\njobs:\\n deploy:\\n name: Deploy to GitHub Pages\\n runs-on: ubuntu-latest\\n steps:\\n - uses: actions/checkout@v2\\n - uses: actions/setup-node@v3\\n with:\\n node-version: 18\\n cache: yarn\\n\\n - name: Install dependencies\\n run: yarn install --frozen-lockfile\\n - name: Build website\\n run: yarn build\\n\\n - name: Deploy to GitHub Pages\\n uses: peaceiris/actions-gh-pages@v3\\n with:\\n github_token: ${{ secrets.DEPLOY_TOKEN }}\\n publish_dir: ./build\\n user_name: github-actions[bot]\\n user_email: 41898282+github-actions[bot]@users.noreply.github.com\\n```\\n\\n## \ub313\uae00 \uae30\ub2a5\\n\\ngiscus\ub97c \uc774\uc6a9\ud558\uc5ec \ub313\uae00 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c\ub2e4. \\n\\n### giscus \uc124\uc815\\n\\n1. \uacf5\uac1c \uc800\uc7a5\uc18c\uc5ec\uc57c \ud55c\ub2e4.\\n2. giscus \uc571\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n3. Discussions \uae30\ub2a5\uc774 \ud574\ub2f9 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.\\n\\n\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [giscus](https://giscus.app/ko)\ub97c \ud655\uc778\ud558\uc790.\\n\\n### docusaurus \uc124\uc815\\n\\n[swizzling](https://docusaurus.io/ko/docs/next/swizzling)\uc744 \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac10\uc2fc\ub2e4. \\n\uae30\uc874\uc5d0 \uac8c\uc2dc\ubb3c\uc744 giscus\uac00 \ud3ec\ud568\ub41c \ub9ac\uc561\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\ub85c \uac10\uc2f8\ub294 \ud615\ud0dc\uac00 \ub41c\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec BlogPostItem\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nyarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap\\n```\\n\\n\uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uba74 `/src/theme/BlogPostItem/index.js` \uc704\uce58\uc5d0 \ud30c\uc77c\uc774 \uc0dd\uc131\ub41c\ub2e4. \\n\ud30c\uc77c\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uace0, \uc774\ub54c setAttribute \ubd80\ubd84\uc740 \uc801\uc808\ud558\uac8c \uc790\uc2e0\uc758 giscus \uc124\uc815\uc744 \uc774\uc6a9\ud55c\ub2e4. \\n\\n```js title=\\"/src/theme/BlogPostItem/index.js\\"\\nimport OriginalBlogPostItem from \\"@theme-original/BlogPostItem\\";\\nimport React, { useEffect, useRef } from \\"react\\";\\n// @ts-expect-error internal code\\nimport { useColorMode } from \\"@docusaurus/theme-common\\";\\nimport { useBlogPost } from \\"@docusaurus/theme-common/internal\\";\\n\\nconst giscusSelector = \\"iframe.giscus-frame\\";\\n\\nfunction BlogPostItem(props) {\\n const { colorMode } = useColorMode();\\n const { isBlogPostPage } = useBlogPost();\\n const giscusTheme = colorMode === \\"dark\\" ? \\"dark\\" : \\"light\\";\\n const containerRef = useRef(null);\\n\\n useEffect(() => {\\n if (!isBlogPostPage) return;\\n\\n const giscusEl = containerRef.current.querySelector(giscusSelector);\\n\\n const createGiscusEl = () => {\\n const script = document.createElement(\\"script\\");\\n\\n script.src = \\"https://giscus.app/client.js\\";\\n script.setAttribute(\\"data-repo\\", \\"teco-chat/teco-chat.github.io\\");\\n script.setAttribute(\\"data-repo-id\\", \\"R_kgDOJZ5j0Q\\");\\n script.setAttribute(\\"data-category\\", \\"Announcements\\");\\n script.setAttribute(\\"data-category-id\\", \\"DIC_kwDOJZ5j0c4CXS_Q\\");\\n script.setAttribute(\\"data-mapping\\", \\"pathname\\");\\n script.setAttribute(\\"data-strict\\", \\"0\\");\\n script.setAttribute(\\"data-reactions-enabled\\", \\"1\\");\\n script.setAttribute(\\"data-emit-metadata\\", \\"0\\");\\n script.setAttribute(\\"data-input-position\\", \\"bottom\\");\\n script.setAttribute(\\"data-theme\\", giscusTheme);\\n script.setAttribute(\\"data-lang\\", \\"ko\\");\\n script.crossOrigin = \\"anonymous\\";\\n script.async = true;\\n \\n containerRef.current.appendChild(script);\\n };\\n\\n const postThemeMessage = () => {\\n const message = {\\n setConfig: {\\n theme: giscusTheme,\\n }\\n };\\n\\n giscusEl.contentWindow.postMessage({ giscus: message }, \\"https://giscus.app\\");\\n };\\n\\n giscusEl ? postThemeMessage() : createGiscusEl();\\n }, [giscusTheme]);\\n\\n return (\\n <>\\n <OriginalBlogPostItem {...props} />\\n {isBlogPostPage && <div ref={containerRef} />}\\n </>\\n );\\n}\\n\\nexport default BlogPostItem;\\n```\\n\\n## \uc54c\uace0\ub9ac\uc544 \uc124\uc815 \ubc0f \uc9c1\uc811 \uad00\ub9ac\ud558\uae30\\n\\n\uc54c\uace0\ub9ac\uc544\ub97c \uc0ac\uc6a9\ud558\uba74 \uac80\uc0c9 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4. \\n\uc720\ub8cc \ud50c\ub79c\uc774\ub098 netlify\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud06c\ub864\ub7ec\ub97c \ub530\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uac83 \uac19\ub2e4. \\n\\n\ubb34\ub8cc \ud50c\ub79c\uc740 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uacfc, [docsearch](https://docsearch.algolia.com/)\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \\ndocsearch\uc5d0 \ub4f1\ub85d\ud55c\ub2e4\uba74 \uc77c\uc8fc\uc77c\uc5d0 \ud55c \ubc88\uc529 \ud06c\ub864\ub9c1\uc774 \uc9c4\ud589\ub41c\ub2e4. \\n\uc774 \uae00\uc5d0\uc11c\ub294 \uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n- [\uc9c1\uc811 \uc778\ub371\uc2a4 \uc218\uc9d1](https://docsearch.algolia.com/docs/legacy/run-your-own/) \\n- [\uc124\uc815 \ud30c\uc77c](https://docsearch.algolia.com/docs/legacy/config-file)\\n\\n### \uc54c\uace0\ub9ac\uc544 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \ubc0f \ud0a4 \ud655\uc778\\n\\n\ud68c\uc6d0\uac00\uc785\uc744 \ud558\uace0 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131\uc744 \ub204\ub978\ub2e4. \\n\uc0dd\uc131\uc744 \ub2e4 \ub9c8\uce58\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 api \ud0a4\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n![algolia](./algolia.png)\\n\\n### \ud0a4 \uc0dd\uc131\\n\\n\uc9c1\uc811 \uc778\ub371\uc2a4\ub97c \uc218\uc9d1\ud558\uae30 \uc704\ud55c \ud0a4\ub97c \uc0dd\uc131\ud55c\ub2e4. \\naddObject, editSettings, deleteIndex acl(\uc811\uadfc \uc81c\uc5b4 \ubaa9\ub85d)\uc774 \uc788\uc73c\uba74 \ub41c\ub2e4. \\n\\n![key](./key.png)\\n\\n### .env \ud30c\uc77c \uc0dd\uc131\\n\\n\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uc0c1\ub2e8\uc5d0 .env \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\\n```bash title=\\".env\\"\\nAPPLICATION_ID=MVIU5UEMOM\\nAPI_KEY=\uc778\ub371\uc2a4_\uc0dd\uc131\uc6a9_\ud0a4\\n```\\n\\n### config \ud30c\uc77c \uc0dd\uc131\\n\\n\ub9c8\ucc2c\uac00\uc9c0\ub85c \ucd5c\uc0c1\ub2e8\uc5d0 config.json \ud30c\uc77c\uc744 \uc0dd\uc131\ud55c\ub2e4.\\n\uc124\uc815 \ud30c\uc77c\uc740 \ud574\ub2f9 [\ub9c1\ud06c](https://docsearch.algolia.com/docs/legacy/config-file)\ub97c \ucc38\uace0\ud55c\ub2e4. \\n\ub610\ub294 Docusaurus\uc758 [\uc124\uc815 \ud30c\uc77c](https://github.com/algolia/docsearch-configs/blob/master/configs/docusaurus-2.json)\uc744 \ucc38\uace0\ud55c\ub2e4.\\n\\n```json title=\\"config.json\\"\\n{\\n \\"index_name\\": \\"teco\\",\\n \\"start_urls\\": [\\n \\"https://teco-chat.github.io/\\"\\n ],\\n \\"sitemap_urls\\": [\\n \\"https://teco-chat.github.io/sitemap.xml\\"\\n ],\\n \\"sitemap_alternate_links\\": true,\\n \\"stop_urls\\": [\\n \\"/tests\\"\\n ],\\n \\"selectors\\": {\\n \\"lvl0\\": {\\n \\"selector\\": \\"(//ul[contains(@class,\'menu__list\')]//a[contains(@class, \'menu__link menu__link--sublist menu__link--active\')]/text() | //nav[contains(@class, \'navbar\')]//a[contains(@class, \'navbar__link--active\')]/text())[last()]\\",\\n \\"type\\": \\"xpath\\",\\n \\"global\\": true,\\n \\"default_value\\": \\"Documentation\\"\\n },\\n \\"lvl1\\": \\"header h1\\",\\n \\"lvl2\\": \\"article h2\\",\\n \\"lvl3\\": \\"article h3\\",\\n \\"lvl4\\": \\"article h4\\",\\n \\"lvl5\\": \\"article h5, article td:first-child\\",\\n \\"lvl6\\": \\"article h6\\",\\n \\"text\\": \\"article p, article li, article td:last-child\\"\\n },\\n \\"strip_chars\\": \\" .,;:#\\",\\n \\"custom_settings\\": {\\n \\"separatorsToIndex\\": \\"_\\",\\n \\"attributesForFaceting\\": [\\n \\"language\\",\\n \\"version\\",\\n \\"type\\",\\n \\"docusaurus_tag\\"\\n ],\\n \\"attributesToRetrieve\\": [\\n \\"hierarchy\\",\\n \\"content\\",\\n \\"anchor\\",\\n \\"url\\",\\n \\"url_without_anchor\\",\\n \\"type\\"\\n ]\\n },\\n \\"conversation_id\\": [\\n \\"833762294\\"\\n ],\\n \\"nb_hits\\": 46250\\n}\\n```\\n\\n### docker \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\\n\\ndocker\uc640 jq\uac00 \ud544\uc694\ud558\ub2e4. \\njq\uac00 \uc124\uce58\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba74 mac \uae30\uc900 brew\ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. \\n\\n```bash\\nbrew install jq\\n```\\n\\n\ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec .env\uc640 config.json\uc744 \uc774\uc6a9\ud558\uc5ec \ud06c\ub864\ub9c1\uc744 \ud55c\ub2e4. \\n\\n```bash\\ndocker run -it --env-file=.env -e \\"CONFIG=$(cat ./config.json | jq -r tostring)\\" algolia/docsearch-scraper\\n```\\n\\n### docusaurus \uc124\uc815\\n\\n\uc804\uc5d0 \ud655\uc778\ud55c APP ID, Search-Only API KEY, IndexName\uc744 \uc774\uc6a9\ud558\uc5ec docusaurus.config \ud30c\uc77c\uc5d0 \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n algolia: {\\n appId: \'MVIU5UEMOM\', // Application ID\\n apiKey: \'b68f378013817d9a190df88cdde226a0\', // Search-Only API Key\\n indexName: \'teco\', // config.json\uc5d0 \uc124\uc815\ud55c \uc778\ub371\uc2a4\uba85\\n contextualSearch: true,\\n },\\n })\\n```\\n\\n## \ubd80\uac00 \uc124\uc815\\n\\n### \ud654\uba74 \uc0c1\ub2e8 Github Icon\\n\\n\ud30c\uc77c \ucd5c\ud558\ub2e8\uc5d0 \uc544\ub798 css \uad6c\ubb38\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```css title=\\"/src/css/custom.css\\"\\n.header-github-link:hover {\\n opacity: 0.6;\\n}\\n\\n.header-github-link:before {\\n content: \'\';\\n width: 24px;\\n height: 24px;\\n display: flex;\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n\\nhtml[data-theme=\'dark\'] .header-github-link:before {\\n background: url(\\"data:image/svg+xml,%3Csvg viewBox=\'0 0 24 24\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cpath fill=\'white\' d=\'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\'/%3E%3C/svg%3E\\")\\n no-repeat;\\n}\\n```\\n\\nthemeconfig -> navbar\uc5d0 github link\ub97c \uc124\uc815\ud55c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nnavbar: {\\n title: \'HELLO\',\\n items: [\\n {\\n href: \'https://github.com/greeng00se\',\\n position: \'right\',\\n className: \'header-github-link\',\\n \'aria-label\': \'GitHub repository\',\\n },\\n ],\\n},\\n```\\n\\n### \ucf54\ub4dc\ube14\ub7ed\\n\\njava\ub098 kotlin\uc758 \uacbd\uc6b0 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ub77c\uc774\ud305\uc744 \uc9c0\uc6d0\ud574 \uc8fc\uc9c0 \uc54a\ub294\ub2e4. \\nprism \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ubcc0\uacbd\ud574 \uc900\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nprism: {\\n theme: lightCodeTheme,\\n darkTheme: darkCodeTheme,\\n additionalLanguages: [\'java\', \'kotlin\'],\\n}\\n```\\n\\n### mermaid\\n\\nmermaid\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 `@docusaurus/theme-mermaid` \ub97c \uc124\uce58\ud574\uc57c \ud55c\ub2e4.\\n\\n```bash\\nyarn add @docusaurus/theme-mermaid\\n```\\n\\n\uc124\uce58 \ud6c4 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\uc744 \ucd94\uac00\ud55c\ub2e4.\\n\\n```js title=\\"docusaurus.config\\"\\nconst config = {\\n ...\\n markdown: {\\n mermaid: true,\\n },\\n themes: [\\n \'@docusaurus/theme-mermaid\'\\n ],\\n};\\n```\\n\\nthemeConfig\uc5d0\uc11c mermaid\uc758 \ud14c\ub9c8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\nthemeConfig:\\n /** @type {import(\'@docusaurus/preset-classic\').ThemeConfig} */\\n ({\\n ...\\n mermaid: {\\n theme: {\\n light: \'neutral\', \\n dark: \'dark\'\\n },\\n },\\n }),\\n```\\n\\n### \uad6d\uc81c\ud654 \uc124\uc815\\n\\n\uad6d\uc81c\ud654 \uc124\uc815\uc744 \ud55c\ub2e4\uba74 `Older Entries` \ud615\ud0dc\uc758 \uc124\uba85\uc774 `\ub2e4\uc74c \ud398\uc774\uc9c0` \ub85c \ubcc0\uacbd\ub41c\ub2e4. \\n\uc124\uc815\ud30c\uc77c\uc5d0\uc11c i18n\uc5d0 \uc788\ub294 \ub85c\ucf00\uc77c \uc124\uc815\uc744 ko\ub85c \ubcc0\uacbd\ud558\uba74 \ub41c\ub2e4. \\n\\n```js title=\\"docusaurus.config\\"\\ni18n: {\\n defaultLocale: \\"ko\\",\\n locales: [\\"ko\\"],\\n},\\n```\\n\\n### \ube14\ub85c\uadf8 \uae00 author\\n\\n\ud300\uc6d0 \ubcc4\ub85c \ubb38\uc11c\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5b4\ub5a4 \ud300\uc6d0\uc774 \uae00\uc744 \uc791\uc131\ud588\ub294\uc9c0 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. \\n\\n![author](./author.png)\\n\\n`authors.yml` \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n```yml title=\\"/blog/authors.yml\\"\\nherb:\\n name: \ud5c8\ube0c\\n title: Backend\\n url: https://github.com/greeng00se\\n image_url: https://github.com/greeng00se.png\\n\\nmallang:\\n name: \ub9d0\ub791\\n title: Backend\\n url: https://github.com/shin-mallang\\n image_url: https://github.com/shin-mallang.png\\n```\\n\\n\ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 authors\uc5d0 \ub123\uc5b4\uc8fc\uae30\ub9cc \ud558\uba74 \ub41c\ub2e4. \\n\\n```mdx\\n---\\nslug: 1\\ntitle: Hello World\\nauthors: [herb, mallang]\\ntags: [hello, docusaurus]\\n---\\n\\n\uccab \ubc88\uc9f8 \ubb38\uc11c \ub0b4\uc6a9\\n```"},{"id":"32","metadata":{"permalink":"/32","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","description":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4.","date":"2023-06-11T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 11\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":2.545,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","slug":"32","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"Docusaurus","permalink":"/33"},"nextItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/31"}},"content":"23\ub144\uc758 6\uc6d4\uc774 \uc624\uace0, \ub808\ubca8 2\uac00 \ub05d\ub0ac\ub2e4. \\n\ube60\ub974\uac8c \uc9c0\ub098\uac00\uc11c \uc870\uae08 \uc544\uc27d\ub2e4. \\n\\n### \ud559\uc2b5\\n\\n\ud68c\uace0\ub97c \uc791\uc131\ud558\uae30 \uc804\uc5d0 \ub808\ubca8 2 \ub3d9\uc548 \ubcf4\ub0c8\ub358 PR\uacfc \ud68c\uace0\ub97c \ucb49 \uc77d\uc5b4\ubd24\ub2e4. \\n\ud56d\uc0c1 \uc544\uc26c\uc6b4 \uacf3\uc740 \uc788\uae30 \ub9c8\ub828\uc774\uc9c0\ub9cc, \uc798 \ud559\uc2b5\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc744 \ud558\uba74\uc11c \uae30\uc220\uc744 \uc5b4\ub5bb\uac8c \uc120\ud0dd\ud558\uace0, \uc801\uc6a9\ud560 \uac83\uc778\uc9c0 \uace0\ubbfc\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uaf64\ub098 \ub9ce\uc740 \uc131\uc7a5\uc744 \ud55c \uac83 \uac19\ub2e4. \\n\\n\uace0\ubbfc\uc740 \uae4a\uc5c8\uc9c0\ub9cc \uc774\ub860\uc801\uc778 \ud559\uc2b5\uc774 \ubd80\uc871\ud55c \ub808\ubca8 2\uc600\ub2e4. \\n\ubc29\ud559 \uadf8\ub9ac\uace0 \ub808\ubca8 3 \ub54c\ub294 \uc870\uae08 \ub354 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc744 \ud559\uc2b5\ud558\ub294\ub370 \uc9d1\uc911\ud574\uc57c\uaca0\ub2e4. \\n\\n\uc810\ucc28 \ud559\uc2b5 \ubc94\uc704\uac00 \ub113\uc5b4\uc9c0\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubaa8\ub974\ub294 \ub0b4\uc6a9\uc774 \uc313\uc5ec\uac04\ub2e4. \\n\ud544\uc694\ud55c \ub0b4\uc6a9\uc740 \uc55e\uc73c\ub85c \ucc9c\ucc9c\ud788 \ud559\uc2b5\ud558\uba74 \ub418\ub2c8\uae4c \uc870\uae09\ud574\uc9c0\uc9c0 \ub9d0\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc218\uba74\\n\\n\ub808\ubca8 2\ub97c \uc9c4\ud589\ud558\ub294 \ub3d9\uc548 \uc218\uba74\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\uc5c8\uace0, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uadf8\ub0a0\uc758 \ucee8\ub514\uc158\uc744 \ub9ce\uc774 \uc88c\uc6b0\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc218\uba74 \uc2dc\uac04\uc744 \ub298\ub9ac\uace0, \uc88b\uc740 \uc218\uba74 \uc2b5\uad00\uc744 \uac00\uc9c0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### \ud611\uc5c5\\n\\n\ub808\ubca8 2 \ub9c8\uc9c0\ub9c9\uc5d0 \ud611\uc5c5 \ubbf8\uc158\uc774 \uc788\uc5c8\ub2e4. \\n\uc9c0\uae08\uae4c\uc9c0\ub294 \ubc31\uc5d4\ub4dc \ud06c\ub8e8\ub4e4\uacfc \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \ud611\uc5c5\uc744 \uacbd\ud5d8\ud588\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ud504\ub7f0\ud2b8\uc5d4\ub4dc \ud06c\ub8e8\uc640 \ud611\uc5c5\uc744 \ud588\ub2e4. \uc18c\ud1b5\uc740 \uc798 \ub41c \uac83 \uac19\uc9c0\ub9cc API \uba85\uc138\ub97c \uc815\ud558\ub294 \ubd80\ubd84\uc774 \uc544\uc9c1 \ubbf8\uc219\ud55c \uac83 \uac19\ub2e4. \\n\\n\ub808\ubca8 3 \ub54c\ubd80\ud130 \ubcf8\uaca9\uc801\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\uac00 \uc2dc\uc791\ub41c\ub2e4. \\n\ud300\uc744 \uc704\ud574 \uc5b4\ub5a4 \uac83\uc744 \ud560 \uc218 \uc788\uc744\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 2\ub97c \ub9c8\ubb34\ub9ac\ud558\uba70\\n\\n\ud68c\uace0 \uc791\uc131\ud558\uba74\uc11c \ub808\ubca8 2\uc5d0\uc11c \ud588\ub358 \uac83\ub4e4\uc744 \ubc18\ucd94\ud574 \ubd24\ub294\ub370 \ubd80\uc871\ud55c \uc810\uc740 \ub9ce\uc558\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \uac00\uace0 \uc788\ub294 \uac83 \uac19\ub2e4.\\n\uc77d\uace0 \uc2f6\uc740 \ucc45\ub3c4 \uc77d\uace0, \ubd80\uc871\ud55c \ubd80\ubd84 \ucc44\uc6b0\uba74\uc11c \uc26c\uc5b4\uc57c\uaca0\ub2e4."},{"id":"31","metadata":{"permalink":"/31","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx","title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","description":"\ub808\ubca8 \uc778\ud130\ubdf0","date":"2023-06-08T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 8\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.435,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","slug":"31","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2 \ud68c\uace0","permalink":"/32"},"nextItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/30"}},"content":"### \ub808\ubca8 \uc778\ud130\ubdf0\\n\\n\ub808\ubca8 1 \ub54c\ub294 \uc900\ube44\ud574\ub454 \ub0b4\uc6a9\uc73c\ub85c \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud574\uc11c \uadf8\ub807\uac8c \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc774 \uc5c6\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \ub808\ubca8 1 \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0\ub294 \ub808\ubca8 1 \ud68c\uace0\ub97c \uc791\uc131\ud560 \ub54c \ub07c\uc6cc\ub123\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \ubc94\uc704\ub3c4 \uc81c\ud55c\ub418\uc5b4 \uc788\uc5b4 \uc5b4\ub5bb\uac8c \uc900\ube44\ud574\uc57c \ud560\uc9c0 \ub2f9\ud669\ud588\uace0, \ub2f5\ubcc0\uc5d0\ub3c4 \ubd80\uc871\ud55c \ubd80\ubd84\uc774 \ub9ce\uc558\uc5c8\ub2e4. \\n\uae30\uc5b5\uc774 \uc0ac\ub77c\uc9c0\uae30 \uc804\uc5d0 \ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\ud55c \ub0b4\uc6a9\uc744 \uc81c\uc678\ud558\uace0, \uae30\uc5b5 \ub0a8\ub294 \uac83 \uc704\uc8fc\ub85c \uc791\uc131\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### API \ubb38\uc11c \ub3c4\uad6c \uc120\ud0dd\\n\\n\ud070 \ubb38\uc81c \uc5c6\uc774 \ub2f5\ubcc0\uc744 \ud588\ub294\ub370 \uc55e\uc73c\ub85c\ub3c4 \ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \ud558\uba74\uc11c \ub3c4\uc6c0 \ub420 \uac83 \uac19\uc740 \ub0b4\uc6a9\uc774 \uc788\uc5b4\uc11c \ub0a8\uaca8\ub450\ub824\uace0 \ud55c\ub2e4. \\n\ubc31\uc5d4\ub4dc \ud300\uc6d0\uc774 \ud568\uaed8 \uc758\uc0ac\uacb0\uc815\uc744 \ud588\uace0, \ubbf8\uc158 \uae30\uac04\uc774 \uc9e7\uc740 \ub9cc\ud07c \ud300 \ucc28\uc6d0\uc5d0\uc11c \ube44\uad50\uc801 \ud559\uc2b5\ud558\uae30 \uc26c\uc6b4 Swagger\ub97c \uc120\ud0dd\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub4e4\uc5b4\uac00\ub294 \uc2dc\uac04 \ub300\ube44 \ud558\uc774 \ub9ac\ud134\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4\uace0 \ub2f5\ubcc0\ud588\ub2e4.\\n\\n\ud300 \ucc28\uc6d0\uc758 \ud559\uc2b5 \ube44\uc6a9\uc744 \uc5b8\uae09\ud574\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc88b\uc740 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4.\\n\\n> \ud2b9\ud788 \ud300\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\ud558\ub294 \uacfc\uc815\uc744 \uacf5\uc720\ud574 \uc900 \uc810\uc774 \uc88b\uc558\uace0 \uae30\uc220\uc801 \uc758\uc0ac\uacb0\uc815 \uacfc\uc815\uc5d0\uc11c \ud300\uc758 \ud559\uc2b5\ube44\uc6a9\uc744 \uace0\ub824\ud55c \uc810\uc774 \uc88b\uc558\uc74c. \\n> \uc55e\uc73c\ub85c\ub3c4 \ud559\uc2b5 \ube44\uc6a9\uc740 \uc8fc\uc694\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d\\n>\\n\\n### PUT\uacfc PATCH & \ud1a0\ud070\uacfc \uc138\uc158\\n\\nPUT\uacfc PATCH \ucc28\uc774\ub97c \uc124\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\ub294 PATCH\ub97c \uc0ac\uc6a9\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uac00 \uc801\uc5b4\uc9c4\ub2e4\ub294 \ub0b4\uc6a9\uc744 \ube7c\uba39\uace0 \ub2f5\ubcc0\uc744 \ud588\ub2e4. \\n\ud1a0\ud070\uacfc \uc138\uc158\uc758 \uacbd\uc6b0 \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud574\ub2ec\ub77c\ub294 \uc81c\uc57d\uc870\uac74\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\n\\n\ud574\ub2f9 \ub0b4\uc6a9\uc744 \ub2f5\ubcc0\ud558\uba74\uc11c \uae30\uc220\uc801\uc778 \uae4a\uc774\uac00 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc2e4\uc81c\ub85c \ub808\ubca8 2 \ub54c \uc774\ub860\uc801\uc778 \ud559\uc2b5 \uc2dc\uac04\uc774 \ub9e4\uc6b0 \uc801\uc5c8\uace0, \uc9d1\uc911\ub825\ub3c4 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc55e\uc73c\ub85c \uc5b4\ub5bb\uac8c \uae4a\uc774\ub97c \ucc44\uc6b8\uc9c0 \uace0\ubbfc\uc744 \ud560 \uc218 \uc788\ub294 \uc9c8\ubb38\ub4e4\uc774\uc5c8\ub2e4. \\n\\n\ucd94\uac00\ub85c \uae30\uc220\uc744 \uc798 \ubaa8\ub974\ub294 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\ud558\ub294 \uac00\uc815\uc744 \ub450\uace0 \ud559\uc2b5\uc744 \ud55c\ub2e4\uba74 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac70\ub77c\ub294 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uc558\ub2e4. \\n\\n### \uadf8 \uc678 \uac1c\uc120\ud560 \uc810\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ud2b9\uc720\uc758 \ub9d0\ubc84\ub987\uc744 \uac1c\uc120\ud558\uae30 \\n\uc0dd\uac01\ud560 \uc2dc\uac04\uc744 \uac00\uc84c\uc744 \ub54c \\"\ub2e4\uc2dc \ub9d0\uc500\ub4dc\ub824\ub3c4 \ub420\uae4c\uc694?\\"\ub77c\uace0 \ub9d0\ud558\uace0 \ub2f5\ubcc0\uc744 \uc774\uc5b4\ub098\uac00\uae30 \\n\uae30\uc220\uc801\uc73c\ub85c \uae4a\uc774\uac00 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc774 \ub9ce\uc774 \ub4e4\uc5b4\uc11c \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\uae30 \\n\uc774\uc804\uc5d0 \uacf5\ubd80\ud588\ub358\uac70 \ub418\ub3cc\uc544 \ubcf4\ub294 \uc2dc\uac04 \uac00\uc9c0\uae30"},{"id":"30","metadata":{"permalink":"/30","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","description":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158","date":"2023-06-04T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 4\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.595,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","slug":"30","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0","permalink":"/31"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/29"}},"content":"### \uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158\\n\\n\ubc30\ud3ec \ubc0f \ud611\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n\ub9c8\ucf54, \uc6b0\uac00, \uc6b0\ucf54, \uc6b0\uc2a4 \uadf8\ub9ac\uace0 \ub098\uae4c\uc9c0 \ud569\uccd0\uc11c 5\uba85\uc774 \ud55c \ud300\uc774 \ub418\uc5c8\ub2e4. \\n\\n### \ubc30\ud3ec\\n\\n\uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac AWS\ub97c \uc774\uc6a9\ud574 \ubc30\ud3ec\ub97c \ud574\uc57c \ud588\ub2e4. \\n\uac01\uc790 \ud558\ub098\uc758 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc5c8\uace0, \ud300 \ubcc4\ub85c DB\ub97c \uc704\ud55c \ucd94\uac00 \uc778\uc2a4\ud134\uc2a4\ub97c \uc81c\uacf5\ubc1b\uc558\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\ud5d8\uc744 \ud574\ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc2dc\uac04\uc744 \ub9ce\uc774 \ud22c\uc790\ud558\uc9c4 \uc54a\uc558\uace0, \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc791\uc131\ud588\ub2e4.\\n\\n```bash\\necho \\"Start Deploy Script\\"\\nREPOSITORY_NAME=/home/ubuntu/jwp-shopping-order\\nPROJECT_NAME=jwp-shopping-order\\n\\necho \\"Change Directory\\"\\ncd $REPOSITORY_NAME\\n\\necho \\"Git Pull\\"\\ngit pull origin step2\\n\\necho \\"Build\\"\\n./gradlew bootJar\\n\\necho \\"Copy, Start Server\\"\\nmv ./build/libs/$PROJECT_NAME.jar .\\n\\nPID=$(pgrep -f $PROJECT_NAME)\\n\\nif [ -n $PID ]; then\\n kill -9 $PID\\n\\tsleep 5\\nfi\\n\\nnohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &\\n```\\n\\n### \ud611\uc5c5\\n\\n\uc77c\ub2e8 \uc6b0\uc2a4\ub791 \uc6b0\ucf54\uac00 \uba3c\uc800 \uc7a0\uc2e4\ub85c \uc640\uc918\uc11c \ub108\ubb34 \uac10\uc0ac\ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uac00 \uc544\ub2cc \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \ud574\ubcf4\ub294 \uccab \ud611\uc5c5\uc774\ub77c \uc57d\uac04 \ub450\uadfc\uac70\ub838\ub2e4. \\n\uc608\uc0c1\uc678\ub85c \ub300\ud654\uac00 \uc798 \ub418\uc5b4\uc11c, \ube60\ub974\uac8c \uba85\uc138\ub97c \uc815\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud574\ubcf4\uae30**\\n\\n\ubc31\uc5d4\ub4dc\uc640 \ud14c\uc774\ube14 \uba85\uc138\ub098 \ucfe0\ud3f0 \uad6c\ud604\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30\ud560 \ub54c \uc7a5\ub2e8\uc5d0 \ub300\ud574 \ub9ce\uc774 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub9ce\uc774 \ub4e4\uc5ec\uc11c \uc7a5\ub2e8\uc810\uc744 \uace0\ub824\ud588\ub2e4\uba74 \ub354 \uc88b\uc740 \uacb0\uacfc\ubb3c\uc774 \ub098\uc624\uc9c0 \uc54a\uc558\uc744\uae4c? \\n\uc55e\uc73c\ub85c \uc120\ud0dd\uc758 \uc21c\uac04\uc5d0\uc11c \uc870\uae08 \ub354 \uc2dc\uac04\uc744 \ub4e4\uc5ec\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ubc30\uc6b4 \ubd80\ubd84\\n\\n**expose headers**\\n\\n\uc6f9 \ud398\uc774\uc9c0\uc5d0\uc11c Location \ud5e4\ub354\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c [\ud5c8\uc6a9 \ubaa9\ub85d\uc5d0 \uc874\uc7ac\ud558\ub294 \uc751\ub2f5\ud5e4\ub354](https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header)\ub9cc \ubc18\ud658\ud55c\ub2e4\ub294 \uac83\uc744 \ubaa8\ub974\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ub97c expose headers \uc124\uc815\uc744 \ud1b5\ud574 \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nnginx \uc124\uc815\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud574 \uc8fc\uc5c8\ub2e4. \\n\\n```bash\\nadd_header \'Access-Control-Expose-Headers\' \'Location\'\\n```\\n\\n**\uc77d\uae30 \uc804\uc6a9 \ud2b8\ub79c\uc7ad\uc158** \\n\\n\ub2e8\uc21c \uc870\ud68c \uc694\uccad\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud5a5\uc0c1\uc2dc\ucf1c\uc900\ub2e4\ub294 \uac83\uc774\ub77c\uace0 \uac04\ub2e8\ud788\ub9cc \uc54c\uace0 \uc788\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0 \ucf54\uba58\ud2b8\uac00 \ub2ec\ub824\uc11c \uc870\uae08 \ub354 \uc790\uc138\ud788 \uacf5\ubd80\ud574 \ubcf4\uae30\ub85c \ud588\ub2e4. \\nTransactional(readOnly = true)\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc774 \ub3d9\uc791\ud55c\ub2e4.\\n\\nsetReadOnly(true) \uc124\uc815\uc774 \ub41c Connection\uc73c\ub85c \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ub97c \ud55c\ub2e4. \uc774 \uc124\uc815\uc744 \ud558\ub294 \uacbd\uc6b0 DB\ub9c8\ub2e4 \ub2e4\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4.\\n- h2\uc758 Connection \uad6c\ud604\uccb4\ub294 readOnly \uc124\uc815\uc744 \ubb34\uc2dc\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 Transactional \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4. \\n- MySQL 8.0(InnoDB \uc0ac\uc6a9 \uc2dc)\uc758 \uacbd\uc6b0 \uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc54c\ub824\uc9c4 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ud2b8\ub79c\uc7ad\uc158 ID\ub97c \uc124\uc815\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc870\ud68c \uc18d\ub3c4\uac00 \ub354 \ube68\ub77c\uc9c4\ub2e4.\\n\\nORM \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 prepareTransactionalConnection\ub97c \ud638\ucd9c\ud55c\ub2e4\uace0 \ud55c\ub2e4. \\n\ucd94\uac00\ub85c \ud604\uc5c5\uc5d0\uc11c\ub294 \uace0\uac00\uc6a9\uc131 \ub0b4\uacb0\ud568\uc131 \ub4f1\uc744 \uc704\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud558\uc5ec \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uace0, \uc774 \uacbd\uc6b0 readOnly \uc124\uc815\uc774 \ub418\uc5b4\uc788\ub2e4\uba74 \uc77d\uae30 \uc804\uc6a9 DB\ub85c \uc9c8\uc758\uac00 \ub4e4\uc5b4\uac00\uc11c \ubd80\ud558 \ubd84\uc0b0\uc758 \ud6a8\uacfc\uac00 \uc788\ub2e4\uace0 \ud55c\ub2e4. \\n\\n**DAO\uc5d0 `@Transactional` \uc801\uc6a9** \\n\\nDAO\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \ubcf4\ub294 \uac74 \uc5b4\ub5bb\uaca0\ub0d0\uace0 \ub9ac\ubdf0\uac00 \ub2ec\ub824\uc11c \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nService \uacc4\uce35\uc5d0 \uc774\ubbf8 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud574 \uc8fc\uace0 \uc788\uae30\uc5d0 \ud544\uc694 \uc5c6\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\nDAO\ub97c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574(\ud655\uc7a5\uc131 \uace0\ub824) `@Transactional`\uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4."},{"id":"29","metadata":{"permalink":"/29","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","source":"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx","title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","description":"\uac1c\uc694","date":"2023-06-01T00:00:00.000Z","formattedDate":"2023\ub144 6\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.005,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","slug":"29","tags":["TecoChat","Retrospective"]},"prevItem":{"title":"\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0","permalink":"/30"},"nextItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/28"}},"content":"### \uac1c\uc694\\n\\n\uc6d0\ub798 \ubaa9\uc801\uc778 `\ud06c\ub8e8\ub4e4\uc758 \ud559\uc2b5\uc5d0 \ub3c4\uc6c0`\uc744 \uc8fc\uae30 \uc704\ud574 \uc5b4\ub5a4 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub808\ubca8 2\uac00 \uac70\uc758 \ub05d\ub098\uac00\ub294 \uc2dc\uc810, \uadf8\ub3d9\uc548 \ud588\ub358 \uac83\uc744 \uc815\ub9ac\ud574 \ubcf4\ub824\uace0 \ud55c\ub2e4. \\n\\n### \ub098\uc758 \ucc44\ud305 \ud655\uc778\ud558\uace0 \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\nGPT\uc5d0\ub3c4 \uc788\ub294 \uae30\ub2a5\uc778\ub370, \ub0b4\uac00 \uc774\uc804\uc5d0 \ud588\ub358 \ucc44\ud305\uc744 \uc774\uc5b4\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\uc608\uc804\uc5d0 \uc5b4\ub5a4 \uc9c8\ubb38\uc744 \ub0a8\uacbc\ub294\uc9c0, \ub610\ud55c \ud574\ub2f9 \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub2e4. \\n\\n![chat1](./chat1.png)\\n\\n### \uc88b\uc544\uc694\uc640 \ub313\uae00 \uae30\ub2a5\\n\\n\ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc5d0 \ubc18\uc751\ud560 \uc218 \uc788\ub294 \ubb34\uc5b8\uac00\uac00 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\ub294 \uc758\uacac\ub4e4\uc774 \ub9ce\uc558\ub2e4. \\n\ub204\uac00 \uc88b\uc544\uc694\ub97c \ub20c\ub800\ub294\uc9c0, \uc5b4\ub5a4 \ucc44\ud305\uc774 \uc88b\uc544\uc694\ub97c \uac00\uc7a5 \ub9ce\uc774 \ubc1b\uc558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ub610\ud55c \ub313\uae00 \ucd94\uac00 \ubc0f \uc0ad\uc81c \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4.\\n\\n### \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\\n\\n\uc5b4\ub5bb\uac8c \ud0a4\uc6cc\ub4dc \ucd94\ucd9c\uc744 \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub294\ub370, \uc77c\ub2e8 GPT\ub97c \uc774\uc6a9\ud574\uc11c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\uae30\ub85c \ud588\ub2e4. \\n\ud574\ub2f9 \ubd80\ubd84\uc740 \uccab \uc9c8\ubb38\uc5d0 \ub300\ud55c \ud0a4\uc6cc\ub4dc\ub9cc \ucd94\ucd9c\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\ubc31\uc5d4\ub4dc\uc5d0\uc120 \ub9d0\ub791\uc774 \uc774\ubca4\ud2b8 \uc774\uc6a9\ud574\uc11c \uccab \ucc44\ud305 \uc694\uccad\uc774 \uc774\ub8e8\uc5b4\uc9c0\uba74, \ube44\ub3d9\uae30\ub85c \ud0a4\uc6cc\ub4dc\ub97c \ucd94\ucd9c\ud558\ub294 \uc9c8\ubb38\uc744 \ucd94\uac00\ub85c \ub0a0\ub9ac\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\nCSV \ud615\uc2dd\uc73c\ub85c GPT\uc5d0\uac8c \ub2f5\ubcc0\uc744 \uc785\ub825\ud574\ub2ec\ub77c\uace0 \uc694\uccad\ubc1b\ub294\ub370, \uc774 \ubd80\ubd84\uc774 \ubb38\uc81c(\ud504\ub86c\ud504\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ubd80\ubd84\uc774 \ubc18\ud658\ub41c\ub2e4.)\uac00 \uc880 \uc788\ub294 \uac83 \uac19\uc544\uc11c \uac1c\uc120\uc774 \ud544\uc694\ud55c \uac83 \uac19\ub2e4. \\n\\n![chat2](./chat2.png)\\n\\n### \ub2e4\ub978 \ud06c\ub8e8\uc758 \ucc44\ud305 \ubcf5\uc0ac\ud574\uc11c \uc774\uc5b4\ud558\ub294 \uae30\ub2a5\\n\\n\ub2e4\ub978 \ud06c\ub8e8\ub4e4\uc758 \ucc44\ud305\uc744 \uc77d\ub2e4\uac00 \uad81\uae08\ud55c \uc810\uc774 \uc788\ub2e4\uba74 \ubcf5\uc0ac\ud574\uc11c \ubc14\ub85c \uc9c8\ubb38\uc744 \ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\ub2e4. \\n\ucc44\ud305\uc774 \ubcf5\uc0ac\ub41c \ud6c4 \ubc14\ub85c GPT\uc640 \ub300\ud654\ub97c \ud560 \uc218 \uc788\ub294 \uba54\uc778 \ud654\uba74\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4. \\n\\n### \uc0ac\uc6a9\uc131 \uace0\ub824\ud558\uae30\\n\\n![chat3](./chat3.png)\\n\\n\uc704 \ud654\uba74\uc740 \ud68c\uc6d0\uac00\uc785 \ucc3d\uc774\ub2e4. \\n\uc0ac\uc2e4 \uac00\uc7a5 \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ud68c\uc6d0\uac00\uc785(\ub2c9\ub124\uc784\ub9cc \uc785\ub825\ud558\uc9c0\ub9cc)\ud560 \ub54c \uc775\uba85\uc744 \uc6d0\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uace0\ubbfc\uc744 \ub3c4\uc640\uc8fc\uac8c \ub054 \uc74c\uc2dd, \uacfc\uc77c, \uacfc\uc790 \ub4f1\uc758 \uc694\uc18c\ub4e4\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc720\ub3c4\ud588\ub2e4!\\n\ucd94\uac00\ub85c GPT\uc758 \ub2f5\ubcc0\uc774 \uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud654\uba74\uc744 \uc2a4\ud06c\ub864 \ud574\uc8fc\ub294 \uac83\uacfc \uac19\uc774 \uc0ac\uc6a9\uc131\uc744 \uac1c\uc120\ud574 \ubcf4\ub824\uace0 \ub178\ub825\ud588\uc9c0\ub9cc \uc27d\uc9c0 \uc54a\uc558\ub2e4. \\n\uc81c\uc77c \ud558\uace0 \uc2f6\uc740 \uac83\uc740 \uc2e4\uc81c GPT\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ucc98\ub7fc stream/text \uac12\uc744 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc740\ub370 \uc774 \ubd80\ubd84\uc740 \ubc29\ud559 \ub54c \uae30\ud68c\uac00 \ub418\uba74 \ub3c4\uc804\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\\n### \ud5a5\ud6c4 \uacc4\ud68d\\n\\n\uc2e4\uc81c \ud06c\ub8e8\ub4e4\uc774 \uc0ac\uc6a9\ud574 \uc8fc\ub294 \uc11c\ube44\uc2a4\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\ubcf4\uba74\uc11c \uc0ac\uc6a9\uc790\uc758 \uc785\uc7a5\uc5d0\uc11c \uace0\ubbfc\ub3c4 \ud558\uac8c \ub418\ub294 \uac83 \uac19\ub2e4. \\n\ud06c\ub8e8\ub4e4\uc774 \uc9c1\uc811 \uc0ac\uc6a9\ud574 \uc8fc\ub2c8\uae4c \ub108\ubb34 \uace0\ub9d9\uace0, \ud55c\ud3b8\uc73c\ub85c\ub294 \uc2e0\uae30\ud558\ub2e4. \\n\uc77c\ub2e8 \ubc29\ud559 \ub54c stream/text \uad00\ub828\ub41c \ubd80\ubd84 \ub3d9\uc791\ub418\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud558\uace0, \uadf8 \uc678\uc758 \ubd80\ubd84\uc740 \uc870\uae08 \ub354 \uace0\ubbfc\ud574\uc57c\ub420 \uac83 \uac19\ub2e4."},{"id":"28","metadata":{"permalink":"/28","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","source":"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx","title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","description":"\uc694\uad6c\uc0ac\ud56d","date":"2023-05-26T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 26\uc77c","tags":[{"label":"Pattern","permalink":"/tags/pattern"},{"label":"Composite","permalink":"/tags/composite"}],"readingTime":4.74,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","slug":"28","tags":["Pattern","Composite"]},"prevItem":{"title":"[\ud14c\ucf54\ucc57] 3. \uae30\ub2a5 \uad6c\ud604","permalink":"/29"},"nextItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/27"}},"content":"### \uc694\uad6c\uc0ac\ud56d\\n\\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.\\n\\n- \uac70\ub9ac\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \ub178\uc120\ubcc4 \ucd94\uac00 \uc694\uae08 \uc815\ucc45\\n- \uc5f0\ub839\ubcc4 \uc694\uae08 \ud560\uc778 \uc815\ucc45\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub85c \ud45c\ud604\ud560 \uc218 \uc788\ub2e4. \\n\uc694\uae08\uc744 \uacc4\uc0b0\ud558\ub294 \uba54\uc11c\ub4dc\ub294 \ucd5c\ub2e8 \uacbd\ub85c \uacc4\uc0b0\uc758 \uacb0\uacfc, \uc0ac\uc6a9\uc790\uc758 \uc815\ubcf4, \uc694\uae08\uc744 \ubc1b\uc544 \uc694\uae08\uc744 \uacc4\uc0b0\ud55c\ub2e4.\\n\\n```java\\npublic interface FarePolicy {\\n int calculate(Path path, Passenger passenger, int fare);\\n}\\n\\npublic class BaseFarePolicy implements FarePolicy { ... }\\npublic class DistanceFarePolicy implements FarePolicy { ... }\\npublic class AgeDiscountFarePolicy implements FarePolicy { ... }\\n```\\n\\n![composite1](./composite1.png)\\n\\n### \ubaa8\ub4e0 \uc694\uae08 \uc815\ucc45\uc744 \ud3ec\ud568\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc694\uae08 \uc815\ucc45 \ub9cc\ub4e4\uae30\\n\\n\ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub97c \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \\n\uc774 \ub610\ud55c FarePolicy\ub97c \uad6c\ud604\ud55c \ud615\ud0dc\uac00 \ub418\uace0, \ud544\ub4dc\ub85c\ub294 \ub098\uba38\uc9c0 \uad6c\ud604\uccb4\ub4e4\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n```java\\npublic class SubwayFarePolicy implements FarePolicy {\\n\\n private final List<FarePolicy> farePolicies;\\n\\n public SubwayFarePolicy(final List<FarePolicy> farePolicies) {\\n this.farePolicies = farePolicies;\\n }\\n\\n @Override\\n public int calculate(final Path path, final Passenger passenger, final int fare) {\\n int calculatedFare = fare;\\n for (FarePolicy farePolicy : farePolicies) {\\n calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);\\n }\\n return calculatedFare;\\n }\\n}\\n```\\n\\n\ub530\ub77c\uc11c \uadf8\ub9bc\uc73c\ub85c \ubcf8\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4.\\n\\n![composite2](./composite2.png)\\n\\n### \uc815\ucc45\uc758 \uc21c\uc11c\\n\\n\uc9c0\ud558\ucca0 \uc694\uad6c\uc0ac\ud56d\uc740 \uc21c\uc11c\uac00 \uc911\uc694\ud588\ub2e4. \\n\uae08\uc561\uc758 \ucd1d\ud569\uc744 \uad6c\ud558\uace0, \uadf8 \ud6c4\uc5d0 \ud560\uc778 \uc815\ucc45\uc774 \ub4e4\uc5b4\uac00\uc57c\ud588\ub2e4. \\n\ub530\ub77c\uc11c \uc790\uc2dd\ub4e4\uc758 \uc21c\uc11c\ub97c \uad00\ub9ac\ud560 \ub54c \uc8fc\uc758\ub97c \uae30\uc6b8\uc5ec\uc57c \ud588\ub2e4. \\nConfiguration \ud074\ub798\uc2a4\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uc21c\uc11c\ub97c \uc9c1\uc811 \uc801\uc6a9\uc2dc\ucf30\ub2e4. \\n\\n```java\\n@Configuration\\npublic class FareConfiguration {\\n\\n @Bean\\n public FarePolicy farePolicy() {\\n return new SubwayFarePolicy(List.of(\\n new BaseFarePolicy(),\\n new DistanceFarePolicy(),\\n new AgeDiscountFarePolicy()\\n ));\\n }\\n}\\n```\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc774\ub780?\\n\\n![composite3](./composite3.png)\\n\\nGOF\uc758 \ub514\uc790\uc778 \ud328\ud134 \ucc45\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n> \ubd80\ubd84\uacfc \uc804\uccb4\uc758 \uacc4\uce35\uc744 \ud45c\ud604\ud558\uae30 \uc704\ud574 \uac1d\uccb4\ub4e4\uc744 \ubaa8\uc544 \ud2b8\ub9ac \uad6c\uc870\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4. \\n\uc0ac\uc6a9\uc790\ub85c \ud558\uc5ec\uae08 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ubcf5\ud569 \uac1d\uccb4\ub97c \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c \ub2e4\ub8f0 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.\\n> \\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774 \ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uad6c\uc131\uc694\uc18c\\n\\nComponent\\n\\n- \uc9d1\ud569 \uad00\uacc4\uc5d0 \uc815\uc758\ub420 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4 \\n- ex) \uc694\uae08 \uc815\ucc45(FarePolicy) \\n\\nLeaf\\n\\n- \uac1c\ubcc4 \uac1d\uccb4, \uac1d\uccb4 \ud569\uc131\uc5d0 \uae30\ubcf8\uc774 \ub418\ub294 \uac1d\uccb4\uc758 \ud589\ub3d9 \\n- ex) \uac70\ub9ac \ubcc4 \uc694\uae08 \uc815\ucc45(DistanceFarePolicy) \\n\\nComposite\\n\\n- \uc5ec\ub7ec \uac1c\uc758 \uac1c\ubc1c \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\ub294 \ud569\uc131 \uac1d\uccb4 \\n- ex) \uc9c0\ud558\ucca0 \uc694\uae08 \uc815\ucc45(SubwayFarePolicy) \\n\\nClient\\n\\n- \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\\n\\n### \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc758 \uc0ac\uc6a9\uacfc \uc8fc\uc694 \ubaa9\ud45c\\n\\n\ubd80\ubd84 - \uc804\uccb4\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0 \uc2f6\uc744 \ub54c \\nClient \uae30\uc900\uc73c\ub85c Composite\uc640 Leaf\uc758 \ucc28\uc774\ub97c \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc798 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc57c\ub420 \ub54c\\n\\n### \ud328\ud134 \uc0ac\uc6a9\uc2dc \uc8fc\uc758\ud574\uc57c\ud560 \ubd80\ubd84\\n\\n\ud328\ud134\uc740 \uacf5\ud1b5\uc73c\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc758 \ud15c\ud50c\ub9bf\uc774\ub2e4. \\n\ubc18\ubcf5\ub418\ub294 \ubb38\uc81c\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc9c0\ub9cc \ud328\ud134\uc5d0 \ub9e4\ubab0\ub418\uc11c\ub294 \uc548\ub41c\ub2e4. \\n\ud328\ud134\uc744 \ub9f9\ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc11c\ub294 \uc548\ub418\uace0, \ud604\uc7ac\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ud328\ud134\uc744 \uc720\ub3d9\uc801\uc73c\ub85c \uc218\uc815\ud574\uac00\uba74\uc11c \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ud56d\uc0c1 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uc0dd\uac01\ud558\uc790!\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134, GoF\uc758 \ub514\uc790\uc778 \ud328\ud134 \\n\ub514\uc790\uc778 \ud328\ud134\uacfc \ud504\ub808\uc784\uc6cc\ud06c, \uc624\ube0c\uc81d\ud2b8"},{"id":"27","metadata":{"permalink":"/27","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","description":"\uc9c0\ud558\ucca0 \ubbf8\uc158","date":"2023-05-25T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 25\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.91,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","slug":"27","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30","permalink":"/28"},"nextItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/26"}},"content":"### \uc9c0\ud558\ucca0 \ubbf8\uc158\\n\\n\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4. \\n\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\nAPI\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4.\\n\\n**\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c**\\n\\n\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4.\\n\\n1. \uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95\\n2. \ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4. \\n\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654**\\n\\n\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4.\\n\\n**\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac**\\n\\n\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4. \\n\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4. \\n\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n:::note \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\\n\\n\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4. \\n\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n:::\\n\\n**\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131**\\n\\n\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4. \\n\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4. \\n\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4. \\n\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4.\\n\\n\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4.\\n\\n```java\\n@Nested\\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\\n\\n @Test\\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\\n // given\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", 5);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"2\ud638\uc120\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \uc624\ub978\ucabd, 5);\\n\\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0);\\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", 3);\\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad(\\"9\ud638\uc120\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\", \uc624\ub978\ucabd, 7);\\n\\n // when\\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\\n\\n // then\\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\\n \uc870\ud68c_\uacb0\uacfc,\\n \ub178\uc120_\uc815\ubcf4(\\"2\ud638\uc120\\", \\"\ucd08\ub85d\\", 0, \\"\uc7a0\uc2e4\\", \\"\uc7a0\uc2e4\uc0c8\ub0b4\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\"),\\n \ub178\uc120_\uc815\ubcf4(\\"9\ud638\uc120\\", \\"\uace0\ub3d9\\", 0, \\"\ubd09\uc740\uc0ac\\", \\"\uc885\ud569\uc6b4\ub3d9\uc7a5\\", \\"\uc0bc\uc804\\")\\n );\\n }\\n}\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc758\uacac \uc870\uc728\ud558\uae30**\\n\\n\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4. \\n\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30**\\n\\n\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4. \\n\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! \\n\\n**\ud3b8\ud55c \ubd84\uc704\uae30**\\n\\n\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4. \\n\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"},{"id":"26","metadata":{"permalink":"/26","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","source":"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx","title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","description":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.","date":"2023-05-24T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 24\uc77c","tags":[{"label":"DTO","permalink":"/tags/dto"}],"readingTime":7.525,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","slug":"26","tags":["DTO"]},"prevItem":{"title":"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0","permalink":"/27"},"nextItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/25"}},"content":"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4.\\n\\n### \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815\\n\\n![\uc911\ubcf51](./\uc911\ubcf51.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?\\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4.\\n\\n> `ProductSaveRequest`\uc640 `ProductUpdateRequest`\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e\\n> \\n\\n\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4.\\n\\n> \uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!\\n> \\n\\n### \uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5\\n\\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4.\\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n### \ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\\n\\n\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c? \\n\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c? \\n\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! \\n\\n### \uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc\\n\\n\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4. \\nController\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\\n\u251c\u2500\u2500 dto\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n![\uc911\ubcf52](./\uc911\ubcf52.png)\\n\\n### \uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf53](./\uc911\ubcf53.png)\\n\\n\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic interface ProductSaveRequest {\\n\\n String getName();\\n\\n String getImage();\\n\\n Long getPrice();\\n}\\n\\n// ProductService\\npublic Long save(final ProductSaveRequest request) {\\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\\n return productDao.saveAndGetId(product);\\n}\\n```\\n\\n### \uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30\\n\\n![\uc911\ubcf54](./\uc911\ubcf54.png)\\n\\n\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4. \\n\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n\u251c\u2500\u2500 controller\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\\n\u251c\u2500\u2500 service\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\\n```\\n\\n```java\\npublic class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\\n\\n @NotBlank(message = \\"\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n @Size(min = 1, max = 100, message = \\"\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final String name;\\n\\n @NotBlank(message = \\"\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\")\\n private final String image;\\n\\n @Range(message = \\"\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.\\")\\n private final long price;\\n\\n public ProductRequest(final String name, final String image, final long price) {\\n this.name = name;\\n this.image = image;\\n this.price = price;\\n }\\n\\n @Override\\n public String getName() {\\n return name;\\n }\\n\\n @Override\\n public String getImage() {\\n return image;\\n }\\n\\n @Override\\n public long getPrice() {\\n return price;\\n }\\n}\\n\\n// ProductController\\n@PostMapping(\\"/products\\")\\npublic ResponseEntity<Void> save(@Valid @RequestBody final ProductRequest request) {\\n final Long id = productService.save(request);\\n return ResponseEntity.created(URI.create(\\"/products/\\" + id)).build();\\n}\\n```\\n\\n### \uc815\ub9ac\\n\\n\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\\n1. Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.\\n2. \uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4.\\n3. \uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4. \\n\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n[https://techblog.woowahan.com/2647/](https://techblog.woowahan.com/2647/) \\n[https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/](https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/)"},{"id":"25","metadata":{"permalink":"/25","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","description":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158","date":"2023-05-12T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 12\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.78,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","slug":"25","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5","permalink":"/26"},"nextItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/24"}},"content":"### \uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4. \\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. \\nInterceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4. \\n\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5**\\n\\n\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. \\n\\n![dto1](./dto1.png)\\n\\n\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4. \\n\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. \\n\\n- \uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n- \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.\\n\\n\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4. \\n\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. \\n\\n![dto2](./dto2.png)\\n\\n**Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9**\\n\\n\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\n\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. \\n\\n\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4. \\n\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4. \\n\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uae30\ub85d**\\n\\n\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4. \\n\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4. \\n\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!\\n\\n**\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30**\\n\\n\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4. \\n\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"},{"id":"24","metadata":{"permalink":"/24","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","description":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158","date":"2023-05-02T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 2\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.535,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","slug":"24","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0","permalink":"/25"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/23"}},"content":"### \uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\\n\\n\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4. \\n\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4. \\n\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4. \\n\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4. \\n\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4. \\n\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. \\n\\n\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4. \\n\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4. \\n\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. \\n\\n\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 `\ub09c\uc774\ub3c4 \ub192\uc774\uae30`\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30**\\n\\n```java\\n@SuppressWarnings(\\"NonAsciiCharacters\\")\\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\\n@Transactional\\n@AutoConfigureMockMvc\\n@SpringBootTest\\npublic class RacingGameIntegrationTest {\\n```\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ube44\ubc84\uc758 \uc131\uaca9** \\n\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84** \\n\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4. \\n\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00? \\n\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n**\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815** \\n\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."},{"id":"23","metadata":{"permalink":"/23","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","source":"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx","title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","description":"\ud504\ub860\ud2b8\uc5d4\ud2b8","date":"2023-05-01T00:00:00.000Z","formattedDate":"2023\ub144 5\uc6d4 1\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":4.67,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","slug":"23","tags":["TecoChat","Retrospective"]},"prevItem":{"title":"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0","permalink":"/24"},"nextItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/22"}},"content":"### \ud504\ub860\ud2b8\uc5d4\ud2b8\\n\\n\ub2c9\ub124\uc784\uc744 \uc785\ub825\ud558\uc5ec \uac04\ub2e8\ud788 \ub85c\uadf8\uc778\ud558\ub294 \ud654\uba74, \ucc44\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\uace0 \ub2e8\uc77c \ucc44\ud305\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud654\uba74\ub3c4 \ub9cc\ub4e4\uc5c8\ub2e4. \\n\ucd94\uac00\ub85c \ucc44\ud305\uc744 \uc774\uc5b4\ub098\uac08 \uc218 \uc788\uac8c \ud558\ub294 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud588\ub2e4. \\n\uc790\uc798\ud558\uac8c \uc2e0\uacbd \uc4f8 \ubd80\ubd84\uc774 \ub9ce\uc544\uc11c, \ud504\ub860\ud2b8\uc5d4\ub4dc \ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\uc5ec\uc720\uac00 \ub41c\ub2e4\uba74 \uc790\uc2e0\uc758 \ucc44\ud305\uc744 \ubcfc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub098, \ucc44\ud305\uc744 \uc774\uc5b4\uc11c \ud560 \uc218 \uc788\ub294 \uae30\ub2a5, \ub313\uae00 \uae30\ub2a5\ub3c4 \ucd94\uac00\ud560 \uc608\uc815\uc774\ub2e4. \\n\\n### \ubc31\uc5d4\ub4dc\\n\\n\ucd5c\ub300\ud55c \ube68\ub9ac \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uae30\ub85c \uc815\ud574\uc11c, \ubc31\uc5d4\ub4dc\ub294 \ub9d0\ub791\uc774 \uc77c\ub2e8 \ub2e4 \ub9cc\ub4e4\uace0 \uc788\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c \ubd80\ubd84\uc774 \ub108\ubb34 \ub9ce\uc544\uc11c \ub0b4\uac00 \ubabb \ub530\ub77c\uac00\ub294 \uac83 \uac19\ub2e4. \\n\ub098\uc911\uc5d0 \ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc774\ud574\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Http Request Header\\n\\n\uc544\uc9c1 \uc778\uc99d\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ud558\uc9c0 \uc54a\uc544\uc11c \uc694\uccad \ud5e4\ub354\uc5d0 \uc774\ub984\uc744 \ubcf4\ub0b4\uae30\ub85c \ud588\ub2e4. \\n\ub9d0\ub791\uc774 \ud55c\uae00\uc740 \uc548\ub41c\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c Base64\ub85c \uc778\ucf54\ub529\ud558\uace0, \ubc31\uc5d4\ub4dc\uc5d0\uc11c \ub514\ucf54\ub529 \ud558\uc5ec \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc544\ub798\ub294 pinia\uc5d0 \uc788\ub294 name \uac12\uc744 \uc778\ucf54\ub529 \ud558\ub294 \ucf54\ub4dc\ub2e4. deprecated \ub418\uc5c8\ub2e4\ub294\ub370, \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc904 \ubab0\ub77c\uc11c \uc77c\ub2e8 \uc774\uac78 \uc0ac\uc6a9\ud588\ub2e4. \\n\\n```ts\\nconst encodedName = () => {\\n const uriComponent = unescape(encodeURIComponent(name.value));\\n return btoa(uriComponent);\\n};\\n```\\n\\n### Elastic Beanstalk\\n\\n\uac00\uc7a5 \ube60\ub974\uac8c \ubc31\uc5d4\ub4dc\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ubb58\uc9c0 \uace0\ubbfc\ud558\ub2e4\uac00 Elastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\ub2e4. \\nElastic Beanstalk\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\ud504\ub77c\uc5d0 \ub300\ud574 \uc798 \uc54c\uc9c0 \ubabb\ud574\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ube60\ub974\uac8c \ubc30\ud3ec\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4. \\n\ubaa8\ub2c8\ud130\ub9c1, \ub85c\uae45, \ub85c\ub4dc \ubc38\ub7f0\uc2f1 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \\n\\n### Elastic Beanstalk RDS \uc124\uc815 \ud6c4 \ubd84\ub9ac\\n\\n\ucd08\uae30 \uc124\uc815 \uc2dc RDS\ub97c \uc5f0\uacb0\ud558\uace0 \uc124\uc815 \uc644\ub8cc \ud6c4 \ubd84\ub9ac\ud55c\ub2e4\uba74, Beanstalk \uc778\uc2a4\ud134\uc2a4 -> RDS \uc694\uccad \uc2dc \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc744 \uc548 \ud574\ub3c4 \ub41c\ub2e4. \\nRDS \ubd84\ub9ac \uc2dc Beanstalk\uc5d0 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub294 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD\uc640 \uac19\uc740 \ud658\uacbd \ubcc0\uc218\uac00 \uac19\uc774 \uc81c\uac70\ub41c\ub2e4. \\n\ucd94\uac00\ub85c Elastic Beanstalk\ub85c RDS\ub97c \uc124\uc815\ud558\uba74 \uae30\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uba85\uc740 ebdb\ub2e4. \\n\\n### Elastic Beanstalk nginx \uc124\uc815\\n\\n\uc5c5\ub85c\ub4dc\ud558\ub294 zip \ud30c\uc77c \ub0b4\ubd80\uc5d0 `.platform/nginx/conf.d/` \uacbd\ub85c\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uba74 nginx \uc124\uc815\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### Jenkins\\n\\n\ubc31\uc5d4\ub4dc \ucf54\ub4dc\ub97c \uc77c\uc77c\ud788 \ubc30\ud3ec\ud558\uae30 \ubd88\ud3b8\ud574\uc11c Jenkins\ub97c \uc774\uc6a9\ud558\uc5ec Repository\uc5d0 \ucf54\ub4dc\ub97c push \ud560 \ub54c \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\uac00 \ub418\uac8c \uc124\uc815\ud558\uae30\ub85c \ud588\ub2e4. \\n\uc791\ub144\uc5d0 \ud655\uc778\ud588\uc744 \ub550 2022\ub144 12\uc6d4 31\uc77c\uae4c\uc9c0 EC2 ARM \uae30\ubc18 t4g.small\uc774 \ubb34\ub8cc\uc600\ub294\ub370, \ub2e4\uc2dc \ub4e4\uc5b4\uac00 \ubcf4\ub2c8 2023\ub144\uae4c\uc9c0 12\uc6d4 31\uc77c\uae4c\uc9c0 t4g.small\uc744 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub2e4. \\nt4g.small\uc740 \ub7a8\uc774 2G\uc778\ub370, \uc608\uc804\uc5d0\ub294 \ubd80\uc871\ud558\uc9c0 \uc54a\uc558\ub2e4\uace0 \uc0dd\uac01\ud588\ub294\ub370 Java 17\uc744 \uc368\uc11c \uadf8\ub7f0\uac00 \ube4c\ub4dc \ud560 \ub54c \ub7a8\uc774 \ub9ce\uc774 \ubd80\uc871\ud55c \uac83 \uac19\uc544\uc11c Swap \uba54\ubaa8\ub9ac 2\uae30\uac00\ub97c \ucd94\uac00\ub85c \uc124\uc815\ud588\ub2e4. \\n\ucd94\uac00\ub85c build.gradle\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8 \uc2dc \uc0ac\uc6a9\ud558\ub294 \ub7a8\uc744 \ub298\ub9b4 \uc218 \uc788\ub2e4. \uae30\ubcf8\uac12\uc740 512MB\ub77c\uace0 \ud55c\ub2e4. \\n\\n```groovy\\ntest {\\n maxHeapSize = \\"1024m\\"\\n}\\n```\\n\\n### Jenkins Blue Ocean\\n\\nBlue Ocean\uc740 Jenkins Pipeline\uc744 \uad6c\uc131\ud558\ub294 \ub370\uc5d0 \uc788\uc5b4 \ud3b8\ub9ac\ud558\uac8c \ud574\uc8fc\ub294 \ub3c4\uad6c\ub2e4. \\n\uc2dc\uac01\ud654\ub3c4 \uc798 \ub418\uc5b4\uc788\uace0, \uc124\uc815\ub3c4 \ud3b8\ub9ac\ud55c \uac83 \uac19\ub2e4. \\n\uc624\ub298 \uc801\uc6a9\ud574 \ubcf4\ub2c8 \ub7a8\uc774 \ubd80\uc871\ud558\uc5ec \uc911\uac04\uc5d0 \uc798 \uc548\ub418\uae30\ub3c4 \ud558\uace0 \uadf8\ub798\uc11c \uadf8\ub0e5 \\"Pipeline\ub9cc \uc0ac\uc6a9\ud560 \uac78 \uadf8\ub7ac\ub098?\\" \ub77c\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Elastic Beanstalk, AWS](https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html) \\n[EC2 AWS Graviton, AWS](https://aws.amazon.com/ko/ec2/graviton/) \\n[Default Memory Settings, AWS](https://docs.gradle.org/current/userguide/upgrading_version_4.html#rel5.0:default_memory_settings)"},{"id":"22","metadata":{"permalink":"/22","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","source":"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx","title":"Jenkins\ub85c CI/CD \uc124\uc815","description":"\uc124\uc815 \ud658\uacbd","date":"2023-04-30T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 30\uc77c","tags":[{"label":"Jenkins","permalink":"/tags/jenkins"},{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk"}],"readingTime":7.495,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","slug":"22","tags":["Jenkins","Elastic Beanstalk"]},"prevItem":{"title":"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec","permalink":"/23"},"nextItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/21"}},"content":"### \uc124\uc815 \ud658\uacbd\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc774\ubbf8\uc9c0: Amazon Linux 2023 AMI \\n\uc544\ud0a4\ud14d\uccd0: ARM \\n\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small \\n\ud658\uacbd \uad6c\uc131\uc774 \uc644\ub8cc\ub41c Elastic Beanstalk \\n\ub2e8\uc77c Spring Boot \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\ub294 Github Repository\\n\\n### \\\\[EC2 CLI\\\\] Swap \uba54\ubaa8\ub9ac \uc124\uc815\\n\\nt4g.small\uc774 \ub7a8\uc774 2G\uc778\ub370 \ub7a8\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\uaef4\uc838\uc11c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud588\ub2e4. \\n\uc544\ub798 \uba85\ub839\uc5b4\ub97c \ub530\ub77c swap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud558\uace0 free -h \uba85\ub839\uc5b4\ub97c \ud1b5\ud574 \uc798 \uc124\uc815\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n``` bash\\n# fallocate \uc774\uc6a9\ud558\uc5ec \uc2a4\uc651 \ud30c\uc77c \uc0dd\uc131\\nsudo fallocate -l 2G /swapfile\\n\\n# \uad8c\ud55c \uc124\uc815\\nsudo chmod 600 /swapfile\\n\\n# \ud30c\uc77c\uc744 Swap \ud3ec\ub9f7\uc73c\ub85c \ubcc0\uacbd \ud6c4 \uc2dc\uc2a4\ud15c\uc5d0 \ub4f1\ub85d\\nsudo mkswap /swapfile\\nsudo swapon /swapfile\\n\\n# Swap \uba54\ubaa8\ub9ac \ubd80\ud305\uc2dc \uc790\ub3d9\uc73c\ub85c \ub9c8\uc6b4\ud2b8\ud558\ub3c4\ub85d \uc801\uc6a9\\n# \ucd5c\ud558\ub2e8\uc5d0 \ub2e4\uc74c \uad6c\ubb38 \uc124\uc815 -> /swapfile swap swap defaults 0 0\\nsudo vim /etc/fstab\\n```\\n\\n\\n### \\\\[EC2 CLI\\\\] jenkins \uc124\uce58\\n\\n```bash\\nsudo wget -O /etc/yum.repos.d/jenkins.repo \\\\\\n https://pkg.jenkins.io/redhat-stable/jenkins.repo\\nsudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key\\nsudo yum upgrade\\nsudo yum install java-17-amazon-corretto-devel\\nsudo yum install jenkins\\nsudo systemctl daemon-reload\\n```\\n\\n[Jenkins \uacf5\uc2dd \ud648\ud398\uc774\uc9c0](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \ub97c \ucc38\uace0\ud558\uc5ec \uc124\uce58\ud558\ub294 \uac8c \uc88b\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] Jenkins \uc2dc\uc791\\n\\n```bash\\nsudo systemctl enable jenkins\\nsudo systemctl start jenkins\\n```\\n\\nenable\ub85c \uc124\uc815\ud558\uc5ec \ubd80\ud305\uc2dc \uc790\ub3d9\uc2dc\uc791 \ub418\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx & git \uc124\uce58\\n\\n```bash\\nsudo yum install nginx\\nsudo systemctl enable nginx\\nsudo systemctl start nginx\\n\\nsudo yum install git\\n```\\n\\nnginx\uc640 \ucf54\ub4dc\ub97c \ubd88\ub7ec\uc62c \ub54c \uc0ac\uc6a9\ud560 git\uc744 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[EC2 CLI\\\\] nginx \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc \uc124\uc815\\n\\n\uc544\ub798 \uc124\uc815 \ud30c\uc77c\uc740 \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0\uc11c \uc548\ub0b4\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815 \ud30c\uc77c\uc774\ub2e4.\\n\\n```bash\\nupstream jenkins {\\n keepalive 32; # keepalive connections\\n server 127.0.0.1:8080; # jenkins ip and port\\n}\\n\\n# Required for Jenkins websocket agents\\nmap $http_upgrade $connection_upgrade {\\n default upgrade;\\n \'\' close;\\n}\\n\\nserver {\\n listen 80; # Listen on port 80 for IPv4 requests\\n\\n server_name jenkins.example.com; # replace \'jenkins.example.com\' with your server domain name\\n\\n # this is the jenkins web root directory\\n # (mentioned in the output of \\"systemctl cat jenkins\\")\\n root /var/run/jenkins/war/;\\n\\n access_log /var/log/nginx/jenkins.access.log;\\n error_log /var/log/nginx/jenkins.error.log;\\n\\n # pass through headers from Jenkins that Nginx considers invalid\\n ignore_invalid_headers off;\\n\\n location ~ \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)$\\" {\\n # rewrite all static files into requests to the root\\n # E.g /static/12345678/css/something.css will become /css/something.css\\n rewrite \\"^/static/[0-9a-fA-F]{8}\\\\/(.*)\\" /$1 last;\\n }\\n\\n location /userContent {\\n # have nginx handle all the static requests to userContent folder\\n # note : This is the $JENKINS_HOME dir\\n root /var/lib/jenkins/;\\n if (!-f $request_filename){\\n # this file does not exist, might be a directory or a /**view** url\\n rewrite (.*) /$1 last;\\n break;\\n }\\n sendfile on;\\n }\\n\\n location / {\\n sendfile off;\\n proxy_pass http://jenkins;\\n proxy_redirect default;\\n proxy_http_version 1.1;\\n\\n # Required for Jenkins websocket agents\\n proxy_set_header Connection $connection_upgrade;\\n proxy_set_header Upgrade $http_upgrade;\\n\\n proxy_set_header Host $host;\\n proxy_set_header X-Real-IP $remote_addr;\\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\\n proxy_set_header X-Forwarded-Proto $scheme;\\n proxy_max_temp_file_size 0;\\n\\n #this is the maximum upload size\\n client_max_body_size 10m;\\n client_body_buffer_size 128k;\\n\\n proxy_connect_timeout 90;\\n proxy_send_timeout 90;\\n proxy_read_timeout 90;\\n proxy_buffering off;\\n proxy_request_buffering off; # Required for HTTP CLI commands\\n proxy_set_header Connection \\"\\"; # Clear for keepalive\\n }\\n\\n}\\n```\\n\\nJenkins\ub294 8080 \ud3ec\ud2b8\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubc84\uc2a4 \ud504\ub85d\uc2dc\ub97c \uc124\uc815\ud574\uc900\ub2e4. \\n`/etc/nginx/conf.d`\xa0\uc544\ub798\xa0`default.conf`\xa0\ud30c\uc77c\uc744 \ud558\ub098 \uc0dd\uc131\ud558\uace0 \uc704\uc640 \uac19\uc774 \uc785\ub825\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4. \\nnginx\uc758 \uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\uc5d0 \uc874\uc7ac\ud558\ub294\xa0`include /etc/nginx/conf.d/*.conf;`\xa0\uc124\uc815 \ub54c\ubb38\uc5d0\xa0`.conf`\xa0\ub85c \ub05d\ub09c\ub2e4\uba74 \uc124\uc815\uc774 \uc801\uc6a9\ub41c\ub2e4. \\n\uc124\uc815 \ud6c4\xa0`sudo nginx -t`\ub85c \uc124\uc815\ud30c\uc77c\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud558\uace0,\xa0`sudo systemctl restart nginx`\xa0\uba85\ub839\uc5b4\ub85c nginx\ub97c \uc7ac\uc2dc\uc791\ud55c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins \uc811\uc18d\\n\\nJenkins\ub97c \uc124\uce58\ud55c EC2 \uc778\uc2a4\ud134\uc2a4 \uc778\ubc14\uc6b4\ub4dc \uc124\uc815\uc5d0 80\ubc88 \ud3ec\ud2b8\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\nEC2\uc758 \uc544\uc774\ud53c \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \ub4e4\uc5b4\uac00\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\ub77c\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4.\\n\\n![jenkins-start](./jenkins-start.png)\\n\\n\ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c \ud558\ub294\ub370 `sudo cat /var/lib/jenkins/secrets/initialAdminPasswor` \ub97c \uc785\ub825\ud574 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4. \\n\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uc815 \ucc3d\uc774 \ub098\uc62c\ud150\ub370 `install suggested plugins`\uc744 \ud074\ub9ad\ud558\uc5ec Jenkins\uac00 \ucd94\ucc9c\ud558\ub294 \uae30\ubcf8 \ud50c\ub7ec\uadf8\uc778\ub4e4\uc744 \uc124\uce58\ud558\uba74 \ub41c\ub2e4. \\n\ud50c\ub7ec\uadf8\uc778\uc744 \uc124\uce58\ud558\uba74 \uacc4\uc815 \ubc0f \uc8fc\uc18c \uc124\uc815\uc744 \ud574\uc57c\ud558\ub294\ub370 \uc774\uac74 \ud3b8\ud558\uac8c \uc124\uc815\ud558\uba74 \ub41c\ub2e4. \\n\\n### \\\\[Jenkins\\\\] Jenkins Blue Ocean \uc124\uce58\\n\\nJenkins \uad00\ub9ac \u2192 Plugin Manager\uc5d0\uc11c Blue Ocean\uc744 \uac80\uc0c9\ud574 \uc124\uce58\ud55c\ub2e4.\\n\\n### \\\\[AWS IAM & EC2\\\\] IAM\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4 \uad8c\ud55c \uc124\uc815\ud558\uae30\\n\\nS3\uc640 Elastic Beanstalk\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub824\uba74 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk \ub450 \uac1c\uc758 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uc5ed\ud560\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4. \\nIAM\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ed\ud560\uc744 \ud558\ub098 \uc0c8\ub85c \uc0dd\uc131\ud55c\ub2e4.\\n\\n1. \uc5d4\ud130\ud2f0 \uc120\ud0dd\\n\\n![aws-iam1](./aws-iam1.png)\\n\\n2. \uad8c\ud55c \ucd94\uac00\\n\\n![aws-iam2](./aws-iam2.png)\\n\\n3. \uc774\ub984 \uc9c0\uc815, \uac80\ud1a0 \ubc0f \uc0dd\uc131\\n\\n![aws-iam3](./aws-iam3.png)\\n\\n4. \uc0dd\uc131\ud55c IAM EC2 Jenkins \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud558\uace0, \uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc744 \ub20c\ub7ec Role \uc124\uc815\\n\\n![aws-iam4](./aws-iam4.png)\\n\\n### \\\\[AWS S3\\\\] Jar \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc \ud560 S3 \ubc84\ud0b7 \uc0dd\uc131\\n\\n\ubc84\ud0b7\uc744 \uc0dd\uc131\ud560 \ub54c \ub2e4\uc74c \uc124\uc815\uc744 \uc81c\uc678\ud558\uace0 \ubaa8\ub450 \ucc28\ub2e8 \ud65c\uc131\ud654\ub97c \ud574\uc900\ub2e4.\\n\\n- `\uc0c8 ACL(\uc561\uc138\uc2a4 \uc81c\uc5b4 \ubaa9\ub85d)\uc744 \ud1b5\ud574 \ubd80\uc5ec\ub41c \ubc84\ud0b7 \ubc0f \uac1d\uccb4\uc5d0 \ub300\ud55c \ud37c\ube14\ub9ad \uc561\uc138\uc2a4 \ucc28\ub2e8`\\n\\n![aws-s3](./aws-s3.png)\\n\\n### \\\\[Github\\\\] Blue Ocean\uc5d0\uc11c \ud30c\uc774\ud504\ub77c\uc778 \uc0dd\uc131\uc5d0 \ud544\uc694\ud55c Github Token \uc0dd\uc131\\n\\nrepo, user:email \uad8c\ud55c\uc774 \uc788\ub294 \ud1a0\ud070\uc774 \ud544\uc694\ud558\ub2e4. \\n\\n### \\\\[Jenkins\\\\] \ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\\n\\n![jenkins-blue-ocean1](./jenkins-blue-ocean1.png)\\n\\n\ube14\ub8e8 \uc624\uc158 \uc5f4\uae30\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc0dd\uc131\ud55c\ub2e4. \\n\ud1a0\ud070 \uc785\ub825 \u2192 \uc870\uc9c1 \uc120\ud0dd \u2192 CI/CD \uc124\uc815\ud560 Repository \uc120\ud0dd\uc744 \ud558\uba74 \ud30c\uc774\ud504\ub77c\uc778 \ucc3d\uc73c\ub85c \ub118\uc5b4\uac04\ub2e4. \\nJenkinsfile\uc744 \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \uc124\uc815\ud558\uae30 \uc704\ud574 \uac04\ub2e8\ud558\uac8c print \ud558\ub098 \ucd9c\ub825\ud558\ub294 \uac83\uc73c\ub85c \uc124\uc815\ud588\ub2e4. \\n\\n![jenkins-blue-ocean2](./jenkins-blue-ocean2.png)\\n\\n\ud30c\uc774\ud504\ub77c\uc778\uc774 \uc2e4\ud589\ub420 \ud150\ub370 pipeline status\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \ucd08\ub85d\ubd88\uc774 \ub728\uba74 \ub41c\ub2e4.\\n\\n![jenkins-blue-ocean3](./jenkins-blue-ocean3.png)\\n\\n### \\\\[Github Repsoitory\\\\] Jenkinsfile \uc124\uc815\\n\\n\ube14\ub8e8 \uc624\uc158 \uc2dc\uc791\uc744 \ud1b5\ud574 \uc124\uc815\ud558\uba74 Jenkinsfile\uc774 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc9c0\uace0, \uc544\ub798\uc640 \uac19\uc774 \uc6d0\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n```bash\\npipeline {\\n agent any\\n stages {\\n stage(\'build and test\') {\\n steps {\\n sh \'/gradlew clean build\'\\n }\\n }\\n stage(\'zip\') {\\n steps {\\n sh \'mv ./build/libs/woowachat.jar .\'\\n sh \'zip -r woowachat.zip .platform delivery.jar Procfile\'\\n }\\n }\\n stage(\'upload\') {\\n steps {\\n sh \'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2\'\\n }\\n }\\n stage(\'deploy\') {\\n steps {\\n sh \'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket=\\"woowa-chat\\",S3Key=\\"woowachat.zip\\"\'\\n sh \'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}\'\\n }\\n }\\n }\\n}\\n```\\n\\n### \\\\[Github\\\\] Webhooks \uc124\uc815\\n\\n![github-hook](./github-hook.png)\\n\\npush \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560 \ub54c `http://Jenkins\uc8fc\uc18c/github-webhook/` \ub85c post request\ub97c \ud558\ub3c4\ub85d \uc6f9\ud6c5\uc744 \uc124\uc815\ud55c\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n[Install Jenkins - CentOS, Jenkins](https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos) \\n[Nginx Reverse Proxy Configuration, Jenkins](https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/) \\n[Amazon Corretto 17 JDK Install, AWS](https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html) \\n[Amazon Linux 2023 packages, AWS](https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230419.html)"},{"id":"21","metadata":{"permalink":"/21","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx","title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","description":"4\uc6d4 21\uc77c \uae08\uc694\uc77c","date":"2023-04-22T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 22\uc77c","tags":[{"label":"TecoChat","permalink":"/tags/teco-chat"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.68,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","slug":"21","tags":["TecoChat","Retrospective"]},"prevItem":{"title":"Jenkins\ub85c CI/CD \uc124\uc815","permalink":"/22"},"nextItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/20"}},"content":"### 4\uc6d4 21\uc77c \uae08\uc694\uc77c\\n\\n\ub808\ubca8 2\ub97c \uc2dc\uc791\ud55c \ub4a4 \ub0b4\uac00 \ud559\uc2b5\uc5d0 \ub300\ud55c \ubc29\ud5a5\uc744 \uc783\uc5b4\ubc84\ub838\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4. \\n\ub808\ubca8 3, 4\uc5d0\uc11c \ub098\ub9cc\uc758 \uac15\uc810\uc744 \uac00\uc9c0\uace0 \uc2f6\uc5b4 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\ub2e8\uc21c\ud788 \uc2a4\ud504\ub9c1\uc744 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ud6a8\uc728\uc774 \ub9ce\uc774 \ub5a8\uc5b4\uc9c4\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uae00\uc4f0\uae30 \uc218\uc0c1\uc73c\ub85c \ubc1b\uc740 \ucfe0\ud3f0\uc744 \uc0ac\uc6a9\ud574 \ube0c\ub77c\uc6b4\uc5d0\uac8c \ucee4\ud53c\ucc57\uc744 \uc2e0\uccad\ud588\uace0, \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud574\ubcf4\ub77c\ub294 \ub2f5\uc744 \ubc1b\uc558\ub2e4. \\n\\n\ub098\ub294 \uc544\uc774\ub514\uc5b4\ub97c \ubabb\ub0b4\ub294 \ud3b8\uc778\ub370 \ube0c\ub77c\uc6b4\uc774 \uc544\uc774\ub514\uc5b4\uae4c\uc9c0 \ub358\uc838\uc8fc\uc168\ub2e4. \\n`Chat-GPT \uc11c\ube44\uc2a4\ub97c \ud06c\ub8e8\ub4e4\uc5d0\uac8c \uc81c\uacf5\ud558\uace0, \ud574\ub2f9 \ud06c\ub8e8\ub4e4\uc774 \uc9c8\ubb38\ud55c \ub0b4\uc6a9\uc744 \uacf5\uc720\ud560 \uc218 \uc788\ub294 \uac74 \uc5b4\ub5a4\uc9c0?` \\n\\n\uae30\uc220\uc774 \ubaa9\uc801\uc778 \uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4\ub294 \ub2f5\ubcc0\uc744 \ub4e4\uc5c8\uace0, \ud63c\uc790 \uc544\ub2c8\uba74 \ud398\uc5b4\ud560 \uc218 \uc788\uc744 \uc815\ub3c4\uc758 \uc778\uc6d0\uc73c\ub85c \uc9c4\ud589\ud558\uba74 \uc88b\uaca0\ub2e4\uace0 \ud558\uc168\ub2e4. \\n\ud504\ub860\ud2b8\ub791 \uac04\ub2e8\ud558\uac8c \ubc30\ud3ec\uae4c\uc9c0 \ud574\ubcf8 \uacbd\ud5d8\uc774 \uc788\uc5b4\uc11c \ud63c\uc790\ud574\ub3c4 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uc744 \uac83 \uac19\uc544\uc11c \ud63c\uc790 \ud558\uae30\ub85c \ub9c8\uc74c\uc744 \uba39\uc5c8\ub2e4. \\n\\n\uc774\uac74 \ubabb\ucc38\uc9c0\\n\\n### \ub3c4\uba54\uc778 \uad6c\uc785 \uc131\uacf5?\\n\\n\ucee4\ud53c\ucc57\uc774 \ub05d\ub098\uace0 \uc9d1\uc73c\ub85c \ub3cc\uc544\uac00\ub294 \uae38\uc5d0 \ubc14\ub85c \ub3c4\uba54\uc778\uc744 \uad6c\ub9e4\ud558\ub824\uace0 namecheap\uc5d0\uc11c \uc801\ub2f9\ud55c \ub3c4\uba54\uc778\uc774 \uc5c6\uc744\uae4c \uac80\uc0c9\uc744 \uacc4\uc18d\ud588\ub2e4. \\n\ub9c8\uce58 \uc5b4\ub9b4 \ub54c \ud588\ub358 \uac8c\uc784 \ub2c9\ub124\uc784 \uc815\ud558\ub294 \uac83\ucc98\ub7fc \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub838\ub2e4. \\ndev, io, chat \ub3c4\uba54\uc778\uc774 \ud6c4\ubcf4\uc600\uace0 \uc9d1 \uac00\ub294 \uae38\uc5d0 \uacb0\uc815\ub9cc \ud558\ub2e4\uac00 \uad6c\ub9e4\ud558\uc9c0 \ubabb\ud588\ub2e4.\\n\\n### \ub9d0\ub791\uc758 DM\\n\\n\uc9d1\uc5d0 \uac00\uc11c \ubc25\uc744 \uba39\uace0 \ub9d0\ub791\uc774\ub791 DM \ud558\ub2e4 \ud504\ub85c\uc81d\ud2b8\ub97c \uac19\uc774 \ud558\uc790\ub294 \uc774\uc57c\uae30\uac00 \ub098\uc654\ub2e4. \\n\uc6b0\ud14c\ucf54 \ucd5c\uace0 \uace0\uc218 \ub9d0\ub791\uc758 \uc694\uad6c\ub77c \uc218\ub77d\ud558\uc9c0 \uc54a\uc73c\uba74 \ud6c4\ud3ed\ud48d\uc744 \uac10\ub2f9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\\n\uc774\ub7f0\uc800\ub7f0 \ub300\ud654\ub97c \ub098\ub204\ub2e4\uac00 \ub09c \ube60\ub974\uac8c \ud504\ub85c\ud1a0\ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uace0 \uc2f6\uc5b4\uc11c \ud504\ub860\ud2b8\ub97c \uad6c\ud604\ud55c\ub2e4\uace0 \ud588\uace0, \ub9d0\ub791\uc740 GPT api\ub97c \uc870\uc0ac\ud558\uae30\ub85c \ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub3c4\uba54\uc778\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub97c \ud558\ub2e4\uac00 woowachat\uc774 \uc5b8\uae09\ub418\uc5c8\uace0, namecheap\uc5d0\uc11c chat \ub3c4\uba54\uc778\uc744 \uc0ac\uc6a9\ud55c woowa.chat\uc73c\ub85c \uad6c\ub9e4\ud588\ub2e4. \\n\uc774\ud6c4\uc5d0 teco.chat\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4!\\n\\n### \ub3c4\uba54\uc778 \uc124\uc815 \ubc0f \ubc30\ud3ec\\n\\n\ud1a0\uc694\uc77c\uc5d0 \uad6c\ub9e4\ud55c \ub3c4\uba54\uc778\uc744 CDN, \ubcf4\uc548 \ub4f1 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 Cloudflare\uc5d0 \ub3c4\uba54\uc778 \ub4f1\ub85d\uc744 \ud588\ub2e4. \\n\ub098\uc5d0\uac8c \uc775\uc219\ud55c Nuxt3\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud588\uace0, Cloudflare Pages\ub97c \uc774\uc6a9\ud558\uc5ec \ubc30\ud3ec\ud588\ub2e4. \\n\\n### GPT\\n\\n\ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud558\ub2c8 api limit\uc774 \uc788\uc5b4 \ubd84\ub2f9 3\ubc88\ubc16\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc77c\ub2e8 \ubc31\uc5d4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ubb34\ub8cc \ud06c\ub808\ub527\uc744 \uc0ac\uc6a9\ud560 \uc0dd\uac01\uc774\ub2e4. \\n\\n### Sonarcloud\\n\\n\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\ub85c Sonarcloud\ub97c \uc801\uc6a9\ud588\ub2e4. \\nSonarcloud\ub294 SonarQube\uc758 SaaS \ubc84\uc804\uc774\uace0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \ud3b8\ud558\ub2e4. \\n\uc608\uc804\uc5d0 Sonarcloud\ub97c \uc0ac\uc6a9\ud560 \ub550 \ubc84\ud2bc \uba87 \ubc88 \ub204\ub974\uba74 \uc801\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ubc14\ub85c github action\uc744 \uc0ac\uc6a9\ud558\ub77c\ub294 \uc548\ub0b4 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud588\ub2e4. \\nSonarcloud\uac00 \uc790\uccb4\uc801\uc73c\ub85c github repository\uc5d0 push \ud558\uba74 \uc815\uc801 \ubd84\uc11d\uc744 \ud574\uc8fc\ub294 \uae30\ub2a5\uc744 \uc6d0\ud588\uace0, Administration -> Analysis Method\uc5d0 Automatic Analysis\ub97c \uc124\uc815\ud558\ub2c8 \ub418\uc5c8\ub2e4. \\n\ub108\ubb34 \uaf41\uaf41 \uc228\uaca8\uc838\uc788\ub124\\n\\n### Tiptap\\n\\n\ucf54\ub4dc \ud558\uc774\ub77c\uc774\ud305 \uae30\ub2a5\uc744 \ub123\uace0 \uc2f6\uc5b4\uc11c Tiptap\uc744 \uc0ac\uc6a9\ud588\ub2e4. \\nTiptap\uc740 Headless WYSIWYG \uc5d0\ub514\ud130\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \uae30\ub2a5\uc5d0 \ud2b9\ud654\ub418\uc5b4\uc788\ub294 \uc5d0\ub514\ud130\ub2e4. \\n\uc544\uc9c1 Tiptap\uc774 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc0ac\uc6a9\ud558\uc9c0\ub294 \ubabb\ud558\uc9c0\ub9cc CodeBlockLowlight \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc \ube14\ub85d\uc744 \uc608\uc058\uac8c \ucd9c\ub825\ud560 \uc218 \uc788\uc5c8\ub2e4. \\napi \ubc18\ud658\uac12 \uadf8\ub300\ub85c tiptap\uc758 content\uc5d0 \uc124\uc815\ud588\ub354\ub2c8 \ucf54\ub4dc \ube14\ub85d\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc544\uc11c \ubc31 \ud2f1 3\uac1c\ub97c `<pre><code>`\ub85c \ubcc0\ud658\ud588\ub2e4. \\n\ucd94\uac00\ub85c \ub744\uc5b4\uc4f0\uae30\ub3c4 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc544\uc11c `\\\\n`\ub97c `<br>`\ud0dc\uadf8\ub85c \ubcc0\ud658\ud588\ub2e4. \\n\ubcc0\ud658\ud558\ub294 \ub85c\uc9c1\uc740 GPT\uc758 \ub3c4\uc6c0\uc744 \ub9ce\uc774 \ubc1b\uc558\ub2e4. \\n\\n```ts\\nconst replaceCodeFences = (input: String) => {\\n const codeFencesRegex = /```([\\\\w-]*)\\\\n([\\\\s\\\\S]*?)\\\\n```/g;\\n return input\\n .replace(codeFencesRegex, (match, p1, p2) => {\\n const languageClass = p1 ? ` class=\\"language-${p1}\\"` : \\"\\";\\n return `<pre><code${languageClass}>${p2}</code></pre>`;\\n })\\n .replace(/\\\\n/g, \\"<br>\\");\\n};\\n```\\n\\nTiptap\uc744 \uc801\uc6a9\ud558\ub2c8 \ub2e4\uc74c\uacfc \uac19\uc774 \uae54\ub054\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \ubcfc \uc218 \uc788\uc5c8\ub2e4. \\n\\n![tecochat](./teco-chat.png)\\n\\n### \ud3f0\ud2b8 \ubc0f favicon \uc801\uc6a9\\n\\n\ud0c0\uc774\ud2c0\uc740 \ubc30\ub2ec\uc758\ubbfc\uc871 \ub3c4\ud604\uccb4, \ub0b4\uc6a9\uc740 IBM Plex Sans\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\ucd94\uac00\ub85c favicon\ub3c4 \uac04\ub2e8\ud558\uac8c \uc801\uc6a9\ud574\uc11c \ub9cc\uc871\uc2a4\ub7ec\uc6e0\ub2e4."},{"id":"20","metadata":{"permalink":"/20","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","source":"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx","title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","description":"\ucc45 \uc815\ubcf4","date":"2023-04-08T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 8\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.16,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","slug":"20","tags":["Book"]},"prevItem":{"title":"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30","permalink":"/21"},"nextItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/19"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c \\n> \uc544\ube48\uc800\uc5f0\uad6c\uc18c\\n> \\n\\n### \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\\n\\n\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. \\n- \uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 \\n- \uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704\\n\\n\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4. \\n\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. \\n\\n\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098 \\n\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4. \\n\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. \\n\\n\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4. \\n\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. \\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4. \\nR. D. \ub7ad \\np.19\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4. \\np.66\\n>\\n\\n> \ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4. \\n\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4. \\n\uc54c\ub7ad, \ud0c1\ub2db\ud55c \\np.103\\n>\\n\\n> \uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. \\n\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. \\n\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\np.175\\n> \\n\\n> \uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \\n\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0. \\np.188\\n> \\n\\n> \ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4. \\np.214\\n> \\n\\n> \ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. \\n\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4. \\np.224\\n>\\n\\n> \uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4. \\n\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. \\np.280\\n>"},{"id":"19","metadata":{"permalink":"/19","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-07T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 7\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"InnoDB","permalink":"/tags/inno-db"}],"readingTime":5.805,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"19","tags":["DataBase","Lock","InnoDB"]},"prevItem":{"title":"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c","permalink":"/20"},"nextItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/18"}},"content":"## InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08\uacfc \ubcc4\uac1c\ub85c \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub0b4\ubd80\uc5d0\uc11c \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ubcf4\ud1b5 \uba85\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \ub4dc\ubb3c\uace0, \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ubb35\uc2dc\uc801\uc73c\ub85c \uc7a0\uae08\uc774 \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n\ub3d9\uc2dc\uc131 \uc81c\uc5b4 \ubc29\uc2dd\uc5d0\ub294 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uacfc \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc774 \uc788\ub2e4. \\nInnoDB\ub294 \uae30\ubcf8\uc801\uc73c\ub85c MVCC(\ub2e4\uc911 \ubc84\uc804 \ub3d9\uc2dc\uc131 \uc81c\uc5b4)\ub97c \ud1b5\ud574 \ub099\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uace0 \ub77d\uc744 \ud1b5\ud574 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \ube44\uad00\uc801\uc778 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n:::note \ub099\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(OCC, Optimistic concurrency control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc11c\ub85c \ucda9\ub3cc\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\ub294 \ubc29\uc2dd \\n\\n:::\\n\\n:::note \ube44\uad00\uc801 \ub3d9\uc2dc\uc131 \uc81c\uc5b4(PCC, Pessimistic Concurrency Control)\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ucda9\ub3cc\ud558\ub294 \uac00\uc815\ud558\uc5d0 \uc7a0\uae08\uc744 \uac70\ub294 \ubc29\uc2dd \\n\uc77c\ubc18\uc801\uc73c\ub85c\xa0Shared Lock, Exclusive Lock\uc744 \ud1b5\ud574 \uc774\ub97c \uad6c\ud604\ud55c\ub2e4.\\n\\n:::\\n\\n### Shared & Exclusive Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704\uc758 \uc7a0\uae08\uc744 \uc218\ud589\ud560 \ub54c \uacf5\uc720 \uc7a0\uae08\uacfc \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\\n**\uacf5\uc720 \uc7a0\uae08(S, shared lock)**\\n\\n\ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \ub77d, \uc77d\uae30 \uc7a0\uae08(read lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uae30\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc4f0\uae30\ub294 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;`\\n\\n**\ubc30\ud0c0\uc801 \uc7a0\uae08(X, exclusive lock)** \\n\\n\ub370\uc774\ud130 \ubcc0\uacbd\uc744 \uc704\ud55c \ub77d, \uc4f0\uae30 \uc7a0\uae08(write lock)\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\ub77d\uc744 \uac74 \ud2b8\ub79c\uc7ad\uc158\ub9cc\uc774 \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \uc811\uadfc \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \uc77d\uae30, \uc4f0\uae30\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc608) `SELECT * FROM table_name WHERE id = 1 FOR UPDATE;`\\n\\n### Intention Locks\\n\\nInnoDB\ub294 \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uacfc \ud14c\uc774\ube14 \uc7a0\uae08\uc758 \uacf5\uc874\uc744 \uc704\ud574 \uc778\ud14d\uc158 \uc7a0\uae08\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \\n\ud14c\uc774\ube14\uc5d0 \uc788\ub294 \ub85c\uc6b0\uc5d0 \ub300\ud574\uc11c \ub098\uc911\uc5d0 \uc694\uccad\ub418\ub294 \uac83\uc774 \uc5b4\ub5a4 \ud615\ud0dc\uc758 \uc7a0\uae08\uc778\uc9c0 \uac00\ub9ac\ud0a4\uae30 \uc704\ud574 \uc0ac\uc6a9\ub41c\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uc6b0 \ub2e8\uc704 \uc7a0\uae08\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 \uc778\ud150\uc158 \uc7a0\uae08\uc744 \uba3c\uc800 \ud68d\ub4dd\ud55c\ub2e4. \\n\uc778\ud150\uc158 \ub77d\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n**\uc778\ud150\uc158 \uacf5\uc720 \uc7a0\uae08(IS, intention shared lock)**\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n**\uc778\ud150\uc158 \ubc30\ud0c0\uc801 \uc7a0\uae08(IX, intention exclusive lock)** \\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \ud14c\uc774\ube14\uc758 \uac1c\ubcc4 \ub85c\uc6b0\uc5d0 \ub300\ud55c \ubc30\ud0c0\uc801 \uc7a0\uae08\uc744 \uc218\ud589\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.\\n\\n** \uc7a0\uae08\uac04\uc758 \ud638\ud658\uc131 **\\n\\n| | X | IX | S | IS |\\n| --- | --- | --- | --- | --- |\\n| X | Conflict | Conflict | Conflict | Conflict |\\n| IX | Conflict | Compatible | Conflict | Compatible |\\n| S | Conflict | Conflict | Compatible | Compatible |\\n| IS | Conflict | Compatible | Compatible | Compatible |\\n\\n### Record Locks\\n\\n\ub808\ucf54\ub4dc \uc790\uccb4\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc740 \ub808\ucf54\ub4dc \uc790\uccb4\uac00 \uc544\ub2c8\ub77c \uc778\ub371\uc2a4\uc758 \ub808\ucf54\ub4dc\ub97c \uc7a0\uadfc\ub2e4. \\n\\n### Gap Locks\\n\\n\ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub808\ucf54\ub4dc\uc640 \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\uc5d0 \uc0c8\ub85c\uc6b4 \ub808\ucf54\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \uc81c\uc5b4\ud558\uace0, \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc758 \uc77c\ubd80\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### Next-Key Locks\\n\\n\ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4. \\n`REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ud32c\ud140 \ub9ac\ub4dc\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \uc7a0\uae08\uc774\ub2e4. \\n\\n### AUTO-INC Locks\\n\\n`AUTO_INCREMENT` \uce7c\ub9bc\uc774 \uc0ac\uc6a9\ub41c \ud14c\uc774\ube14\uc5d0 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \ub808\ucf54\ub4dc\uac00 `INSERT`\ub418\ub294 \uacbd\uc6b0, \uac01 \ub808\ucf54\ub4dc\ub294 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \uc800\uc7a5\ub41c \uc21c\uc11c\ub300\ub85c \uc99d\uac00\ud558\ub294 \uc77c\ub828\ubc88\ud638 \uac12\uc744 \uac00\uc838\uc57c \ud55c\ub2e4. \\nInnoDB \ub294 \ub0b4\ubd80\uc801\uc73c\ub85c AUTO-INC \ub77d\uc774\ub77c\uace0 \ud558\ub294 \ud14c\uc774\ube14 \uc218\uc900\uc758 \uc7a0\uae08\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uacfc \uad00\uacc4 \uc5c6\uc774 `INSERT`\ub098 `REPLACE` \ubb38\uc7a5\uc5d0\uc11c `AUTO_INCREMENT` \uac12\uc744 \uac00\uc838\uc624\ub294 \uc21c\uac04\ub9cc \ub77d\uc774 \uac78\ub838\ub2e4\uac00 \ud574\uc81c\ub41c\ub2e4.\\n\\n### \uc7a0\uae08 \uc608\uc2dc\\n\\n```sql\\n-- \ub808\ucf54\ub4dc\ub294 id \uae30\uc900 10, 20, 30, 40, 50\uc774 \uc788\ub2e4\uace0 \uac00\uc815\\n-- Record Locks: 10\uc5d0 \ub300\ud574 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id = 10 for update;\\n\\n-- Gap Locks: 51\ubd80\ud130 PositiveInfinity\uae4c\uc9c0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id > 100 for update;\\n\\n-- Next-Key Locks: 21\ubd80\ud130 30, 31\ubd80\ud130 40\uc5d0 \ub77d\uc774 \uac78\ub9b0\ub2e4.\\nSELECT * FROM table_name where id BETWEEN 25 AND 35 for update;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Optimistic and Pessimistic record locking, IBM](https://www.ibm.com/docs/en/rational-clearquest/9.0.0?topic=clearquest-optimistic-pessimistic-record-locking) \\n[MySQL Innodb Locks, cecil1018](https://cecil1018.wordpress.com/2016/06/18/mysql-innodb-locks/) \\n[MySQL 8.0 InnoDB Locks, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html) \\n[Locks Set by Different SQL Statements in InnoDB, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html)"},{"id":"18","metadata":{"permalink":"/18","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","source":"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx","title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","description":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","date":"2023-04-06T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 6\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Lock","permalink":"/tags/lock"},{"label":"MySQL","permalink":"/tags/my-sql"}],"readingTime":4.405,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","slug":"18","tags":["DataBase","Lock","MySQL"]},"prevItem":{"title":"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/19"},"nextItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/17"}},"content":"## MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08\\n\\nMySQL\uc5d0\uc11c\uc758 \ub77d\uc740 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4 \ub808\ubca8\uacfc, MySQL \uc5d4\uc9c4 \ub808\ubca8\ub85c \ub098\ub20c \uc218 \uc788\ub2e4. \\nMySQL \uc5d4\uc9c4 \ub808\ubca8\uc758 \uc7a0\uae08\uc740 \ubaa8\ub4e0 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce5c\ub2e4. \\n\\n### \uae00\ub85c\ubc8c \ub77d(Global lock)\\n\\nMySQL\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc7a0\uae08 \uc911 \uac00\uc7a5 \ub113\uc740 \ubc94\uc704\ub97c \uac00\uc9c0\uace0 \uc788\ub294 \uc7a0\uae08\uc774\ub2e4. \\n - \uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \ubc94\uc704\ub294 \ud574\ub2f9 \uc11c\ubc84 \uc804\uccb4\uc774\ub2e4.\\n - \uc791\uc5c5 \ub300\uc0c1 \ud14c\uc774\ube14, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0c1\uad00 \uc5c6\uc774 \ub3d9\uc77c\ud558\uac8c \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4.\\n\\n\ud55c \uc138\uc158\uc5d0\uc11c \uae00\ub85c\ubc8c \ub77d\uc744 \ud68d\ub4dd\ud558\uba74 \ud574\uc81c \ub420 \ub54c \uae4c\uc9c0 \uc870\ud68c\ub97c \uc81c\uc678\ud55c \ub300\ubd80\ubd84\uc758 \uba85\ub839\uc774 \ub300\uae30 \uc0c1\ud0dc\uac00 \ub41c\ub2e4. \\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc874\uc7ac\ud558\ub294 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub300\ud574 \uc77c\uad00\ub41c \ubc31\uc5c5\uc744 \ubc1b\uc544\uc57c\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\nInnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c\ub294 \ubc31\uc5c5 \uc2dc \uc870\uae08 \ub354 \uac00\ubcbc\uc6b4 \ubc31\uc5c5 \ub77d\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- GLOBAL LOCK\\nFLUSH TABLES WITH READ LOCK;\\n-- UNLOCK\\nUNLOCK TABLES;\\n\\n-- BACKUP LOCK\\nLOCK INSTANCE FOR BACKUP;\\n-- UNLOCK\\nUNLOCK INSTANCE;\\n```\\n\\n:::note MyISAM\\n\\nMySQL 5.5 \ubc84\uc804 \uc774\uc804\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uace0, SELECT \uc791\uc5c5 \uc18d\ub3c4\uac00 \ube60\ub974\ub2e4.\\n\\n:::\\n\\n### \ud14c\uc774\ube14 \ub77d(Table lock)\\n\\n\uac1c\ubcc4 \ud14c\uc774\ube14 \ub2e8\uc704\ub85c \uc124\uc815\ub418\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801 \ub610\ub294 \ubb35\uc2dc\uc801\uc73c\ub85c \ud2b9\uc815 \ud14c\uc774\ube14\uc758 \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4. \\n\ubb35\uc2dc\uc801 \ub77d\uc740 MyISAM\uc774\ub098 MEMORY \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uba74 \ubc1c\uc0dd\ud55c\ub2e4. \\nInnoDB \ud14c\uc774\ube14\uc5d0\ub294 DML \ucffc\ub9ac\ub294 \ubb34\uc2dc\ub418\uace0 DDL \uc77c \uacbd\uc6b0\uc5d0\ub9cc \ubb35\uc2dc\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud55c\ub2e4.\\n\\n```sql\\n-- TABLE LOCK\\nLOCK TABLES table_name [ READ | WRITE ]\\n\\n-- UNLOCK\\nUNLOCK TABLES;\\n```\\n\\n### \ub124\uc784\ub4dc \ub77d(Named lock)\\n\\n\uc784\uc758\uc758 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub294 \uc7a0\uae08\uc73c\ub85c \uc720\uc800 \ub808\ubca8 \ub77d\uc73c\ub85c\ub3c4 \ubd88\ub9b0\ub2e4. \\n\uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \ud504\ub85c\uc138\uc2a4\uac00 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub824\ub294 \uacbd\uc6b0, \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ubcf4\ud638\ud560 \uc218 \uc788\ub2e4. \\n\\n```sql\\n-- aGVyYg== \ub77c\ub294 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08 \ud68d\ub4dd, \uc774\ubbf8 \uc7a0\uae08\uc744 \uc0ac\uc6a9\uc911\uc778 \uacbd\uc6b0 1\ucd08 \ub3d9\uc548\ub9cc \ub300\uae30\\nSELECT GET_LOCK(\'aGVyYg==\', 1);\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc774 \uc124\uc815\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4.\\nSELECT IS_FREE_LOCK(\'aGVyYg==\');\\n\\n-- \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4.\\nSELECT RELEASE_LOCK(\'aGVyYg==\');\\n\\n-- \uc704 3\uac1c \ud568\uc218 \ubaa8\ub450 \uc815\uc0c1\uc801\uc73c\ub85c \ub77d\uc744 \ud68d\ub4dd\ud558\uac70\ub098 \ud574\uc81c\ud55c \uacbd\uc6b0\uc5d0 1\uc744, \uc544\ub2c8\uba74 0\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n-- \ubaa8\ub4e0 \ubb38\uc790\uc5f4\uc5d0 \ub300\ud55c \uc7a0\uae08\uc744 \ud574\uc81c\ud55c\ub2e4. \ud574\uc81c\ub41c \uc7a0\uae08\uc758 \uac1c\uc218\ub97c \ubc18\ud658\ud55c\ub2e4.\\nSELECT RELEASE_ALL_LOCKS();\\n```\\n\\n### \uba54\ud0c0\ub370\uc774\ud130 \ub77d(Metadata lock)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac1d\uccb4\uc758 \uc774\ub984\uc774\ub098 \uad6c\uc870\ub97c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \ud68d\ub4dd\ud558\ub294 \uc7a0\uae08\uc774\ub2e4. \\n\uba85\uc2dc\uc801\uc73c\ub85c \ud68d\ub4dd \ub610\ub294 \ud574\uc81c \ud560 \uc218 \uc5c6\uc9c0\ub9cc \ud14c\uc774\ube14\uc758 \uc774\ub984\uc744 \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ud14c\uc774\ube14\uc744 \ubc14\uafd4\uc57c\ud558\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4.\\n\\n```sql\\n-- \ubc30\uce58 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc784\uc2dc \ud14c\uc774\ube14\uc5d0 \uc11c\ube44\uc2a4\uc6a9 \ub7ad\ud0b9 \ub370\uc774\ud130 \uc0dd\uc131 \ud6c4 \uae30\uc874 \ud14c\uc774\ube14\uc744 \ubc31\uc5c5\ud558\ub294 \uacbd\uc6b0\\n-- \uc544\ub798 \uad6c\ubb38 \uc2e4\ud589 \uc2dc \uba54\ud0c0\ub370\uc774\ud130 \ub77d\uc744 \uc790\ub3d9\uc73c\ub85c \ud68d\ub4dd\ud55c\ub2e4.\\nRENAME TABLE rank TO rank_backup, rank_new TO rank;\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[MySQL\uc758 User Level Lock\ub97c \ud65c\uc6a9\ud55c\ub2e4\uba74?, gywndi](https://gywn.net/2013/12/mysql-user-level-lock/) \\n[Locking Functions, MySQL 5.7 Reference](https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html#function_release-all-locks) \\n[Locking Functions, MySQL 8.0 Reference](https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_release-all-locks)"},{"id":"17","metadata":{"permalink":"/17","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","source":"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx","title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","description":"\ud2b8\ub79c\uc7ad\uc158(Transaction)","date":"2023-04-05T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 5\uc77c","tags":[{"label":"DataBase","permalink":"/tags/data-base"},{"label":"Transaction","permalink":"/tags/transaction"},{"label":"Isolation","permalink":"/tags/isolation"}],"readingTime":9.68,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","slug":"17","tags":["DataBase","Transaction","Isolation"]},"prevItem":{"title":"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08","permalink":"/18"},"nextItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/16"}},"content":"## \ud2b8\ub79c\uc7ad\uc158(Transaction)\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4. \\n\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)\\n\\n\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4. \\n\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4. \\n\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4. \\n\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### \ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c) \\n\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\\n:::info \uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14\\n\\n\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. \\n\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \\n- \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)\\n- \ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)\\n\\n:::\\n\\n## \uaca9\ub9ac \uc218\uc900(Isolation level)\\n\\n\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4. \\n\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, `SERIALIZABLE`\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\n### READ UNCOMMITTED\\n\\n\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 `COMMIT`\uc774\ub098 `ROLLBACK` \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4. \\n\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c `READ COMMITTED` \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ UNCOMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: INSERT(Alice)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: COMMIT(Alice)\\n```\\n\\n### READ COMMITTED\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\n\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uba70, \uc628\ub77c\uc778 \uc11c\ube44\uc2a4\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc120\ud0dd\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\n`REPEATABLE READ`\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 `NON-REPEATABLE READ` \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: READ COMMITTED\\n---\\nsequenceDiagram\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n Alice->>Database: COMMIT\\n```\\n\\n### REPEATABLE READ\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 `COMMIT`\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4. \\nMySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4. \\nMVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4. \\n\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n - \ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4.\\n - Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4.\\n - Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4.\\n - `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. \\n\\nInnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. \\n\\n```mermaid\\n---\\ntitle: REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice(Undo log)\\n```\\n\\n:::note \uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)\\n\\n\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4. \\n\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.\\n\\n:::\\n\\n:::note MVCC(Multi Version Concurrency Control)\\n\\n\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4.\\n - PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4.\\n - Oracle, InnoDB\ub294 `Undo log`\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)\\n\\n\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.\\n\\n:::\\n\\n### SERIALIZABLE\\n\\n\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4. \\n\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4. \\nInnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 `REPEATABLE READ` \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. \\n\\n## \uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c\\n\\n\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n| \uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c | \ub354\ud2f0 \ub9ac\ub4dc | \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c | \ud32c\ud140 \ub9ac\ub4dc |\\n| --- | --- | --- | --- |\\n| READ UNCOMMITTED | O | O | O |\\n| READ COMMITTED | X | O | O |\\n| REPEATABLE READ | X | X | O(InnoDB\ub294 X) |\\n| SERIALIZABLE | X | X | X |\\n\\n### \ub354\ud2f0 \ub9ac\ub4dc(Dirty read)\\n\\n\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1 \\n\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4. \\n\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0\\n\\n### \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: NON REPEATABLE READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN\\n Bob->>Database: SELECT\\n Database->>+Bob: Alice\\n Alice->>Database: BEGIN\\n Alice->>Database: UPDATE(Alice to Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT\\n Database->>+Bob: Bob\\n```\\n\\n### \ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)\\n\\n\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1 \\n\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 \\n\\n```mermaid\\n---\\ntitle: PHANTOM READ\\n---\\nsequenceDiagram\\n participant Alice\\n participant Database\\n participant Bob\\n Bob->>Database: BEGIN(TRX-ID: 1)\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 1\\n Alice->>Database: BEGIN(TRX-ID: 2)\\n Alice->>Database: INSERT(Bob)\\n Alice->>Database: COMMIT\\n Bob->>Database: SELECT COUNT\\n Database->>+Bob: 2\\n```\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\nReal My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1 \\n[Isolation Level, MySQL](https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html)"},{"id":"16","metadata":{"permalink":"/16","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","source":"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx","title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","description":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?","date":"2023-04-04T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 4\uc77c","tags":[{"label":"Test","permalink":"/tags/test"},{"label":"Mock","permalink":"/tags/mock"}],"readingTime":4.52,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","slug":"16","tags":["Test","Mock"]},"prevItem":{"title":"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900","permalink":"/17"},"nextItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/15"}},"content":"### \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?\\n\\n\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4. \\nGerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4.\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. \\n\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870**\\n\\n```mermaid\\nflowchart LR\\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\\n Fake --\x3e TestDouble\\n```\\n\\n### \ub354\ubbf8(Dummy)\\n\\n\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4. \\n\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4. \\n\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n### \uc2a4\ud141(Stub)\\n\\n\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \\n\\n### \uc2a4\ud30c\uc774(Spy)\\n\\n\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4. \\n\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. \\n\\n### \ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)\\n\\n\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4. \\n\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\\n### \uac00\uc9dc(Fake)\\n\\nDOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4. \\n\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note DOC(depended-on component)\\n\\n\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4. \\n\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. \\n\\n:::\\n\\n### \uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84\\n\\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4. \\n\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. \\n\\n| TestDouble | Mock | Stub |\\n| --- | --- | --- |\\n| \ud3ec\ud568 \uc720\ud615 | \ubaa9, \uc2a4\ud30c\uc774 | \uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c |\\n| \uc6a9\ub3c4 | \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9 | \ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9 |\\n| \uc124\uba85 | SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9 | SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9\\n| \uc608\uc2dc | \uc774\uba54\uc77c \ubc1c\uc1a1 | \ub370\uc774\ud130 \uac80\uc0c9 |\\n\\n:::note SUT(system under test)\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c \\n\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1\\n\\n:::\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4 \\n\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504 \\n\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0 \\n[\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler](https://www.martinfowler.com/bliki/TestDouble.html) \\n[\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib](https://johngrib.github.io/wiki/test-terms/) \\n[Test Double, Gerard Meszaros](http://xunitpatterns.com/Test%20Double.html)"},{"id":"15","metadata":{"permalink":"/15","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","source":"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx","title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","description":"\ud074\ub798\uc2a4 \ud30c\uc77c","date":"2023-04-03T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 3\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Class","permalink":"/tags/class"}],"readingTime":5.63,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","slug":"15","tags":["Java","Class"]},"prevItem":{"title":"\ud14c\uc2a4\ud2b8 \ub300\uc5ed","permalink":"/16"},"nextItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/14"}},"content":"### \ud074\ub798\uc2a4 \ud30c\uc77c\\n\\n\uc790\ubc14 \uc18c\uc2a4\ucf54\ub4dc\uac00 \uc2e4\ud589\uc774 \ub418\ub824\uba74 \uc790\ubc14 \ucef4\ud30c\uc77c\ub7ec(javac)\ub97c \ud1b5\ud574 \uc18c\uc2a4\ucf54\ub4dc\ub97c \ud074\ub798\uc2a4\ud30c\uc77c\ub85c \ubcc0\ud658\ud574\uc57c \ud55c\ub2e4. \\n\ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4\ud30c\uc77c\uc740 \uc5b4\ub5a4 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\uc744\uae4c?\\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \ub370\uc774\ud130 \ud615\uc2dd\\n\\n8\ube44\ud2b8 \ubc14\uc774\ud2b8\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4. \\n16\ube44\ud2b8 \ubc0f 32\ube44\ud2b8\uc758 \ub370\uc774\ud130\ub294 \uac01\uac01 2\uac1c, 4\uac1c\uc758 \uc5f0\uc18d\ub41c 8\ube44\ud2b8\ub97c \uc77d\uc5b4\uc11c \uad6c\uc131\ub41c\ub2e4. \\n\uba40\ud2f0\ubc14\uc774\ud2b8\uc758 \uacbd\uc6b0 \ud56d\uc0c1 big endian \uc21c\uc11c\ub85c \uc800\uc7a5\ub41c\ub2e4. \\n\\nu1 \u2192 unsigned 1byte \\nu2 \u2192 unsigned 2byte \\nu4 \u2192 unsigned 4byte \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870\\n\\n```\\nClassFile {\\n u4 magic;\\n u2 minor_version;\\n u2 major_version;\\n u2 constant_pool_count;\\n cp_info constant_pool[constant_pool_count-1];\\n u2 access_flags;\\n u2 this_class;\\n u2 super_class;\\n u2 interfaces_count;\\n u2 interfaces[interfaces_count];\\n u2 fields_count;\\n field_info fields[fields_count];\\n u2 methods_count;\\n method_info methods[methods_count];\\n u2 attributes_count;\\n attribute_info attributes[attributes_count];\\n}\\n```\\n\\n### \ub9e4\uc9c1\ub118\ubc84\\n\\n\ubaa8\ub4e0 \ud074\ub798\uc2a4 \ud30c\uc77c\uc740 0xCAFEBABE\ub77c\ub294 \ub9e4\uc9c1\ub118\ubc84\ub85c \uc2dc\uc791\ud55c\ub2e4. \\n\ubcf4\ud1b5 \ub9e4\uc9c1\ub118\ubc84\ub294 \ud30c\uc77c \uc885\ub958\ub97c \uc2dd\ubcc4\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud3ec\ub9f7 \ubc84\uc804\\n\\n\ud074\ub798\uc2a4 \ud30c\uc77c \ubc84\uc804 \uac12\uc740 \ud074\ub798\uc2a4\ub85c\ub354\uc758 \ud638\ud658\uc131 \ubcf4\uc7a5\uc744 \uc704\ud574 \uaf2d \ud544\uc694\ud55c \uac12\uc774\ub2e4. \\n- Java 17 \ubc84\uc804\uc73c\ub85c \ube4c\ub4dc\ud55c\ub2e4\uba74 class version 61 ex) 00 00 00 3D\\n\\n\ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc84\uc804\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \ub85c\ub529\ud558\ub824\uace0 \ud558\ub294 \uacbd\uc6b0 \ub7f0\ud0c0\uc784\uc5d0 `UnsupportedClassVersionError` \uc608\uc678\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \\n\\n**class\xa0file format major versions**\\n\\n| Java SE | Released | Major | Supported majors |\\n| --- | --- | --- | --- |\\n| 8 | March 2014 | 52 | 45 .. 52 |\\n| 9 | September 2017 | 53 | 45 .. 53 |\\n| 10 | March 2018 | 54 | 45 .. 54 |\\n| 11 | September 2018 | 55 | 45 .. 55 |\\n| 12 | March 2019 | 56 | 45 .. 56 |\\n| 13 | September 2019 | 57 | 45 .. 57 |\\n| 14 | March 2020 | 58 | 45 .. 58 |\\n| 15 | September 2020 | 59 | 45 .. 59 |\\n| 16 | March 2021 | 60 | 45 .. 60 |\\n| 17 | September 2021 | 61 | 45 .. 61 |\\n\\n### \uc0c1\uc218 \ud480\\n\\n2\ubc14\uc774\ud2b8\uc758 \uc0c1\uc218\uc758 \uac1c\uc218\uac12\uc774 \uba3c\uc800\uc624\uace0 \uadf8 \ub4a4\ub85c \ucf54\ub4dc\uc5d0 \ub4f1\uc7a5\ud558\ub294 \uc0c1\uc218\uac12\uc774 \ubaa8\uc5ec\uc788\ub2e4. \\n\ud074\ub798\uc2a4\uba85, \uc0c1\uc218\uba85, \uc0c1\uc218 \uac12, \ud544\ub4dc\uba85, \uba54\uc11c\ub4dc\uba85\uacfc \uac19\uc740 \uac12\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4. \\nJVM\uc740 \ucf54\ub4dc \uc2e4\ud589 \uc2dc \ub7f0\ud0c0\uc784\uc5d0 \ubc30\uce58\ub41c \uba54\ubaa8\ub9ac\uac00 \uc544\ub2c8\ub77c, \ud574\ub2f9 \uc0c1\uc218 \ud480 \ud14c\uc774\ube14\uc744 \ucc3e\uc544\ubcf4\uace0 \ud544\uc694\ud55c \uac12\uc744 \ucc38\uc870\ud55c\ub2e4.\\n\\n### \uc561\uc138\uc2a4 \ud50c\ub798\uadf8\\n\\n\ud074\ub798\uc2a4, \uc778\ud130\ud398\uc774\uc2a4\uc640 \uac19\uc740 \ud30c\uc77c\uc758 \uc18d\uc131\uc744 \ud45c\uc2dc\ud55c\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 public interface\ub85c \uc815\uc758\ub41c \uc778\ud130\ud398\uc774\uc2a4\uc758 \ud50c\ub798\uadf8\ub294 0x0601\uc774\ub2e4. \\n- \uacc4\uc0b0\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ub8e8\uc5b4\uc9c4\ub2e4. `ACC_PUBLIC` xor `ACC_INTERFACE` xor `ACC_ABSTRACT`\\n\\n\uacf5\uc2dd\ubb38\uc11c\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uac01 \ud50c\ub798\uadf8\uc5d0 \ub300\ud55c \uc124\uba85 + \ud50c\ub798\uadf8 \uc124\uc815\uc2dc \ub3d9\uc2dc\uc5d0 \uc124\uc815\ub418\uba74 \uc548\ub418\ub294 \ud50c\ub798\uadf8\uc640 \uac19\uc740 \uc124\uba85\uc774 \uc790\uc138\ud558\uac8c \ub098\uc640\uc788\ub2e4.\\n\\n**Class access and property modifiers**\\n\\n| Flag Name | Value | Interpretation |\\n| --- | --- | --- |\\n| ACC_PUBLIC | 0x0001 | Declared\xa0public; may be accessed from outside its package. |\\n| ACC_FINAL | 0x0010 | Declared\xa0final; no subclasses allowed. |\\n| ACC_SUPER | 0x0020 | Treat superclass methods specially when invoked by the\xa0invokespecial\xa0instruction. |\\n| ACC_INTERFACE | 0x0200 | Is an interface, not a class. |\\n| ACC_ABSTRACT | 0x0400 | Declared\xa0abstract; must not be instantiated. |\\n| ACC_SYNTHETIC | 0x1000 | Declared synthetic; not present in the source code. |\\n| ACC_ANNOTATION | 0x2000 | Declared as an annotation type. |\\n| ACC_ENUM | 0x4000 | Declared as an\xa0enum\xa0type. |\\n| ACC_MODULE | 0x8000 | Is a module, not a class or interface. |\\n\\n### this_class\\n\\n\ud074\ub798\uc2a4\uba85\uacfc \uac19\uc740 \uc774\ub984\uc744 \ud45c\ud604\ud558\ub294 \uac12\uc73c\ub85c, \uc0c1\uc218 \ud480\uc5d0\uc11c \ud074\ub798\uc2a4\uba85\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\ud574\ub2f9 \uc778\ub371\uc2a4\uc758 \ud56d\ubaa9\uc740 `CONSTANT_Class_infoclass` \ud615\uc2dd\uc758 \uac12\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\\n### super_class\\n\\n\uc0c1\uc218 \ud480\uc5d0\uc11c \uc288\ud37c \ud074\ub798\uc2a4\uc758 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \ud56d\ubaa9\uc758 \uc778\ub371\uc2a4\ub97c \ucc38\uc870\ud55c\ub2e4. \\n\uc544\ubb34\uac83\ub3c4 \uc0c1\uc18d\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 `java.lang.Object`\uc758 \uc778\ub371\uc2a4 \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4.\\n\\n### interface, field, method\\n\\n\uac01\uac01\uc758 \uac1c\uc218\uc640, \uc815\ubcf4\uc5d0 \ub300\ud55c \uac12\uc774 \ub4e4\uc5b4\uc788\ub2e4. \\ninterface, field, method\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\ubc95\uc774 \uac01\uac01 \ub2e4\ub974\uace0, \uc811\uadfc\uc790\uc5d0 \ub300\ud55c \ud50c\ub798\uadf8\ub3c4 \uac01\uac01 \ub2e4\ub974\ub2e4.\\n\\n### attributes\\n\\n\ud574\ub2f9 \ud074\ub798\uc2a4 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucd94\uac00 \uc815\ubcf4\uc758 \ubaa8\uc74c\uc774\ub2e4. \uc608) \uc18c\uc2a4\ud30c\uc77c\uba85 \\n\uc815\ud574\uc9c4 \ud074\ub798\uc2a4 \ud30c\uc77c\uc758 \uad6c\uc870\ub97c \ud655\uc7a5\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \\n\\n### \ud074\ub798\uc2a4 \ud30c\uc77c \ud655\uc778\ud558\uba74\uc11c \uc0ac\uc6a9\ud55c \ud234\\n\\nIntelliJ plugin - BinEd \\nIntelliJ plugin - jclasslib Bytecode Viewer\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n2\uc7a5 JVM \uc774\uc57c\uae30, \uc790\ubc14 \ucd5c\uc801\ud654 \\n[Class file in Java, File Format](https://docs.fileformat.com/ko/programming/class/) \\n[java se11 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html) \\n[java se17 Class \ud30c\uc77c \ud615\uc2dd, Oracle](https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-4.html)"},{"id":"14","metadata":{"permalink":"/14","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","source":"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx","title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","description":"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.","date":"2023-04-02T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 2\uc77c","tags":[{"label":"JDBC","permalink":"/tags/jdbc"},{"label":"Java","permalink":"/tags/java"}],"readingTime":9.025,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","slug":"14","tags":["JDBC","Java"]},"prevItem":{"title":"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870","permalink":"/15"},"nextItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/13"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4. \\n\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. \\n\\n### \uae30\uc874 \ucf54\ub4dc\\n\\n<Tabs>\\n<TabItem value=\\"User\\" label=\\"User\\" default>\\n\\n```java\\npublic class User {\\n private final int id;\\n private final String name;\\n\\n public User(final int id, final String name) {\\n this.id = id;\\n this.name = name;\\n }\\n\\n public int getId() {\\n return id;\\n }\\n\\n public String getName() {\\n return name;\\n }\\n}\\n```\\n\\n</TabItem>\\n\\n<TabItem value=\\"UserDao\\" label=\\"UserDao\\">\\n\\n```java\\npublic class UserDao {\\n private final ConnectionPool connectionPool;\\n\\n public UserDao(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void insert(final String name) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setString(1, name);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public void delete(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"DELETE FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public User findById(final int userId) {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n preparedStatement.setInt(1, userId);\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n if (resultSet.next()) {\\n return new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n );\\n }\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n return null;\\n }\\n\\n public List<User> findAll() {\\n final Connection connection = connectionPool.getConnection();\\n final String query = \\"SELECT * FROM user\\";\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n final ResultSet resultSet = preparedStatement.executeQuery();\\n final List<User> result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(new User(\\n resultSet.getInt(\\"id\\"),\\n resultSet.getString(\\"name\\")\\n ));\\n }\\n return result;\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n</TabItem>\\n\\n<TabItem value=\\"ConnectionPool\\" label=\\"ConnectionPool\\">\\n\\n```java\\npublic class ConnectionPool {\\n private static final String SERVER = \\"localhost:13306\\";\\n private static final String DATABASE = \\"chess\\";\\n private static final String OPTION = \\"?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true\\";\\n private static final String URL = \\"jdbc:mysql://\\" + SERVER + \\"/\\" + DATABASE + OPTION;\\n private static final String USERNAME = \\"root\\";\\n private static final String PASSWORD = \\"root\\";\\n\\n private final AtomicInteger index = new AtomicInteger();\\n private final List<Connection> connections;\\n\\n public ConnectionPool(final int connectionCount) {\\n connections = generateConnections(connectionCount);\\n }\\n\\n private List<Connection> generateConnections(final int connectionCount) {\\n return Stream.generate(this::generateConnection)\\n .limit(connectionCount)\\n .collect(toList());\\n }\\n\\n private Connection generateConnection() {\\n try {\\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\\n } catch (SQLException e) {\\n throw new IllegalStateException(\\"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\\");\\n }\\n }\\n\\n public Connection getConnection() {\\n int currentIndex = index.getAndIncrement();\\n return connections.get(currentIndex % connections.size());\\n }\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n### SELECT, DELETE \uc911\ubcf5 \uc81c\uac70\\n\\n\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1 \\n\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 \\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n```java\\npublic void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n executeUpdate(query, name);\\n}\\n\\npublic void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n executeUpdate(query, userId);\\n}\\n\\nprivate void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758\\n\\n\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. \\n\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\\n:::note \ucf5c\ubc31(Callback)\\n\\n\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4. \\n\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n```mermaid\\nflowchart LR\\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31\\n```\\n\\n:::\\n\\n\\n\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4. \\nexecuteQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4. \\n\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. \\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper {\\n User mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c\\n\\n\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c? \\n\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. \\n\\n```java\\npublic User findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return queryForSingleResult(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n }, userId);\\n}\\n\\nprivate User queryForSingleResult(\\n final String query,\\n final RowMapper rowMapper,\\n final Object... parameters\\n) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return rowMapper.mapRow(resultSet);\\n }\\n return null;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c\\n\\n\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4.\\n\\n```java\\npublic List<User> findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return query(query, resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n });\\n}\\n\\nprivate List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List<User> result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n}\\n\\nprivate ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n}\\n```\\n\\n### \uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30\\n\\n\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \\n\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\n@FunctionalInterface\\npublic interface RowMapper<T> {\\n T mapRow(final ResultSet resultSet) throws SQLException;\\n}\\n\\nprivate <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\\nprivate <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\\n```\\n\\n### \uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30\\n\\n\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4. \\n\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4.\\n\\n<Tabs>\\n<TabItem value=\\"UserDao\\" label=\\"UserDao\\" default>\\n\\n```java\\npublic class UserDao {\\n private final RowMapper<User> rowMapper = resultSet -> {\\n final int id = resultSet.getInt(\\"id\\");\\n final String name = resultSet.getString(\\"name\\");\\n return new User(id, name);\\n };\\n private final JdbcTemplate jdbcTemplate;\\n\\n public UserDao(final JdbcTemplate jdbcTemplate) {\\n this.jdbcTemplate = jdbcTemplate;\\n }\\n\\n public void insert(final String name) {\\n final String query = \\"INSERT INTO User (name) VALUES (?)\\";\\n jdbcTemplate.executeUpdate(query, name);\\n }\\n\\n public void delete(final int userId) {\\n final String query = \\"DELETE FROM user WHERE user_id = ?\\";\\n jdbcTemplate.executeUpdate(query, userId);\\n }\\n\\n public Optional<User> findById(final int userId) {\\n final String query = \\"SELECT * FROM user WHERE id = ?\\";\\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\\n }\\n\\n public List<User> findAll() {\\n final String query = \\"SELECT * FROM user\\";\\n return jdbcTemplate.query(query, rowMapper);\\n }\\n}\\n```\\n\\n</TabItem>\\n<TabItem value=\\"JdbcTemplate\\" label=\\"JdbcTemplate\\" default>\\n\\n```java\\npublic class JdbcTemplate {\\n private final ConnectionPool connectionPool;\\n\\n public JdbcTemplate(final ConnectionPool connectionPool) {\\n this.connectionPool = connectionPool;\\n }\\n\\n public void executeUpdate(final String query, final Object... parameters) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n preparedStatement.executeUpdate();\\n } catch (final SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n public <T> Optional<T> queryForSingleResult(\\n final String query,\\n final RowMapper<T> rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n if (resultSet.next()) {\\n return Optional.of(rowMapper.mapRow(resultSet));\\n }\\n return Optional.empty();\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n\\n private ResultSet executeQuery(\\n final PreparedStatement preparedStatement,\\n final Object[] parameters\\n ) throws SQLException {\\n for (int i = 1; i <= parameters.length; i++) {\\n preparedStatement.setObject(i, parameters[i - 1]);\\n }\\n return preparedStatement.executeQuery();\\n }\\n\\n public <T> List<T> query(\\n final String query,\\n final RowMapper<T> rowMapper,\\n final Object... parameters\\n ) {\\n final Connection connection = connectionPool.getConnection();\\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\\n final List<T> result = new ArrayList<>();\\n while (resultSet.next()) {\\n result.add(rowMapper.mapRow(resultSet));\\n }\\n return result;\\n } catch (SQLException e) {\\n throw new IllegalArgumentException(e.getMessage());\\n }\\n }\\n}\\n```\\n\\n</TabItem>\\n</Tabs>"},{"id":"13","metadata":{"permalink":"/13","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx","title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","description":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4.","date":"2023-04-01T00:00:00.000Z","formattedDate":"2023\ub144 4\uc6d4 1\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.48,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","slug":"13","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30","permalink":"/14"},"nextItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/12"}},"content":"\ub808\ubca8 1\uc774 \ub05d\ub0ac\ub2e4. \\n\uc6b0\ud14c\ucf54\ub97c \uc2dc\uc791\ud558\uae30 \uc804 \ub0b4\uac00 \uc815\ud574\ub450\uc5c8\ub358 \ubaa9\ud45c \uc774\uc0c1\uc73c\ub85c \ub2ec\uc131\ud588\uae30 \ub54c\ubb38\uc5d0 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4. \\n\ud63c\uc790 \ub3c5\ud559\uc744 \ud560 \ub550 \uc774 \ubc29\ud5a5\uc73c\ub85c \uacf5\ubd80\ud558\ub294 \uac8c \ub9de\ub294\uc9c0 \uacc4\uc18d \ubc18\ucd94\ud558\ub2e4 \uacb0\uad6d \ubb34\uae30\ub825\ud568\uc5d0 \ube60\uc838\ub4e4\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uc774\uc81c\ub294 \uac19\uc774 \uacf5\ubd80\ud560 \uc0ac\ub78c\ub3c4 \uc788\uace0, \uc774\uc57c\uae30\ud560 \uc0ac\ub78c\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc990\uae30\ub294 \uc77c\ub9cc \ub0a8\uc740 \uac83 \uac19\ub2e4. \\n\\n### Keep\\n\\n**\ub098\ub9cc\uc758 \ub8e8\ud2f4 \ub9cc\ub4e4\uae30** \\n\\n\uc2a4\uc2a4\ub85c\uac00 \uc678\ubd80\uc758 \uc601\ud5a5\uc744 \ub9ce\uc774 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ucd5c\ub300\ud55c \uafb8\uc900\ud788 \ud560 \uc218 \uc788\ub294 \uc2dc\uac04\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\\n\ub9e4\uc77c 8\uc2dc\uc5d0 \ub3c4\ucc29\ud558\uc5ec \uc544\uce68\uc5d0 \ud574\uc57c \ud560 \uc77c\uc744 \uc815\ub9ac\ud558\uac70\ub098, \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud558\uace0 \\n\uc18c\ud654\ub2a5\ub825\uc774 \ubd80\uc871\ud558\uae30 \ub54c\ubb38\uc5d0 \uc810\uc2ec\uc740 \ub3c4\uc2dc\ub77d(\uadf8\ub798\ubd24\uc790 \uacc4\ub7802\uac1c)\uc744 \uc900\ube44\ud558\uace0 \\n\ud56d\uc0c1 \ub611\uac19\uc740 \ucee8\ub514\uc158\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud56d\uc0c1 6\uc2dc\uc5d0 \uc9d1\uc5d0 \uac04\ub2e4. \\n\uc774\uc81c \ubc14\ube60\uc9c8 \ud14c\ub2c8 \uc77c\ucc0d \uc9d1\uc5d0 \uac00\ub294 \uc77c\uc740 \uc5b4\uca54 \uc218 \uc5c6\uc774 \uc904\uc5b4\ub4e4\uaca0\uc9c0\ub9cc\ud83d\ude22 \\n\\n\uc120\ud0dd\ub3c4 \ube44\uc6a9\uc774\ub2e4. \uc55e\uc73c\ub85c \uc758\uc0ac\uacb0\uc815\uc774 \ud544\uc694 \uc5c6\ub294 \ubd80\ubd84\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\ub4e4\uc5b4\uc57c\uaca0\ub2e4. \\n\\n**\ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uae30** \\n\\n10\uba85 \uc815\ub3c4\uc758 \ud06c\ub8e8\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b0\uace0 \uce5c\ud558\uac8c \uc9c0\ub0b8\ub2e4\uba74 \uc131\uacf5\uc801\uc774\ub77c\uace0 \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \ub354 \ub9ce\uc740 \ud06c\ub8e8\ub4e4\uc758 \ub2c9\ub124\uc784\uc744 \uc678\uc6b4 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c\ub3c4 \ud06c\ub8e8\ub4e4\uacfc \uce5c\ud558\uac8c \uc9c0\ub0b4\uace0 \uc544\ubb34 \ub54c\ub098 \ub9d0\uc744 \uac78 \uc218 \uc788\ub294 \ud06c\ub8e8\uac00 \ub298\uc5b4\ub098\uae38 :) \\n\\n**\uae00\uc4f0\uae30** \\n\\n\uae00\uc744 \uc798 \uc4f0\ub294 \ud3b8\uc740 \uc544\ub2c8\uc9c0\ub9cc \uafb8\uc900\ud788 \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4. \\n\ub9e4 \ubbf8\uc158\ub9c8\ub2e4 \ud68c\uace0\ub97c \uc791\uc131\ud558\ub2c8 \uc0dd\uac01\ub3c4 \uc815\ub9ac\ub418\uace0 \uac1c\uc120\uc810\ub3c4 \ucc3e\uc744 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\ub2e4. \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\uc5d0\ub294 \ub808\ubca8\ub9c8\ub2e4 \uae00\uc4f0\uae30\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uc6b4\uc774 \uc88b\uac8c \uae00\uc4f0\uae30 \uc0c1\uc744 \ubc1b\uc558\ub2e4. \\n\uc0ac\uc2e4 \uac89\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uaf2d \ubc1b\uc544\ubcf4\uace0 \uc2f6\uc5c8\ub2e4. \\n\uae00\uc4f0\uae30 \uc870\uc6d0, \ud22c\ud45c\ud574 \uc900 \ud06c\ub8e8\ub4e4\uc5d0\uac8c \ub108\ubb34 \uac10\uc0ac\ud558\ub2e4. \\n\\n**\ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514** \\n\\n\ub204\ub204, \uc8fc\ub178, \ub2e4\uc990, \ub9d0\ub791, \ubc15\uc2a4\ud130, \uc624\uc789, \uae43\uc9f1\uc640 \ucf54\ub4dc \ub9ac\ubdf0 \uc2a4\ud130\ub514\ub97c \uc9c4\ud589\ud588\ub2e4. \\n\uacfc\uc5f0 \ub3c4\uc6c0\uc774 \ub420\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud558\uba74\uc11c \uc131\uc7a5\uc744 \ub9ce\uc774 \ud55c \uac83 \uac19\ub2e4. \\n\ud22c\uc790\ud55c \uc2dc\uac04 \ub300\ube44 \uac00\uc131\ube44\uac00 \uc88b\uc740 \ud65c\ub3d9\uc774\uc5c8\ub2e4. \\n\ub204\ub204\uac00 \uc2a4\ud130\ub514\uc7a5\uc778\ub370 \uacfc\uc5f0 \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00\ub824\ub098? \\n\\n**\ub808\ubca8 \uc778\ud130\ubdf0**\\n\\n\uc778\ud130\ubdf0\ud560 \ub54c \ub9ce\uc774 \ub5a8\uc9c0 \uc54a\uc544\uc11c \uc88b\uc558\ub2e4. \\n\ub0a8\ub4e4 \uc55e\uc5d0\uc11c \uc774\uc57c\uae30\ub97c \ud558\uac70\ub098, \uba74\uc811\uc744 \ubcf4\uba74 \ud56d\uc0c1 \uc5c4\uccad \ub5a8\uc5b4\uc11c \uac71\uc815\ud588\ub294\ub370 \\n\uae30\uc220\uc801\uc778 \uc9c8\ubb38\uc744 \ubc1b\uc558\uc744 \ub54c \ub5a8\uc9c0 \uc54a\uace0 \uc798 \ub300\ub2f5\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \ub2e4\ub978 \ud06c\ub8e8\uac00 \uc9c8\ubb38\ud588\uc744 \ub54c, \ucd5c\ub300\ud55c \uc774\ud574\ud558\uae30 \uc27d\uac8c \uc124\uba85\ud558\ub824\uace0 \ud588\ub358 \uacbd\ud5d8\uc774 \ub3c4\uc6c0\uc774 \ub41c \uac83 \uac19\ub2e4. \\n\uc774\ud6c4 \ub808\ubca8 \uc778\ud130\ubdf0\ub97c \uc9c4\ud589\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc740 \ubd80\ubd84\uc744 \uace0\ub824\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\ub2e4. \\n- \ub300\ub2f5\ud558\uba74\uc11c \uc9c8\ubb38\uc744 \uacc4\uc18d \uc0dd\uac01\ud558\uba70 \uc78a\uc5b4\ubc84\ub9ac\uc9c0 \ub9d0\uae30 \\n- \ub450\uad04\uc2dd \ud45c\ud604\\n- \uc124\uba85\ud558\ub2e4\uac00 \uc798\ubabb \uc124\uba85\ud55c \uac83 \uac19\uc73c\uba74 \ub2e4 \ub04a\uace0 \ub2e4\uc2dc \uc774\uc57c\uae30\ud574\ub3c4 \ub420\uc9c0 \ubb3c\uc5b4\ubcf4\uae30 \\n- \uc124\uba85\ud560 \uc218 \uc788\uc744\ub9cc\ud07c \uc2dc\uac04 \ucda9\ubd84\ud788 \uac00\uc9c0\uae30\\n- \uc778\ud130\ubdf0\uc5b4\uc758 \uc9c8\ubb38 \uc758\ub3c4\ub97c \uba85\ud655\ud788 \uc774\ud574\ud558\uc9c0 \ubabb\ud588\ub2e4\uba74 \uc758\ub3c4 \ub2e4\uc2dc \ubb3c\uc5b4\ubcf4\uae30\\n- \ub05d\ub9fa\ub294 \ubd80\ubd84 \uc5f0\uc2b5\ud558\uae30(\uc790\uc2e0\uac10 \uc788\uac8c)\\n- \uae30\uc220\uc801\uc778 \uc9d1\ucc29\uac00\uc9c0\uae30\\n- \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud788 \uc900\ube44\ud588\uc73c\uba74 \ud611\uc5c5 \uad00\ub828 \uc9c8\ubb38\ub3c4 \uc900\ube44\ud558\uae30\\n\\n### Problem\\n\\n**\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uac00\uc7a5 \uc5b4\ub824\uc6b4 \ud65c\ub3d9 \uc911 \ud558\ub098\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4. \\n\ud398\uc5b4\ub294 \ub9e4\ubc88 \ubc14\ub00c\uace0, \ubbf8\uc158\uc758 \ubcf5\uc7a1\ub3c4\ub3c4 \uc99d\uac00\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\ub2e4. \\n\uc18c\ud1b5 \ub2a5\ub825, \uc2dc\uac04\uad00\ub9ac\uac00 \ubd80\uc871\ud588\uace0, \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\uc558\ub2e4. \\n\ud558\uc9c0\ub9cc \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uace0, \ud68c\uace0\ub97c \ud558\ub2e4 \ubcf4\ub2c8 \ub098\ub9cc\uc758 \ub178\ud558\uc6b0\uac00 \uc313\uc774\ub294 \ub290\ub08c\uc774\ub2e4. \\n\ub808\ubca8 2\uc5d0\uc11c\ub294 \ubd80\uc871\ud588\ub358 \ubd80\ubd84\uc744 \uac1c\uc120\ud558\uc5ec \ud568\uaed8\ud558\uace0 \uc2f6\uc740 \ud398\uc5b4\uac00 \ub418\uace0 \uc2f6\ub2e4. \\n\\n**\uc9d1\uc911\ud558\ub294 \uc2dc\uac04\u23f1\ufe0f \ubd80\uc871** \\n\\n\ub808\ubca8 1\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc9d1\uc911\ud558\ub294 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud588\ub2e4. \\n\uc774\ub978 \uc544\uce68\uacfc \uc624\ud6c4\uc5d0 \uac1c\uc778\uc801\uc73c\ub85c \uc9d1\uc911\ud560 \uc218 \uc788\ub294 \uacf5\uac04\uc744 \uc608\uc57d\ud574\uc11c \uc628\uc804\ud788 \ub098\ub9cc\uc758 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### Try\\n\\n**\ud5c8\ube0c\ud83c\udf3f\uc640\uc758 \ud2f0\ud0c0\uc784?** \\n\\n\uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc744 \ub298\ub9b4 \ubc29\ubc95\uc744 \uc0dd\uac01\ud558\ub2e4\uac00 \ub300\ud654\ub97c \ub098\ub204\uc9c0 \ubabb\ud55c \ub2e4\ub978 \ud06c\ub8e8\ub4e4\uacfc \uae5c\uc9dd \ucee4\ud53c\ucc57\uc744 \ud558\uba74 \uc5b4\ub5a8\uae4c \uc0dd\uac01\ud588\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc7a1\ub2f4\ubc29\uc5d0 `\uc800\uc640 \ucee4\ud53c\ucc57 \ud558\uc2e4 \ubd84 :)` \ud558\uba74\uc11c \uc62c\ub9b4 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. \\n\ucc38\uc5ec\ud558\ub294 \uc0ac\ub78c\uc774 \uc788\uc744\uc9c0, \uc548 \uc88b\uac8c \ubcf4\ub294 \uac8c \uc544\ub2d0\uc9c0 \uac71\uc815\ub418\uc9c0\ub9cc \uadf8\ub798\ub3c4 \uc7ac\ubc0c\uc744 \uac83 \uac19\ub2e4. \\n\uc800\ub791 \ud5c8\ube0c\ud2f0 \ud55c\uc794 \ud558\uc2e4\ub798\uc694? \\n\\n**\uae30\uc220\uc801\uc778 \ubd80\ubd84** \\n\\n\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \uc0dd\ud65c\uc744 \ud558\uba74\uc11c \uc18c\ud504\ud2b8 \uc2a4\ud0ac\uc5d0 \uc870\uae08 \ub354 \ubb34\uac8c\ub97c \ub450\ub2e4 \ubcf4\ub2c8 \uc774\ub860\uc801\uc778 \ubd80\ubd84\uc774 \ubd80\uc871\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc2dc\uac04\uc758 \uc5ec\uc720\uac00 \ub420 \ub54c \ucc45\uc744 \uc870\uae08\uc529 \uc77d\uc5b4\uc57c\uaca0\ub2e4. \\n\ube14\ub85c\uadf8\uc5d0 \uae30\uc220\uc801\uc778 \ubd80\ubd84\uc744 \ub9ce\uc774 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc870\uae08 \ub354 \uae4a\uac8c \uacf5\ubd80\ud558\uace0 \uc815\ub9ac\ud558\ub294 \uc2dc\uac04\ub3c4 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \ub808\ubca8 1\uc744 \ub9c8\ubb34\ub9ac\ud558\uba70 \\n\\n\uc2dc\uac04\uc774 \ube60\ub974\uac8c \ud758\ub7ec\uac14\ub2e4. \\n\ud0c0\uc778\uc5d0\uac8c \uc88b\uc740 \uc601\ud5a5\uc744 \uc8fc\uae30\uc704\ud574, \ubc29\ud559\ub3d9\uc548 \ub098\ub97c \ucc59\uae30\ub294 \uc2dc\uac04\uc744 \uac00\uc838\uc57c\uaca0\ub2e4. \\n\ub610\ud55c \ud568\uaed8 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc744 \ubaa9\ud45c\ub85c \uc55e\uc73c\ub85c\ub3c4 \uafb8\uc900\ud788 \uc758\uc2dd\uc801 \ub178\ub825\uc744 \ud574\uc57c\uaca0\ub2e4."},{"id":"12","metadata":{"permalink":"/12","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","description":"\uccb4\uc2a4","date":"2023-03-31T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 31\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.63,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","slug":"12","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0","permalink":"/13"},"nextItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/11"}},"content":"### \uccb4\uc2a4\\n\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4! \\n\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4. \\n\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. \\n \\n\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n\\n**\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80** \\nRank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4. \\n\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4. \\n\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2) \\n\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4.\\n\\n**\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80** \\n\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4. \\n\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. \\n\\n**\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80** \\n\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. \\n\\n**\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9** \\n\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4. \\n\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n- \uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 \\n- \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 \\n\\n\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4. \\n\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \\n- \ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. \\n- \uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. \\n- \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. \\n\\n\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4. \\n\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac) \\n\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)\\n\\n\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d \\n\\n**\ubd80\uac00\uc801\uc778 \ubd80\ubd84**\\n\\n\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. \\n- \ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 \\n- ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac \\n- \uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) \\n\\n\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. \\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84** \\nDB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n**\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10** \\n\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4. \\n\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**DAO \uc911\ubcf5 \uc81c\uac70**\\n\\n\ud504\ub864\ub85c\uadf8\uc5d0 [\uae00](https://prolog.techcourse.co.kr/studylogs/2947)\uc744 \uc791\uc131\ud588\ub2e4. \\nDAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4. \\n\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc0dd\uac01\ud558\uae30** \\n\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! \\n\\n**\ubbf8\uc158 \ubab0\uc785\ud558\uae30** \\n\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4. \\n\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4. \\n\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4. \\n\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 \\n\\n**\uc194\uc9c1\ud568** \\n\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84 \\n\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. \\n\\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"},{"id":"11","metadata":{"permalink":"/11","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-30-GRASP.mdx","source":"@site/blog/2023/2023-03-30-GRASP.mdx","title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","description":"GRASP(General Responsibility Assignment Software Pattern)","date":"2023-03-30T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 30\uc77c","tags":[{"label":"GRASP","permalink":"/tags/grasp"},{"label":"OOP","permalink":"/tags/oop"}],"readingTime":8.085,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","slug":"11","tags":["GRASP","OOP"]},"prevItem":{"title":"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0","permalink":"/12"},"nextItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/10"}},"content":"### GRASP(General Responsibility Assignment Software Pattern)\\n\\n\ud06c\ub808\uc774\uadf8 \ub77c\ub9cc\uc758 Applying UML and Patterns\uc774\ub77c\ub294 \ucc45\uc5d0\uc11c \ub098\uc628 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134\\n\\n\uac01 \ud328\ud134\ub9c8\ub2e4 Solution\uacfc Problem\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4.\\n\\n### \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134(Information Expert)\\n\\nQ: \uac1d\uccb4\uc5d0 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uae30\ubcf8 \uc6d0\uce59\uc740 \ubb34\uc5c7\uc778\uac00?\\n\\nA: \ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub370 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \ud074\ub798\uc2a4(\uc815\ubcf4 \uc804\ubb38\uac00)\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uc815\ubcf4\uc640 \ud589\ub3d9\uc744 \uac00\uae4c\uc6b4 \uacf3\uc5d0 \uc704\uce58\uc2dc\ud0a4\uae30 \ub54c\ubb38\uc5d0 \ucea1\uc290\ud654\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud544\uc694\ud55c \uc815\ubcf4\ub97c \uac00\uc9c4 \uac1d\uccb4\ub4e4\ub85c \ucc45\uc784\uc774 \ubd84\uc0b0\ub41c\ub2e4.\\n\\n### \ucc3d\uc870\uc790 \ud328\ud134(Creator)\\n\\nQ: \ub204\uac00 \uac1d\uccb4 A\ub97c \uc0dd\uc131\ud558\ub294\uac00?\\n\\nA: \ub2e4\uc74c\uc758 \uc870\uac74\uc744 \ucd5c\ub300\ud55c \ub9ce\uc774 \ub9cc\uc871\ud558\ub294 \uac1d\uccb4\uc5d0\uac8c \uac1d\uccb4 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\uc758 \ucd08\uae30\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.\\n\\n\uc0dd\uc131 \uc608\uc815\uc778 \uac1d\uccb4\uc640 \uc5f0\uad00\ub418\uc5b4 \uc788\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uac8c \ub41c\ub2e4\uba74, \uc774\ubbf8 \ud574\ub2f9 \uac1d\uccb4\uc640 \uacb0\ud569\ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc804\uccb4\uc801\uc778 \uacb0\ud569\ub3c4\ub97c \ub0ae\uac8c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ub0ae\uc740 \uacb0\ud569\ub3c4 \ud328\ud134(Low Coupling)\\n\\nQ: \uc758\uc874\uc131\uc744 \ub0ae\ucd94\uace0 \ubcc0\ud654\uc758 \uc601\ud5a5\uc744 \uc904\uc774\uba70 \uc7ac\uc0ac\uc6a9\uc131\uc744 \uc99d\uac00\uc2dc\ud0a4\ub294 \ubc29\ubc95\uc740?\\n\\nA: \uc804\uccb4\uc801\uc778 \uacb0\ud569\uc774 \ub0ae\uac8c \uc720\uc9c0\ub418\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uacb0\ud569\ub3c4(Coupling)\\n\uac1d\uccb4 \uc0ac\uc774\uc758 \uc758\uc874\uc131\uc774 \uacfc\ud55c \uacbd\uc6b0 \uacb0\ud569\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.17\\n> \\n\\n\uacb0\ud569\ub3c4\ub97c \ub0ae\ucd98\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uc758 \ubcc0\ud654\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\ub294\ub2e4.\\n- \uc7ac\uc0ac\uc6a9\uc774 \ud3b8\ub9ac\ud574\uc9c4\ub2e4.\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\uc758\uc874\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0)\\n\\n### \ub192\uc740 \uc751\uc9d1\ub3c4 \ud328\ud134(High Cohesion)\\n\\nQ. \uac1d\uccb4\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\uac8c \ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub192\uc740 \uc751\uc9d1\ub3c4\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n> \uc751\uc9d1\ub3c4(Cohesion)\\n\uc5f0\uad00\ub41c \uc791\uc5c5\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc5f0\uad00\uc131 \uc5c6\ub294 \uc791\uc5c5\uc740 \ub2e4\ub978 \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac1d\uccb4\ub97c \uac00\ub9ac\ucf1c \uc751\uc9d1\ub3c4\uac00 \ub192\ub2e4\uace0 \ub9d0\ud55c\ub2e4.\\n- \uc624\ube0c\uc81d\ud2b8 p.26\\n> \\n\\n\ubcc0\uacbd\uc758 \uc774\uc720\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ubd84\ub9ac\ud55c\ub2e4\uba74 \uc751\uc9d1\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uace0, \uc751\uc9d1\ub3c4\uac00 \ub192\uc544\uc9c4\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc774 \uc788\ub2e4.\\n\\n- \ud574\ub2f9 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \uc26c\uc6cc\uc9c4\ub2e4. (\ud560\ub2f9\ub41c \ucc45\uc784\ub9cc\uc744 \uc218\ud589\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0)\\n- \uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c4\ub2e4.\\n- \ub0ae\uc740 \uacb0\ud569\ub3c4 \ub610\ud55c \uc9c0\uc6d0\ud55c\ub2e4.\\n- \uc751\uc9d1\ub3c4\uac00 \ub192\uc740 \ud074\ub798\uc2a4\ub294 \ud2b9\uc815\ud55c \ubaa9\uc801\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc7ac\uc0ac\uc6a9\ud558\uae30 \uc88b\ub2e4.\\n\\n### \ucee8\ud2b8\ub864\ub7ec \ud328\ud134(Controller)\\n\\nQ. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uac83\uc740 \ub204\uac00 \ub2f4\ub2f9\ud574\uc57c \ud558\ub294\uac00?\\n\\nA. \uc0ac\uc6a9\uc790\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.\\n\\n\uc5b4\ub5a4 \uc11c\ube0c\uc2dc\uc2a4\ud15c\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 \uac00\uc815\ud560 \ub54c\\n\\n- \uc9c1\uc811\uc801\uc73c\ub85c \uac1d\uccb4\uc5d0 \uc811\uadfc\ud558\uc5ec \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uacb0\ud569\ub3c4\uac00 \uc0c1\uc2b9\ud55c\ub2e4.\\n- \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744 \ucc98\ub9ac\ud574\uc8fc\ub294 \ucee8\ud2b8\ub864\ub7ec\uac00 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 \ud574\ub2f9 \ucee8\ud2b8\ub864\ub7ec\ub9cc \uc54c\uba74 \ub41c\ub2e4.\\n- \ub9cc\uc57d \uc11c\ube0c \uc2dc\uc2a4\ud15c\uc758 \ubcc0\uacbd\uc774 \uc0dd\uacbc\uc744 \ub54c \uc678\ubd80\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\ub3c4 \uc904\uc5b4\ub4e0\ub2e4.\\n\\n### \ub2e4\ud615\uc131 \ud328\ud134(Polymorphism)\\n\\nQ. \uac1d\uccb4\uc758 \ud0c0\uc785\uc5d0 \ub530\ub77c \ud589\ub3d9\uc774 \ubc14\ub010\ub2e4\uba74 \ucc45\uc784\uc744 \uc5b4\ub5bb\uac8c \ud560\ub2f9\ud574\uc57c \ud560\uae4c?\\n\\nA. OOP\uac00 \uc9c0\uc6d0\ud558\ub294 \ub2e4\ud615\uc131\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ud65c\uc6a9\ud55c\ub2e4. (\uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0 \ud589\ub3d9\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uad6c\ud604)\\n\\n\uac1d\uccb4\uc758 \uc885\ub958\uc5d0 \ub530\ub77c \ubd84\uae30\ud558\ub294 \uc870\uac74\ubb38\uc774 \uc544\ub2cc \ub2e4\ud615\uc131\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.\\n\\n\uc0c8\ub85c\uc6b4 \ud0c0\uc785\uc774 \ucd94\uac00\ub418\uc5c8\uc744 \ub54c \uc870\uac74\ubb38\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uae30\uc874\uc758 \uc870\uac74\ubb38\uc744 \uc218\uc815\ud574\uc57c \ud558\uc9c0\ub9cc \ub2e4\ud615\uc131\uc744 \ud65c\uc6a9\ud558\uba74 \uc27d\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\\n\\nQ. \uc5b4\ub5bb\uac8c \ud558\uba74 \ubcc0\uacbd\uc774 \ub2e4\ub978 \uc694\uc18c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub3c4\ub85d \ubc29\uc9c0\ud560 \uc218 \uc788\uc744\uae4c?\\n\\nA. \ubcc0\ud654\uac00 \uc608\uc0c1\ub418\ub294 \uc9c0\uc810\uc744 \uc2dd\ubcc4\ud558\uace0, \uc8fc\uc704\uc5d0 \uc548\uc815\ub41c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud558\ub3c4\ub85d \ucc45\uc784\uc744 \ud560\ub2f9\ud574\uc57c \ud55c\ub2e4.\\n\\n### \uac04\uc811 \ucc38\uc870 \ud328\ud134(Indirection)\\n\\nQ. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc758 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud558\uace0 \uc2f6\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ub2e4\ub978 \uac1d\uccb4\ub97c \ub450\uc5b4 \uc9c1\uc811\uc801\uc778 \uc5f0\uacb0\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uc7ac\uc790 \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub450 \uac1d\uccb4 \uc0ac\uc774\uc5d0 \ub610 \ud558\ub098\uc758 \uac1d\uccb4\ub97c \ucd94\uac00\ud558\uc5ec \ubcf5\uc7a1\ud55c \uad00\uacc4\ub97c \ub2e8\uc21c\ud654\ud560 \uc218 \uc788\ub2e4.\\n\\n\uc911\uac04\uc5d0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub454\ub2e4\uba74 \ubcc0\uacbd \ubcf4\ud638 \ud328\ud134(Protected Variations)\uc5d0 \ud574\ub2f9\ub41c\ub2e4.\\n\\n### \uc21c\uc218\ud55c \uac00\uacf5\ubb3c \ud328\ud134(Pure Fabrication)\\n\\nQ. \ucc45\uc784\uc744 \ud560\ub2f9\ud55c \ub3c4\uba54\uc778 \uac1d\uccb4\uac00 Low Coupling, High Cohesion, \uc7ac\uc0ac\uc6a9\uc131 \ub4f1\uc758 \ubaa9\uc801\uc744 \uc704\ubc18\ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\\n\\nA. \ub3c4\uba54\uc778 \uac1c\ub150\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\ub294 \ud074\ub798\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uace0 \ub9e4\uc6b0 \uc751\uc9d1\ub41c \ucc45\uc784\uc744 \ud560\ub2f9\ud560 \uc218 \uc788\ub2e4.\\n\\n\ud589\ub3d9\uc744 \ucd94\uac00\ud560 \ub54c, \ud574\ub2f9 \ucc45\uc784\uc744 \uc218\ud589\ud560 \ub3c4\uba54\uc778 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub3c4\uba54\uc778\uacfc \ubb34\uad00\ud55c \uc778\uacf5\uc801\uc778 \uac1d\uccb4\ub97c \ub9cc\ub4e0\ub2e4\uc74c \ud574\ub2f9 \uac1d\uccb4\uc5d0\uac8c \ucc45\uc784\uc744 \ud560\ub2f9\ud55c\ub2e4.\\n\\n\uac1d\uccb4\uac00 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud574\uc57c \ud560 \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uace0, \uc815\ubcf4 \uc804\ubb38\uac00 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub77c\ub294 \ucc45\uc784\uc744 \uac00\uc9c0\ub77c\uace0 \ud558\uc9c0 \uc54a\ub294\ub2e4.\\n\\n\uc608) \uc0c1\uc810\uacfc \uace0\uac1d \ud074\ub798\uc2a4\uac00 \uc788\uace0 \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uace0 \uac00\uc815\\n\\n- \uc11c\ub85c \ub2e4\ub978 \ud1b5\ud654\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac70\ub798\ub97c \ud558\ub824\uba74 \ud658\uc804\uc744 \ud574\uc57c\ud55c\ub2e4.\\n- \ub450 \ud074\ub798\uc2a4 \ub2e4 \ud658\uc804\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc560\ub9e4\ud558\ub2e4\uba74 \ud658\uc804\uc744 \ucc45\uc784\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n\uc624\ube0c\uc81d\ud2b8 5\uc7a5. \ucc45\uc784 \ud560\ub2f9\ud558\uae30, [\uc870\uc601\ud638](http://aeternum.egloos.com/)\\n\\nApplying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman\\n\\n[GRASP, \ud55c\ube5b \ub124\ud2b8\uc6cc\ud06c](https://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS8586826397)"},{"id":"10","metadata":{"permalink":"/10","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx","title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","description":"\ube14\ub799\uc7ad","date":"2023-03-14T00:00:00.000Z","formattedDate":"2023\ub144 3\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":5.105,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","slug":"10","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134","permalink":"/11"},"nextItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/9"}},"content":"### \ube14\ub799\uc7ad\\n\\n\ube14\ub799\uc7ad \ubbf8\uc158\uc5d0\uc11c\ub294 \ud6c4\ucd94\uc640 \ud398\uc5b4(\uc870\ubbf8\ub8cc \ub4c0\uc624?)\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\ubc88\uc5d0\ub294 \uc2e4\uc218\ud558\uc9c0 \uc54a\uace0, \ubc14\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uc9c0 \uc54a\uace0 \uce5c\ud574\uc9c0\uae30 \ubd80\ud130 \uc2dc\uc791\ud588\ub2e4. \\n\\n\ube14\ub799\uc7ad\uc740 \uad6c\ud604\ud574\uc57c \ub420 \ub0b4\uc6a9\uc774 \ub9ce\uc544 \uc2dc\uac04\uc774 \ub9ce\uc774 \ubd80\uc871\ud560 \uac83 \uac19\uc558\uc9c0\ub9cc \\n\ud6c4\ucd94\uc640 \ud568\uaed8 \uc804\ub7b5\uc801(\uc0bc\uc77c\uc808\uc5d0 \ubbf8\uc158 \uc774\uc57c\uae30 \ub098\ub204\uae30)\uc73c\ub85c \ubbf8\uc158\uc744 \uc9c4\ud589\ud574 \uc2dc\uac04 \ub0b4\uc5d0 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\ubbf8\uc158\uc744 \ub05d\ub098\uace0 \ud68c\uace0\ub97c \ud588\uc744 \ub54c \ud6c4\ucd94\uac00 \uace0\ubbfc\uac70\ub9ac\ub97c \ud558\ub098 \ub0b4\uc92c\ub2e4. \\n\\"\ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \uc555\ubc15\uac10\uc744 \ub290\ub07c\ub294 \ud398\uc5b4\uac00 \uc788\ub2e4\uba74 \ud5c8\ube0c\uac00 \ud574\uc904 \uc218 \uc788\ub294\uac8c \ubb50\uac00 \uc788\uc744\uae4c?\\" \\n\\n\uacf0\uacf0\ud788 \uc0dd\uac01\ud574\ubd24\uc9c0\ub9cc \uc27d\uac8c \ub2f5\uc744 \ub0b4\ub9b4 \uc218 \uc5c6\uc5c8\ub2e4. \\n\uc911\uac04 \uc911\uac04 \ud68c\uace0\ub97c \ud558\uace0, \ub098\uc758 \uc18c\ud504\ud2b8\uc2a4\ud0ac\uc744 \ub192\ud788\ub294\uac8c \ub2f5\uc77c\uae4c? \\n\ubd80\ub2f4\uac10\uc744 \ub290\ub07c\uc9c0 \uc54a\uace0 \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uacc4\uc18d \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4. \\n\\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc0dd\uac01\uc774 \ub9ce\uc544\uc838\uc11c \uc804 \ub9ac\ubdf0\uc5b4\uc778 \ud130\ud2c0\ud83d\udc22\uacfc\ub3c4 \ub300\ud654\ub97c \ub098\ub204\uc5c8\ub2e4. \\n\ud130\ud2c0\uc740 \uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\ubcf4\ub2e4 \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84(\uad81\uadf9\uc801\uc778 \ubaa9\ud45c\uc778 \uc88b\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uac83)\uc5d0 \uc9d1\uc911\ud574\ubcf4\ub77c\uace0 \ud558\uc168\ub2e4. \\n\\n\uc88b\uc740 \ucf54\ub4dc, \uc88b\uc740 \ud398\uc5b4\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \uc77c\ub2e8 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0dd\uac01\ud574\ubd10\uc57c\uaca0\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\ud398\uc5b4 \uc2e0\uacbd\uc4f0\uae30** \\n\uc774\ubc88 \ud398\uc5b4\ud560 \ub54c \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub0b4\ubcf4\ub3c4\ub85d \ud588\ub2e4. \uadf8\ub807\uae30\uc5d0 \ub108\ubb34 \uc758\uacac\uc744 \uac15\ud558\uac8c \ubc00\uc5b4\ubd99\uc778 \ub290\ub08c\uc774 \ub4e4\uc5b4\uc11c \ubbf8\uc548\ud588\ub2e4. \\n\ud6c4\ucd94\uac00 \uc555\ubc15\uc744 \ub290\uaf08\uc744 \uc218\ub3c4 \uc788\uc744 \uac83 \uac19\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\uc911\uac04 \uc911\uac04 \uc791\uc740 \ud68c\uace0\ub97c \uc9c4\ud589\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uc744\uae4c?\\n\\n**\uccb4\ub825 \uad00\ub9ac** \\n\uc694\uc998 \uc798 \ubabb\uba39\ub294 \uac83 \uac19\ub2e4. \\n\uc55e\uc73c\ub85c \uc0b4 \ub0a0\uc774 \ub9ce\uc740\ub370 \uc798 \ucc59\uaca8\uba39\uace0, \ud798\ub0b4\uc57c\uaca0\ub2e4.\\n\\n**\uc911\uac04 \uc911\uac04 \ub3cc\uc544\ubcf4\uae30** \\n\uc774\ubc88 \ubbf8\uc158\uacfc \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ud14c\ucf54\ub97c \uc798 \ud65c\uc6a9 \ud558\uace0 \uc788\ub294\uc9c0 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4. \\n\ub0b4\uac00 \uc6b0\ud14c\ucf54\uc5d0 \uc9c0\uc6d0\ud55c \uc774\uc720\ub97c \ud56d\uc0c1 \uc78a\uc9c0 \uc54a\uc544\uc57c\uaca0\ub2e4. \\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uc0c1\ud0dc \ud328\ud134** \\n\uac1d\uccb4\uc758 \ub0b4\ubd80 \uc0c1\ud0dc\uc5d0 \ub530\ub77c \uc2a4\uc2a4\ub85c \ud589\ub3d9\uc744 \ubcc0\uacbd\ud558\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc73c\ub85c if/else/switch\uc640 \uac19\uc740 \uc870\uac74\ubb38\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \\n\ube14\ub799\uc7ad \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc0c1\ud0dc \ud328\ud134\uc5d0 \ub300\ud55c \ubd80\ubd84\uc744 \ucc98\uc74c \uc801\uc6a9\ud574\ubcf4\uc558\ub2e4. \\n\ucc98\uc74c \uc801\uc6a9\ud558\uae30 \uc804\uc5d0\ub294 \ubcc4\ub85c\ub77c\uace0 \uc0dd\uac01\ud588\ub294\ub370, \uc0dd\uac01\ubcf4\ub2e4 \uad1c\ucc2e\uc740 \uac83 \uac19\ub2e4. \\n\\n**\uc77c\uad00\uc131, \uac00\ub3c5\uc131, \ucd94\uc0c1\ud654** \\n\uc774\ubc88 \ub9ac\ubdf0\uc5b4\ub294 \uac80\ud504\ud83c\udf6b \uc600\ub2e4! \\n\uac80\ud504\uc758 \ub9ac\ubdf0\ub294 \uac04\uacb0\ud568\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774 \ub9ce\uc558\ub2e4. \\n\uc77c\uad00\uc131\uc774 \uc788\ub294 \ucf54\ub4dc, \uac00\ub3c5\uc131\uc774 \uc88b\uc740 \ucf54\ub4dc, \ucd94\uc0c1\ud654\uac00 \uc798 \ub418\uc5b4\uc788\ub294 \ucf54\ub4dc \\n\uc77d\uae30 \uc88b\uace0, \uac04\uacb0\ud55c \ubc29\ud5a5\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4 \uac83 \uac19\ub2e4. \\n\ucf54\ub4dc\ub97c \ubc14\ub77c\ubcf4\ub294 \uc2dc\uc810\uc774 \ud558\ub098 \ub298\uc5b4\ub09c \uae30\ubd84\uc774\ub2e4!(\uc55e\uc73c\ub85c \uc801\uc6a9\ud558\ub294 \uac83\uc740 \ub098\uc758 \ubaab\uc774\uc9c0\ub9cc) \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n**\uc0dd\uac01 \uc815\ub9ac** \\n\uc911\uac04 \uc911\uac04 \ud604\uc7ac \uc0c1\ud669\uc5d0 \ub300\ud574 \uadf8\ub9bc\uc744 \uadf8\ub9ac\uac70\ub098, \uae00\uc744 \uc801\uc73c\uba74\uc11c \uc815\ub9ac\ud55c\ub2e4. \\n\ud398\uc5b4\uc640 \ub3d9\uc77c\ud55c \ubd80\ubd84\uc744 \uc774\ud574\ud558\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \\n\uc9c4\ud589\ud558\ub294\ub370 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ub098\ub3c4 \ub2e4\uc74c \ud398\uc5b4\ub54c\ubd80\ud130 \ud39c\uc774\ub791 \uc885\uc774\ub97c \uc900\ube44\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uac00\uac10\uc5c6\uc774 \uc758\uacac\uc744 \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84** \\n\uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub300\ud55c \ubd80\ubd84, \uc9c4\ud589 \uc18d\ub3c4, \uc9c0\uae08 \uc790\uc2e0\uc774 \uc774\ud574\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc744 \ub9d0\ud574\uc918\uc11c \ud3b8\ud588\ub2e4. \\n\ud68c\uace0\ub54c\ub3c4 \uc11c\ub85c \uc194\uc9c1\ud558\uac8c \uc758\uacac\uc744 \uc8fc\uace0 \ubc1b\uc544\uc11c \uc88b\uc558\ub2e4. \\n\\n**\ub3c4\uba54\uc778 \uc5b8\uc5b4\uc5d0 \uc2e0\uacbd\uc4f0\ub294 \ubd80\ubd84** \\n\ud074\ub798\uc2a4\uba85, \ubcc0\uc218\uba85\uacfc \uac19\uc740 \uc5b8\uc5b4\ub97c \uc138\uc2ec\ud558\uac8c \uc2e0\uacbd\uc4f4\ub2e4. \\n\uc694\uad6c\uc0ac\ud56d \uc815\ub9ac\ub3c4 \uae54\ub054\ud558\uac8c \uc798\ud558\ub294 \uac83 \uac19\ub2e4. \\n\\n\ud6c4\ucd94 \ucd5c\uace0 \ud83d\udc4d"},{"id":"9","metadata":{"permalink":"/9","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","description":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30","date":"2023-02-26T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 26\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":10.22,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","slug":"9","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0","permalink":"/10"},"nextItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/8"}},"content":"### \uc0ac\ub2e4\ub9ac \ud0c0\uae30\\n\\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\\n\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4.\\n\\n2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4.\\n\\n1. LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n2. Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95\\n\\n### Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\n\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4. \\n\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4. \\n\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n\\n LadderGame --\x3e Position\\n Ladder --\x3e Position\\n Items --\x3e Position\\n Line --\x3e Position\\n Players --\x3e Position\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item\\n Players --\x3e Player\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n final Map<Player, Item> result = new LinkedHashMap<>();\\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\\n for (Position position : Position.range(players.count())) {\\n final Position resultPosition = ladder.play(position);\\n result.put(players.get(position), items.get(resultPosition));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95\\n\\nPosition\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4. \\n\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. \\n\\n```mermaid\\ngraph TD\\n\\n LadderGameController --\x3e LadderGame\\n LadderGame --\x3e Ladder\\n LadderGame --\x3e Players\\n LadderGame --\x3e Items\\n\\n Ladder --\x3e Line\\n Line --\x3e LineStatus\\n Line --\x3e Position\\n\\n Players --\x3e Ladder\\n Player --\x3e Ladder\\n\\n Item --\x3e Position\\n Player --\x3e Position\\n\\n\\n LadderGame --\x3e LadderGameResult\\n\\n Items --\x3e Item --\x3e ItemName\\n Players --\x3e Player --\x3e PlayerName\\n\\n LadderGameController --\x3e InputView\\n LadderGameController --\x3e OutputView\\n\\n OutputView --\x3e LadderMessageGenerator\\n```\\n\\n```java\\npublic LadderGameResult play() {\\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\\n final Map<Player, Position> playResult = players.play(ladder);\\n\\n final Map<Player, Item> result = new LinkedHashMap<>();\\n for (Player player : playResult.keySet()) {\\n result.put(player, toItem(playResult.get(player)));\\n }\\n return new LadderGameResult(result);\\n}\\n```\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n**\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30** \\n\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4. \\n\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. \\n\\n**\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30** \\n\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72\\n\\n**README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c** \\n\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4.\\n\\n**\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30** \\n\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. \\n\\n**PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30** \\n\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4. \\nPR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4. \\ngithub pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4.\\n\\n**\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30** \\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4. \\n\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784** \\nPlayers\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. \\n\\n\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n- B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4.\\n- B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4.\\n- B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.\\n- B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. \\n\\n\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4.\\n\\n**\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900** \\n\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4. \\n\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. \\n\\n**\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30** \\nPosition\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4. \\n\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4. \\n\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. \\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4. \\n\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4. \\n\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! \\n\\n\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4. \\n\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4. \\n\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!\\n\\n\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"},{"id":"8","metadata":{"permalink":"/8","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx","title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","description":"\uc790\ub3d9\ucc28 \uacbd\uc8fc","date":"2023-02-14T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 14\uc77c","tags":[{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse"},{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":7.56,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","slug":"8","tags":["Woowahan Techcourse","Retrospective"]},"prevItem":{"title":"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0","permalink":"/9"},"nextItem":{"title":"Parameterized Tests","permalink":"/7"}},"content":"### \uc790\ub3d9\ucc28 \uacbd\uc8fc\\n\\n\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4. \\n\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. \\n\\n\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. \\n\\n\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4. \\nmermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n- \ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. \\n- github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```mermaid\\n---\\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\\n---\\ngraph TD\\n Cars --\x3e Car\\n Car --\x3e Name\\n Car --\x3e Position\\n RacingGame --\x3e Count\\n RacingGame --\x3e NumberGenerator\\n RacingGame --\x3e Cars\\n RacingCarController --\x3e RacingGame\\n RandomNumberGenerator -.-> NumberGenerator\\n RacingCarController --\x3e InputView\\n InputView --\x3e InputValidator\\n RacingCarController --\x3e OutputView\\n```\\n\\n\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4.\\n\\n\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4. \\n\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \ubd80\uc871\ud588\ub358 \ubd80\ubd84\\n\\n\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4. \\n\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. \\n\\n\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc \\n\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4. \\n\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4.\\n\\n### \uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84\\n\\n**Assertions extracting**\\n\\n\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4. \\n\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4.\\n\\n```java\\n@Test\\nvoid extracting() {\\n final Cars cars = new Cars(List.of(\\"car1\\", \\"car2\\"));\\n\\n assertThat(cars.getCars())\\n .extracting(Car::getName)\\n .containsExactly(\\"car1\\", \\"car2\\");\\n}\\n```\\n\\n---\\n\\n\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4.\\n\\n**\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4. \\n\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?\\n\\n**\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8**\\n\\n\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4. \\n\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \\n\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4. \\n\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc \\n\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4.\\n\\n**\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9**\\n\\n\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4. \\n\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4. \\n\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4.\\n\\n### \ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84\\n\\n\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4. \\n\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4. \\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4. \\n\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?) \\n\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4.\\n\\n\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4. \\n\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4. \\n\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4. \\n\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00? \\n\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4.\\n\\n\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc. \\n\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."},{"id":"7","metadata":{"permalink":"/7","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-12-Parameterized Tests.mdx","source":"@site/blog/2023/2023-02-12-Parameterized Tests.mdx","title":"Parameterized Tests","description":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.","date":"2023-02-12T00:00:00.000Z","formattedDate":"2023\ub144 2\uc6d4 12\uc77c","tags":[{"label":"Java","permalink":"/tags/java"}],"readingTime":3.17,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Parameterized Tests","slug":"7","tags":["Java"]},"prevItem":{"title":"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0","permalink":"/8"},"nextItem":{"title":"IntelliJ \uc124\uc815","permalink":"/6"}},"content":"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4. \\n\uc774 \ub54c `@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4.\\n\\n## Argument Sources\\n\\n`@ParameterizedTest`\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4. \\nJUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n### Value Source\\n\\n\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. \\n- short, int, long, float, double\\n- byte, char, boolean, String, Class \\n\\n```java\\n@ParameterizedTest\\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\\nvoid valueTest(final int value) {\\n Assertions.assertThat(value).isPositive();\\n}\\n```\\n\\n### Null & Empty Source\\n\\nnull \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4. \\nEmpty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n- String\\n- java.util.List, java.util.Set, java.util.Map\\n- primitive arrays \u2014 ex) int[]\\n- object arrays \u2014 ex) String[]\\n\\n```java\\n@ParameterizedTest\\n@NullAndEmptySource\\nvoid nullAndEmptyTest(final String value) {\\n Assertions.assertThat(value).isNullOrEmpty();\\n}\\n```\\n\\n### Enum Source\\n\\nEnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n```java\\nenum Day {\\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\\n}\\n\\n@ParameterizedTest\\n@EnumSource(Day.class)\\nvoid enumTest(final Day day) {\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)\\n\\n```java\\n@ParameterizedTest\\n@EnumSource(value = Day.class, names = {\\"SATURDAY\\", \\"SUNDAY\\"}, mode = Mode.EXCLUDE)\\nvoid enumTest(final Day day) {\\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\\n assertThat(day).isInstanceOf(Day.class);\\n}\\n```\\n\\n### CSV Source\\n\\ncsv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4. \\n\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@CsvSource({\\"1,1\\", \\"2,4\\", \\"3,9\\", \\"4,16\\"})\\nvoid csvTest(final int number, final int result) {\\n assertThat(number * number).isEqualTo(result);\\n}\\n```\\n\\n### Method Source\\n\\n\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4. \\n\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4.\\n\\n```java\\n@ParameterizedTest\\n@MethodSource\\nvoid methodTest(final List<Integer> numbers, final int count) {\\n assertThat(numbers).hasSize(count);\\n}\\n\\nprivate static Stream<Arguments> methodTest() {\\n return Stream.of(\\n Arguments.of(List.of(1), 1),\\n Arguments.of(List.of(1, 2), 2),\\n Arguments.of(List.of(1, 2, 3), 3)\\n );\\n}\\n```\\n\\n### ETC.\\n\\n\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.\\n\\n- CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource\\n- ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource\\n\\n## \ucc38\uace0 \uc790\ub8cc\\n\\n- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5)"},{"id":"6","metadata":{"permalink":"/6","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","source":"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx","title":"IntelliJ \uc124\uc815","description":"Import \uc790\ub3d9 \uc801\uc6a9","date":"2023-01-30T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 30\uc77c","tags":[{"label":"IntelliJ","permalink":"/tags/intelli-j"}],"readingTime":0.465,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"IntelliJ \uc124\uc815","slug":"6","tags":["IntelliJ"]},"prevItem":{"title":"Parameterized Tests","permalink":"/7"},"nextItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/5"}},"content":"### Import \uc790\ub3d9 \uc801\uc6a9\\n\\nPrefrences > Editor > General > Auto Import > Add unambiguous imports on the fly\\n\\n![auto-import](./auto-import.png)\\n\\n### \uc800\uc7a5\uc2dc \ub3d9\uc791\\n\\nPrefrences > Tools > Actions on Save\\n\\n![actions-on-save](./actions-on-save.png)\\n\\nReformat Code: Code Reformmating\\n\\nOptimize imports: \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 Import \uc81c\uac70\\n\\nRearrange: Code Style > Arrangement \uc124\uc815 \uae30\ubc18 \ucf54\ub4dc \uc7ac\uc815\ub82c\\n\\n### \uba54\uc18c\ub4dc \ucd94\ucd9c, \ubcc0\uc218 \ucd94\ucd9c\uc2dc final \uc801\uc6a9\\n\\nPrefrences > Editor > Code Style > Java > Code Generation > Final Modifier\\n\\n![final-modifier](./final-modifier.png)"},{"id":"5","metadata":{"permalink":"/5","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","source":"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx","title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","description":"nullable \ud0c0\uc785","date":"2023-01-16T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 16\uc77c","tags":[{"label":"Kotlin","permalink":"/tags/kotlin"}],"readingTime":4.225,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","slug":"5","tags":["Kotlin"]},"prevItem":{"title":"IntelliJ \uc124\uc815","permalink":"/6"},"nextItem":{"title":"JSR-310","permalink":"/4"}},"content":"import Tabs from \\"@theme/Tabs\\";\\nimport TabItem from \\"@theme/TabItem\\";\\n\\n### nullable \ud0c0\uc785\\n\\n\ucf54\ud2c0\ub9b0\uc740 `NullPointerException` \uc608\uc678\ub97c \ucd5c\ub300\ud55c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 \ud0c0\uc785 \uc2dc\uc2a4\ud15c\uc774 \uc124\uacc4\ub418\uc5b4 \uc788\ub2e4. \\n\uc774\ub294 \uc2e4\ud589 \uc2dc\uc810\uc774 \uc544\ub2cc \ucef4\ud30c\uc77c \uc2dc \ubbf8\ub9ac \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ubd80\ubd84\uc744 \ubbf8\ub9ac \uac10\uc9c0\ud558\uc5ec NPE \ubc1c\uc0dd\uc758 \uac00\ub2a5\uc131\uc744 \uc904\uc5ec\uc900\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc758 \uacbd\uc6b0 nullable \ud0c0\uc785\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\ud604\ud55c\ub2e4.\\n\\n```kotlin\\nval number: Int?\\n```\\n\\n\ud0c0\uc785 \ub4a4\uc5d0 `?`\ub97c \ubd99\uc5ec \ud574\ub2f9 \uac12\uc774 null\uc774 \ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4. \\n\ub9cc\uc57d `?`\ub97c \ubd99\uc774\uc9c0 \uc54a\uc744 \ub54c null\uc744 \ubc1b\ub294 \uacbd\uc6b0 \ucef4\ud30c\uc77c \uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4.\\n\\n### `?.` Safe Calls \uc5f0\uc0b0\uc790\\n\\n\uc790\ubc14\uc5d0\uc11c NPE\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 null\uc744 \ucc98\ub9ac\ud558\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c\ub294 \ubd84\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4.\\n\\n\ucf54\ud2c0\ub9b0\uc740 \uc548\uc804\ud55c \ud638\ucd9c \uc5f0\uc0b0\uc790\uc778 `?.` \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4. \\n\ub530\ub77c\uc11c \ucc38\uc870 \uac12\uc774 null\uc774 \uc544\ub2d0 \uacbd\uc6b0\uc5d0\ub9cc \uba54\uc11c\ub4dc \ud638\ucd9c\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ucc38\uc870 \uac12\uc774 null\uc778 \uacbd\uc6b0 \uba54\uc11c\ub4dc \ud638\ucd9c\uc774 \ubb34\uc2dc\ub418\uace0, null\uc744 \ubc18\ud658\ud55c\ub2e4. \\n\\n<Tabs>\\n<TabItem value=\\"Java\\" label=\\"Java\\" default>\\n\\n```java\\npublic String repeat(String word) {\\n if (word == null) {\\n return null;\\n }\\n return word.repeat(2);\\n}\\n```\\n\\n</TabItem>\\n<TabItem value=\\"Kotlin\\" label=\\"Kotlin\\">\\n\\n```kotlin\\nfun repeat(word: String?): String? {\\n return word?.repeat(2)\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n### `?:` \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\\n\\n\ucc38\uc870\ud558\ub824\ub294 \uac12\uc774 null\uc77c \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \ubc18\ud658\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c? \\n\ucf54\ud2c0\ub9b0\uc740 null\uc774 \uc544\ub2cc \uacbd\uc6b0 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc9c0\uc6d0\ud55c\ub2e4.\\n\\n<Tabs>\\n<TabItem value=\\"Java\\" label=\\"Java\\" default>\\n\\n```java\\npublic String stringSafe(String word) {\\n if (word == null) {\\n return \\"\\";\\n }\\n return word;\\n}\\n```\\n\\n</TabItem>\\n<TabItem value=\\"Kotlin\\" label=\\"Kotlin\\">\\n\\n```kotlin\\nfun stringSafe(word: String?): String {\\n return word ?: \\"\\"\\n}\\n```\\n\\n</TabItem>\\n</Tabs>\\n\\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 throw\ub3c4 \uc2dd\uc774\uae30 \ub54c\ubb38\uc5d0 \uc5d8\ube44\uc2a4 \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4. \\n\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\uac00 \uc788\ub294 \uc800\uc7a5\uc18c\uc5d0 \ucc3e\ub294 \uc0ac\uc6a9\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\\n\\n```kotlin\\nuserRepository.findByName(name) ?: throw IllegalArgumentException()\\n```\\n\\n### `!!` \ub110 \uc544\ub2d8 \ub2e8\uc5b8 \uc5f0\uc0b0\uc790\\n\\n!! \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud55c\ub2e4\uba74 \uac15\uc81c\ub85c \uc5b4\ub5a4 \uac12\uc774\ub4e0 non-nullable \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. \\n\ud558\uc9c0\ub9cc null\uc778 \uac12\uc5d0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 NPE\uac00 \ubc1c\uc0dd\ud558\uac8c \ub41c\ub2e4. \\n\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\uc5d0\ub294 !! \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc704\ud5d8\ud558\ub2e4. \\n\uc0ac\uc6a9\ud558\uae30 \uc27d\uc9c0\ub9cc, \ub9ac\uc2a4\ud06c\uac00 \ud06c\uace0 \ud639\uc2dc\ub098 \ud574\ub2f9 \uac12\uc774 \ucd94\ud6c4\uc5d0\ub294 null\uc774 \ub420 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc591\ud574\uc57c \ub41c\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.\\n\\n```kotlin\\nval length: Int = word!!.length\\n```\\n\\n### `as?` \uc548\uc804\ud55c \uce90\uc2a4\ud305\\n\\n\ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \ub54c \uc9c0\uc815\ud55c \ud0c0\uc785\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4\uba74 `ClassCastException`\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \\n\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 as \ub4a4\uc5d0 ?\ub97c \ubd99\uc5ec \uc548\uc804\ud558\uac8c \ud0c0\uc785 \ubcc0\ud658\uc744 \ud560 \uc218 \uc788\ub2e4. \\n\ub530\ub77c\uc11c \ubbf8\ub9ac \ubcc0\ud658 \uac00\ub2a5\ud55c \ud0c0\uc785\uc778\uc9c0 \ud655\uc778\ud558\uc9c0 \uc54a\uace0, \uc548\uc804\ud558\uac8c \ud0c0\uc785\uc744 \ubcc0\ud658 \ud560 \uc218 \uc788\ub2e4. \\n\\n\ud0c0\uc785 \ubcc0\ud658\uc774 \ubd88\uac00\ub2a5 \ud560 \uacbd\uc6b0 \uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uc9c0 \uc54a\uace0 null\uc744 \ubc18\ud658\ud55c\ub2e4.\\n\\n```kotlin\\nval value: Int? = something as? Int\\n```\\n\\n### List\uc5d0\uc11c\uc758 null \ucc98\ub9ac\\n\\nList\uc5d0\ub294 null\uc774 \uc544\ub2cc \uac12\ub9cc \ubc18\ud658\ud558\ub294 `filterNotNull` \uc720\ud2f8\ub9ac\ud2f0 \uba54\uc11c\ub4dc\ub97c \uc81c\uacf5\ud55c\ub2e4.\\n\\n```kotlin\\nval foodsWithNull: List<String?> = listOf(\\"Pizza\\", \\"Cheese\\", null, \\"Potato\\")\\nval foods = foodsWithNull.filterNotNull()\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [Kotlin in Action](https://product.kyobobook.co.kr/detail/S000001804588)\\n- [Effective Kotlin Item 8](https://product.kyobobook.co.kr/detail/S000001033129)\\n- [Comprehensive Guide to Null Safety in Kotlin](https://www.baeldung.com/kotlin/null-safety)\\n- [Kotlin NullSafety](https://kotlinlang.org/docs/null-safety.html)"},{"id":"4","metadata":{"permalink":"/4","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-08-JSR-310.mdx","source":"@site/blog/2023/2023-01-08-JSR-310.mdx","title":"JSR-310","description":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API","date":"2023-01-08T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 8\uc77c","tags":[{"label":"Java","permalink":"/tags/java"},{"label":"Time","permalink":"/tags/time"}],"readingTime":1.685,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"JSR-310","slug":"4","tags":["Java","Time"]},"prevItem":{"title":"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95","permalink":"/5"},"nextItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/3"}},"content":"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API \\nISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131 \\n\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131\\n\\n:::note ISO-8601\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900\\n\\n:::\\n\\n### LocalDate, LocalTime, LocalDateTime\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### Instant\\n\\n\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4 \\n\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604\\n\\n### Duration, Period\\n\\n\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4\\n\\n### TemporalAdjusters\\n\\n\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9 \\n\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5\\n\\n```java\\n@FunctionalInterface\\npublic interface TemporalAdjuster {\\n Temporal adjustInto(Temporal temporal);\\n}\\n```\\n\\n### DateTimeFormatter\\n\\n\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4 \\n\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5\\n\\n### ZoneId, ZoneOffset\\n\\nZoneId\ub294 \uc9c0\uc5ed ID\ub294 `\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019` \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9 \\nZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9\\n\\n```java\\nInstant instant = Instant.now();\\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\\n```\\n\\n### \ucc38\uace0 \uc790\ub8cc\\n\\n- [\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158](https://product.kyobobook.co.kr/detail/S000001810171)\\n- [Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API](https://d2.naver.com/helloworld/645609)\\n- [ISO-8601](https://www.w3.org/TR/NOTE-datetime)\\n- [JSR-310 Spec](https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4)\\n- [Temporal Adjuster](https://www.baeldung.com/java-temporal-adjuster)\\n- [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)"},{"id":"3","metadata":{"permalink":"/3","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","source":"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx","title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","description":"\ucc45 \uc815\ubcf4","date":"2023-01-07T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 7\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":5.415,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","slug":"3","tags":["Book"]},"prevItem":{"title":"JSR-310","permalink":"/4"},"nextItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574 \\n> \uc870\uc601\ud638\\n> \\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4. \\n\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4. \\n\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. \\n\\n\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0 \\n\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4.\\n\\n### \ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173\\n\\n\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4.\\n\\n- \uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558\\n- \ucc45\uc784\uc758 \ucd94\uc0c1\ud654\\n\\n\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4.\\n\\n- \uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac\\n\\n\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4.\\n\\n- \ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558\\n\\n\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4.\\n\\n- \uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00\\n\\n\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4.\\n\\n- \uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\\np.21\\n> \\n\\n> \uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\\np.33\\n> \\n\\n> **\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8**\\n> \\n> \\n> \uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95\\n> \\n> \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4.\\n> \\n> \uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\\n> p.35\\n> \\n\\n> \ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\\np.38\\n> \\n\\n> \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\\np.105\\n> \\n\\n> \ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\\np.158\\n>"},{"id":"2","metadata":{"permalink":"/2","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx","source":"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx","title":"2022\ub144 \ud68c\uace0","description":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70","date":"2023-01-02T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 2\uc77c","tags":[{"label":"Retrospective","permalink":"/tags/retrospective"}],"readingTime":3.705,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"2022\ub144 \ud68c\uace0","slug":"2","tags":["Retrospective"]},"prevItem":{"title":"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574","permalink":"/3"},"nextItem":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","permalink":"/1"}},"content":"\uc801\ub2f9\ud55c \uc804\ud658\uc810, 2022\ub144\uc744 \ub3cc\uc544\ubcf4\uba70 \\n\\n### \uc804\uc5ed\\n\\n\uc57d 1\ub144 6\uac1c\uc6d4\uac04\uc758 \uacf5\uad70 \uc815\ubcf4\ubcf4\ud638\ubcd1 \uc0dd\ud65c\uc744 \ub9c8\uce58\uace0 \uc804\uc5ed\uc744 \ud588\ub2e4. \\n\uc870\uae30 \uc804\uc5ed \ub54c\ubb38\uc5d0 2021\ub144 12\uc6d4\uc5d0 \ub098\uc654\uc9c0\ub9cc, \uc2e4\uc81c \uc804\uc5ed \ub0a0\uc9dc\ub294 2022\ub144\uc774\ub2c8 \ud68c\uace0\uc5d0 \uc801\uc5b4\ub3c4 \uc0c1\uad00\uc5c6\uaca0\uc9c0. \\n\\n\uc870\uae08 \ub354 \ubbf8\ub798\uc5d0 \ub300\ud55c \uc0dd\uac01\uc744 \ud574\ubcfc\uac78 \uadf8\ub7ac\ub2e4. \\n\uc804\uc5ed\uc744 \ud588\uc9c0\ub9cc \ubb50 \ud558\ub098 \uc81c\ub300\ub85c \ud560 \uc904 \uc544\ub294 \uac83\ub3c4 \uc5c6\uc73c\ub2c8 \ub113\uc740 \ubc14\ub2f7\uc18d\uc5d0 \ub369\uadf8\ub7ec\ub2c8 \ub193\uc544\uc9c4 \uae30\ubd84\uc774 \uad1c\ud788 \ub4e4\uc5c8\uc5c8\ub2e4. \\n\uc77c\ucc0d \uc0dd\uac01\uc744 \uc815\ub9ac\ud558\uc5ec \ubc29\ud5a5\uc744 \uc7a1\uc9c0 \ubabb\ud588\uae30\uc5d0 \uc544\uc26c\uc6c0\uc774 \ub9ce\uc774 \ub0a8\uc558\ub2e4. \\n\\n### \uc790\ubc14\\n\\n\uc804\uc5ed\uc744 \ud558\uace0 \uc9c4\ub85c\ub97c \uace0\ubbfc\ud558\ub2e4 \ud5a5\ub85c\ub2d8\uc758 [\uc790\ubc14 \uacf5\ud654\uad6d](https://jojoldu.tistory.com/609) \ud3ec\uc2a4\ud305\uc744 \uc77d\uace0 \ub098\uc11c \uc790\ubc14 \uacf5\ubd80\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\uc720\uba85\ud55c \uc778\ud504\ub7f0\uc758 \uae40\uc601\ud55c\ub2d8\uc758 \uc2a4\ud504\ub9c1 \uac15\uc758\ub3c4 \uc788\uace0, \uc88b\uc740 \uc790\ubc14 \uac1c\ubc1c \uc11c\uc801\uc774 \ub9ce\uc544\uc11c \ub3c5\ud559\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4. \\n\ud558\ub2e4 \ubcf4\ub2c8 \uc790\ubc14\uc640 \uc2a4\ud504\ub9c1\uc744 \uacf5\ubd80\ud558\uba74\uc11c \u201c\uc65c \uc9c4\uc791\ud558\uc9c0 \uc54a\uc558\uc9c0\u201d\ub77c\ub294 \uc0dd\uac01\ub3c4 \ub9ce\uc774 \ub4e4\uc5c8\ub2e4. \\n\uc591\uc9c8\uc758 \uc790\ub8cc\ub3c4 \ub9ce\uc558\uae30 \ub54c\ubb38\uc5d0, \uc608\uc804\uc5d0 \ub178\ub4dc\ub85c \uac1c\ubc1c\ud588\uc744 \ub54c \ud480\uc9c0 \ubabb\ud588\ub358 \ub2f5\ub2f5\ud568\uc744 \ub9ce\uc774 \ud574\uc18c\ud588\ub358 \uac83 \uac19\ub2e4.\\n\\n23\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae4a\uac8c \uc790\ubc14\ub97c \uacf5\ubd80\ud574\ubcfc \uc0dd\uac01\uc774\ub2e4. \\n\uc5b8\uc5b4\ub97c \ud558\ub098 \uae4a\uac8c \uacf5\ubd80\ud558\ub294 \uac74 \ub9ce\uc740 \ub3c4\uc6c0\uc774 \ub418\ub294 \uac83 \uac19\ub2e4.\\n\\n### \uc2a4\ud130\ub514\\n\\n\uae40\uc601\ud55c\ub2d8\uc758 \uac15\uc758\ub97c \uac70\uc758 \ub2e4 \ub4e4\uc5c8\uc744 \ub54c\ucbe4, \ud56d\uc0c1 \uac15\uc758\uc5d0\uc11c \uc5b8\uae09\ub418\ub294 \ud1a0\ube44\uc758 \uc2a4\ud504\ub9c1\uc744 \uc77d\uc5b4\ubcf4\uace0 \uc2f6\uc5b4\uc84c\uace0 \\n\ud63c\uc790 \uacf5\ubd80\ud558\uae30\uc5d0\ub294 \ub3d9\uae30\ubd80\uc5ec\ub3c4 \ubd80\uc871\ud588\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ud130\ub514\ub97c \uc2dc\uc791\ud588\ub2e4. \\n\ub2e4\ub978 \uc0ac\ub78c\uc5d0\uac8c \uc124\uba85\uc744 \ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uacf5\ubd80\ub97c \ud560 \uc218 \uc788\uc5b4\uc11c \uc88b\uc558\uc9c0\ub9cc \ub098\uc5d0\uac8c\ub294 \ub0b4\uc6a9\uc774 \uaf64\ub098 \uc5b4\ub824\uc6cc\uc11c \uc2dc\uac04\uc744 \ub9ce\uc774 \uc18c\ube44\ud588\ub2e4. \\n\uac19\uc774 \uc2a4\ud130\ub514\ud558\uc2dc\ub294 \ubd84\uacfc 7\uac1c\uc6d4 \ub3d9\uc548 \uc2a4\ud130\ub514\ub97c \uafb8\uc900\ud788 \uc774\uc5b4\ub098\uac00 \ucd1d 3\uad8c\uc758 \ucc45\uc744 \uc77d\uc744 \uc218 \uc788\uc5c8\ub2e4.\\n\\n### \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\\n\\n\uad70 \ubcf5\ubb34 \uc911\uc77c \ub54c \uc9c0\uc6d0\ud588\ub2e4 \ub5a8\uc5b4\uc9c4 \uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ub2e4\uc2dc \uc9c0\uc6d0\ud588\ub2e4. \\n\uc774\ubc88 \uc5f0\ub3c4\uc5d0 \ucde8\uc5c5\uc744 \ud558\ub294 \uac8c \ubaa9\ud45c\uc600\uc9c0\ub9cc \ub0b4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud2b9\ubcc4\ud55c \ubb34\uae30\uac00 \uc5c6\ub2e4\ub294 \uac78 \uae68\ub2ec\uc558\ub2e4. \\n\uc801\uc9c0 \uc54a\uc740 \uc2dc\uac04\uc744 \ud22c\uc790\ud574 \uc900\ube44\ub97c \ud588\uace0, \uac10\uc0ac\ud558\uac8c\ub3c4 \uc774\ubc88\uc5d0\ub294 \ucd5c\uc885 \ud569\uaca9\uc744 \ud588\ub2e4. \\n\\n\ub09c \uc0ac\ub78c\ub4e4\uacfc \uc18c\ud1b5\ud558\uace0, \ud611\uc5c5\ud558\ub294 \ub2a5\ub825\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \uc0dd\uac01\uc744 \ub9ce\uc774 \ud588\ub2e4. \\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\ub97c \ud1b5\ud574 \uadf8 \ube48 \ubd80\ubd84\uc744 \ucc44\uc6b0\ub3c4\ub85d \ub178\ub825\ud574\uc57c\uaca0\ub2e4. \\n\\n### 2023\ub144\uc5d0\ub294\\n\\n\ub9c8\uc74c\uc758 \uc5ec\uc720\uac00 \uc5c6\uc5c8\ub358 2022\ub144\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4. \\n\ud558\uace0 \uc2f6\uc740 \uac74 \ub9ce\uc9c0\ub9cc, \uc774\ubc88\uc5d0\ub294 \uc5ec\uc720\ub97c \uac00\uc9c0\uace0 \ud560 \uc218 \uc788\ub294 \uac83\uc5d0 \ucd5c\uc120\uc744 \ub2e4\ud574\uc57c\uaca0\ub2e4."},{"id":"1","metadata":{"permalink":"/1","editUrl":"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","source":"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx","title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","description":"\ucc45 \uc815\ubcf4","date":"2023-01-01T00:00:00.000Z","formattedDate":"2023\ub144 1\uc6d4 1\uc77c","tags":[{"label":"Book","permalink":"/tags/book"}],"readingTime":4.425,"hasTruncateMarker":false,"authors":[],"frontMatter":{"title":"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.","slug":"1","tags":["Book"]},"prevItem":{"title":"2022\ub144 \ud68c\uace0","permalink":"/2"}},"content":"### \ucc45 \uc815\ubcf4\\n\\n> \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \\n> \ubc15\uc194\ubbf8 \\n>\\n\\n### \uc77d\uace0 \ub098\uc11c\\n\\n\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4. \\n\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. \\n\\n\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4. \\n\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4. \\n\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4.\\n\\n### \ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4\\n\\n> \ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.\\n> \\n\\n> \ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.\\n> \\n\\n> \uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.\\n> \\n\\n> \uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.\\n> \\n\\n> \uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c\\n> \\n\\n> \uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.\\n> \\n\\n> \uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.\\n> \\n\\n> \ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.\\n> \\n\\n> \uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.\\n>"}]}')}}]); \ No newline at end of file diff --git a/assets/js/b2e443b6.ca59c9b2.js b/assets/js/b2e443b6.ca59c9b2.js new file mode 100644 index 000000000..474f3504f --- /dev/null +++ b/assets/js/b2e443b6.ca59c9b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2901],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,g=d["".concat(c,".").concat(m)]||d[m]||s[m]||l;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var p=2;p<l;p++)o[p]=n[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},591:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const l={title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:26,tags:["DTO"]},o=void 0,i={permalink:"/26",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",source:"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",description:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",date:"2023-05-24T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 24\uc77c",tags:[{label:"DTO",permalink:"/tags/dto"}],readingTime:7.525,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:"26",tags:["DTO"]},prevItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"},nextItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"}},c={authorsImageUrls:[]},p=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815",id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815",level:3},{value:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5",level:3},{value:"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c",id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c",level:3},{value:"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc",id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30",level:3},{value:"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30",id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30",level:3},{value:"\uc815\ub9ac",id:"\uc815\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:p};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4."),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815"},"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf51",src:n(71676).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?"),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},(0,a.kt)("inlineCode",{parentName:"p"},"ProductSaveRequest"),"\uc640 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProductUpdateRequest"),"\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e")),(0,a.kt)("p",null,"\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!")),(0,a.kt)("h3",{id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5"},"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5"),(0,a.kt)("p",null,"\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("h3",{id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c"},"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c"),(0,a.kt)("p",null,"\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! "),(0,a.kt)("h3",{id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc"},"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc"),(0,a.kt)("p",null,"\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Controller\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\n\u251c\u2500\u2500 dto\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf52",src:n(35430).Z,width:"1528",height:"912"})),(0,a.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30"},"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf53",src:n(12732).Z,width:"1518",height:"904"})),(0,a.kt)("p",null,"\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public interface ProductSaveRequest {\n\n String getName();\n\n String getImage();\n\n Long getPrice();\n}\n\n// ProductService\npublic Long save(final ProductSaveRequest request) {\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\n return productDao.saveAndGetId(product);\n}\n")),(0,a.kt)("h3",{id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30"},"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf54",src:n(33070).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\n\n @NotBlank(message = "\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n @Size(min = 1, max = 100, message = "\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final String name;\n\n @NotBlank(message = "\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n private final String image;\n\n @Range(message = "\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final long price;\n\n public ProductRequest(final String name, final String image, final long price) {\n this.name = name;\n this.image = image;\n this.price = price;\n }\n\n @Override\n public String getName() {\n return name;\n }\n\n @Override\n public String getImage() {\n return image;\n }\n\n @Override\n public long getPrice() {\n return price;\n }\n}\n\n// ProductController\n@PostMapping("/products")\npublic ResponseEntity<Void> save(@Valid @RequestBody final ProductRequest request) {\n final Long id = productService.save(request);\n return ResponseEntity.created(URI.create("/products/" + id)).build();\n}\n')),(0,a.kt)("h3",{id:"\uc815\ub9ac"},"\uc815\ub9ac"),(0,a.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. "),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,"\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/2647/"},"https://techblog.woowahan.com/2647/"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/"},"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/")))}s.isMDXComponent=!0},71676:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf51-ccd4f91674b224578f2b295b3fccaf2c.png"},35430:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf52-0b4f9f493909fc139f0e4579f7569a6b.png"},12732:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf53-1b6b93bc790ba29844083df5b70dbd2c.png"},33070:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf54-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/b2e443b6.e6e6924a.js b/assets/js/b2e443b6.e6e6924a.js deleted file mode 100644 index 94ea1fd94..000000000 --- a/assets/js/b2e443b6.e6e6924a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2901],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,g=d["".concat(c,".").concat(m)]||d[m]||s[m]||l;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var p=2;p<l;p++)o[p]=n[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},591:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const l={title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:26,tags:["DTO"]},o=void 0,i={permalink:"/26",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",source:"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",description:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",date:"2023-05-24T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 24\uc77c",tags:[{label:"DTO",permalink:"/tags/dto"}],readingTime:7.525,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",slug:"26",tags:["DTO"]},prevItem:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",permalink:"/27"},nextItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"}},c={authorsImageUrls:[]},p=[{value:"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815",id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815",level:3},{value:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5",level:3},{value:"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c",id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c",level:3},{value:"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc",id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc",level:3},{value:"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30",id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30",level:3},{value:"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30",id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30",level:3},{value:"\uc815\ub9ac",id:"\uc815\ub9ac",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:p};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc5d0 \ub2f4\uae34 Body\ub97c \ud1b5\ud574 \uc804\ub2ec\ubc1b\uc740 \uac12\uc744 DTO\ub85c \ub9e4\ud551\ud558\uc5ec \ucd94\uac00\uc640 \uc218\uc815\uc744 \ud588\ub2e4."),(0,a.kt)("h3",{id:"\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158\uc5d0\uc11c\uc758-\uc0c1\ud488-\ucd94\uac00-\ubc0f-\uc218\uc815"},"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\uc758 \uc0c1\ud488 \ucd94\uac00 \ubc0f \uc218\uc815"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf51",src:n(1676).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d\ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0\uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc704 \uacbd\uc6b0\ub294 \uc911\ubcf5\uc77c\uae4c? \uc911\ubcf5\uc774 \uc544\ub2d0\uae4c?"),(0,a.kt)("p",null,"\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ub9ac\ubdf0\ub97c \ubc1b\uc558\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},(0,a.kt)("inlineCode",{parentName:"p"},"ProductSaveRequest"),"\uc640 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProductUpdateRequest"),"\uac00 \uc644\uc804\ud788 \ub3d9\uc77c\ud55c\ub370, \uc7ac\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc744\uae4c? \ub77c\ub294 \ub9ac\ubdf0\ub97c \ub0a8\uacbc\uc5c8\uc5b4\uc694. \uc0ac\uc2e4 \uc0dd\uc131\uacfc \uc218\uc815\uc740 \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac1c\uc5f0\uc131\uc774 \ub192\uc544\uc11c \ubbf8\ub9ac \ubd84\ub9ac\ud574\ub193\ub294 \uac8c \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\uae34 \ud55c\ub370, \uadf8\ub798\ub3c4 \uc911\ubcf5\uc740 \uc2eb\uc5b4\uc11c \uc800\ub3c4 \uc694\uc998 \uc774\ub7f0\uc800\ub7f0 \ubc29\ubc95\ub4e4\uc744 \uc2dc\ub3c4\ud574\ubcf4\ub294 \uc911 \uc785\ub2c8\ub2e4. \ud5c8\ube0c\ub294 \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574 \uc5b4\ub5a4 \uc0dd\uac01\uc744 \uac00\uc9c0\uace0 \uc788\uc744\uc9c0 \uad81\uae08\ud558\ub124\uc694 \u314e\u314e")),(0,a.kt)("p",null,"\uc9c8\ubb38\uc5d0 \ub300\ud574 \uc544\ub798\uc640 \uac19\uc774 \ub2f5\ubcc0\uc744 \ud588\ub2e4."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc800\uc7a5\uacfc \uc218\uc815\ud560 \ub54c \ud544\uc694\ud55c \ud544\ub4dc\uac12\uc774 \ub3d9\uc77c\ud558\uc5ec \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c\ub294 \ud558\ub098\ub85c \uc0ac\uc6a9\ud574\ub3c4 \ub41c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud558\uc9c0\ub9cc, \ub9d0\uc500\ud574\uc8fc\uc2e0\ub300\ub85c \uc694\uad6c\uc0ac\ud56d\uc774 \ubcc0\uacbd\ub41c\ub2e4\uba74 \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\uace0 \ud310\ub2e8\ud558\uc600\uc2b5\ub2c8\ub2e4!")),(0,a.kt)("h3",{id:"\uc911\ubcf5\uacfc-\uc6b0\ubc1c\uc801-\uc911\ubcf5"},"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5"),(0,a.kt)("p",null,"\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uac70\uc9d3\ub41c \uc911\ubcf5, \uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.\n\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc0c1\ud669\uc740 \uc6b0\ubc1c\uc801 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc778\ub2e4. \uadf8\ub798\ub3c4 \uc911\ubcf5\uc744 \uc81c\uac70\ud574\ubcfc \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("h3",{id:"\ud558\ub098\ub85c-\uc0ac\uc6a9\ud558\ub294-\uac74-\uc548\uc88b\uc544\ubcf4\uc774\uace0-\uc911\ubcf5\uc740-\uc81c\uac70\ud558\uace0-\uc2f6\uc740-\ub9c8\uc74c"},"\ud558\ub098\ub85c \uc0ac\uc6a9\ud558\ub294 \uac74 \uc548\uc88b\uc544\ubcf4\uc774\uace0, \uc911\ubcf5\uc740 \uc81c\uac70\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c"),(0,a.kt)("p",null,"\uc9c0\uae08\uc740 \ucd94\uac00, \uc218\uc815 2\uac00\uc9c0 \uacbd\uc6b0 \ubc16\uc5d0 \uc5c6\uc9c0\ub9cc \uc870\uae08 \ub354 \ubcf5\uc7a1\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc8fc\uc5b4\uc838\uc11c 10\uac00\uc9c0 \uacbd\uc6b0\ub85c \uc785\ub825\uc744 \ubc1b\uc73c\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c\ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4 \uacc4\uce35\uc5d0\uc11c\ub3c4 \uacc4\uce35\uc758 \ubd84\ub9ac\ub97c \uc704\ud574\uc11c \ub2e4\ub978 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 20\uac1c\uc758 DTO\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uac00 \uc54c\ub824\uc900 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud55c \ubc29\ubc95\uc744 \ud1b5\ud574 \uc774\ub97c \ud574\uacb0\ud574\ubcf4\uc790! "),(0,a.kt)("h3",{id:"\uc911\ubcf5-\uc81c\uac70-\uc804-\ucf54\ub4dc"},"\uc911\ubcf5 \uc81c\uac70 \uc804 \ucf54\ub4dc"),(0,a.kt)("p",null,"\ud604\uc7ac \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ub418\uc5b4\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Controller\uc640 Service\uc5d0\uc11c \uc800\uc7a5, \uc218\uc815\ud560 \ub54c \uac01\uac01\uc758 DTO\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4.\n\ud604\uc7ac DTO\ub294 controller, service \ud328\ud0a4\uc9c0 \ub0b4\uc5d0 \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub77c dto\ub77c\ub294 \ud328\ud0a4\uc9c0\uc5d0 \uc704\uce58\ud558\uace0 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductService\n\u251c\u2500\u2500 dto\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf52",src:n(5430).Z,width:"1528",height:"912"})),(0,a.kt)("h3",{id:"\uc778\ud130\ud398\uc774\uc2a4-\uc791\uc131\ud558\uae30"},"\uc778\ud130\ud398\uc774\uc2a4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf53",src:n(2732).Z,width:"1518",height:"904"})),(0,a.kt)("p",null,"\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \uac12\ub4e4\uc744 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc815\uc758\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 service \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub85c \uc62e\uaca8\uc900\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductController\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public interface ProductSaveRequest {\n\n String getName();\n\n String getImage();\n\n Long getPrice();\n}\n\n// ProductService\npublic Long save(final ProductSaveRequest request) {\n final Product product = new Product(request.getName(), request.getImage(), request.getPrice());\n return productDao.saveAndGetId(product);\n}\n")),(0,a.kt)("h3",{id:"\uad6c\ud604\uccb4-\uc791\uc131\ud558\uae30"},"\uad6c\ud604\uccb4 \uc791\uc131\ud558\uae30"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"\uc911\ubcf54",src:n(3070).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc791\uc131\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub97c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uccad\uc740 ProductRequest \ud074\ub798\uc2a4\ub85c \ubc1b\uace0, \uc11c\ube44\uc2a4\uc5d0 \uc804\ub2ec\ud560 \ub550 \ud574\ub2f9 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uba85\uc138\ub9cc \ub9de\ucd94\uba74 \ubb38\uc81c\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"\u251c\u2500\u2500 controller\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductController\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductRequest\n\u251c\u2500\u2500 service\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductService\n\u2502\xa0\xa0 \u251c\u2500\u2500 ProductSaveRequest\n\u2502\xa0\xa0 \u2514\u2500\u2500 ProductUpdateRequest\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {\n\n @NotBlank(message = "\uc774\ub984\uc740 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n @Size(min = 1, max = 100, message = "\uc774\ub984\uc740 \ucd5c\uc18c {min}\uc790 \uc774\uc0c1, {max}\uc790 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final String name;\n\n @NotBlank(message = "\uc774\ubbf8\uc9c0\ub294 \uacf5\ubc31\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.")\n private final String image;\n\n @Range(message = "\uac00\uaca9\uc740 \ucd5c\uc18c {min}\uc6d0 \uc774\uc0c1, {max}\uc6d0 \uc774\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4.")\n private final long price;\n\n public ProductRequest(final String name, final String image, final long price) {\n this.name = name;\n this.image = image;\n this.price = price;\n }\n\n @Override\n public String getName() {\n return name;\n }\n\n @Override\n public String getImage() {\n return image;\n }\n\n @Override\n public long getPrice() {\n return price;\n }\n}\n\n// ProductController\n@PostMapping("/products")\npublic ResponseEntity<Void> save(@Valid @RequestBody final ProductRequest request) {\n final Long id = productService.save(request);\n return ResponseEntity.created(URI.create("/products/" + id)).build();\n}\n')),(0,a.kt)("h3",{id:"\uc815\ub9ac"},"\uc815\ub9ac"),(0,a.kt)("p",null,"\uc704\uc640 \uac19\uc774 \uad6c\ud604\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. "),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Service\uc5d0\uc11c \ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad\uc5d0 \ub300\ud55c DTO\ub97c \uc54c\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DTO\ub97c \uc81c\uc678\ud558\uace0 DTO \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \uac01 \ub808\uc774\uc5b4\uc758 \uc751\uc9d1\ub3c4\uac00 \uc99d\uac00\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ol"},"\uc694\uccad \uac1d\uccb4\ub9cc \ub2e4\ub974\uace0 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud589\uc704\ub97c \uc218\ud589\ud558\ub294 \uacbd\uc6b0 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,"\uc704 \ubc29\ubc95\uc744 \uc9c0\uae08 \ubbf8\uc158\uc5d0\uc11c \ubc14\ub85c \uc801\uc6a9\ud560\uae4c \ud558\ub2e4\uac00, \ub098\uc911\uc5d0 \ud544\uc694\ud560 \ub54c \uc801\uc6a9\ud558\uba74 \ub354 \uc88b\uc744 \uac83 \uac19\uc544\uc11c \ubbf8\uc158\uc5d0\ub294 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0c1\ud669\uc5d0 \ub9de\ucdb0 \uc801\uc7ac\uc801\uc18c\uc5d0 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud574\ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98 16\uc7a5 \ub3c5\ub9bd\uc131, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/2647/"},"https://techblog.woowahan.com/2647/"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/"},"https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/")))}s.isMDXComponent=!0},1676:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf51-ccd4f91674b224578f2b295b3fccaf2c.png"},5430:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf52-0b4f9f493909fc139f0e4579f7569a6b.png"},2732:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf53-1b6b93bc790ba29844083df5b70dbd2c.png"},3070:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/\uc911\ubcf54-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/b393c858.857a7783.js b/assets/js/b393c858.857a7783.js new file mode 100644 index 000000000..4148df46b --- /dev/null +++ b/assets/js/b393c858.857a7783.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9922],{3905:(t,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>s});var r=n(67294);function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function p(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?l(Object(n),!0).forEach((function(e){a(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function o(t,e){if(null==t)return{};var n,r,a=function(t,e){if(null==t)return{};var n,r,a={},l=Object.keys(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||(a[n]=t[n]);return a}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(a[n]=t[n])}return a}var i=r.createContext({}),m=function(t){var e=r.useContext(i),n=e;return t&&(n="function"==typeof t?t(e):p(p({},e),t)),n},u=function(t){var e=m(t.components);return r.createElement(i.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},c=r.forwardRef((function(t,e){var n=t.components,a=t.mdxType,l=t.originalType,i=t.parentName,u=o(t,["components","mdxType","originalType","parentName"]),c=m(n),s=a,d=c["".concat(i,".").concat(s)]||c[s]||k[s]||l;return n?r.createElement(d,p(p({ref:e},u),{},{components:n})):r.createElement(d,p({ref:e},u))}));function s(t,e){var n=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var l=n.length,p=new Array(l);p[0]=c;var o={};for(var i in e)hasOwnProperty.call(e,i)&&(o[i]=e[i]);o.originalType=t,o.mdxType="string"==typeof t?t:a,p[1]=o;for(var m=2;m<l;m++)p[m]=n[m];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}c.displayName="MDXCreateElement"},47084:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var r=n(87462),a=(n(67294),n(3905));const l={title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:16,tags:["Test","Mock"]},p=void 0,o={permalink:"/16",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",source:"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",description:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",date:"2023-04-04T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 4\uc77c",tags:[{label:"Test",permalink:"/tags/test"},{label:"Mock",permalink:"/tags/mock"}],readingTime:4.52,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:"16",tags:["Test","Mock"]},prevItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"},nextItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"}},i={authorsImageUrls:[]},m=[{value:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780",level:3},{value:"\ub354\ubbf8(Dummy)",id:"\ub354\ubbf8dummy",level:3},{value:"\uc2a4\ud141(Stub)",id:"\uc2a4\ud141stub",level:3},{value:"\uc2a4\ud30c\uc774(Spy)",id:"\uc2a4\ud30c\uc774spy",level:3},{value:"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)",id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock",level:3},{value:"\uac00\uc9dc(Fake)",id:"\uac00\uc9dcfake",level:3},{value:"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84",id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:m};function k(t){let{components:e,...n}=t;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?"),(0,a.kt)("p",null,"\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Gerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4."),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870")),(0,a.kt)("mermaid",{value:"flowchart LR\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\n Fake --\x3e TestDouble"}),(0,a.kt)("h3",{id:"\ub354\ubbf8dummy"},"\ub354\ubbf8(Dummy)"),(0,a.kt)("p",null,"\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud141stub"},"\uc2a4\ud141(Stub)"),(0,a.kt)("p",null,"\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud30c\uc774spy"},"\uc2a4\ud30c\uc774(Spy)"),(0,a.kt)("p",null,"\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock"},"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)"),(0,a.kt)("p",null,"\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uac00\uc9dcfake"},"\uac00\uc9dc(Fake)"),(0,a.kt)("p",null,"DOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"DOC(depended-on component)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. ")),(0,a.kt)("h3",{id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84"},"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84"),(0,a.kt)("p",null,"\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. "),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"TestDouble"),(0,a.kt)("th",{parentName:"tr",align:null},"Mock"),(0,a.kt)("th",{parentName:"tr",align:null},"Stub"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\ud3ec\ud568 \uc720\ud615"),(0,a.kt)("td",{parentName:"tr",align:null},"\ubaa9, \uc2a4\ud30c\uc774"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc6a9\ub3c4"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc124\uba85"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc608\uc2dc"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc774\uba54\uc77c \ubc1c\uc1a1"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub370\uc774\ud130 \uac80\uc0c9")))),(0,a.kt)("admonition",{title:"SUT(system under test)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.martinfowler.com/bliki/TestDouble.html"},"\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://johngrib.github.io/wiki/test-terms/"},"\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"http://xunitpatterns.com/Test%20Double.html"},"Test Double, Gerard Meszaros")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b393c858.d7958369.js b/assets/js/b393c858.d7958369.js deleted file mode 100644 index 399eb546b..000000000 --- a/assets/js/b393c858.d7958369.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9922],{3905:(t,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>s});var r=n(7294);function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function p(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?l(Object(n),!0).forEach((function(e){a(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function o(t,e){if(null==t)return{};var n,r,a=function(t,e){if(null==t)return{};var n,r,a={},l=Object.keys(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||(a[n]=t[n]);return a}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(r=0;r<l.length;r++)n=l[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(a[n]=t[n])}return a}var i=r.createContext({}),m=function(t){var e=r.useContext(i),n=e;return t&&(n="function"==typeof t?t(e):p(p({},e),t)),n},u=function(t){var e=m(t.components);return r.createElement(i.Provider,{value:e},t.children)},k={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},c=r.forwardRef((function(t,e){var n=t.components,a=t.mdxType,l=t.originalType,i=t.parentName,u=o(t,["components","mdxType","originalType","parentName"]),c=m(n),s=a,d=c["".concat(i,".").concat(s)]||c[s]||k[s]||l;return n?r.createElement(d,p(p({ref:e},u),{},{components:n})):r.createElement(d,p({ref:e},u))}));function s(t,e){var n=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var l=n.length,p=new Array(l);p[0]=c;var o={};for(var i in e)hasOwnProperty.call(e,i)&&(o[i]=e[i]);o.originalType=t,o.mdxType="string"==typeof t?t:a,p[1]=o;for(var m=2;m<l;m++)p[m]=n[m];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}c.displayName="MDXCreateElement"},7084:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var r=n(7462),a=(n(7294),n(3905));const l={title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:16,tags:["Test","Mock"]},p=void 0,o={permalink:"/16",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",source:"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",description:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",date:"2023-04-04T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 4\uc77c",tags:[{label:"Test",permalink:"/tags/test"},{label:"Mock",permalink:"/tags/mock"}],readingTime:4.52,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",slug:"16",tags:["Test","Mock"]},prevItem:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",permalink:"/17"},nextItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"}},i={authorsImageUrls:[]},m=[{value:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?",id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780",level:3},{value:"\ub354\ubbf8(Dummy)",id:"\ub354\ubbf8dummy",level:3},{value:"\uc2a4\ud141(Stub)",id:"\uc2a4\ud141stub",level:3},{value:"\uc2a4\ud30c\uc774(Spy)",id:"\uc2a4\ud30c\uc774spy",level:3},{value:"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)",id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock",level:3},{value:"\uac00\uc9dc(Fake)",id:"\uac00\uc9dcfake",level:3},{value:"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84",id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:m};function k(t){let{components:e,...n}=t;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ud14c\uc2a4\ud2b8-\ub300\uc5ed\uc774\ub780"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub780?"),(0,a.kt)("p",null,"\ubaa8\ub4e0 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac00\uc9dc \uc758\uc874\uc131\uc744 \uc758\ubbf8\ud558\uace0, \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud589\ub420 \ub54c \ub2e4\ub978 \uac1d\uccb4\ub97c \ub300\uc2e0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Gerard Meszaros\uc758 xUnit Test Patterns\ub77c\ub294 \ucc45\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ub2e4\uc12f \uac00\uc9c0(\ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774, \ubaa9, \ud398\uc774\ud06c)\ub85c \uad6c\ubd84\ud55c\ub2e4."),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \uae30\ubcf8 \uba54\ucee4\ub2c8\uc998\uc740 \ub2e4\ud615\uc131\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc678\ubd80 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uacbd\uc6b0, \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0 \uc678\ubd80 \uc11c\ube44\uc2a4 \ub300\uc2e0 \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\uc758 \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc758 \ud0c0\uc785 \uacc4\uce35 \uad6c\uc870")),(0,a.kt)("mermaid",{value:"flowchart LR\n Mock --\x3e Spy --\x3e Stub --\x3e Dummy --\x3e TestDouble\n Fake --\x3e TestDouble"}),(0,a.kt)("h3",{id:"\ub354\ubbf8dummy"},"\ub354\ubbf8(Dummy)"),(0,a.kt)("p",null,"\uac00\uc7a5 \ub2e8\uc21c\ud558\uace0, \uc6d0\uc2dc\uc801\uc778 \uc720\ud615\uc758 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf8\uc801\uc73c\ub85c \uc544\ubb34 \uc77c\ub3c4 \ud558\uc9c0 \uc54a\ub294 \uad6c\ud604\uccb4\ub85c \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9cc\uc57d \uba54\uc11c\ub4dc\uac00 \ubb34\uc5b8\uac00 \ubc18\ud658\uc744 \ud574\uc57c\ud558\ub294 \uacbd\uc6b0 0, null\uacfc \uac19\uc740 \uac12\uc744 \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud141stub"},"\uc2a4\ud141(Stub)"),(0,a.kt)("p",null,"\uc2dc\ub098\ub9ac\uc624\ub9c8\ub2e4 \ub2e4\ub978 \uac12(\ubbf8\ub9ac \uc900\ube44 \ub41c \uacb0\uacfc)\uc744 \ubc18\ud658\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc870\uac74\uc5d0\uc11c \uba54\uc11c\ub4dc\uac00 \uc608\uc0c1\ud55c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uc2a4\ud30c\uc774spy"},"\uc2a4\ud30c\uc774(Spy)"),(0,a.kt)("p",null,"\uc2a4\ud141\uacfc \uc720\uc0ac\ud558\uc9c0\ub9cc \ud638\ucd9c \uc5ec\ubd80\ub97c \uae30\ub85d\ud558\uac70\ub098 \ud638\ucd9c\ud560 \ub54c \uc804\ub2ec\ud55c \uc778\uc790\uac12\uc744 \uae30\ub85d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uba54\uc77c \uc804\uc1a1 \uae30\ub2a5\uc744 \uac00\uc9c4 \uac1d\uccb4\ub97c \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc73c\ub85c \uad6c\ud604\ud588\uc744 \ub54c \uba54\uc77c \uc804\uc1a1 \ud69f\uc218\ub97c \uae30\ub85d\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\ubaa9-\ubaa8\uc758-\uac1d\uccb4mock"},"\ubaa9, \ubaa8\uc758 \uac1d\uccb4(Mock)"),(0,a.kt)("p",null,"\ubaa9\uc740 \ub354\ubbf8, \uc2a4\ud141, \uc2a4\ud30c\uc774\ub97c \ud3ec\ud568\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \uc2dc \uc0ac\uc804\uc5d0 \uc815\uc758\ub41c \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0, \uc608\uc0c1\uce58 \ubabb\ud55c \ud638\ucd9c\uc774 \uc788\uc744 \uacbd\uc6b0 \uc608\uc678\ub97c \ub358\uc9c8 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \uac80\uc99d\uc744 \ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("h3",{id:"\uac00\uc9dcfake"},"\uac00\uc9dc(Fake)"),(0,a.kt)("p",null,"DOC\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ub354\uc6b1 \uac04\ub2e8\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ub41c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc608) \uc2e4\uc81c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \ub3d9\uc791\ud558\ub294 \uac00\uc9dc \uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"DOC(depended-on component)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\uc758\uc874 \uad6c\uc131 \uc694\uc18c, DOC\ub97c \ud14c\uc2a4\ud2b8 \ub354\ube14\ub85c \ub300\uccb4\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \ub354\ube14\uc740 DOC\uc640 \ub3d9\uc77c\ud55c API\ub97c \uc81c\uacf5\ud574\uc57c \ud55c\ub2e4. ")),(0,a.kt)("h3",{id:"\uc0c1\ud638\uc791\uc6a9\uc5d0-\ub530\ub978-\ubaa9\uacfc-\uc2a4\ud141-\uad6c\ubd84"},"\uc0c1\ud638\uc791\uc6a9\uc5d0 \ub530\ub978 \ubaa9\uacfc \uc2a4\ud141 \uad6c\ubd84"),(0,a.kt)("p",null,"\ub2e8\uc704 \ud14c\uc2a4\ud2b8 p.149 \uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \ub300\uc5ed\uc744 \ud06c\uac8c \ubaa9\uacfc \uc2a4\ud141\uc73c\ub85c \uad6c\ubd84\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa9\uc740 SUT\uc640 \uad00\ub828\ub41c \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ubc18\uba74, \uc2a4\ud141\uc740 \ub2e8\uc21c \ubaa8\ubc29\ub9cc \ud55c\ub2e4. "),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"TestDouble"),(0,a.kt)("th",{parentName:"tr",align:null},"Mock"),(0,a.kt)("th",{parentName:"tr",align:null},"Stub"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\ud3ec\ud568 \uc720\ud615"),(0,a.kt)("td",{parentName:"tr",align:null},"\ubaa9, \uc2a4\ud30c\uc774"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc2a4\ud141, \ub354\ubbf8, \ud398\uc774\ud06c")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc6a9\ub3c4"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\uace0 \uac80\uc0ac\ud558\ub294 \ub370 \uc0ac\uc6a9"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub0b4\ubd80\ub85c \ub4e4\uc5b4\uc624\ub294 \uc0c1\ud638\uc791\uc6a9\uc744 \ubaa8\ubc29\ud558\ub294 \ub370 \uc0ac\uc6a9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc124\uba85"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9"),(0,a.kt)("td",{parentName:"tr",align:null},"SUT\uac00 \uc785\ub825 \ub370\uc774\ud130\ub97c \uc5bb\uae30 \uc704\ud55c \uc758\uc874\uc131\uc744 \ud638\ucd9c\ud558\ub294 \uac83\uc5d0 \ud574\ub2f9")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"\uc608\uc2dc"),(0,a.kt)("td",{parentName:"tr",align:null},"\uc774\uba54\uc77c \ubc1c\uc1a1"),(0,a.kt)("td",{parentName:"tr",align:null},"\ub370\uc774\ud130 \uac80\uc0c9")))),(0,a.kt)("admonition",{title:"SUT(system under test)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8\ub97c \ud558\ub824\ub294 \ub300\uc0c1")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc7a5\uc778 \uc815\uc2e0 \uc774\uc57c\uae30 - 3\uc7a5 \uace0\uae09 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c, \ub85c\ubc84\ud2b8 C. \ub9c8\ud2f4",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc704 \ud14c\uc2a4\ud2b8 - 5\uc7a5 \ubaa9\uacfc \ud14c\uc2a4\ud2b8 \ucde8\uc57d\uc131, \ube14\ub77c\ub514\ubbf8\ub974 \ucf54\ub9ac\ucf54\ud504",(0,a.kt)("br",{parentName:"p"}),"\n","\ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c \uc2dc\uc791\ud558\uae30 - 7\uc7a5 \ub300\uc5ed, \ucd5c\ubc94\uade0",(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.martinfowler.com/bliki/TestDouble.html"},"\ud14c\uc2a4\ud2b8 \ub354\ube14, Martin Fowler"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://johngrib.github.io/wiki/test-terms/"},"\ud14c\uc2a4\ud2b8 \uad00\ub828 \uc6a9\uc5b4 \uc815\ub9ac, Johngrib"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"http://xunitpatterns.com/Test%20Double.html"},"Test Double, Gerard Meszaros")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b474adfe.859d75dc.js b/assets/js/b474adfe.859d75dc.js new file mode 100644 index 000000000..da869f879 --- /dev/null +++ b/assets/js/b474adfe.859d75dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[573],{85419:e=>{e.exports=JSON.parse('{"permalink":"/tags/image/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/image","nextPage":"/tags/image/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b474adfe.b31e9691.js b/assets/js/b474adfe.b31e9691.js deleted file mode 100644 index 2ccdbb50c..000000000 --- a/assets/js/b474adfe.b31e9691.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[573],{5419:e=>{e.exports=JSON.parse('{"permalink":"/tags/image/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/image","nextPage":"/tags/image/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b5f3dcc5.3594b25d.js b/assets/js/b5f3dcc5.3594b25d.js new file mode 100644 index 000000000..98c9b10f1 --- /dev/null +++ b/assets/js/b5f3dcc5.3594b25d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7723],{23005:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/15","page":15,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/14","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b5f3dcc5.37c24d94.js b/assets/js/b5f3dcc5.37c24d94.js deleted file mode 100644 index 0b9eb8a4e..000000000 --- a/assets/js/b5f3dcc5.37c24d94.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7723],{3005:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/15","page":15,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/14","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b73048db.6c32de44.js b/assets/js/b73048db.6c32de44.js deleted file mode 100644 index 2f33ba8f7..000000000 --- a/assets/js/b73048db.6c32de44.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5912],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),i=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):u(u({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(o.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=i(r),d=a,v=p["".concat(o,".").concat(d)]||p[d]||m[d]||l;return r?n.createElement(v,u(u({ref:t},c),{},{components:r})):n.createElement(v,u({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,u=new Array(l);u[0]=p;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s.mdxType="string"==typeof e?e:a,u[1]=s;for(var i=2;i<l;i++)u[i]=r[i];return n.createElement.apply(null,u)}return n.createElement.apply(null,r)}p.displayName="MDXCreateElement"},8838:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const l={title:"Parameterized Tests",slug:7,tags:["Java"]},u=void 0,s={permalink:"/7",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-12-Parameterized Tests.mdx",source:"@site/blog/2023/2023-02-12-Parameterized Tests.mdx",title:"Parameterized Tests",description:"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",date:"2023-02-12T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 12\uc77c",tags:[{label:"Java",permalink:"/tags/java"}],readingTime:3.17,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Parameterized Tests",slug:"7",tags:["Java"]},prevItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"},nextItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"}},o={authorsImageUrls:[]},i=[{value:"Argument Sources",id:"argument-sources",level:2},{value:"Value Source",id:"value-source",level:3},{value:"Null & Empty Source",id:"null--empty-source",level:3},{value:"Enum Source",id:"enum-source",level:3},{value:"CSV Source",id:"csv-source",level:3},{value:"Method Source",id:"method-source",level:3},{value:"ETC.",id:"etc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:i};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c ",(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h2",{id:"argument-sources"},"Argument Sources"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","JUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"value-source"},"Value Source"),(0,a.kt)("p",null,"\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"short, int, long, float, double"),(0,a.kt)("li",{parentName:"ul"},"byte, char, boolean, String, Class ")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\nvoid valueTest(final int value) {\n Assertions.assertThat(value).isPositive();\n}\n")),(0,a.kt)("h3",{id:"null--empty-source"},"Null & Empty Source"),(0,a.kt)("p",null,"null \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Empty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"String"),(0,a.kt)("li",{parentName:"ul"},"java.util.List, java.util.Set, java.util.Map"),(0,a.kt)("li",{parentName:"ul"},"primitive arrays \u2014 ex) int[]"),(0,a.kt)("li",{parentName:"ul"},"object arrays \u2014 ex) String[]")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@NullAndEmptySource\nvoid nullAndEmptyTest(final String value) {\n Assertions.assertThat(value).isNullOrEmpty();\n}\n")),(0,a.kt)("h3",{id:"enum-source"},"Enum Source"),(0,a.kt)("p",null,"EnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"enum Day {\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n}\n\n@ParameterizedTest\n@EnumSource(Day.class)\nvoid enumTest(final Day day) {\n assertThat(day).isInstanceOf(Day.class);\n}\n")),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)\nvoid enumTest(final Day day) {\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\n assertThat(day).isInstanceOf(Day.class);\n}\n')),(0,a.kt)("h3",{id:"csv-source"},"CSV Source"),(0,a.kt)("p",null,"csv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@CsvSource({"1,1", "2,4", "3,9", "4,16"})\nvoid csvTest(final int number, final int result) {\n assertThat(number * number).isEqualTo(result);\n}\n')),(0,a.kt)("h3",{id:"method-source"},"Method Source"),(0,a.kt)("p",null,"\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@MethodSource\nvoid methodTest(final List<Integer> numbers, final int count) {\n assertThat(numbers).hasSize(count);\n}\n\nprivate static Stream<Arguments> methodTest() {\n return Stream.of(\n Arguments.of(List.of(1), 1),\n Arguments.of(List.of(1, 2), 2),\n Arguments.of(List.of(1, 2, 3), 3)\n );\n}\n")),(0,a.kt)("h3",{id:"etc"},"ETC."),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource"),(0,a.kt)("li",{parentName:"ul"},"ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource")),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/parameterized-tests-junit-5"},"Guide to JUnit 5 Parameterized Tests"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b73048db.8ac66e18.js b/assets/js/b73048db.8ac66e18.js new file mode 100644 index 000000000..320a088c7 --- /dev/null +++ b/assets/js/b73048db.8ac66e18.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5912],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),i=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):u(u({},t),e)),r},c=function(e){var t=i(e.components);return n.createElement(o.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=i(r),d=a,v=p["".concat(o,".").concat(d)]||p[d]||m[d]||l;return r?n.createElement(v,u(u({ref:t},c),{},{components:r})):n.createElement(v,u({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,u=new Array(l);u[0]=p;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s.mdxType="string"==typeof e?e:a,u[1]=s;for(var i=2;i<l;i++)u[i]=r[i];return n.createElement.apply(null,u)}return n.createElement.apply(null,r)}p.displayName="MDXCreateElement"},98838:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>i});var n=r(87462),a=(r(67294),r(3905));const l={title:"Parameterized Tests",slug:7,tags:["Java"]},u=void 0,s={permalink:"/7",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-12-Parameterized Tests.mdx",source:"@site/blog/2023/2023-02-12-Parameterized Tests.mdx",title:"Parameterized Tests",description:"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",date:"2023-02-12T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 12\uc77c",tags:[{label:"Java",permalink:"/tags/java"}],readingTime:3.17,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Parameterized Tests",slug:"7",tags:["Java"]},prevItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"},nextItem:{title:"IntelliJ \uc124\uc815",permalink:"/6"}},o={authorsImageUrls:[]},i=[{value:"Argument Sources",id:"argument-sources",level:2},{value:"Value Source",id:"value-source",level:3},{value:"Null & Empty Source",id:"null--empty-source",level:3},{value:"Enum Source",id:"enum-source",level:3},{value:"CSV Source",id:"csv-source",level:3},{value:"Method Source",id:"method-source",level:3},{value:"ETC.",id:"etc",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:i};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\ub2e4\ubcf4\uba74 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \ub530\ub77c \ubc18\ubcf5\uc774 \ub418\ub294 \ud14c\uc2a4\ud2b8\ub4e4\uc774 \uc0dd\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c ",(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e8\uc77c \ud14c\uc2a4\ud2b8\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubc88 \ubc18\ubcf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h2",{id:"argument-sources"},"Argument Sources"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"@ParameterizedTest"),"\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ucd5c\uc18c \ud558\ub098 \uc774\uc0c1\uc758 Source \uc560\ub178\ud14c\uc774\uc158\uc774 \ud544\uc694\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","JUnit\uc774 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c Source\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\uc5d0 \ub9de\ucdb0 \ub2e4\uc591\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("h3",{id:"value-source"},"Value Source"),(0,a.kt)("p",null,"\uac12\uc744 \uc774\uc6a9\ud558\uc5ec \uc81c\uacf5\ud558\ub294 \ud615\ud0dc\ub85c, \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"short, int, long, float, double"),(0,a.kt)("li",{parentName:"ul"},"byte, char, boolean, String, Class ")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@ValueSource(ints = {1, 100, Integer.MAX_VALUE})\nvoid valueTest(final int value) {\n Assertions.assertThat(value).isPositive();\n}\n")),(0,a.kt)("h3",{id:"null--empty-source"},"Null & Empty Source"),(0,a.kt)("p",null,"null \uac12, \ube48 \uac12\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Empty Source\uc758 \uacbd\uc6b0 \ub2e4\uc74c\uacfc \uac19\uc740 \ud0c0\uc785\uc5d0 \ud55c\ud574 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"String"),(0,a.kt)("li",{parentName:"ul"},"java.util.List, java.util.Set, java.util.Map"),(0,a.kt)("li",{parentName:"ul"},"primitive arrays \u2014 ex) int[]"),(0,a.kt)("li",{parentName:"ul"},"object arrays \u2014 ex) String[]")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@NullAndEmptySource\nvoid nullAndEmptyTest(final String value) {\n Assertions.assertThat(value).isNullOrEmpty();\n}\n")),(0,a.kt)("h3",{id:"enum-source"},"Enum Source"),(0,a.kt)("p",null,"EnumSource\ub97c \uc774\uc6a9\ud558\uc5ec Enum \ub610\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"enum Day {\n MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n}\n\n@ParameterizedTest\n@EnumSource(Day.class)\nvoid enumTest(final Day day) {\n assertThat(day).isInstanceOf(Day.class);\n}\n")),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 mode \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud2b9\uc9d5 Enum\uc744 \uc81c\uc678\ud558\uac70\ub098, \ud3ec\ud568\uc2dc\ud0ac \uc218 \uc788\ub2e4. (default: Mode.Include)"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)\nvoid enumTest(final Day day) {\n // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\n assertThat(day).isInstanceOf(Day.class);\n}\n')),(0,a.kt)("h3",{id:"csv-source"},"CSV Source"),(0,a.kt)("p",null,"csv \ud615\uc2dd\uc758 \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ubd84\uc790\uc758 \uae30\ubcf8\uac12\uc740 \uc27c\ud45c(,)\ub85c \uad6c\ubd84\uc790\ub97c \ubcc0\uacbd\ud558\uace0 \uc2f6\uc744 \ub550 delimeter \uac12\uc744 \ub530\ub85c \uc804\ub2ec\ud558\uc5ec \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\n\uac1c\uc778\uc801\uc73c\ub85c 2\uac1c \uc815\ub3c4\uc758 \uac12\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud558\ub294 \uacbd\uc6b0 CsvSource\ub97c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@ParameterizedTest\n@CsvSource({"1,1", "2,4", "3,9", "4,16"})\nvoid csvTest(final int number, final int result) {\n assertThat(number * number).isEqualTo(result);\n}\n')),(0,a.kt)("h3",{id:"method-source"},"Method Source"),(0,a.kt)("p",null,"\ubcf5\uc7a1\ud55c \ud0c0\uc785\uc758 \uac12\uc744 \uc804\ub2ec\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \uc785\ub825\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc\uba85\uc744 \ub530\ub85c \uc785\ub825\ud558\uc9c0 \uc54a\uc73c\uba74 \ud14c\uc2a4\ud2b8\uba85\uacfc \ub3d9\uc77c\ud55c static \uba54\uc11c\ub4dc\uac00 \uc9c0\uc815\ub41c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@ParameterizedTest\n@MethodSource\nvoid methodTest(final List<Integer> numbers, final int count) {\n assertThat(numbers).hasSize(count);\n}\n\nprivate static Stream<Arguments> methodTest() {\n return Stream.of(\n Arguments.of(List.of(1), 1),\n Arguments.of(List.of(1, 2), 2),\n Arguments.of(List.of(1, 2, 3), 3)\n );\n}\n")),(0,a.kt)("h3",{id:"etc"},"ETC."),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc5b8\uae09\ud55c \ubc29\ubc95 \uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub9e4\uac1c\ubcc0\uc218\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud55c CsvFileSource"),(0,a.kt)("li",{parentName:"ul"},"ArgumentsProvider \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 ArgumentsSource")),(0,a.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://www.baeldung.com/parameterized-tests-junit-5"},"Guide to JUnit 5 Parameterized Tests"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b7811d78.76646830.js b/assets/js/b7811d78.76646830.js new file mode 100644 index 000000000..5ca9dedef --- /dev/null +++ b/assets/js/b7811d78.76646830.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7008],{3905:(e,t,n)=>{n.d(t,{Zo:()=>i,kt:()=>b});var r=n(67294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){l(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,l=function(e,t){if(null==e)return{};var n,r,l={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var u=r.createContext({}),c=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},i=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,u=e.parentName,i=p(e,["components","mdxType","originalType","parentName"]),m=c(n),b=l,s=m["".concat(u,".").concat(b)]||m[b]||k[b]||o;return n?r.createElement(s,a(a({ref:t},i),{},{components:n})):r.createElement(s,a({ref:t},i))}));function b(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=m;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p.mdxType="string"==typeof e?e:l,a[1]=p;for(var c=2;c<o;c++)a[c]=n[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},46111:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>k,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var r=n(87462),l=(n(67294),n(3905));const o={title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:3,tags:["Book"]},a=void 0,p={permalink:"/3",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",source:"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",description:"\ucc45 \uc815\ubcf4",date:"2023-01-07T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 7\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.415,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:"3",tags:["Book"]},prevItem:{title:"JSR-310",permalink:"/4"},nextItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},u={authorsImageUrls:[]},c=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173",id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:c};function k(e){let{components:t,...n}=e;return(0,l.kt)("wrapper",(0,r.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",(0,l.kt)("br",{parentName:"p"}),"\n","\uc870\uc601\ud638")),(0,l.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,l.kt)("p",null,"\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. "),(0,l.kt)("p",null,"\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0",(0,l.kt)("br",{parentName:"p"}),"\n","\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4."),(0,l.kt)("h3",{id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173"},"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173"),(0,l.kt)("p",null,"\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558"),(0,l.kt)("li",{parentName:"ul"},"\ucc45\uc784\uc758 \ucd94\uc0c1\ud654")),(0,l.kt)("p",null,"\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac")),(0,l.kt)("p",null,"\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558")),(0,l.kt)("p",null,"\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00")),(0,l.kt)("p",null,"\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0")),(0,l.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\np.21")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\np.33")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},(0,l.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8")),(0,l.kt)("p",{parentName:"blockquote"},"\uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95"),(0,l.kt)("p",{parentName:"blockquote"},"\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\np.35")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\np.38")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\np.105")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\np.158")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b7811d78.ea18260b.js b/assets/js/b7811d78.ea18260b.js deleted file mode 100644 index 06d15b258..000000000 --- a/assets/js/b7811d78.ea18260b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7008],{3905:(e,t,n)=>{n.d(t,{Zo:()=>i,kt:()=>b});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){l(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,l=function(e,t){if(null==e)return{};var n,r,l={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var u=r.createContext({}),c=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},i=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,u=e.parentName,i=p(e,["components","mdxType","originalType","parentName"]),m=c(n),b=l,s=m["".concat(u,".").concat(b)]||m[b]||k[b]||o;return n?r.createElement(s,a(a({ref:t},i),{},{components:n})):r.createElement(s,a({ref:t},i))}));function b(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=m;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p.mdxType="string"==typeof e?e:l,a[1]=p;for(var c=2;c<o;c++)a[c]=n[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6111:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>k,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var r=n(7462),l=(n(7294),n(3905));const o={title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:3,tags:["Book"]},a=void 0,p={permalink:"/3",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",source:"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",description:"\ucc45 \uc815\ubcf4",date:"2023-01-07T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 7\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.415,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:"3",tags:["Book"]},prevItem:{title:"JSR-310",permalink:"/4"},nextItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},u={authorsImageUrls:[]},c=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173",id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:c};function k(e){let{components:t,...n}=e;return(0,l.kt)("wrapper",(0,r.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",(0,l.kt)("br",{parentName:"p"}),"\n","\uc870\uc601\ud638")),(0,l.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,l.kt)("p",null,"\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. "),(0,l.kt)("p",null,"\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0",(0,l.kt)("br",{parentName:"p"}),"\n","\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4."),(0,l.kt)("h3",{id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173"},"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173"),(0,l.kt)("p",null,"\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558"),(0,l.kt)("li",{parentName:"ul"},"\ucc45\uc784\uc758 \ucd94\uc0c1\ud654")),(0,l.kt)("p",null,"\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac")),(0,l.kt)("p",null,"\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558")),(0,l.kt)("p",null,"\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00")),(0,l.kt)("p",null,"\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0")),(0,l.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\np.21")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\np.33")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},(0,l.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8")),(0,l.kt)("p",{parentName:"blockquote"},"\uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95"),(0,l.kt)("p",{parentName:"blockquote"},"\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\np.35")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\np.38")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\np.105")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\np.158")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b7d33121.17983764.js b/assets/js/b7d33121.17983764.js new file mode 100644 index 000000000..4b6cf6949 --- /dev/null +++ b/assets/js/b7d33121.17983764.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7153],{72005:e=>{e.exports=JSON.parse('{"label":"cloudwatch","permalink":"/tags/cloudwatch","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/b8de016f.3395513f.js b/assets/js/b8de016f.3395513f.js new file mode 100644 index 000000000..3b322017e --- /dev/null +++ b/assets/js/b8de016f.3395513f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7340],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),k=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=k(e.components);return n.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},i=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),i=k(r),b=a,s=i["".concat(u,".").concat(b)]||i[b]||m[b]||p;return r?n.createElement(s,o(o({ref:t},c),{},{components:r})):n.createElement(s,o({ref:t},c))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=i;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var k=2;k<p;k++)o[k]=r[k];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}i.displayName="MDXCreateElement"},5055:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>p,metadata:()=>l,toc:()=>k});var n=r(87462),a=(r(67294),r(3905));const p={title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:20,tags:["Book"]},o=void 0,l={permalink:"/20",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",source:"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",description:"\ucc45 \uc815\ubcf4",date:"2023-04-08T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 8\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.16,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:"20",tags:["Book"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"},nextItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"}},u={authorsImageUrls:[]},k=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18",id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],c={toc:k};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ube48\uc800\uc5f0\uad6c\uc18c")),(0,a.kt)("h3",{id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18"},"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18"),(0,a.kt)("p",null,"\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 "),(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704")),(0,a.kt)("p",null,"\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,a.kt)("p",null,"\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. "),(0,a.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","R. D. \ub7ad",(0,a.kt)("br",{parentName:"p"}),"\n","p.19")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.66")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc54c\ub7ad, \ud0c1\ub2db\ud55c",(0,a.kt)("br",{parentName:"p"}),"\n","p.103")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.175")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0.",(0,a.kt)("br",{parentName:"p"}),"\n","p.188")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.214")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.224")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.280")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8de016f.a35bb9b6.js b/assets/js/b8de016f.a35bb9b6.js deleted file mode 100644 index 42f6c3e72..000000000 --- a/assets/js/b8de016f.a35bb9b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7340],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),k=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=k(e.components);return n.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},i=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),i=k(r),b=a,s=i["".concat(u,".").concat(b)]||i[b]||m[b]||p;return r?n.createElement(s,o(o({ref:t},c),{},{components:r})):n.createElement(s,o({ref:t},c))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=i;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var k=2;k<p;k++)o[k]=r[k];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}i.displayName="MDXCreateElement"},5055:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>p,metadata:()=>l,toc:()=>k});var n=r(7462),a=(r(7294),r(3905));const p={title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:20,tags:["Book"]},o=void 0,l={permalink:"/20",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",source:"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",description:"\ucc45 \uc815\ubcf4",date:"2023-04-08T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 8\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.16,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",slug:"20",tags:["Book"]},prevItem:{title:"[\ud14c\ucf54\ucc57] 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30",permalink:"/21"},nextItem:{title:"InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/19"}},u={authorsImageUrls:[]},k=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18",id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],c={toc:k};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ube48\uc800\uc5f0\uad6c\uc18c")),(0,a.kt)("h3",{id:"\uc790\uae30\uae30\ub9cc\uacfc-\uc790\uae30\ubc30\ubc18"},"\uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18"),(0,a.kt)("p",null,"\ucc45\uc5d0\uc11c\ub294 \uc790\uae30\uae30\ub9cc\uacfc \uc790\uae30\ubc30\ubc18\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\uae30\ub9cc: \uc790\uc2e0\uc758 \ubb38\uc81c\ub97c \uc778\uc815\ud558\uc9c0 \uc54a\ub294 \uac83 "),(0,a.kt)("li",{parentName:"ul"},"\uc790\uae30\ubc30\ubc18: \ub2e4\ub978 \uc0ac\ub78c\uc744 \uc704\ud574 \ubb34\uc5b8\uac00 \ud574\uc57c\ub9cc \ud55c\ub2e4\ub294 \uc0dd\uac01\uc744 \ubc18\ud558\ub294 \ud589\uc704")),(0,a.kt)("p",null,"\uc790\uae30\ubc30\ubc18\uc744 \ud55c\ub2e4\uba74 \uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uac00 \ub41c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\uae30\uae30\ub9cc \uc0c1\ud0dc\uc5d0 \ube60\uc9c0\ub294 \uac83\uc744 \ucc45\uc5d0\uc11c\ub294 \uc0c1\uc790 \uc548\uc5d0 \ub4e4\uc5b4\uac04\ub2e4\uace0 \ud45c\ud604\ud55c\ub2e4. "),(0,a.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,a.kt)("p",null,"\ucd5c\uadfc\uc5d0 \uc77d\uc740 \ucc45 \uc911 \uac00\uc7a5 \ub9c8\uc74c\uc774 \ubd88\ud3b8\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30\uc5d0 \ub354\ub354\uc6b1 \ub098\uc5d0\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\uc774 \ub2f4\uaca8\uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0b4\uba74\uc11c \ub9ce\uc740 \uc120\ud0dd\uc758 \uc21c\uac04\uc774 \uc874\uc7ac\ud588\uace0, \uadf8 \uc21c\uac04\ub9c8\ub2e4 \uc790\uae30\ubc30\ubc18\uc744 \ud0dd\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc791\uac8c\ub294 \uc9d1\uc548\uc77c\uc744 \ud574\uc57c \ud558\ub294\ub370 \ubab8\uc774 \uc870\uae08 \ud798\ub4e4\ub2e4\uace0 \ud558\uc9c0 \uc54a\uac70\ub098",(0,a.kt)("br",{parentName:"p"}),"\n","\ud06c\uac8c\ub294 \uc798\ubabb\uc744 \uc778\uc815\ud574\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uadf8\ub7ec\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub7f0 \uc0c1\ud669\uc774 \ubc18\ubcf5\ub418\uc5b4 \uacb0\uad6d \uc0c1\uc790 \uc548\uc5d0 \ub098 \uc790\uc2e0\uc744 \uac00\ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\ub354 \ub098\uc740 \uc0b6\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \uc9c0\uc18d\uc801\uc73c\ub85c \ud655\uc778\ud558\uace0, \uc0c1\uc790 \ubc16\uc73c\ub85c \ub098\uac00\ub824\ub294 \uc5f0\uc2b5\uc744 \ud574\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub113\uc740 \uc2dc\uc120\uc744 \uac00\uc9c0\uace0, \ud56d\uc0c1 \ub0b4\uac00 \ud2c0\ub9b4 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc0dd\uac01\ud558\uace0 \uc0b4\uc544\uac00\uc790. "),(0,a.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uc758 \uc0dd\uac01\uc740 \uc9c0\uc2dd\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc9c0\uc2dd\uc740 \uc0ac\ub791\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc0ac\ub791\uc740 \uc874\uc7ac\ubcf4\ub2e4 \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\ub9ac\uac00 \uc0dd\uac01\ud558\ub294 \ub098\ub294 \uc2e4\uc81c\uc758 \ub098\ubcf4\ub2e4 \uadf8\ub9cc\ud07c \uc791\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","R. D. \ub7ad",(0,a.kt)("br",{parentName:"p"}),"\n","p.19")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc678\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud589\ub3d9\uc744 \ud558\ub4e0\uc9c0 \uac04\uc5d0, \uc0ac\ub78c\ub4e4\uc740 \uc6b0\ub9ac \ub9c8\uc74c\uc5d0\uc11c \uadf8\ub4e4\uc744 \uc5b4\ub5bb\uac8c \ub300\ud558\uace0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \uc8fc\ub85c \ubc18\uc751\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uc0ac\ub78c\ub4e4\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \ub290\ub07c\uac8c \ub418\ub294\uc9c0\ub294 \uc6b0\ub9ac\uac00 \uc0c1\uc790 \uc548\uc5d0 \uc788\ub294\uc9c0 \ud639\uc740 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\uac8c \ub429\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.66")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ube44\ub09c\uc740 \uac10\uc815\uc5d0 \uc18d\ud558\uace0 \ub099\uad00\uc740 \uc758\uc9c0\uc5d0 \uc18d\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc778\uac04\uc740 \uac10\uc815\ubcf4\ub2e4 \ub354 \ud070 \uc874\uc7ac\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc54c\ub7ad, \ud0c1\ub2db\ud55c",(0,a.kt)("br",{parentName:"p"}),"\n","p.103")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\uac00 \uc790\uc2e0\uc5d0\uac8c\ub9cc \uc9d1\uc911\ud558\uace0 \uc788\ub294 \ud55c, \ud63c\uc790\uc11c \uc77c\ud558\ub294 \uac83 \uc774\uc0c1\uc758 \ucc3d\uc870\uc801\uc778 \uacb0\uacfc\ub098 \ud611\ub825\uc744 \uc774\ub04c\uc5b4 \ub0b8\ub2e4\ub294 \uac83\uc740 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc624\ub298\ub0a0 \uacbd\uc81c \ud658\uacbd\uc5d0\uc11c\ub294 \ud63c\uc790\uc11c\ub294 \uc77c\uc758 \uacb0\uacfc\ub97c \ud0c1\uc6d4\ud558\uac8c \ub9cc\ub4e4\uc5b4 \ub0b4\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc911\uc2ec\uc774\uc5b4\uc57c \ub41c\ub2e4\ub294 \ud3d0\uc1c4\uc801\uc778 \uc0ac\uace0\ub294 \ud568\uaed8 \uc77c\ud558\ub294 \uc0ac\ub78c\ub4e4\uc758 \uc5f4\uc815\uc744 \ubd88\ub7ec\uc624\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.175")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc194\uc9c1\ud568\uc740 \uc6b0\ub9ac\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\uc740 \uc790\uc2e0\uc758 \ud589\ub3d9\uacfc \uad00\ub828\ub41c \uc0ac\ub78c\uc5d0 \ub300\ud574 \uae30\uaebc\uc774 \uc0ac\uacfc\ub97c \ud558\ub294 \uac83\uc785\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub9cc\uc774 \uc2e4\ud0c0\ub798\ucc98\ub7fc \uc5c9\ud0a8 \uad00\uacc4\uc758 \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0.",(0,a.kt)("br",{parentName:"p"}),"\n","p.188")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub204\uad70\uac00\ub97c \ub098\uc640 \uac19\uc774 \ub3d9\uc77c\ud55c \uac00\uce58\ub97c \uc9c0\ub2cc \ud55c \uc778\uac04\uc73c\ub85c \uc0dd\uac01\ud574\uc11c \uadf8 \uc0ac\ub78c\uc744 \uc704\ud574 \ub0b4\uac00 \uc0c1\uc790 \ubc16\uc5d0 \uacc4\uc18d \uba38\ubb34\ub974\uace0 \uc2f6\uc740 \uc5f4\ub9dd\uc774 \uc0dd\uae38 \ub54c, \ub098\ub294 \uc774\ubbf8 \uadf8 \uc0ac\ub78c\uc5d0 \ub300\ud574 \uc0c1\uc790 \ubc16\uc5d0 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.214")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ub4e4\uc774 \uad00\uacc4 \uae30\uc220\uc744 \uac00\uc9c0\uace0 \uadf8\ub4e4\uc774 \uacaa\uace0 \uc788\ub294 \ubb38\uc81c\ub97c \ubc14\ub85c\uc7a1\uc73c\ub824\uace0 \ud558\ub294 \ub178\ub825\uc774 \uacb0\uc2e4\uc744 \uc5bb\uc9c0 \ubabb\ud558\ub294 \uac83\uc740 \uacb0\ucf54 \uadf8\ub7ec\ud55c \uae30\uc220 \ubd80\uc871 \ub54c\ubb38\uc5d0 \uc0dd\uae30\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\uac83\ub4e4\uc740 \uc790\uae30\ubc30\ubc18 \ub54c\ubb38\uc5d0 \uc0dd\uaca8\ub0a9\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.224")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\uc6b0\ub9ac\ub294 \ud568\uaed8 \uc77c\ud558\uace0 \uc6b0\ub9ac\uc640 \ud568\uaed8 \uc0b4\uc544\uac00\ub294 \uc0ac\ub78c\uc774 \uc9c4\uc815\uc73c\ub85c \ub204\uad6c\uc778\uc9c0 \uc54c\uc9c0 \ubabb\ud569\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uac00 \uadf8\ub4e4\uacfc \uc9c4\uc815\uc73c\ub85c \ud568\uaed8 \uc18c\ud1b5\ud558\uae30 \uc804\uae4c\uc9c0\ub294 \uc6b0\ub9ac\ub294 \uadf8\ub4e4\uc758 \uac00\uce58\ub97c \uc798 \ubaa8\ub985\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ub9ac\uc758 \uc704\ub300\ud568\uc774\ub780 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc758 \uc704\ub300\ud55c \uc810\uc744 \ubc1c\uacac\ud574 \uc8fc\ub294 \uac83\uc5d0 \uc788\uc2b5\ub2c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","p.280")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b9bcab37.0fb141a9.js b/assets/js/b9bcab37.0fb141a9.js deleted file mode 100644 index ba6847eac..000000000 --- a/assets/js/b9bcab37.0fb141a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7688],{3632:e=>{e.exports=JSON.parse('{"label":"GRASP","permalink":"/tags/grasp","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/b9bcab37.2fcdcd9c.js b/assets/js/b9bcab37.2fcdcd9c.js new file mode 100644 index 000000000..31018c52c --- /dev/null +++ b/assets/js/b9bcab37.2fcdcd9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7688],{43632:e=>{e.exports=JSON.parse('{"label":"GRASP","permalink":"/tags/grasp","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/bbc01ba0.7dffe8aa.js b/assets/js/bbc01ba0.7dffe8aa.js deleted file mode 100644 index fcebdb5ef..000000000 --- a/assets/js/bbc01ba0.7dffe8aa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3009],{2333:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/bbc01ba0.8f5af35b.js b/assets/js/bbc01ba0.8f5af35b.js new file mode 100644 index 000000000..d854afd17 --- /dev/null +++ b/assets/js/bbc01ba0.8f5af35b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3009],{12333:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/bbceb8f1.40f1e732.js b/assets/js/bbceb8f1.40f1e732.js new file mode 100644 index 000000000..c059f240d --- /dev/null +++ b/assets/js/bbceb8f1.40f1e732.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[653],{26529:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/5","page":5,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/4","nextPage":"/tags/woowahan-techcourse/page/6","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/bbceb8f1.fd1ed8b7.js b/assets/js/bbceb8f1.fd1ed8b7.js deleted file mode 100644 index 35138106e..000000000 --- a/assets/js/bbceb8f1.fd1ed8b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[653],{6529:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/5","page":5,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/4","nextPage":"/tags/woowahan-techcourse/page/6","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/bd2d06b5.199371d9.js b/assets/js/bd2d06b5.199371d9.js deleted file mode 100644 index fa08f0a53..000000000 --- a/assets/js/bd2d06b5.199371d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9763],{3081:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/bd2d06b5.4060203d.js b/assets/js/bd2d06b5.4060203d.js new file mode 100644 index 000000000..bdb95d8ec --- /dev/null +++ b/assets/js/bd2d06b5.4060203d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9763],{93081:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/bf933b37.56ca3009.js b/assets/js/bf933b37.56ca3009.js new file mode 100644 index 000000000..f5ce0263f --- /dev/null +++ b/assets/js/bf933b37.56ca3009.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3095],{52954:e=>{e.exports=JSON.parse('{"permalink":"/tags/my-sql","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/bf933b37.a8add082.js b/assets/js/bf933b37.a8add082.js deleted file mode 100644 index c69187234..000000000 --- a/assets/js/bf933b37.a8add082.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3095],{2954:e=>{e.exports=JSON.parse('{"permalink":"/tags/my-sql","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c037d168.96f06126.js b/assets/js/c037d168.96f06126.js new file mode 100644 index 000000000..37ade0afc --- /dev/null +++ b/assets/js/c037d168.96f06126.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6587],{41235:e=>{e.exports=JSON.parse('{"permalink":"/tags/transaction","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c0a61fca.4dff8159.js b/assets/js/c0a61fca.4dff8159.js deleted file mode 100644 index c5f53dd1e..000000000 --- a/assets/js/c0a61fca.4dff8159.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[344],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),i=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=i(r),k=a,b=m["".concat(c,".").concat(k)]||m[k]||s[k]||l;return r?n.createElement(b,o(o({ref:t},u),{},{components:r})):n.createElement(b,o({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=m;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:a,o[1]=p;for(var i=2;i<l;i++)o[i]=r[i];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},5086:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var n=r(7462),a=(r(7294),r(3905));const l={title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:25,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,p={permalink:"/25",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",date:"2023-05-12T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 12\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.78,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:"25",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"},nextItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"}},c={authorsImageUrls:[]},i=[{value:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:i};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158"},"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Interceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5")),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto1",src:r(8960).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto2",src:r(4885).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9")),(0,a.kt)("p",null,"\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\ub85d")),(0,a.kt)("p",null,"\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"))}s.isMDXComponent=!0},8960:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto1-ccd4f91674b224578f2b295b3fccaf2c.png"},4885:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto2-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/c0a61fca.7cbdf820.js b/assets/js/c0a61fca.7cbdf820.js new file mode 100644 index 000000000..df8a931cd --- /dev/null +++ b/assets/js/c0a61fca.7cbdf820.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[344],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),i=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(c.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=i(r),k=a,b=m["".concat(c,".").concat(k)]||m[k]||s[k]||l;return r?n.createElement(b,o(o({ref:t},u),{},{components:r})):n.createElement(b,o({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=m;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:a,o[1]=p;for(var i=2;i<l;i++)o[i]=r[i];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},95086:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>i});var n=r(87462),a=(r(67294),r(3905));const l={title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:25,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,p={permalink:"/25",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",date:"2023-05-12T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 12\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:4.78,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",slug:"25",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"},nextItem:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",permalink:"/24"}},c={authorsImageUrls:[]},i=[{value:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158",id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:i};function s(e){let{components:t,...l}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc7a5\ubc14\uad6c\ub2c8-\ubbf8\uc158"},"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc740 \ube14\ub799\ucea3\uc774\ub791 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uad6c\uc0ac\ud56d\uc774 \uc5c4\uccad \ubcf5\uc7a1\ud55c \ubbf8\uc158\uc740 \uc544\ub2c8\uc5c8\uace0, \uc2a4\ud504\ub9c1\uc744 \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 CRUD\ub97c \uad6c\ud604\ud558\ub294 \ubbf8\uc158\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","2\ub2e8\uacc4\uc5d0\uc11c\ub294 Basic \uc778\uc99d\uc744 \ud1b5\ud574 \uc790\uc2e0\uc758 \uc7a5\ubc14\uad6c\ub2c8\uc5d0\ub9cc \uc0c1\ud488\uc744 \ub2f4\uace0, \uc81c\uac70\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud558\ub294 \uc694\uad6c\uc0ac\ud56d\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","Interceptor\ub098 Argument Resolver\uc5d0 \ub300\ud55c \uc774\ud574\ub3c4\uac00 \ub192\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc870\uae08 \ub354 \uc54c\uc544\uac04 \ub290\ub08c\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0 \uc2a4\ud504\ub9c1 \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc544\ubb34 \uc0dd\uac01 \uc5c6\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\ub294\ub370, \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c \uadfc\uac70\uac00 \uc0dd\uae30\uace0 \uc788\ub294 \uac83 \uac19\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DTO \uc6b0\ubc1c\uc801 \uc911\ubcf5")),(0,a.kt)("p",null,"\uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc0c1\ud488 \ucd94\uac00\uc640 \uc0c1\ud488 \uc218\uc815\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto1",src:r(78960).Z,width:"2028",height:"704"})),(0,a.kt)("p",null,"\ud074\ub798\uc2a4\uba85\uc744 \uc81c\uc678\ud558\uace0 \ud544\ub4dc\uc640 \uac80\uc99d \ub85c\uc9c1 \uadf8 \uc678 \ubaa8\ub4e0 \uac8c \uac19\uc740 DTO\ub97c \ubcf4\uba70 \uc911\ubcf5\uc774\ub77c\uace0 \uc0dd\uac01\uc744 \ud588\uace0, \ubc18\ub300\ub85c \uc6a9\ub3c4\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc911\ubcf5\uc774 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud558\uae30\ub3c4 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub85c\ubc84\ud2b8 \ub9c8\ud2f4\ub2d8\uc774 \uc9d1\ud544\ud558\uc2e0 \ud074\ub9b0 \uc544\ud0a4\ud14d\ucc98\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc911\ubcf5\uc744 \uc5ec\ub7ec \uac00\uc9c0 \uc885\ub958\ub85c \ub098\ub204\uc5b4 \uc124\uba85\ud558\uace0 \uc788\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uc9c4\uc9dc \uc911\ubcf5: \ud55c \uc778\uc2a4\ud134\uc2a4\uac00 \ubcc0\uacbd\ub418\uba74, \ub3d9\uc77c\ud55c \ubcc0\uacbd\uc744 \uadf8 \uc778\uc2a4\ud134\uc2a4\uc758 \ubaa8\ub4dc \ubcf5\uc0ac\ubcf8\uc5d0 \ubc18\ub4dc\uc2dc \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\uc6b0\ubc1c\uc801 \uc911\ubcf5: \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\ub294 \ub450 \ucf54\ub4dc \uc601\uc5ed\uc774 \uac01\uc790\uc758 \uacbd\ub85c\ub85c \ubc1c\uc804\ud55c\ub2e4\uba74, \uc989 \uc11c\ub85c \ub2e4\ub978 \uc18d\ub3c4\uc640 \ub2e4\ub978 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc774 \ub450 \ucf54\ub4dc\ub294 \uc9c4\uc9dc \uc911\ubcf5\uc774 \uc544\ub2c8\ub2e4.")),(0,a.kt)("p",null,"\ucd94\uac00\uc640 \uc218\uc815\uc740 \ucd08\uae30\uc5d0\ub294 \uc911\ubcf5\uc73c\ub85c \ubcf4\uc774\uc9c0\ub9cc \ucd08\uae30 \uc0dd\uc131 \uc2dc\uc5d0\ub9cc \uae30\uc785\ud558\ub294 \ub370\uc774\ud130\ub4e4\uc774 \ucd94\uac00\ub418\uac70\ub098, \uc2dc\uac04\uc774 \uc9c0\ub098\uba74\uc11c \uc11c\ub85c \ub2ec\ub77c\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub9ac\ubdf0\uc5b4 \uc6e8\uc9c0\uac00 \uc544\ub798\uc640 \uac19\uc774 \uc758\uc874 \uc5ed\uc804\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\uace0 \uc54c\ub824\uc8fc\uc168\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"dto2",src:r(14885).Z,width:"1508",height:"896"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Interceptor\uc5d0\uc11c \uc778\uc99d\ud55c \uac12 \uc7ac\uc0ac\uc6a9")),(0,a.kt)("p",null,"\uc0ac\uc2e4 \uc870\ud68c\ub97c \ub450 \ubc88 \ud558\uae30 \uc2eb\uc5b4\uc11c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc0dd\uac01\ud588\uc5c8\ub294\ub370 \uc774\ubc88 \ubbf8\uc158\uc5d0\uc11c\ub294 ThreadLocal\uc744 \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\ub2e8 Tomcat\uc740 \uc694\uccad\ub9c8\ub2e4 \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uace0, Interceptor\uc5d0\uc11c \uc870\ud68c\ud574\uc11c \ub9cc\ub4e0 Credential\uc744 ThreadLocal\uc5d0 \ub123\uc5b4\ub450\uc5c8\ub2e4\uac00 ArgumentResolver\uc5d0\uc11c \uaebc\ub0b8 \ub2e4\uc74c ThreadLocal\uc744 clear \ud558\uba74 \ubb38\uc81c\uac00 \uc5c6\uc744 \uac70\ub77c \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \uc6e8\uc9c0\uc5d0\uac8c\ub3c4 \uc5b4\ub5a4 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560\uc9c0 \uad81\uae08\uc99d\uc744 \uc791\uc131\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6e8\uc9c0\ub294 email\uc5d0 index\ub97c \uac78\uc5b4\ub450\uace0 dao \uc7ac\uc870\ud68c\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc7ac\uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 db\uc5d0 \uc778\ub371\uc2a4\ub97c \uac78 \uc0dd\uac01\uc740 \ud558\uc9c0 \ubabb\ud588\ub294\ub370, \uc81c\uc77c \uc9c1\uad00\uc801\uc774\uace0 \uc88b\uc740 \ubc29\ubc95\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uae30\ub85d")),(0,a.kt)("p",null,"\ube14\ub799\ucea3\uc740 \uae30\ub85d\uc744 \uad49\uc7a5\ud788 \uc798 \ud558\ub294 \ud06c\ub8e8\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub178\uc158\uc5d0 \ud398\uc5b4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \ud588\ub358 \ub0b4\uc6a9 + \uace0\ubbfc\ud588\ub358 \ubd80\ubd84 + \ud68c\uace0\ub97c \uaf3c\uaf3c\ud558\uac8c \uae30\ub85d\ud574\uc11c \uacf5\uc720\ud574 \uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc774\ubaa8\uc9c0\ub97c \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec \ub354\uc6b1 \uc88b\uc558\ub2e4!"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc77c\uce58\uc2dc\ud0a4\uae30")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc740 \ud55c\uc815\ub418\uc5b4 \uc788\uace0, \uae30\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc801\ub2f9\ud788 \ud0c0\ud611\uc744 \ubd10\uc11c \uc758\uacac\uc744 \ube60\ub974\uac8c \uc218\uc6a9\ud574 \ub370\ub4dc\ub77c\uc778\uc744 \ub9de\ucd94\ub294 \uac83\ub3c4 \uc911\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube14\ub799\ucea3\uc740 \ub0b4 \uc758\uacac\uc744 \uc798 \ub4e4\uc5b4\uc92c\uace0, \ub355\ubd84\uc5d0 \ub9c9\ud788\ub294 \ubd80\ubd84 \uc5c6\uc774 \ube60\ub974\uac8c \ubbf8\uc158\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\ube68\ub9ac \uce5c\ud574\uc84c\uace0, \uc758\uc0ac\uc18c\ud1b5\uc774 \uc798 \ub3fc\uc11c \uc7ac\ubc0c\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4!"))}s.isMDXComponent=!0},78960:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto1-ccd4f91674b224578f2b295b3fccaf2c.png"},14885:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/dto2-15b381e0a024487f54608d438e5385f9.png"}}]); \ No newline at end of file diff --git a/assets/js/c0cb7215.9bf2d1f6.js b/assets/js/c0cb7215.9bf2d1f6.js deleted file mode 100644 index 603290b19..000000000 --- a/assets/js/c0cb7215.9bf2d1f6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7966],{6109:e=>{e.exports=JSON.parse('{"permalink":"/tags/book/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/book","nextPage":"/tags/book/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c0cb7215.c03bc365.js b/assets/js/c0cb7215.c03bc365.js new file mode 100644 index 000000000..856f28592 --- /dev/null +++ b/assets/js/c0cb7215.c03bc365.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7966],{66109:e=>{e.exports=JSON.parse('{"permalink":"/tags/book/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/book","nextPage":"/tags/book/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c29bedb9.96d9dc0d.js b/assets/js/c29bedb9.96d9dc0d.js new file mode 100644 index 000000000..6fa6f69fb --- /dev/null +++ b/assets/js/c29bedb9.96d9dc0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9242],{44025:e=>{e.exports=JSON.parse('{"permalink":"/page/35","page":35,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/34","nextPage":"/page/36","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c29bedb9.a519e409.js b/assets/js/c29bedb9.a519e409.js deleted file mode 100644 index c77152380..000000000 --- a/assets/js/c29bedb9.a519e409.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9242],{4025:e=>{e.exports=JSON.parse('{"permalink":"/page/35","page":35,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/34","nextPage":"/page/36","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c33ca104.63a2cd60.js b/assets/js/c33ca104.63a2cd60.js deleted file mode 100644 index 0ca4ad4b8..000000000 --- a/assets/js/c33ca104.63a2cd60.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5696],{8872:e=>{e.exports=JSON.parse('{"label":"pacakge","permalink":"/docs/tags/pacakge","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\uc124\uacc4/\ud328\ud0a4\uc9c0","title":"\ud328\ud0a4\uc9c0","description":"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0","permalink":"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0"}]}')}}]); \ No newline at end of file diff --git a/assets/js/c33ca104.f1e18c9a.js b/assets/js/c33ca104.f1e18c9a.js new file mode 100644 index 000000000..53ebafd85 --- /dev/null +++ b/assets/js/c33ca104.f1e18c9a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5696],{88872:e=>{e.exports=JSON.parse('{"label":"pacakge","permalink":"/docs/tags/pacakge","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\uc124\uacc4/\ud328\ud0a4\uc9c0","title":"\ud328\ud0a4\uc9c0","description":"\uacc4\uce35 \uae30\ubc18 \ud328\ud0a4\uc9c0","permalink":"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0"}]}')}}]); \ No newline at end of file diff --git a/assets/js/c3ea66fe.73186556.js b/assets/js/c3ea66fe.73186556.js new file mode 100644 index 000000000..24f59f94d --- /dev/null +++ b/assets/js/c3ea66fe.73186556.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6698],{63504:s=>{s.exports=JSON.parse('{"label":"Isolation","permalink":"/tags/isolation","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/c3ea66fe.dd5762e3.js b/assets/js/c3ea66fe.dd5762e3.js deleted file mode 100644 index a0f1efa58..000000000 --- a/assets/js/c3ea66fe.dd5762e3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6698],{3504:s=>{s.exports=JSON.parse('{"label":"Isolation","permalink":"/tags/isolation","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.1db57317.js b/assets/js/c4f5d8e4.1db57317.js deleted file mode 100644 index 6892a6c25..000000000 --- a/assets/js/c4f5d8e4.1db57317.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4195],{2841:(e,t,s)=>{s.r(t),s.d(t,{default:()=>i});var n=s(2263),u=s(7294),c=s(6550);function i(){const{siteConfig:e}=(0,n.Z)();return u.createElement(c.l_,{to:"/blog"})}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.d37ba840.js b/assets/js/c4f5d8e4.d37ba840.js new file mode 100644 index 000000000..4c1d48122 --- /dev/null +++ b/assets/js/c4f5d8e4.d37ba840.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4195],{62841:(e,t,s)=>{s.r(t),s.d(t,{default:()=>i});var n=s(52263),u=s(67294),c=s(16550);function i(){const{siteConfig:e}=(0,n.Z)();return u.createElement(c.l_,{to:"/blog"})}}}]); \ No newline at end of file diff --git a/assets/js/c55d205b.4417145d.js b/assets/js/c55d205b.4417145d.js deleted file mode 100644 index 178c07527..000000000 --- a/assets/js/c55d205b.4417145d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3438],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>g});var r=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,i=function(e,n){if(null==e)return{};var t,r,i={},a=Object.keys(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var p=r.createContext({}),c=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},u=function(e){var n=c(e.components);return r.createElement(p.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,a=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=c(t),g=i,m=d["".concat(p,".").concat(g)]||d[g]||s[g]||a;return t?r.createElement(m,l(l({ref:n},u),{},{components:t})):r.createElement(m,l({ref:n},u))}));function g(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var a=t.length,l=new Array(a);l[0]=d;var o={};for(var p in n)hasOwnProperty.call(n,p)&&(o[p]=n[p]);o.originalType=e,o.mdxType="string"==typeof e?e:i,l[1]=o;for(var c=2;c<a;c++)l[c]=t[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,t)}d.displayName="MDXCreateElement"},3859:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=t(7462),i=(t(7294),t(3905));const a={title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",tags:["nginx"]},l=void 0,o={unversionedId:"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",id:"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",description:"\ud3f4\ub354 \ubc0f \ud30c\uc77c",source:"@site/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4.mdx",sourceDirName:"Nginx",slug:"/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",permalink:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4.mdx",tags:[{label:"nginx",permalink:"/docs/tags/nginx"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",tags:["nginx"]},sidebar:"tutorialSidebar",previous:{title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",permalink:"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551"},next:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",permalink:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5"}},p={},c=[{value:"\ud3f4\ub354 \ubc0f \ud30c\uc77c",id:"\ud3f4\ub354-\ubc0f-\ud30c\uc77c",level:3},{value:"\uba85\ub839\uc5b4",id:"\uba85\ub839\uc5b4",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:n,...t}=e;return(0,i.kt)("wrapper",(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"\ud3f4\ub354-\ubc0f-\ud30c\uc77c"},"\ud3f4\ub354 \ubc0f \ud30c\uc77c"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/")),(0,i.kt)("p",null,"\uae30\ubcf8 \uc124\uc815\uc774 \uc800\uc7a5\ub41c \ub8e8\ud2b8 \ub514\ub809\ud130\ub9ac"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/nginx.conf")),(0,i.kt)("p",null,"\uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\ub85c \ubaa8\ub4e0 \uc124\uc815\uc5d0 \ub300\ud55c \uc9c4\uc785\uc810",(0,i.kt)("br",{parentName:"p"}),"\n","\ub514\ub809\ud130\ub9ac\uc5d0 \uc704\uce58\ud55c \ubaa8\ub4e0 \uc124\uc815 \ud30c\uc77c\uc744 \ud3ec\ud568\ud558\ub294 \ucd5c\uc0c1\uc704 Http \ube14\ub85d\uc744 \ud3ec\ud568\ud55c\ub2e4. "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="nginx\uc5d0 \ud3ec\ud568\ub41c \uc124\uc815 \ud30c\uc77c \ud3ec\ud568 include \uad6c\ubb38"',title:'"nginx\uc5d0',"\ud3ec\ud568\ub41c":!0,"\uc124\uc815":!0,"\ud30c\uc77c":!0,"\ud3ec\ud568":!0,include:!0,'\uad6c\ubb38"':!0},"http {\n ...\n include /etc/nginx/conf.d/*.conf;\n include /etc/nginx/sites-enabled/*;\n}\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d/")),(0,i.kt)("p",null,"\uae30\ubcf8 HTTP \uc11c\ubc84 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub300\ud55c \ub514\ub809\ud130\ub9ac",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("inlineCode",{parentName:"p"},".conf")," \ub85c \ub05d\ub098\ub294 \uacbd\uc6b0 \uc704\uc758 include \uc124\uc815\uc5d0 \uc758\ud574 \ucd5c\uc0c1\uc704 http \ube14\ub85d\uc5d0 \ud3ec\ud568\ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","conf.d \ub514\ub809\ud130\ub9ac \ub300\uc2e0 site-enabled \ub514\ub809\ud130\ub9ac\uc640 symlink\ub97c \ud1b5\ud574 \uc124\uc815 \ud30c\uc77c\uc744 \uc5f0\uacb0\ud558\ub294 \ubc29\ubc95\uc740 \ub354 \uc774\uc0c1 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,i.kt)("admonition",{title:"NIGNX \uc124\uc815",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"nginx \uc124\uc815\uc758 \uacbd\uc6b0 include \uad6c\ubb38\uc744 \ud65c\uc6a9\ud574 \uad6c\uc870\ud654\ud558\uc5ec \uc124\uc815 \ud30c\uc77c\uc744 \uac04\uacb0\ud558\uac8c \uc720\uc9c0\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/var/log/nginx/")),(0,i.kt)("p",null,"\uc5d4\uc9c4\uc5d1\uc2a4 \ub85c\uadf8\uac00 \uc800\uc7a5\ub418\ub294 \ub514\ub809\ud130\ub9ac\ub85c access \ub85c\uadf8\uc640 error \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8 \ud615\uc2dd\uc758 \uacbd\uc6b0 \uc124\uc815 \ud30c\uc77c\uc758 log_format \uad6c\ubb38\uc744 \uc774\uc6a9\ud574\uc11c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. "),(0,i.kt)("h3",{id:"\uba85\ub839\uc5b4"},"\uba85\ub839\uc5b4"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"nginx -t")),(0,i.kt)("p",null,"nginx \uc124\uc815\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud55c\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"nginx -T")," "),(0,i.kt)("p",null,"nginx \uc124\uc815 \ud655\uc778\uc758 \uacb0\uacfc\ub97c \uc870\uae08 \ub354 \uc790\uc138\ud558\uac8c \ucd9c\ub825\ud574\uc900\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"nginx -s <SIGNAL>")),(0,i.kt)("p",null,"\uc5ec\uae30\uc11c SIGNAL\uc740 \ub2e4\uc74c \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\ub2e4."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"quit: \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc(SIGQUIT)"),(0,i.kt)("li",{parentName:"ul"},"reload: \uc124\uc815 \ud30c\uc77c \ub9ac\ub85c\ub4dc(SIGHUP)"),(0,i.kt)("li",{parentName:"ul"},"reopen: \ub85c\uadf8 \ud30c\uc77c\uc744 \ub2e4\uc2dc \uc5f4\ub3c4\ub85d \uc694\uccad(SIGUSR1)"),(0,i.kt)("li",{parentName:"ul"},"stop: \uc885\ub8cc \uc694\uccad(SIGTERM)")),(0,i.kt)("p",null,"\uc5ec\uae30\uc11c SIGQUIT & SIGTREM \ubaa8\ub450 graceful shutdown\uc744 \uc218\ud589\ud55c\ub2e4."),(0,i.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,i.kt)("p",null,"NGINX \ucfe1\ubd81, \ub370\ub9ad \ub514\uc6a9\uae30 p.22 ~ p.23",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.nginx.com/"},"https://docs.nginx.com/"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.nginx.com/nginx/admin-guide/monitoring/logging/"},"https://docs.nginx.com/nginx/admin-guide/monitoring/logging/")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c55d205b.5245fecd.js b/assets/js/c55d205b.5245fecd.js new file mode 100644 index 000000000..8e9a8acc6 --- /dev/null +++ b/assets/js/c55d205b.5245fecd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3438],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>g});var r=t(67294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,i=function(e,n){if(null==e)return{};var t,r,i={},a=Object.keys(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var p=r.createContext({}),c=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},u=function(e){var n=c(e.components);return r.createElement(p.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,a=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=c(t),g=i,m=d["".concat(p,".").concat(g)]||d[g]||s[g]||a;return t?r.createElement(m,l(l({ref:n},u),{},{components:t})):r.createElement(m,l({ref:n},u))}));function g(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var a=t.length,l=new Array(a);l[0]=d;var o={};for(var p in n)hasOwnProperty.call(n,p)&&(o[p]=n[p]);o.originalType=e,o.mdxType="string"==typeof e?e:i,l[1]=o;for(var c=2;c<a;c++)l[c]=t[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,t)}d.displayName="MDXCreateElement"},83859:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=t(87462),i=(t(67294),t(3905));const a={title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",tags:["nginx"]},l=void 0,o={unversionedId:"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",id:"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",description:"\ud3f4\ub354 \ubc0f \ud30c\uc77c",source:"@site/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4.mdx",sourceDirName:"Nginx",slug:"/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",permalink:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4.mdx",tags:[{label:"nginx",permalink:"/docs/tags/nginx"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",tags:["nginx"]},sidebar:"tutorialSidebar",previous:{title:"\uae30\ubcf8 \ud0a4 \ub9e4\ud551",permalink:"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551"},next:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",permalink:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5"}},p={},c=[{value:"\ud3f4\ub354 \ubc0f \ud30c\uc77c",id:"\ud3f4\ub354-\ubc0f-\ud30c\uc77c",level:3},{value:"\uba85\ub839\uc5b4",id:"\uba85\ub839\uc5b4",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],u={toc:c};function s(e){let{components:n,...t}=e;return(0,i.kt)("wrapper",(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h3",{id:"\ud3f4\ub354-\ubc0f-\ud30c\uc77c"},"\ud3f4\ub354 \ubc0f \ud30c\uc77c"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/")),(0,i.kt)("p",null,"\uae30\ubcf8 \uc124\uc815\uc774 \uc800\uc7a5\ub41c \ub8e8\ud2b8 \ub514\ub809\ud130\ub9ac"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/nginx.conf")),(0,i.kt)("p",null,"\uae30\ubcf8 \uc124\uc815 \ud30c\uc77c\ub85c \ubaa8\ub4e0 \uc124\uc815\uc5d0 \ub300\ud55c \uc9c4\uc785\uc810",(0,i.kt)("br",{parentName:"p"}),"\n","\ub514\ub809\ud130\ub9ac\uc5d0 \uc704\uce58\ud55c \ubaa8\ub4e0 \uc124\uc815 \ud30c\uc77c\uc744 \ud3ec\ud568\ud558\ub294 \ucd5c\uc0c1\uc704 Http \ube14\ub85d\uc744 \ud3ec\ud568\ud55c\ub2e4. "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="nginx\uc5d0 \ud3ec\ud568\ub41c \uc124\uc815 \ud30c\uc77c \ud3ec\ud568 include \uad6c\ubb38"',title:'"nginx\uc5d0',"\ud3ec\ud568\ub41c":!0,"\uc124\uc815":!0,"\ud30c\uc77c":!0,"\ud3ec\ud568":!0,include:!0,'\uad6c\ubb38"':!0},"http {\n ...\n include /etc/nginx/conf.d/*.conf;\n include /etc/nginx/sites-enabled/*;\n}\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d/")),(0,i.kt)("p",null,"\uae30\ubcf8 HTTP \uc11c\ubc84 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub300\ud55c \ub514\ub809\ud130\ub9ac",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("inlineCode",{parentName:"p"},".conf")," \ub85c \ub05d\ub098\ub294 \uacbd\uc6b0 \uc704\uc758 include \uc124\uc815\uc5d0 \uc758\ud574 \ucd5c\uc0c1\uc704 http \ube14\ub85d\uc5d0 \ud3ec\ud568\ub41c\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","conf.d \ub514\ub809\ud130\ub9ac \ub300\uc2e0 site-enabled \ub514\ub809\ud130\ub9ac\uc640 symlink\ub97c \ud1b5\ud574 \uc124\uc815 \ud30c\uc77c\uc744 \uc5f0\uacb0\ud558\ub294 \ubc29\ubc95\uc740 \ub354 \uc774\uc0c1 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,i.kt)("admonition",{title:"NIGNX \uc124\uc815",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"nginx \uc124\uc815\uc758 \uacbd\uc6b0 include \uad6c\ubb38\uc744 \ud65c\uc6a9\ud574 \uad6c\uc870\ud654\ud558\uc5ec \uc124\uc815 \ud30c\uc77c\uc744 \uac04\uacb0\ud558\uac8c \uc720\uc9c0\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"/var/log/nginx/")),(0,i.kt)("p",null,"\uc5d4\uc9c4\uc5d1\uc2a4 \ub85c\uadf8\uac00 \uc800\uc7a5\ub418\ub294 \ub514\ub809\ud130\ub9ac\ub85c access \ub85c\uadf8\uc640 error \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,i.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8 \ud615\uc2dd\uc758 \uacbd\uc6b0 \uc124\uc815 \ud30c\uc77c\uc758 log_format \uad6c\ubb38\uc744 \uc774\uc6a9\ud574\uc11c \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. "),(0,i.kt)("h3",{id:"\uba85\ub839\uc5b4"},"\uba85\ub839\uc5b4"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"nginx -t")),(0,i.kt)("p",null,"nginx \uc124\uc815\uc774 \uc815\uc0c1\uc778\uc9c0 \ud655\uc778\ud55c\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"nginx -T")," "),(0,i.kt)("p",null,"nginx \uc124\uc815 \ud655\uc778\uc758 \uacb0\uacfc\ub97c \uc870\uae08 \ub354 \uc790\uc138\ud558\uac8c \ucd9c\ub825\ud574\uc900\ub2e4. "),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"nginx -s <SIGNAL>")),(0,i.kt)("p",null,"\uc5ec\uae30\uc11c SIGNAL\uc740 \ub2e4\uc74c \uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\ub2e4."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"quit: \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc(SIGQUIT)"),(0,i.kt)("li",{parentName:"ul"},"reload: \uc124\uc815 \ud30c\uc77c \ub9ac\ub85c\ub4dc(SIGHUP)"),(0,i.kt)("li",{parentName:"ul"},"reopen: \ub85c\uadf8 \ud30c\uc77c\uc744 \ub2e4\uc2dc \uc5f4\ub3c4\ub85d \uc694\uccad(SIGUSR1)"),(0,i.kt)("li",{parentName:"ul"},"stop: \uc885\ub8cc \uc694\uccad(SIGTERM)")),(0,i.kt)("p",null,"\uc5ec\uae30\uc11c SIGQUIT & SIGTREM \ubaa8\ub450 graceful shutdown\uc744 \uc218\ud589\ud55c\ub2e4."),(0,i.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,i.kt)("p",null,"NGINX \ucfe1\ubd81, \ub370\ub9ad \ub514\uc6a9\uae30 p.22 ~ p.23",(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.nginx.com/"},"https://docs.nginx.com/"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.nginx.com/nginx/admin-guide/monitoring/logging/"},"https://docs.nginx.com/nginx/admin-guide/monitoring/logging/")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c573638f.4b02c3a3.js b/assets/js/c573638f.4b02c3a3.js deleted file mode 100644 index 5f803d311..000000000 --- a/assets/js/c573638f.4b02c3a3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[964],{8866:a=>{a.exports=JSON.parse('[{"label":"async","permalink":"/tags/async","count":1},{"label":"event","permalink":"/tags/event","count":1},{"label":"image","permalink":"/tags/image","count":3},{"label":"awt","permalink":"/tags/awt","count":2},{"label":"Python","permalink":"/tags/python","count":1},{"label":"Mockito","permalink":"/tags/mockito","count":1},{"label":"static","permalink":"/tags/static","count":1},{"label":"Java","permalink":"/tags/java","count":5},{"label":"Spring Boot","permalink":"/tags/spring-boot","count":1},{"label":"Spring","permalink":"/tags/spring","count":1},{"label":"WebSocket","permalink":"/tags/web-socket","count":1},{"label":"Documentation","permalink":"/tags/documentation","count":1},{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","count":11},{"label":"Retrospective","permalink":"/tags/retrospective","count":15},{"label":"TecoChat","permalink":"/tags/teco-chat","count":3},{"label":"Pattern","permalink":"/tags/pattern","count":1},{"label":"Composite","permalink":"/tags/composite","count":1},{"label":"DTO","permalink":"/tags/dto","count":1},{"label":"Jenkins","permalink":"/tags/jenkins","count":1},{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk","count":1},{"label":"Book","permalink":"/tags/book","count":3},{"label":"DataBase","permalink":"/tags/data-base","count":3},{"label":"Lock","permalink":"/tags/lock","count":2},{"label":"InnoDB","permalink":"/tags/inno-db","count":1},{"label":"MySQL","permalink":"/tags/my-sql","count":1},{"label":"Transaction","permalink":"/tags/transaction","count":1},{"label":"Isolation","permalink":"/tags/isolation","count":1},{"label":"Test","permalink":"/tags/test","count":1},{"label":"Mock","permalink":"/tags/mock","count":1},{"label":"Class","permalink":"/tags/class","count":1},{"label":"JDBC","permalink":"/tags/jdbc","count":1},{"label":"GRASP","permalink":"/tags/grasp","count":1},{"label":"OOP","permalink":"/tags/oop","count":1},{"label":"IntelliJ","permalink":"/tags/intelli-j","count":1},{"label":"Kotlin","permalink":"/tags/kotlin","count":1},{"label":"Time","permalink":"/tags/time","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/c573638f.9b4b64b6.js b/assets/js/c573638f.9b4b64b6.js new file mode 100644 index 000000000..2cb50d00f --- /dev/null +++ b/assets/js/c573638f.9b4b64b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[964],{28866:a=>{a.exports=JSON.parse('[{"label":"cloudwatch","permalink":"/tags/cloudwatch","count":1},{"label":"log","permalink":"/tags/log","count":1},{"label":"monitoring","permalink":"/tags/monitoring","count":1},{"label":"async","permalink":"/tags/async","count":1},{"label":"event","permalink":"/tags/event","count":1},{"label":"image","permalink":"/tags/image","count":3},{"label":"awt","permalink":"/tags/awt","count":2},{"label":"Python","permalink":"/tags/python","count":1},{"label":"Mockito","permalink":"/tags/mockito","count":1},{"label":"static","permalink":"/tags/static","count":1},{"label":"Java","permalink":"/tags/java","count":5},{"label":"Spring Boot","permalink":"/tags/spring-boot","count":1},{"label":"Spring","permalink":"/tags/spring","count":1},{"label":"WebSocket","permalink":"/tags/web-socket","count":1},{"label":"Documentation","permalink":"/tags/documentation","count":1},{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","count":11},{"label":"Retrospective","permalink":"/tags/retrospective","count":15},{"label":"TecoChat","permalink":"/tags/teco-chat","count":3},{"label":"Pattern","permalink":"/tags/pattern","count":1},{"label":"Composite","permalink":"/tags/composite","count":1},{"label":"DTO","permalink":"/tags/dto","count":1},{"label":"Jenkins","permalink":"/tags/jenkins","count":1},{"label":"Elastic Beanstalk","permalink":"/tags/elastic-beanstalk","count":1},{"label":"Book","permalink":"/tags/book","count":3},{"label":"DataBase","permalink":"/tags/data-base","count":3},{"label":"Lock","permalink":"/tags/lock","count":2},{"label":"InnoDB","permalink":"/tags/inno-db","count":1},{"label":"MySQL","permalink":"/tags/my-sql","count":1},{"label":"Transaction","permalink":"/tags/transaction","count":1},{"label":"Isolation","permalink":"/tags/isolation","count":1},{"label":"Test","permalink":"/tags/test","count":1},{"label":"Mock","permalink":"/tags/mock","count":1},{"label":"Class","permalink":"/tags/class","count":1},{"label":"JDBC","permalink":"/tags/jdbc","count":1},{"label":"GRASP","permalink":"/tags/grasp","count":1},{"label":"OOP","permalink":"/tags/oop","count":1},{"label":"IntelliJ","permalink":"/tags/intelli-j","count":1},{"label":"Kotlin","permalink":"/tags/kotlin","count":1},{"label":"Time","permalink":"/tags/time","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/c6004f62.5bf31f92.js b/assets/js/c6004f62.5bf31f92.js deleted file mode 100644 index c110c6202..000000000 --- a/assets/js/c6004f62.5bf31f92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5892],{7567:e=>{e.exports=JSON.parse('{"permalink":"/tags/mock","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c6004f62.8257704e.js b/assets/js/c6004f62.8257704e.js new file mode 100644 index 000000000..9011e8c0f --- /dev/null +++ b/assets/js/c6004f62.8257704e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5892],{37567:e=>{e.exports=JSON.parse('{"permalink":"/tags/mock","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/c60995f6.5cb96803.js b/assets/js/c60995f6.5cb96803.js deleted file mode 100644 index 0f84010ce..000000000 --- a/assets/js/c60995f6.5cb96803.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6199],{2474:i=>{i.exports=JSON.parse('{"label":"nginx","permalink":"/docs/tags/nginx","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","title":"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4","description":"\ud3f4\ub354 \ubc0f \ud30c\uc77c","permalink":"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4"},{"id":"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","title":"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5","description":"root","permalink":"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5"}]}')}}]); \ No newline at end of file diff --git a/assets/js/c60995f6.fb18c9be.js b/assets/js/c60995f6.fb18c9be.js new file mode 100644 index 000000000..2d716a99a --- /dev/null +++ b/assets/js/c60995f6.fb18c9be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6199],{62474:i=>{i.exports=JSON.parse('{"label":"nginx","permalink":"/docs/tags/nginx","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","title":"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4","description":"\ud3f4\ub354 \ubc0f \ud30c\uc77c","permalink":"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4"},{"id":"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","title":"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5","description":"root","permalink":"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5"}]}')}}]); \ No newline at end of file diff --git a/assets/js/c60ea0ff.881f4c53.js b/assets/js/c60ea0ff.881f4c53.js new file mode 100644 index 000000000..c8b9020c9 --- /dev/null +++ b/assets/js/c60ea0ff.881f4c53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3085],{14072:e=>{e.exports=JSON.parse('{"label":"TecoChat","permalink":"/tags/teco-chat","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/c60ea0ff.a51f7940.js b/assets/js/c60ea0ff.a51f7940.js deleted file mode 100644 index 2f978c41a..000000000 --- a/assets/js/c60ea0ff.a51f7940.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3085],{4072:e=>{e.exports=JSON.parse('{"label":"TecoChat","permalink":"/tags/teco-chat","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.7af2b68e.js b/assets/js/ccc49370.7af2b68e.js new file mode 100644 index 000000000..ea25834a3 --- /dev/null +++ b/assets/js/ccc49370.7af2b68e.js @@ -0,0 +1 @@ +(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6103],{65203:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>b});var a=n(67294),r=n(86010),o=n(10833),l=n(35281),i=n(9460),s=n(39058),c=n(857),m=n(87462),u=n(95999),d=n(32244);function g(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,u.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(d.Z,(0,m.Z)({},n,{subLabel:a.createElement(u.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(d.Z,(0,m.Z)({},t,{subLabel:a.createElement(u.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function f(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:r,date:l,tags:s,authors:c,frontMatter:m}=t,{keywords:u}=m,d=e.image??m.image;return a.createElement(o.d,{title:n,description:r,keywords:u,image:d},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:l}),c.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:c.map((e=>e.url)).filter(Boolean).join(",")}),s.length>0&&a.createElement("meta",{property:"article:tag",content:s.map((e=>e.label)).join(",")}))}var p=n(39407);function v(e){let{sidebar:t,children:n}=e;const{metadata:r,toc:o}=(0,i.C)(),{nextItem:l,prevItem:m,frontMatter:u}=r,{hide_table_of_contents:d,toc_min_heading_level:f,toc_max_heading_level:v}=u;return a.createElement(s.Z,{sidebar:t,toc:!d&&o.length>0?a.createElement(p.Z,{toc:o,minHeadingLevel:f,maxHeadingLevel:v}):void 0},a.createElement(c.Z,null,n),(l||m)&&a.createElement(g,{nextItem:l,prevItem:m}))}function b(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(o.FG,{className:(0,r.Z)(l.k.wrapper.blogPages,l.k.page.blogPostPage)},a.createElement(f,null),a.createElement(v,{sidebar:e.sidebar},a.createElement(t,null))))}},39407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var a=n(87462),r=n(67294),o=n(86010),l=n(93743);const i="tableOfContents_bqdL";function s(e){let{className:t,...n}=e;return r.createElement("div",{className:(0,o.Z)(i,"thin-scrollbar",t)},r.createElement(l.Z,(0,a.Z)({},n,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}},93743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(87462),r=n(67294),o=n(86668);function l(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...r}=e;n>=0?t[n].children.push(r):a.push(r)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function s(e){const t=e.getBoundingClientRect();return t.top===t.bottom?s(e.parentNode):t}function c(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>s(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(s(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,r.useRef)(0),{navbar:{hideOnScroll:t}}=(0,o.L)();return(0,r.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function u(e){const t=(0,r.useRef)(void 0),n=m();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:r,minHeadingLevel:o,maxHeadingLevel:l}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let r=t;r<=n;r+=1)a.push(`h${r}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:l}),s=c(i,{anchorTopOffset:n.current}),m=e.find((e=>s&&s.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(r),e.classList.add(r),t.current=e):e.classList.remove(r)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function d(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?r.createElement("ul",{className:o?void 0:n},t.map((e=>r.createElement("li",{key:e.id},r.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),r.createElement(d,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const g=r.memo(d);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:s="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:m,maxHeadingLevel:d,...f}=e;const p=(0,o.L)(),v=m??p.tableOfContents.minHeadingLevel,b=d??p.tableOfContents.maxHeadingLevel,h=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,r.useMemo)((()=>i({toc:l(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:v,maxHeadingLevel:b});return u((0,r.useMemo)((()=>{if(s&&c)return{linkClassName:s,linkActiveClassName:c,minHeadingLevel:v,maxHeadingLevel:b}}),[s,c,v,b])),r.createElement(g,(0,a.Z)({toc:h,className:n,linkClassName:s},f))}},857:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var a=n(30390),r=n(67294),o=n(92949),l=n(9460);const i=function(e){const{colorMode:t}=(0,o.I)(),{isBlogPostPage:n}=(0,l.C)(),i="dark"===t?"dark":"light",s=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(!n)return;const e=s.current.querySelector("iframe.giscus-frame");e?(()=>{const t={setConfig:{theme:i}};e.contentWindow.postMessage({giscus:t},"https://giscus.app")})():(()=>{const e=document.createElement("script");e.src="https://giscus.app/client.js",e.setAttribute("data-repo","greeng00se/greeng00se.github.io"),e.setAttribute("data-repo-id","R_kgDOIRAC3w"),e.setAttribute("data-category","Announcements"),e.setAttribute("data-category-id","DIC_kwDOIRAC384CTcGg"),e.setAttribute("data-mapping","pathname"),e.setAttribute("data-strict","0"),e.setAttribute("data-reactions-enabled","1"),e.setAttribute("data-emit-metadata","0"),e.setAttribute("data-input-position","bottom"),e.setAttribute("data-theme",i),e.setAttribute("data-lang","ko"),e.crossOrigin="anonymous",e.async=!0,s.current.appendChild(e)})()}),[i]),r.createElement(r.Fragment,null,r.createElement(a.Z,e),n&&r.createElement("div",{ref:s}))}},11748:(e,t,n)=>{var a={"./locale":89234,"./locale.js":89234};function r(e){var t=o(e);return n(t)}function o(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=o,e.exports=r,r.id=11748}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.cd536bca.js b/assets/js/ccc49370.cd536bca.js deleted file mode 100644 index 63405f146..000000000 --- a/assets/js/ccc49370.cd536bca.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6103],{5203:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>b});var a=n(7294),r=n(6010),o=n(833),l=n(5281),i=n(9460),s=n(9058),c=n(857),m=n(7462),u=n(5999),d=n(2244);function g(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,u.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(d.Z,(0,m.Z)({},n,{subLabel:a.createElement(u.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(d.Z,(0,m.Z)({},t,{subLabel:a.createElement(u.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function f(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:r,date:l,tags:s,authors:c,frontMatter:m}=t,{keywords:u}=m,d=e.image??m.image;return a.createElement(o.d,{title:n,description:r,keywords:u,image:d},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:l}),c.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:c.map((e=>e.url)).filter(Boolean).join(",")}),s.length>0&&a.createElement("meta",{property:"article:tag",content:s.map((e=>e.label)).join(",")}))}var p=n(9407);function v(e){let{sidebar:t,children:n}=e;const{metadata:r,toc:o}=(0,i.C)(),{nextItem:l,prevItem:m,frontMatter:u}=r,{hide_table_of_contents:d,toc_min_heading_level:f,toc_max_heading_level:v}=u;return a.createElement(s.Z,{sidebar:t,toc:!d&&o.length>0?a.createElement(p.Z,{toc:o,minHeadingLevel:f,maxHeadingLevel:v}):void 0},a.createElement(c.Z,null,n),(l||m)&&a.createElement(g,{nextItem:l,prevItem:m}))}function b(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(o.FG,{className:(0,r.Z)(l.k.wrapper.blogPages,l.k.page.blogPostPage)},a.createElement(f,null),a.createElement(v,{sidebar:e.sidebar},a.createElement(t,null))))}},9407:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var a=n(7462),r=n(7294),o=n(6010),l=n(3743);const i="tableOfContents_bqdL";function s(e){let{className:t,...n}=e;return r.createElement("div",{className:(0,o.Z)(i,"thin-scrollbar",t)},r.createElement(l.Z,(0,a.Z)({},n,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}},3743:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(7462),r=n(7294),o=n(6668);function l(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...r}=e;n>=0?t[n].children.push(r):a.push(r)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function s(e){const t=e.getBoundingClientRect();return t.top===t.bottom?s(e.parentNode):t}function c(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>s(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(s(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,r.useRef)(0),{navbar:{hideOnScroll:t}}=(0,o.L)();return(0,r.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function u(e){const t=(0,r.useRef)(void 0),n=m();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:r,minHeadingLevel:o,maxHeadingLevel:l}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let r=t;r<=n;r+=1)a.push(`h${r}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:l}),s=c(i,{anchorTopOffset:n.current}),m=e.find((e=>s&&s.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(r),e.classList.add(r),t.current=e):e.classList.remove(r)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function d(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?r.createElement("ul",{className:o?void 0:n},t.map((e=>r.createElement("li",{key:e.id},r.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),r.createElement(d,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const g=r.memo(d);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:s="table-of-contents__link",linkActiveClassName:c,minHeadingLevel:m,maxHeadingLevel:d,...f}=e;const p=(0,o.L)(),v=m??p.tableOfContents.minHeadingLevel,b=d??p.tableOfContents.maxHeadingLevel,h=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,r.useMemo)((()=>i({toc:l(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:v,maxHeadingLevel:b});return u((0,r.useMemo)((()=>{if(s&&c)return{linkClassName:s,linkActiveClassName:c,minHeadingLevel:v,maxHeadingLevel:b}}),[s,c,v,b])),r.createElement(g,(0,a.Z)({toc:h,className:n,linkClassName:s},f))}},857:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var a=n(390),r=n(7294),o=n(2949),l=n(9460);const i=function(e){const{colorMode:t}=(0,o.I)(),{isBlogPostPage:n}=(0,l.C)(),i="dark"===t?"dark":"light",s=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(!n)return;const e=s.current.querySelector("iframe.giscus-frame");e?(()=>{const t={setConfig:{theme:i}};e.contentWindow.postMessage({giscus:t},"https://giscus.app")})():(()=>{const e=document.createElement("script");e.src="https://giscus.app/client.js",e.setAttribute("data-repo","greeng00se/greeng00se.github.io"),e.setAttribute("data-repo-id","R_kgDOIRAC3w"),e.setAttribute("data-category","Announcements"),e.setAttribute("data-category-id","DIC_kwDOIRAC384CTcGg"),e.setAttribute("data-mapping","pathname"),e.setAttribute("data-strict","0"),e.setAttribute("data-reactions-enabled","1"),e.setAttribute("data-emit-metadata","0"),e.setAttribute("data-input-position","bottom"),e.setAttribute("data-theme",i),e.setAttribute("data-lang","ko"),e.crossOrigin="anonymous",e.async=!0,s.current.appendChild(e)})()}),[i]),r.createElement(r.Fragment,null,r.createElement(a.Z,e),n&&r.createElement("div",{ref:s}))}},1748:(e,t,n)=>{var a={"./locale":9234,"./locale.js":9234};function r(e){var t=o(e);return n(t)}function o(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=o,e.exports=r,r.id=1748}}]); \ No newline at end of file diff --git a/assets/js/cf8e491a.1c0e17dc.js b/assets/js/cf8e491a.1c0e17dc.js deleted file mode 100644 index 72aea72e4..000000000 --- a/assets/js/cf8e491a.1c0e17dc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5870],{9799:e=>{e.exports=JSON.parse('{"label":"awt","permalink":"/tags/awt","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/cf8e491a.20189b57.js b/assets/js/cf8e491a.20189b57.js new file mode 100644 index 000000000..8de855721 --- /dev/null +++ b/assets/js/cf8e491a.20189b57.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5870],{19799:e=>{e.exports=JSON.parse('{"label":"awt","permalink":"/tags/awt","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/d0840b01.5f5aa788.js b/assets/js/d0840b01.5f5aa788.js deleted file mode 100644 index aceaa9ba3..000000000 --- a/assets/js/d0840b01.5f5aa788.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8037],{317:a=>{a.exports=JSON.parse('{"label":"Transaction","permalink":"/tags/transaction","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/d0840b01.850cded6.js b/assets/js/d0840b01.850cded6.js new file mode 100644 index 000000000..678c4c9ce --- /dev/null +++ b/assets/js/d0840b01.850cded6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8037],{20317:a=>{a.exports=JSON.parse('{"label":"Transaction","permalink":"/tags/transaction","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/d09f7e4b.c7713e01.js b/assets/js/d09f7e4b.c7713e01.js deleted file mode 100644 index 6f4e4285a..000000000 --- a/assets/js/d09f7e4b.c7713e01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3098],{4057:e=>{e.exports=JSON.parse('{"permalink":"/tags/teco-chat/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/teco-chat/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d09f7e4b.eacc75cd.js b/assets/js/d09f7e4b.eacc75cd.js new file mode 100644 index 000000000..573cb6a7c --- /dev/null +++ b/assets/js/d09f7e4b.eacc75cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3098],{84057:e=>{e.exports=JSON.parse('{"permalink":"/tags/teco-chat/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/teco-chat/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d0e4cdf1.02c122d8.js b/assets/js/d0e4cdf1.02c122d8.js deleted file mode 100644 index 618b665b4..000000000 --- a/assets/js/d0e4cdf1.02c122d8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5465],{4020:e=>{e.exports=JSON.parse('{"permalink":"/page/7","page":7,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/6","nextPage":"/page/8","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d0e4cdf1.1fd4ca7e.js b/assets/js/d0e4cdf1.1fd4ca7e.js new file mode 100644 index 000000000..e99d3eb8f --- /dev/null +++ b/assets/js/d0e4cdf1.1fd4ca7e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5465],{64020:e=>{e.exports=JSON.parse('{"permalink":"/page/7","page":7,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/6","nextPage":"/page/8","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d1cef389.280b862f.js b/assets/js/d1cef389.280b862f.js deleted file mode 100644 index 8f1215609..000000000 --- a/assets/js/d1cef389.280b862f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9310],{836:e=>{e.exports=JSON.parse('{"permalink":"/page/17","page":17,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/16","nextPage":"/page/18","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d1cef389.4c8a243a.js b/assets/js/d1cef389.4c8a243a.js new file mode 100644 index 000000000..05015a7c3 --- /dev/null +++ b/assets/js/d1cef389.4c8a243a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9310],{40836:e=>{e.exports=JSON.parse('{"permalink":"/page/17","page":17,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/16","nextPage":"/page/18","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d2770bf7.41309e83.js b/assets/js/d2770bf7.41309e83.js deleted file mode 100644 index 315b02e9d..000000000 --- a/assets/js/d2770bf7.41309e83.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[843],{1156:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/43fcf0e9.999ae75e.js b/assets/js/d2770bf7.ed9f3c3a.js similarity index 72% rename from assets/js/43fcf0e9.999ae75e.js rename to assets/js/d2770bf7.ed9f3c3a.js index acd26e39d..6ac67933f 100644 --- a/assets/js/43fcf0e9.999ae75e.js +++ b/assets/js/d2770bf7.ed9f3c3a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6468],{4822:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[843],{41156:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/d2935d14.1868a9df.js b/assets/js/d2935d14.1868a9df.js deleted file mode 100644 index a7e5d5978..000000000 --- a/assets/js/d2935d14.1868a9df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3259],{2158:e=>{e.exports=JSON.parse('{"permalink":"/tags/isolation","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/41b4728f.ee287de5.js b/assets/js/d2935d14.fe55055e.js similarity index 50% rename from assets/js/41b4728f.ee287de5.js rename to assets/js/d2935d14.fe55055e.js index 98f8f8a2e..a7e2bf773 100644 --- a/assets/js/41b4728f.ee287de5.js +++ b/assets/js/d2935d14.fe55055e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8628],{171:e=>{e.exports=JSON.parse('{"permalink":"/tags/spring-boot","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3259],{92158:e=>{e.exports=JSON.parse('{"permalink":"/tags/isolation","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d297da14.a1964598.js b/assets/js/d297da14.a1964598.js new file mode 100644 index 000000000..659a3fcd7 --- /dev/null +++ b/assets/js/d297da14.a1964598.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7704],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>d});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?l(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):l(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var u=r.createContext({}),c=function(e){var n=r.useContext(u),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(u.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=c(t),d=a,f=m["".concat(u,".").concat(d)]||m[d]||s[d]||l;return t?r.createElement(f,i(i({ref:n},p),{},{components:t})):r.createElement(f,i({ref:n},p))}));function d(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,i=new Array(l);i[0]=m;var o={};for(var u in n)hasOwnProperty.call(n,u)&&(o[u]=n[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,i[1]=o;for(var c=2;c<l;c++)i[c]=t[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},85162:(e,n,t)=>{t.d(n,{Z:()=>i});var r=t(67294),a=t(86010);const l="tabItem_Ymn6";function i(e){let{children:n,hidden:t,className:i}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l,i),hidden:t},n)}},74866:(e,n,t)=>{t.d(n,{Z:()=>w});var r=t(87462),a=t(67294),l=t(86010),i=t(12466),o=t(16550),u=t(91980),c=t(67392),p=t(50012);function s(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}function m(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??s(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[n,t])}function d(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const r=(0,o.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=m(e),[i,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!d({value:n,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l}))),[u,c]=f({queryString:t,groupId:r}),[s,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,p.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),S=(()=>{const e=u??s;return d({value:e,tabValues:l})?e:null})();(0,a.useEffect)((()=>{S&&o(S)}),[S]);return{selectedValue:i,selectValue:(0,a.useCallback)((e=>{if(!d({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,l]),tabValues:l}}var S=t(72389);const b="tabList__CuJ",y="tabItem_LNqP";function v(e){let{className:n,block:t,selectedValue:o,selectValue:u,tabValues:c}=e;const p=[],{blockElementScrollPositionUntilNextRender:s}=(0,i.o5)(),m=e=>{const n=e.currentTarget,t=p.indexOf(n),r=c[t].value;r!==o&&(s(n),u(r))},d=e=>{let n=null;switch(e.key){case"Enter":m(e);break;case"ArrowRight":{const t=p.indexOf(e.currentTarget)+1;n=p[t]??p[0];break}case"ArrowLeft":{const t=p.indexOf(e.currentTarget)-1;n=p[t]??p[p.length-1];break}}n?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":t},n)},c.map((e=>{let{value:n,label:t,attributes:i}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,key:n,ref:e=>p.push(e),onKeyDown:d,onClick:m},i,{className:(0,l.Z)("tabs__item",y,i?.className,{"tabs__item--active":o===n})}),t??n)})))}function E(e){let{lazy:n,children:t,selectedValue:r}=e;if(n){const e=t.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},t.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))))}function h(e){const n=g(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",b)},a.createElement(v,(0,r.Z)({},e,n)),a.createElement(E,(0,r.Z)({},e,n)))}function w(e){const n=(0,S.Z)();return a.createElement(h,(0,r.Z)({key:String(n)},e))}},44269:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=t(87462),a=(t(67294),t(3905)),l=t(74866),i=t(85162);const o={title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:14,tags:["JDBC","Java"]},u=void 0,c={permalink:"/14",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",description:"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",date:"2023-04-02T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 2\uc77c",tags:[{label:"JDBC",permalink:"/tags/jdbc"},{label:"Java",permalink:"/tags/java"}],readingTime:9.025,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:"14",tags:["JDBC","Java"]},prevItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"}},p={authorsImageUrls:[]},s=[{value:"\uae30\uc874 \ucf54\ub4dc",id:"\uae30\uc874-\ucf54\ub4dc",level:3},{value:"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70",id:"select-delete-\uc911\ubcf5-\uc81c\uac70",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c",level:3},{value:"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30",id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30",level:3},{value:"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30",id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30",level:3}],m={toc:s};function d(e){let{components:n,...t}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uae30\uc874-\ucf54\ub4dc"},"\uae30\uc874 \ucf54\ub4dc"),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"User",label:"User",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class User {\n private final int id;\n private final String name;\n\n public User(final int id, final String name) {\n this.id = id;\n this.name = name;\n }\n\n public int getId() {\n return id;\n }\n\n public String getName() {\n return name;\n }\n}\n"))),(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final ConnectionPool connectionPool;\n\n public UserDao(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void insert(final String name) {\n final Connection connection = connectionPool.getConnection();\n final String query = "INSERT INTO User (name) VALUES (?)";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setString(1, name);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public void delete(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "DELETE FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public User findById(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n final ResultSet resultSet = preparedStatement.executeQuery();\n if (resultSet.next()) {\n return new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n );\n }\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n return null;\n }\n\n public List<User> findAll() {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n final ResultSet resultSet = preparedStatement.executeQuery();\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n ));\n }\n return result;\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n'))),(0,a.kt)(i.Z,{value:"ConnectionPool",label:"ConnectionPool",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ConnectionPool {\n private static final String SERVER = "localhost:13306";\n private static final String DATABASE = "chess";\n private static final String OPTION = "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";\n private static final String URL = "jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION;\n private static final String USERNAME = "root";\n private static final String PASSWORD = "root";\n\n private final AtomicInteger index = new AtomicInteger();\n private final List<Connection> connections;\n\n public ConnectionPool(final int connectionCount) {\n connections = generateConnections(connectionCount);\n }\n\n private List<Connection> generateConnections(final int connectionCount) {\n return Stream.generate(this::generateConnection)\n .limit(connectionCount)\n .collect(toList());\n }\n\n private Connection generateConnection() {\n try {\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\n } catch (SQLException e) {\n throw new IllegalStateException("\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.");\n }\n }\n\n public Connection getConnection() {\n int currentIndex = index.getAndIncrement();\n return connections.get(currentIndex % connections.size());\n }\n}\n')))),(0,a.kt)("h3",{id:"select-delete-\uc911\ubcf5-\uc81c\uac70"},"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70"),(0,a.kt)("p",null,"\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 "),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n executeUpdate(query, name);\n}\n\npublic void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n executeUpdate(query, userId);\n}\n\nprivate void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758"),(0,a.kt)("p",null,"\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"\ucf5c\ubc31(Callback)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("mermaid",{parentName:"admonition",value:"flowchart LR\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31"})),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","executeQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper {\n User mapRow(final ResultSet resultSet) throws SQLException;\n}\n")),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public User findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return queryForSingleResult(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n }, userId);\n}\n\nprivate User queryForSingleResult(\n final String query,\n final RowMapper rowMapper,\n final Object... parameters\n) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return rowMapper.mapRow(resultSet);\n }\n return null;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return query(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n });\n}\n\nprivate List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30"},"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper<T> {\n T mapRow(final ResultSet resultSet) throws SQLException;\n}\n\nprivate <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\nprivate <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\n")),(0,a.kt)("h3",{id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30"},"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4."),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final RowMapper<User> rowMapper = resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n };\n private final JdbcTemplate jdbcTemplate;\n\n public UserDao(final JdbcTemplate jdbcTemplate) {\n this.jdbcTemplate = jdbcTemplate;\n }\n\n public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n jdbcTemplate.executeUpdate(query, name);\n }\n\n public void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n jdbcTemplate.executeUpdate(query, userId);\n }\n\n public Optional<User> findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\n }\n\n public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return jdbcTemplate.query(query, rowMapper);\n }\n}\n'))),(0,a.kt)(i.Z,{value:"JdbcTemplate",label:"JdbcTemplate",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class JdbcTemplate {\n private final ConnectionPool connectionPool;\n\n public JdbcTemplate(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public <T> Optional<T> queryForSingleResult(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return Optional.of(rowMapper.mapRow(resultSet));\n }\n return Optional.empty();\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n private ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters\n ) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n }\n\n public <T> List<T> query(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<T> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d297da14.a7c47b77.js b/assets/js/d297da14.a7c47b77.js deleted file mode 100644 index 5a950703f..000000000 --- a/assets/js/d297da14.a7c47b77.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7704],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>d});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?l(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):l(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)t=l[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var u=r.createContext({}),c=function(e){var n=r.useContext(u),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(u.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=c(t),d=a,f=m["".concat(u,".").concat(d)]||m[d]||s[d]||l;return t?r.createElement(f,i(i({ref:n},p),{},{components:t})):r.createElement(f,i({ref:n},p))}));function d(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,i=new Array(l);i[0]=m;var o={};for(var u in n)hasOwnProperty.call(n,u)&&(o[u]=n[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,i[1]=o;for(var c=2;c<l;c++)i[c]=t[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},5162:(e,n,t)=>{t.d(n,{Z:()=>i});var r=t(7294),a=t(6010);const l="tabItem_Ymn6";function i(e){let{children:n,hidden:t,className:i}=e;return r.createElement("div",{role:"tabpanel",className:(0,a.Z)(l,i),hidden:t},n)}},4866:(e,n,t)=>{t.d(n,{Z:()=>w});var r=t(7462),a=t(7294),l=t(6010),i=t(2466),o=t(6550),u=t(1980),c=t(7392),p=t(12);function s(e){return function(e){return a.Children.map(e,(e=>{if((0,a.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))}(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:a}}=e;return{value:n,label:t,attributes:r,default:a}}))}function m(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??s(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[n,t])}function d(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function f(e){let{queryString:n=!1,groupId:t}=e;const r=(0,o.k6)(),l=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})}),[l,r])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=m(e),[i,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(n){if(!d({value:n,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l}))),[u,c]=f({queryString:t,groupId:r}),[s,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,l]=(0,p.Nk)(t);return[r,(0,a.useCallback)((e=>{t&&l.set(e)}),[t,l])]}({groupId:r}),S=(()=>{const e=u??s;return d({value:e,tabValues:l})?e:null})();(0,a.useEffect)((()=>{S&&o(S)}),[S]);return{selectedValue:i,selectValue:(0,a.useCallback)((e=>{if(!d({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,l]),tabValues:l}}var S=t(2389);const b="tabList__CuJ",y="tabItem_LNqP";function v(e){let{className:n,block:t,selectedValue:o,selectValue:u,tabValues:c}=e;const p=[],{blockElementScrollPositionUntilNextRender:s}=(0,i.o5)(),m=e=>{const n=e.currentTarget,t=p.indexOf(n),r=c[t].value;r!==o&&(s(n),u(r))},d=e=>{let n=null;switch(e.key){case"Enter":m(e);break;case"ArrowRight":{const t=p.indexOf(e.currentTarget)+1;n=p[t]??p[0];break}case"ArrowLeft":{const t=p.indexOf(e.currentTarget)-1;n=p[t]??p[p.length-1];break}}n?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":t},n)},c.map((e=>{let{value:n,label:t,attributes:i}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,key:n,ref:e=>p.push(e),onKeyDown:d,onClick:m},i,{className:(0,l.Z)("tabs__item",y,i?.className,{"tabs__item--active":o===n})}),t??n)})))}function E(e){let{lazy:n,children:t,selectedValue:r}=e;if(n){const e=t.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},t.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))))}function h(e){const n=g(e);return a.createElement("div",{className:(0,l.Z)("tabs-container",b)},a.createElement(v,(0,r.Z)({},e,n)),a.createElement(E,(0,r.Z)({},e,n)))}function w(e){const n=(0,S.Z)();return a.createElement(h,(0,r.Z)({key:String(n)},e))}},4269:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>u,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=t(7462),a=(t(7294),t(3905)),l=t(4866),i=t(5162);const o={title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:14,tags:["JDBC","Java"]},u=void 0,c={permalink:"/14",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",source:"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",description:"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",date:"2023-04-02T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 2\uc77c",tags:[{label:"JDBC",permalink:"/tags/jdbc"},{label:"Java",permalink:"/tags/java"}],readingTime:9.025,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30",slug:"14",tags:["JDBC","Java"]},prevItem:{title:"\uc790\ubc14 \ud074\ub798\uc2a4 \ud30c\uc77c \uad6c\uc870",permalink:"/15"},nextItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"}},p={authorsImageUrls:[]},s=[{value:"\uae30\uc874 \ucf54\ub4dc",id:"\uae30\uc874-\ucf54\ub4dc",level:3},{value:"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70",id:"select-delete-\uc911\ubcf5-\uc81c\uac70",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c",level:3},{value:"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c",id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c",level:3},{value:"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30",id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30",level:3},{value:"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30",id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30",level:3}],m={toc:s};function d(e){let{components:n,...t}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 DAO\ub97c \uc0ac\uc6a9\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c JDBC\ub97c \uc0ac\uc6a9\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ucee4\ub125\uc158\uc744 \uc5bb\uace0, try-with-resource\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc774 \ubc18\ubcf5\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc744 \uc774\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 JdbcTemplate\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\uae30\uc874-\ucf54\ub4dc"},"\uae30\uc874 \ucf54\ub4dc"),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"User",label:"User",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class User {\n private final int id;\n private final String name;\n\n public User(final int id, final String name) {\n this.id = id;\n this.name = name;\n }\n\n public int getId() {\n return id;\n }\n\n public String getName() {\n return name;\n }\n}\n"))),(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final ConnectionPool connectionPool;\n\n public UserDao(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void insert(final String name) {\n final Connection connection = connectionPool.getConnection();\n final String query = "INSERT INTO User (name) VALUES (?)";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setString(1, name);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public void delete(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "DELETE FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public User findById(final int userId) {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user WHERE id = ?";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n preparedStatement.setInt(1, userId);\n final ResultSet resultSet = preparedStatement.executeQuery();\n if (resultSet.next()) {\n return new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n );\n }\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n return null;\n }\n\n public List<User> findAll() {\n final Connection connection = connectionPool.getConnection();\n final String query = "SELECT * FROM user";\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n final ResultSet resultSet = preparedStatement.executeQuery();\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(new User(\n resultSet.getInt("id"),\n resultSet.getString("name")\n ));\n }\n return result;\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n'))),(0,a.kt)(i.Z,{value:"ConnectionPool",label:"ConnectionPool",mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class ConnectionPool {\n private static final String SERVER = "localhost:13306";\n private static final String DATABASE = "chess";\n private static final String OPTION = "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";\n private static final String URL = "jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION;\n private static final String USERNAME = "root";\n private static final String PASSWORD = "root";\n\n private final AtomicInteger index = new AtomicInteger();\n private final List<Connection> connections;\n\n public ConnectionPool(final int connectionCount) {\n connections = generateConnections(connectionCount);\n }\n\n private List<Connection> generateConnections(final int connectionCount) {\n return Stream.generate(this::generateConnection)\n .limit(connectionCount)\n .collect(toList());\n }\n\n private Connection generateConnection() {\n try {\n return DriverManager.getConnection(URL, USERNAME, PASSWORD);\n } catch (SQLException e) {\n throw new IllegalStateException("\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.");\n }\n }\n\n public Connection getConnection() {\n int currentIndex = index.getAndIncrement();\n return connections.get(currentIndex % connections.size());\n }\n}\n')))),(0,a.kt)("h3",{id:"select-delete-\uc911\ubcf5-\uc81c\uac70"},"SELECT, DELETE \uc911\ubcf5 \uc81c\uac70"),(0,a.kt)("p",null,"\ubcc0\ud558\uc9c0 \uc54a\ub294 \ubd80\ubd84: try-with-resource, preparedStatement\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84, executeUpdate\ub85c \uc2e4\ud589 \ub4f1\ub4f1",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\ud558\ub294 \ubd80\ubd84: SQL Query, \ub9e4\uac1c\ubcc0\uc218 "),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub294 \ubd80\ubd84\uc744 \ubd84\ub9ac\ud558\uace0 \uac00\ubcc0\uc778\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74 SELECT\uc640 DELETE\uc758 \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n executeUpdate(query, name);\n}\n\npublic void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n executeUpdate(query, userId);\n}\n\nprivate void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---1-\ucf5c\ubc31\uc744-\uc704\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc815\uc758"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 1. \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758"),(0,a.kt)("p",null,"\uc870\ud68c\ub294 INSERT, DELETE\uc640 \ub2ec\ub9ac \uac12\uc744 \ubc18\ud658\ubc1b\uc544\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ub2e4\ub978 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ub54c \ucf5c\ubc31\uc774\ub77c\ub294 \uac83\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("admonition",{title:"\ucf5c\ubc31(Callback)",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ucf5c\ubc31\uc740 \ub2e4\ub978 \ucf54\ub4dc\uc758 \uc778\uc218\ub85c \ub118\uaca8\uc8fc\ub294 \uc2e4\ud589 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub73b\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc790\ubc14\uc5d0\uc11c\ub294 \ub78c\ub2e4\ub098 \uc775\uba85 \ud074\ub798\uc2a4\ub97c \ub118\uaca8\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("mermaid",{parentName:"admonition",value:"flowchart LR\n \ud074\ub77c\uc774\uc5b8\ud2b8 -- \ucf5c\ubc31\uc804\ub2ec --\x3e \uba54\uc11c\ub4dc\n \uba54\uc11c\ub4dc -- \ub0b4\ubd80\ud638\ucd9c --\x3e \uc804\ub2ec\ubc1b\uc740\ucf5c\ubc31"})),(0,a.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud558\uace0, \ud574\ub2f9 \uac12\uc744 \uac1d\uccb4\ub85c \ub9e4\ud551\ud558\uc5ec \uac12\uc744 \ubc18\ud658\ud574\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","executeQuery\ub85c \uc870\ud68c\ud55c \uac12\uc740 ResultSet \uc548\uc5d0 \ub4e4\uc5b4\uac00\uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub97c \uc6d0\ud558\ub294 \ud0c0\uc785\uc758 \uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc57c\ud558\ub2c8 \uc77c\ub2e8 \ucf5c\ubc31\uc744 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper {\n User mapRow(final ResultSet resultSet) throws SQLException;\n}\n")),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---2-\ub2e8\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 2. \ub2e8\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\uc704\uc5d0\uc11c \uc815\uc758\ud55c RowMapper\ub97c \uba54\uc11c\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 SQL \ucffc\ub9ac, RowMapper, \ud30c\ub77c\ubbf8\ud130\ub97c \ubd84\ub9ac\ud55c \uba54\uc11c\ub4dc\uc5d0 \ub118\uaca8\uc8fc\uace0 \ucffc\ub9ac \uc2e4\ud589 \ud6c4 \ub9e4\ud551\ud55c \uac12\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public User findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return queryForSingleResult(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n }, userId);\n}\n\nprivate User queryForSingleResult(\n final String query,\n final RowMapper rowMapper,\n final Object... parameters\n) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return rowMapper.mapRow(resultSet);\n }\n return null;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc870\ud68c-\ubd84\ub9ac\ud558\uae30---3-\ub2e4\uac74-\uc870\ud68c"},"\uc870\ud68c \ubd84\ub9ac\ud558\uae30 - 3. \ub2e4\uac74 \uc870\ud68c"),(0,a.kt)("p",null,"\ub2e8\uac74 \uc870\ud68c\uc640 \uc720\uc0ac\ud558\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return query(query, resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n });\n}\n\nprivate List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<User> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n}\n\nprivate ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n}\n')),(0,a.kt)("h3",{id:"\uc81c\ub124\ub9ad-\uc0ac\uc6a9\ud558\uae30"},"\uc81c\ub124\ub9ad \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uc704\uc758 \ucf54\ub4dc\ub294 User\ub97c \uc870\ud68c\ud560 \ub54c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc640 \uac19\uc774 \uc81c\ub124\ub9ad\uc744 \uc801\uc6a9\ud558\uc5ec \ub2e4\ub978 Dao\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface RowMapper<T> {\n T mapRow(final ResultSet resultSet) throws SQLException;\n}\n\nprivate <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\nprivate <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}\n")),(0,a.kt)("h3",{id:"\uba54\uc11c\ub4dc-\ubd84\ub9ac\ud55c-\ubd80\ubd84-\ud074\ub798\uc2a4\ub85c-\ubd84\ub9ac\ud558\uae30--optional-\uc0ac\uc6a9\ud558\uae30"},"\uba54\uc11c\ub4dc \ubd84\ub9ac\ud55c \ubd80\ubd84 \ud074\ub798\uc2a4\ub85c \ubd84\ub9ac\ud558\uae30 + Optional \uc0ac\uc6a9\ud558\uae30"),(0,a.kt)("p",null,"\uba54\uc11c\ub4dc\ub85c \ubd84\ub9ac\ud55c \ubd80\ubd84\uc744 JdbcTemplate\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc62e\uae34\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c null\uc744 \ubc18\ud658\ud558\uae30 \ubcf4\ub2e8 Optional\ub85c \uac10\uc2f8\uc11c \ubc18\ud658\ud558\ub3c4\ub85d \ubcc0\uacbd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\uac00 \uc644\uc131\ub41c\ub2e4."),(0,a.kt)(l.Z,{mdxType:"Tabs"},(0,a.kt)(i.Z,{value:"UserDao",label:"UserDao",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'public class UserDao {\n private final RowMapper<User> rowMapper = resultSet -> {\n final int id = resultSet.getInt("id");\n final String name = resultSet.getString("name");\n return new User(id, name);\n };\n private final JdbcTemplate jdbcTemplate;\n\n public UserDao(final JdbcTemplate jdbcTemplate) {\n this.jdbcTemplate = jdbcTemplate;\n }\n\n public void insert(final String name) {\n final String query = "INSERT INTO User (name) VALUES (?)";\n jdbcTemplate.executeUpdate(query, name);\n }\n\n public void delete(final int userId) {\n final String query = "DELETE FROM user WHERE user_id = ?";\n jdbcTemplate.executeUpdate(query, userId);\n }\n\n public Optional<User> findById(final int userId) {\n final String query = "SELECT * FROM user WHERE id = ?";\n return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);\n }\n\n public List<User> findAll() {\n final String query = "SELECT * FROM user";\n return jdbcTemplate.query(query, rowMapper);\n }\n}\n'))),(0,a.kt)(i.Z,{value:"JdbcTemplate",label:"JdbcTemplate",default:!0,mdxType:"TabItem"},(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public class JdbcTemplate {\n private final ConnectionPool connectionPool;\n\n public JdbcTemplate(final ConnectionPool connectionPool) {\n this.connectionPool = connectionPool;\n }\n\n public void executeUpdate(final String query, final Object... parameters) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n preparedStatement.executeUpdate();\n } catch (final SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n public <T> Optional<T> queryForSingleResult(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n if (resultSet.next()) {\n return Optional.of(rowMapper.mapRow(resultSet));\n }\n return Optional.empty();\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n\n private ResultSet executeQuery(\n final PreparedStatement preparedStatement,\n final Object[] parameters\n ) throws SQLException {\n for (int i = 1; i <= parameters.length; i++) {\n preparedStatement.setObject(i, parameters[i - 1]);\n }\n return preparedStatement.executeQuery();\n }\n\n public <T> List<T> query(\n final String query,\n final RowMapper<T> rowMapper,\n final Object... parameters\n ) {\n final Connection connection = connectionPool.getConnection();\n try (final PreparedStatement preparedStatement = connection.prepareStatement(query);\n final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {\n final List<T> result = new ArrayList<>();\n while (resultSet.next()) {\n result.add(rowMapper.mapRow(resultSet));\n }\n return result;\n } catch (SQLException e) {\n throw new IllegalArgumentException(e.getMessage());\n }\n }\n}\n")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d368e73e.9d264eba.js b/assets/js/d368e73e.9d264eba.js new file mode 100644 index 000000000..44cc19fb6 --- /dev/null +++ b/assets/js/d368e73e.9d264eba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7954],{71965:e=>{e.exports=JSON.parse('{"permalink":"/tags/image","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/image/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d368e73e.db47481c.js b/assets/js/d368e73e.db47481c.js deleted file mode 100644 index d51a563b1..000000000 --- a/assets/js/d368e73e.db47481c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7954],{1965:e=>{e.exports=JSON.parse('{"permalink":"/tags/image","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/image/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d3752f11.31066cbd.js b/assets/js/d3752f11.31066cbd.js new file mode 100644 index 000000000..5db7893b7 --- /dev/null +++ b/assets/js/d3752f11.31066cbd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4819],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),m=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=m(e.components);return a.createElement(o.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=m(n),c=r,y=d["".concat(o,".").concat(c)]||d[c]||s[c]||l;return n?a.createElement(y,p(p({ref:t},u),{},{components:n})):a.createElement(y,p({ref:t},u))}));function c(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,p=new Array(l);p[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,p[1]=i;for(var m=2;m<l;m++)p[m]=n[m];return a.createElement.apply(null,p)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},78185:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var a=n(87462),r=(n(67294),n(3905));const l={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:38,tags:["Image","Python"]},p=void 0,i={permalink:"/38",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",source:"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",description:"\uac1c\uc694",date:"2023-07-31T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 31\uc77c",tags:[{label:"Image",permalink:"/tags/image"},{label:"Python",permalink:"/tags/python"}],readingTime:6.185,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:"38",tags:["Image","Python"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"},nextItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"}},o={authorsImageUrls:[]},m=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\uc0ac\uc6a9 \uae30\uc220",id:"\uc0ac\uc6a9-\uae30\uc220",level:3},{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd",id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd",level:3},{value:"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604",id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604",level:3},{value:"AWS Lambda",id:"aws-lambda",level:3},{value:"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131",id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131",level:3},{value:"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc",id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc",level:3},{value:"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131",id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"<code>No module named 'numpy.core._multiarray_umath'</code> \uc5d0\ub7ec",id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec",level:3},{value:"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01",id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],u={toc:m};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\uc0ac\uc6a9-\uae30\uc220"},"\uc0ac\uc6a9 \uae30\uc220"),(0,r.kt)("p",null,"\uc5b8\uc5b4: Python 3.10",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib",(0,r.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront "),(0,r.kt)("p",null,"\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("mermaid",{value:"graph LR\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\n Client --\x3e CloudFront --\x3e S3"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./route.png",src:n(94934).Z,width:"1014",height:"902"})),(0,r.kt)("p",null,"\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. "),(0,r.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,r.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,r.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9"),(0,r.kt)("li",{parentName:"ul"},"\uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. ")),(0,r.kt)("h3",{id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd"},"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5"),(0,r.kt)("li",{parentName:"ol"},"\ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5")),(0,r.kt)("p",null,"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604"},"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"import time\n\nimport matplotlib.pyplot as plt\n\n\ndef draw(point):\n start = time.time()\n x, y = zip(*point)\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n draw_lines(pixel_x, pixel_y)\n end = time.time()\n print(end - start)\n \ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n return scaled_coordinates\n\n\ndef draw_lines(x, y):\n figure = plt.gcf()\n figure.set_size_inches(5, 5)\n plt.plot(x, y, c = 'w',linewidth=5)\n plt.scatter(x[3],y[3], c = 'w', s = 125)\n plt.axis('off')\n plt.savefig('name.png', transparent=True, format='png')\n\npoint = [\n [126.96352960597338, 37.590841000217125],\n [126.96987292787792, 37.58435564234159],\n [126.98128481452298, 37.58594375113966],\n [126.99360339342958, 37.58248524741927],\n [126.99867565340067, 37.56778118088622],\n [127.001935378366117, 37.55985240444085],\n [126.9831048919687, 37.548030119488665],\n [126.97189273528845, 37.5119879225856],\n [127.02689859997221, 37.48488593333883]\n]\n\ndraw(point)\n")),(0,r.kt)("p",null,"\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./routeImage.png",src:n(46770).Z,width:"500",height:"500"})),(0,r.kt)("h3",{id:"aws-lambda"},"AWS Lambda"),(0,r.kt)("p",null,"\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131"},"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131"),(0,r.kt)("p",null,"AmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc"},"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc"),(0,r.kt)("p",null,"\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"\nimport io\nimport uuid\n\nimport boto3\nimport matplotlib.pyplot as plt\n\nPIXEL = 255\nBUCKET_NAME = 'image-plot'\nS3 = 's3'\n\ndef lambda_handler(event, context):\n x = event['x']\n y = event['y']\n image_name = str(uuid.uuid4())\n\n img_data = draw(x, y)\n s3 = boto3.client(S3)\n s3.put_object(Body=img_data.getvalue(), ContentType='image/png', Bucket=BUCKET_NAME, Key=image_name)\n url = f'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}'\n\n return {\n 'statusCode': 200,\n 'body': url\n }\n\ndef draw(x, y):\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n img_data = draw_lines(pixel_x, pixel_y)\n plt.close()\n return img_data\n\ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\n return pixel_values\n\ndef draw_lines(x, y):\n plt.plot(x, y, 'k-', linewidth=10)\n plt.axis('off')\n img_data = io.BytesIO()\n plt.savefig(img_data, transparent=True, format='png')\n img_data.seek(0)\n return img_data\n\n")),(0,r.kt)("h3",{id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131"},"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"matplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"pillow.zip\n\u2502 python/PIL\n\u2514 python/Pillow-5.3.0.dist-info\n")),(0,r.kt)("p",null,"Ubuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"sudo apt update\nsudo apt install zip\nsudo apt install python3-pip\n\nmkdir python\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\n")),(0,r.kt)("h3",{id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec"},(0,r.kt)("inlineCode",{parentName:"h3"},"No module named 'numpy.core._multiarray_umath'")," \uc5d0\ub7ec"),(0,r.kt)("p",null,"Layer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01"},"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","AWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/lambda/"},"AWS Lambda"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html"},"Lambda Layer"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html"},"Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b"},"No module named 'numpy.core._multiarray_umath'"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/6217/"},"\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc")))}s.isMDXComponent=!0},94934:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"},46770:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/routeImage-0eac25ba9b356cd034ade6e062c1ce19.png"}}]); \ No newline at end of file diff --git a/assets/js/d3752f11.3e74a639.js b/assets/js/d3752f11.3e74a639.js deleted file mode 100644 index b84514850..000000000 --- a/assets/js/d3752f11.3e74a639.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4819],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),m=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=m(e.components);return a.createElement(o.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=m(n),c=r,y=d["".concat(o,".").concat(c)]||d[c]||s[c]||l;return n?a.createElement(y,p(p({ref:t},u),{},{components:n})):a.createElement(y,p({ref:t},u))}));function c(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,p=new Array(l);p[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i.mdxType="string"==typeof e?e:r,p[1]=i;for(var m=2;m<l;m++)p[m]=n[m];return a.createElement.apply(null,p)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},8185:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>p,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var a=n(7462),r=(n(7294),n(3905));const l={title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:38,tags:["Image","Python"]},p=void 0,i={permalink:"/38",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",source:"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",description:"\uac1c\uc694",date:"2023-07-31T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 31\uc77c",tags:[{label:"Image",permalink:"/tags/image"},{label:"Python",permalink:"/tags/python"}],readingTime:6.185,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",slug:"38",tags:["Image","Python"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604",permalink:"/39"},nextItem:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",permalink:"/37"}},o={authorsImageUrls:[]},m=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"\uc0ac\uc6a9 \uae30\uc220",id:"\uc0ac\uc6a9-\uae30\uc220",level:3},{value:"\uc694\uad6c\uc0ac\ud56d",id:"\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd",id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd",level:3},{value:"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604",id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604",level:3},{value:"AWS Lambda",id:"aws-lambda",level:3},{value:"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131",id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131",level:3},{value:"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc",id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc",level:3},{value:"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131",id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131",level:3},{value:"<code>No module named 'numpy.core._multiarray_umath'</code> \uc5d0\ub7ec",id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec",level:3},{value:"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01",id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],u={toc:m};function s(e){let{components:t,...l}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,r.kt)("p",null,"\uc774\uc804\uc5d0 \uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc870\uc0ac\ud558\uba74\uc11c \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud55c \ub0b4\uc6a9\uc744 \uc815\ub9ac\ud55c \ub0b4\uc6a9\uc774\ub2e4. "),(0,r.kt)("h3",{id:"\uc0ac\uc6a9-\uae30\uc220"},"\uc0ac\uc6a9 \uae30\uc220"),(0,r.kt)("p",null,"\uc5b8\uc5b4: Python 3.10",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc0dd\uc131: matplotlib",(0,r.kt)("br",{parentName:"p"}),"\n","\uc11c\ube44\uc2a4: AWS Lambda, AWS API Gateway",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \ubc0f URL: AWS S3, AWS CloudFront "),(0,r.kt)("p",null,"\ud50c\ub85c\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("mermaid",{value:"graph LR\n Server -- \uc0dd\uc131 \uc694\uccad --\x3e AG[API Gateway] --\x3e Lambda --\x3e S3\n Client --\x3e CloudFront --\x3e S3"}),(0,r.kt)("h3",{id:"\uc694\uad6c\uc0ac\ud56d"},"\uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./route.png",src:n(4934).Z,width:"1014",height:"902"})),(0,r.kt)("p",null,"\uc6b0\uce21 \uc0c1\ub2e8\uc758 \uacbd\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\ub824\uace0 \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc5d0 \ub300\ud55c \uc694\uad6c\uc0ac\ud56d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\uc704\ub3c4, \uacbd\ub3c4\ub85c \uc774\ub8e8\uc5b4\uc9c4 \ubc30\uc5f4\uc744 \uc785\ub825\ubc1b\ub294\ub2e4. "),(0,r.kt)("li",{parentName:"ul"},"\uc774\ubbf8\uc9c0 \uc0dd\uc131"),(0,r.kt)("li",{parentName:"ul"},"\uc120\uacfc \uc810 \ud45c\ud604"),(0,r.kt)("li",{parentName:"ul"},"\ud22c\uba85\ud55c \ubc30\uacbd\uc0c9"),(0,r.kt)("li",{parentName:"ul"},"\uc704\uacbd\ub3c4 \ucc28\uc774\uac00 \ud06c\ub4e0 \uc791\ub4e0 \uc81c\uacf5\ud558\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \uacbd\ub85c\uac00 \ub2e4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. ")),(0,r.kt)("h3",{id:"\uc774\ubbf8\uc9c0-\ucd9c\ub825-\ubc29\uc2dd"},"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\uc704\uacbd\ub3c4\ub97c \ucc98\ub9ac\ud55c \uac12\uc73c\ub85c \uc9c1\uc811 \uacbd\ub85c\ub97c \uadf8\ub9b0 \ub2e4\uc74c \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5"),(0,r.kt)("li",{parentName:"ol"},"\ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ud615\ud0dc\ub85c \uc800\uc7a5")),(0,r.kt)("p",null,"\uc774\ubbf8\uc9c0 \ucd9c\ub825 \ubc29\uc2dd\uc758 \uacbd\uc6b0 1\ubc88\uacfc 2\ubc88\uc744 \uace0\ubbfc\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud30c\uc774\uc36c\uc73c\ub85c\ub294 \ud50c\ub86f\uc744 \uadf8\ub824\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 matplotlib\uc744 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub85c\uceec\uc5d0\uc11c-\uae30\ub2a5-\uad6c\ud604"},"\ub85c\uceec\uc5d0\uc11c \uae30\ub2a5 \uad6c\ud604"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"import time\n\nimport matplotlib.pyplot as plt\n\n\ndef draw(point):\n start = time.time()\n x, y = zip(*point)\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n draw_lines(pixel_x, pixel_y)\n end = time.time()\n print(end - start)\n \ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n return scaled_coordinates\n\n\ndef draw_lines(x, y):\n figure = plt.gcf()\n figure.set_size_inches(5, 5)\n plt.plot(x, y, c = 'w',linewidth=5)\n plt.scatter(x[3],y[3], c = 'w', s = 125)\n plt.axis('off')\n plt.savefig('name.png', transparent=True, format='png')\n\npoint = [\n [126.96352960597338, 37.590841000217125],\n [126.96987292787792, 37.58435564234159],\n [126.98128481452298, 37.58594375113966],\n [126.99360339342958, 37.58248524741927],\n [126.99867565340067, 37.56778118088622],\n [127.001935378366117, 37.55985240444085],\n [126.9831048919687, 37.548030119488665],\n [126.97189273528845, 37.5119879225856],\n [127.02689859997221, 37.48488593333883]\n]\n\ndraw(point)\n")),(0,r.kt)("p",null,"\uc0dd\uc131 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4. (\uc608\uc2dc\ub97c \uc704\ud574 \uac80\uc740\uc0c9\uc73c\ub85c \ucd9c\ub825)"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./routeImage.png",src:n(6770).Z,width:"500",height:"500"})),(0,r.kt)("h3",{id:"aws-lambda"},"AWS Lambda"),(0,r.kt)("p",null,"\uc378\ub124\uc77c \uc0dd\uc131 \uc11c\ubc84\ub97c \ub530\ub85c \ub450\uae30\ub294 \uae30\ub2a5 \ub300\ube44 \ube44\uc6a9\uc774 \ub108\ubb34 \ud074 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc11c\ubc84\ub9ac\uc2a4\ub85c \ud30c\uc77c\uc744 \ucc98\ub9ac\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\ub85c s3 \uc811\uadfc\uc740 boto3\ub97c \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-s3-\uc811\uadfc\uc744-\uc704\ud55c-iam-\uc0dd\uc131"},"\ub78c\ub2e4 S3 \uc811\uadfc\uc744 \uc704\ud55c IAM \uc0dd\uc131"),(0,r.kt)("p",null,"AmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy \ub450\uac00\uc9c0\ub97c \ucd94\uac00\ud574\uc11c Lambda \uc804\uc6a9 \uc5ed\ud560\uc744 \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\ub78c\ub2e4-\ubc30\ud3ec\uc6a9-\ucf54\ub4dc"},"\ub78c\ub2e4 \ubc30\ud3ec\uc6a9 \ucf54\ub4dc"),(0,r.kt)("p",null,"\uae30\uc220 \uad6c\ud604 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ud655\uc778\ud560 \ub550 \uc704\uce58 \uc810\uc744 \ucc0d\ub294 \uae30\ub2a5\uc744 \ub78c\ub2e4\uc5d0 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc558\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"\nimport io\nimport uuid\n\nimport boto3\nimport matplotlib.pyplot as plt\n\nPIXEL = 255\nBUCKET_NAME = 'image-plot'\nS3 = 's3'\n\ndef lambda_handler(event, context):\n x = event['x']\n y = event['y']\n image_name = str(uuid.uuid4())\n\n img_data = draw(x, y)\n s3 = boto3.client(S3)\n s3.put_object(Body=img_data.getvalue(), ContentType='image/png', Bucket=BUCKET_NAME, Key=image_name)\n url = f'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}'\n\n return {\n 'statusCode': 200,\n 'body': url\n }\n\ndef draw(x, y):\n pixel_x, pixel_y = convert_to_pixel_values(x, y)\n img_data = draw_lines(pixel_x, pixel_y)\n plt.close()\n return img_data\n\ndef convert_to_pixel_values(x, y):\n max_diff = max(max(x) - min(x), max(y) - min(y))\n return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)\n\ndef scale_to_pixel_values(points, max_diff):\n min_value = min(points)\n scaled_coordinates = [(p - min_value) / max_diff for p in points]\n pixel_values = [int(p * PIXEL) for p in scaled_coordinates]\n return pixel_values\n\ndef draw_lines(x, y):\n plt.plot(x, y, 'k-', linewidth=10)\n plt.axis('off')\n img_data = io.BytesIO()\n plt.savefig(img_data, transparent=True, format='png')\n img_data.seek(0)\n return img_data\n\n")),(0,r.kt)("h3",{id:"layer-\ucd94\uac00\ub97c-\uc704\ud55c-zip-\ud30c\uc77c-\uc0dd\uc131"},"Layer \ucd94\uac00\ub97c \uc704\ud55c zip \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("p",null,"matplotlib\uc758 \uacbd\uc6b0 \uc678\ubd80 \ub77c\uc774\ube0c\ub7ec\ub9ac\uae30 \ub54c\ubb38\uc5d0 \ub530\ub85c Layer\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\uc11c \uc5c5\ub85c\ub4dc\ud574\uc57c\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c python\uc758 Lambda \ub7f0\ud0c0\uc784\uc5d0 \ub300\ud55c \uacc4\uce35 \uacbd\ub85c\ub294 python\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc555\ucd95\ud55c zip \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \ub744\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"pillow.zip\n\u2502 python/PIL\n\u2514 python/Pillow-5.3.0.dist-info\n")),(0,r.kt)("p",null,"Ubuntu \uae30\uc900 \ub2e4\uc74c \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc0dd\uc131\uc744 \uc9c4\ud589\ud588\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"sudo apt update\nsudo apt install zip\nsudo apt install python3-pip\n\nmkdir python\npip3 install matplotlib -t python # pip3 install \uc124\uce58\ud560_\ud328\ud0a4\uc9c0 -t \uc124\uce58_\uacbd\ub85c\nzip -r my_layer.zip python # zip -r \uc555\ucd95_\ud30c\uc77c\uba85 \uc555\ucd95_\ud30c\uc77c\uc774_\uc874\uc7ac\ud558\ub294_\uacbd\ub85c\n")),(0,r.kt)("h3",{id:"no-module-named-numpycore_multiarray_umath-\uc5d0\ub7ec"},(0,r.kt)("inlineCode",{parentName:"h3"},"No module named 'numpy.core._multiarray_umath'")," \uc5d0\ub7ec"),(0,r.kt)("p",null,"Layer \ucd94\uac00 \ud6c4 \ub78c\ub2e4 \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud55c \uc5d0\ub7ec\uc600\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ucc98\uc74c\uc5d0 mac\uc5d0\uc11c zip \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \uc5c5\ub85c\ub4dc\ud588\ub294\ub370 \ud574\ub2f9 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\ub294 lambda\uac00 \ub3cc\uc544\uac00\ub294 \ub3d9\uc77c\ud55c \ud658\uacbd\uc5d0\uc11c layer\ub97c \uc704\ud55c zip \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc9c0 \uc54a\uc544\uc11c \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud558\uac8c ec2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \ub530\ub85c Layer\ub97c \uc0dd\uc131\ud558\uba74 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"\uc801\uc815\uae30\uc220\uc5d0-\ub300\ud55c-\uc0dd\uac01"},"\uc801\uc815\uae30\uc220\uc5d0 \ub300\ud55c \uc0dd\uac01"),(0,r.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\uc5d0 Lambda\uc640 Python\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \uc544\uc27d\uac8c\ub3c4 \ubc18\ub824\ub2f9\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","AWS Lambda\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud574\ub2f9 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc77c \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\uc6a9 \uac00\ub2a5\ud55c \uc790\uc6d0, \uae30\uc220\uc758 \ub09c\uc774\ub3c4, \uc0ac\uc6a9\ud558\ub294 \ud300\uc6d0\uc744 \uace0\ub824\ud55c\ub2e4\uba74 Lambda\ub294 \uc801\uc815\uae30\uc220\uc774 \uc544\ub2d0 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud574\ub2f9 \uc774\ubbf8\uc9c0 \uc0dd\uc131\uae30\ub97c \uc5b4\ub5bb\uac8c \uc801\uc6a9\ud560\uc9c0 \uc870\uae08 \ub354 \uace0\ub824\ub97c \ud574\uc57c \ub420 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\ucd5c\uc885\uc801\uc73c\ub85c Java AWT\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.")),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/lambda/"},"AWS Lambda"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html"},"Lambda Layer"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html"},"Python Lambda \ud568\uc218\uc5d0 \ub300\ud55c .zip \ud30c\uc77c \uc544\uce74\uc774\ube0c \uc791\uc5c5"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://gist.github.com/ksmin23/0f3f243408a8497f766b43cf589fea7b"},"No module named 'numpy.core._multiarray_umath'"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://techblog.woowahan.com/6217/"},"\uc0ac\ub840\ubcc4\ub85c \uc54c\uc544\ubcf8 \uc548\uc804\ud55c S3 \uc0ac\uc6a9 \uac00\uc774\ub4dc")))}s.isMDXComponent=!0},4934:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/route-89cacb9b7815a3191ab1f9d9e23c43a1.png"},6770:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/routeImage-0eac25ba9b356cd034ade6e062c1ce19.png"}}]); \ No newline at end of file diff --git a/assets/js/d50fd269.79a6cf20.js b/assets/js/d50fd269.79a6cf20.js new file mode 100644 index 000000000..8ba2fca49 --- /dev/null +++ b/assets/js/d50fd269.79a6cf20.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[100],{38132:e=>{e.exports=JSON.parse('{"permalink":"/page/31","page":31,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/30","nextPage":"/page/32","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d50fd269.ec047294.js b/assets/js/d50fd269.ec047294.js deleted file mode 100644 index dcb8b3190..000000000 --- a/assets/js/d50fd269.ec047294.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[100],{8132:e=>{e.exports=JSON.parse('{"permalink":"/page/31","page":31,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/30","nextPage":"/page/32","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d5dfecc2.0a00693c.js b/assets/js/d5dfecc2.0a00693c.js deleted file mode 100644 index 170d22337..000000000 --- a/assets/js/d5dfecc2.0a00693c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1677],{3335:e=>{e.exports=JSON.parse('{"permalink":"/tags/teco-chat/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/teco-chat","nextPage":"/tags/teco-chat/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d5dfecc2.ea44f851.js b/assets/js/d5dfecc2.ea44f851.js new file mode 100644 index 000000000..3bdeb1cf5 --- /dev/null +++ b/assets/js/d5dfecc2.ea44f851.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1677],{83335:e=>{e.exports=JSON.parse('{"permalink":"/tags/teco-chat/page/2","page":2,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/teco-chat","nextPage":"/tags/teco-chat/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d693e23c.05708b3c.js b/assets/js/d693e23c.05708b3c.js deleted file mode 100644 index f8d648d5f..000000000 --- a/assets/js/d693e23c.05708b3c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6697],{3905:(e,t,a)=>{a.d(t,{Zo:()=>b,kt:()=>s});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),m=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},b=function(e){var t=m(e.components);return n.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,b=o(e,["components","mdxType","originalType","parentName"]),c=m(a),s=r,u=c["".concat(p,".").concat(s)]||c[s]||d[s]||l;return a?n.createElement(u,i(i({ref:t},b),{},{components:a})):n.createElement(u,i({ref:t},b))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var m=2;m<l;m++)i[m]=a[m];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},5397:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var n=a(7462),r=(a(7294),a(3905));const l={title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:17,tags:["DataBase","Transaction","Isolation"]},i=void 0,o={permalink:"/17",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",source:"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",description:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",date:"2023-04-05T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 5\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Transaction",permalink:"/tags/transaction"},{label:"Isolation",permalink:"/tags/isolation"}],readingTime:9.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:"17",tags:["DataBase","Transaction","Isolation"]},prevItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"},nextItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"}},p={authorsImageUrls:[]},m=[{value:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",id:"\ud2b8\ub79c\uc7ad\uc158transaction",level:2},{value:"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)",id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid",level:3},{value:"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d",id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d",level:3},{value:"\uaca9\ub9ac \uc218\uc900(Isolation level)",id:"\uaca9\ub9ac-\uc218\uc900isolation-level",level:2},{value:"READ UNCOMMITTED",id:"read-uncommitted",level:3},{value:"READ COMMITTED",id:"read-committed",level:3},{value:"REPEATABLE READ",id:"repeatable-read",level:3},{value:"SERIALIZABLE",id:"serializable",level:3},{value:"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c",id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c",level:2},{value:"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)",id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read",level:3},{value:"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)",id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read",level:3},{value:"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)",id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],b={toc:m};function d(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},b,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\ud2b8\ub79c\uc7ad\uc158transaction"},"\ud2b8\ub79c\uc7ad\uc158(Transaction)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid"},"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)"),(0,r.kt)("p",null,"\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d"},"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c)",(0,r.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)"),(0,r.kt)("li",{parentName:"ul"},"\ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)"))),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900isolation-level"},"\uaca9\ub9ac \uc218\uc900(Isolation level)"),(0,r.kt)("p",null,"\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, ",(0,r.kt)("inlineCode",{parentName:"p"},"SERIALIZABLE"),"\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"read-uncommitted"},"READ UNCOMMITTED"),(0,r.kt)("p",null,"\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"ROLLBACK")," \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c ",(0,r.kt)("inlineCode",{parentName:"p"},"READ COMMITTED")," \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ UNCOMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: INSERT(Alice)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: COMMIT(Alice)"}),(0,r.kt)("h3",{id:"read-committed"},"READ COMMITTED"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uba70, \uc628\ub77c\uc778 \uc11c\ube44\uc2a4\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc120\ud0dd\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ"),"\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"NON-REPEATABLE READ")," \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ COMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)\n Alice->>Database: COMMIT"}),(0,r.kt)("h3",{id:"repeatable-read"},"REPEATABLE READ"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. ")),(0,r.kt)("p",null,"InnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)"}),(0,r.kt)("admonition",{title:"\uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.")),(0,r.kt)("admonition",{title:"MVCC(Multi Version Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Oracle, InnoDB\ub294 ",(0,r.kt)("inlineCode",{parentName:"li"},"Undo log"),"\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)")),(0,r.kt)("p",{parentName:"admonition"},"\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.")),(0,r.kt)("h3",{id:"serializable"},"SERIALIZABLE"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. "),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c"},"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("p",null,"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ub354\ud2f0 \ub9ac\ub4dc"),(0,r.kt)("th",{parentName:"tr",align:null},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud32c\ud140 \ub9ac\ub4dc"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ UNCOMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ COMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REPEATABLE READ"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O(InnoDB\ub294 X)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SERIALIZABLE"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X")))),(0,r.kt)("h3",{id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read"},"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)"),(0,r.kt)("p",null,"\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0"),(0,r.kt)("h3",{id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read"},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: NON REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Bob"}),(0,r.kt)("h3",{id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row"},"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: PHANTOM READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 1\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: INSERT(Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 2"}),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html"},"Isolation Level, MySQL")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d693e23c.33f1813d.js b/assets/js/d693e23c.33f1813d.js new file mode 100644 index 000000000..74c824327 --- /dev/null +++ b/assets/js/d693e23c.33f1813d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6697],{3905:(e,t,a)=>{a.d(t,{Zo:()=>b,kt:()=>s});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),m=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},b=function(e){var t=m(e.components);return n.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,b=o(e,["components","mdxType","originalType","parentName"]),c=m(a),s=r,u=c["".concat(p,".").concat(s)]||c[s]||d[s]||l;return a?n.createElement(u,i(i({ref:t},b),{},{components:a})):n.createElement(u,i({ref:t},b))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var m=2;m<l;m++)i[m]=a[m];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},25397:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var n=a(87462),r=(a(67294),a(3905));const l={title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:17,tags:["DataBase","Transaction","Isolation"]},i=void 0,o={permalink:"/17",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",source:"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",description:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",date:"2023-04-05T00:00:00.000Z",formattedDate:"2023\ub144 4\uc6d4 5\uc77c",tags:[{label:"DataBase",permalink:"/tags/data-base"},{label:"Transaction",permalink:"/tags/transaction"},{label:"Isolation",permalink:"/tags/isolation"}],readingTime:9.68,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900",slug:"17",tags:["DataBase","Transaction","Isolation"]},prevItem:{title:"MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08",permalink:"/18"},nextItem:{title:"\ud14c\uc2a4\ud2b8 \ub300\uc5ed",permalink:"/16"}},p={authorsImageUrls:[]},m=[{value:"\ud2b8\ub79c\uc7ad\uc158(Transaction)",id:"\ud2b8\ub79c\uc7ad\uc158transaction",level:2},{value:"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)",id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid",level:3},{value:"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d",id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d",level:3},{value:"\uaca9\ub9ac \uc218\uc900(Isolation level)",id:"\uaca9\ub9ac-\uc218\uc900isolation-level",level:2},{value:"READ UNCOMMITTED",id:"read-uncommitted",level:3},{value:"READ COMMITTED",id:"read-committed",level:3},{value:"REPEATABLE READ",id:"repeatable-read",level:3},{value:"SERIALIZABLE",id:"serializable",level:3},{value:"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c",id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c",level:2},{value:"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)",id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read",level:3},{value:"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)",id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read",level:3},{value:"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)",id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],b={toc:m};function d(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},b,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\ud2b8\ub79c\uc7ad\uc158transaction"},"\ud2b8\ub79c\uc7ad\uc158(Transaction)"),(0,r.kt)("p",null,"\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub17c\ub9ac\uc801 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \uc791\uc5c5\uc758 \ub2e8\uc704\ub97c \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc740 \uc791\uc5c5\uc758 \uc644\uc804\uc131\uacfc \ub370\uc774\ud130\uc758 \uc815\ud569\uc131\uc744 \ubcf4\uc7a5\ud574 \uc900\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \uc14b\uc744 \uc644\ubcbd\ud558\uac8c \ucc98\ub9ac\ud558\uac70\ub098, \uc624\ub958 \uc2dc \uc791\uc5c5\uc758 \uc77c\ubd80\ub9cc \uc801\uc6a9\ub418\ub294 \ud604\uc0c1\uc744 \ub9c9\uc544\uc900\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158\uc758-\uc18d\uc131acid"},"\ud2b8\ub79c\uc7ad\uc158\uc758 \uc18d\uc131(ACID)"),(0,r.kt)("p",null,"\uc6d0\uc790\uc131(Atomicity): \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub41c \uc791\uc5c5\ub4e4\uc740 \ubaa8\ub450 \uc131\uacf5\ud558\uac70\ub098, \uc2e4\ud328\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc77c\uad00\uc131(Consistency): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc218\ud589\ub418\uae30 \uc804\uacfc \ud6c4\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc77c\uad00\ub41c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac\uc131(Isolation): \uac01\uac01\uc758 \ud2b8\ub79c\uc7ad\uc158\uc740 \ub3c5\ub9bd\uc801\uc774\ub77c \uc11c\ub85c\uc5d0\uac8c \uc601\ud5a5\uc744 \uc8fc\uc9c0 \uc54a\uc544\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc9c0\uc18d\uc131(Durability): \ud2b8\ub79c\uc7ad\uc158\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub41c\ub2e4\uba74 \uc601\uad6c\uc801\uc73c\ub85c \uacb0\uacfc\uc5d0 \ubc18\uc601\ub418\uc5b4\uc57c \ud55c\ub2e4. "),(0,r.kt)("h3",{id:"\ud2b8\ub79c\uc7ad\uc158-\uc8fc\uc758\uc0ac\ud56d"},"\ud2b8\ub79c\uc7ad\uc158 \uc8fc\uc758\uc0ac\ud56d"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc740 \uaf2d \ud544\uc694\ud55c \ucd5c\uc18c\uc758 \ucf54\ub4dc\uc5d0\ub9cc \uc801\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.(\ud2b8\ub79c\uc7ad\uc158\uc758 \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud558\ub77c)",(0,r.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud574\uc57c \ud558\ub294 \uc5c5\ubb34\uc5d0 \ub530\ub77c \ud2b8\ub79c\uc7ad\uc158\uc744 \ubb36\uac70\ub098 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc81c\uc678\ud558\uace0, \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4. "),(0,r.kt)("admonition",{title:"\uc65c \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc788\uc744 \ub54c \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubc30\uc81c\ud574\uc57c \ud560\uae4c? \ud83e\udd14",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"\ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uacfc \uc548\uc804\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \ubc30\uc81c\ud574\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud2b8\ub79c\uc7ad\uc158 \ub0b4\ubd80\uc5d0 \ud3ec\ud568\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"\ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc774 \uc911\uac04\uc5d0 \uc2e4\ud328\ud560 \uac00\ub2a5\uc131(\uc548\uc804\uc131 X)"),(0,r.kt)("li",{parentName:"ul"},"\ud1b5\uc2e0\uc73c\ub85c \uc778\ud574 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \uc218 \uc788\ub294 \ubd80\ubd84(\uc77c\uad00\uc131 X)"))),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900isolation-level"},"\uaca9\ub9ac \uc218\uc900(Isolation level)"),(0,r.kt)("p",null,"\uc5ec\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc774 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ub420 \ub54c \ud2b9\uc815 \ud2b8\ub79c\uc7ad\uc158\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\uc758 \uc870\ud68c \ubc0f \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc744 \ub9d0\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uaca9\ub9ac \uc218\uc900\uc774 \ub192\uc544\uc9c8 \uc218\ub85d \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\uc9c0\ub9cc, ",(0,r.kt)("inlineCode",{parentName:"p"},"SERIALIZABLE"),"\uc774 \uc544\ub2c8\ub77c\uba74 \ud06c\uac8c \uc131\ub2a5\uc758 \uc800\ud558\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. "),(0,r.kt)("h3",{id:"read-uncommitted"},"READ UNCOMMITTED"),(0,r.kt)("p",null,"\uac01 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\uc758 \ubcc0\uacbd \ub0b4\uc6a9\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774\ub098 ",(0,r.kt)("inlineCode",{parentName:"p"},"ROLLBACK")," \uc5ec\ubd80\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcf4\uc778\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub354\ud2f0 \ub9ac\ub4dc \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uae30 \ub54c\ubb38\uc5d0 \uc815\ud569\uc131\uc758 \ubb38\uc81c\uac00 \ub9ce\uc740 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL \uc0ac\uc6a9\uc2dc \ucd5c\uc18c ",(0,r.kt)("inlineCode",{parentName:"p"},"READ COMMITTED")," \uc774\uc0c1\uc758 \uaca9\ub9ac \uc218\uc900 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ UNCOMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: INSERT(Alice)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: COMMIT(Alice)"}),(0,r.kt)("h3",{id:"read-committed"},"READ COMMITTED"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub370\uc774\ud130\ub9cc \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc624\ub77c\ud074 DBMS\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uba70, \uc628\ub77c\uc778 \uc11c\ube44\uc2a4\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc120\ud0dd\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ"),"\uac00 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"NON-REPEATABLE READ")," \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: READ COMMITTED\n---\nsequenceDiagram\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)\n Alice->>Database: COMMIT"}),(0,r.kt)("h3",{id:"repeatable-read"},"REPEATABLE READ"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc774 \uc2dc\uc791\ub418\uae30 \uc804\uc5d0 ",(0,r.kt)("inlineCode",{parentName:"p"},"COMMIT"),"\uc774 \uc644\ub8cc\ub41c \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c\ub9cc \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MySQL\uc758 InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc5d0\uc11c \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uaca9\ub9ac \uc218\uc900\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","MVCC\ub97c \uc774\uc6a9\ud574 \uc5b8\ub450(Undo) \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \uc774\uc804 \ub370\uc774\ud130\ub97c \uc774\uc6a9\ud574 \ub3d9\uc77c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc904 \uc218 \uc788\uac8c \ubcf4\uc7a5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub3d9\uc77c\ud55c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ubaa8\ub4e0 InnoDB \ud2b8\ub79c\uc7ad\uc158\uc740 \uc21c\ucc28\uc801\uc73c\ub85c \uc99d\uac00\ud558\ub294 \uace0\uc720\ud55c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ub97c \uac00\uc9c4\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc5d0 \ubc31\uc5c5\ub41c \ub808\ucf54\ub4dc\uc5d0\ub294 \ubcc0\uacbd\uc744 \ubc1c\uc0dd\uc2dc\ud0a8 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubc88\ud638\uac00 \ud3ec\ud568\ub418\uc5b4\uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Undo \uc601\uc5ed\uc758 \ubc31\uc5c5\ub41c \ub370\uc774\ud130\ub294 \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc774 \ubd88\ud544\uc694\ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uacbd\uc6b0 \uc0ad\uc81c\ub41c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c\ub294 MVCC\ub97c \ubcf4\uc7a5\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \uc624\ub798\ub41c \ud2b8\ub79c\uc7ad\uc158 \ubc88\ud638\ubcf4\ub2e4 \uc55e\uc120 Undo \uc601\uc5ed\uc758 \ub370\uc774\ud130\ub294 \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4. ")),(0,r.kt)("p",null,"InnoDB\uc5d0\uc11c\ub294 \uac2d \ub77d\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d\uc744 \uc774\uc6a9\ud558\uc5ec \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc744 \ubc29\uc9c0\ud55c\ub2e4. "),(0,r.kt)("mermaid",{value:"---\ntitle: REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Alice(Undo log)"}),(0,r.kt)("admonition",{title:"\uac2d \ub78d(Gap lock)\uacfc \ub125\uc2a4\ud2b8 \ud0a4 \ub77d(Next-key lock)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\uac2d \ub77d: \ub808\ucf54\ub4dc\uc640 \ubc14\ub85c \uc778\uc811\ud55c \ub808\ucf54\ub4dc \uc0ac\uc774\uc758 \uac04\uaca9\ub9cc\uc744 \uc7a0\uadf8\ub294 \ub77d\uc774\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub125\uc2a4\ud2b8 \ud0a4 \ub77d: \ub808\ucf54\ub4dc \ub77d\uacfc \uac2d \ub77d\uc744 \ud569\uccd0\ub193\uc740 \ud615\ud0dc\uc758 \uc7a0\uae08\uc73c\ub85c \ub808\ucf54\ub4dc\uc640 \uadf8 \ub808\ucf54\ub4dc \uc55e\uc758 \uac2d \ub77d\uc744 \ud3ec\ud568\ud55c\ub2e4.")),(0,r.kt)("admonition",{title:"MVCC(Multi Version Concurrency Control)",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\ub3d9\uc2dc\uc131\uc744 \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\ub85c \ud558\ub098\uc758 \ub808\ucf54\ub4dc\uc5d0 \ub300\ud574 \uc5ec\ub7ec \uac1c\uc758 \ubc84\uc804\uc774 \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ub418\ub294 \uac83\uc774\ub2e4."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"PostgreSQL\uc740 \ub2e4\uc911 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc73c\ub85c MVCC\ub97c \uad6c\ud604\ud55c\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"Oracle, InnoDB\ub294 ",(0,r.kt)("inlineCode",{parentName:"li"},"Undo log"),"\ub97c \uc774\uc6a9\ud574 \uc774 \uae30\ub2a5\uc744 \uad6c\ud604\ud55c\ub2e4.(\ucd5c\uc2e0 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub9cc DB\uc5d0 \uc800\uc7a5)")),(0,r.kt)("p",{parentName:"admonition"},"\uc7a0\uae08\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc77d\uad00\ub41c \uc77d\uae30\ub97c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ub2e4.")),(0,r.kt)("h3",{id:"serializable"},"SERIALIZABLE"),(0,r.kt)("p",null,"\ud2b8\ub79c\uc7ad\uc158\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc9c4\ud589\uc2dc\ud0a4\ub294 \uaca9\ub9ac \uc218\uc900\uc774\uace0 \ub530\ub77c\uc11c \ub3d9\uc2dc \ucc98\ub9ac \uc131\ub2a5\ub3c4 \ub2e4\ub978 \uaca9\ub9ac \uc218\uc900\ubcf4\ub2e4 \ub5a8\uc5b4\uc9c4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc77d\uace0 \uc4f0\ub294 \ub808\ucf54\ub4dc\ub97c \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c\ub294 \uc811\uadfc\ud560 \uc218 \uc5c6\uace0 \ub2e8\uc21c\ud55c \uc77d\uae30 \uc791\uc5c5\ub3c4 \uacf5\uc720 \uc7a0\uae08(\uc77d\uae30 \uc7a0\uae08)\uc744 \ud68d\ub4dd\ud574\uc57c\ub9cc \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","InnoDB\uc5d0\uc11c\ub294 \ud32c\ud140 \ub9ac\ub4dc \ud604\uc0c1\uc774 ",(0,r.kt)("inlineCode",{parentName:"p"},"REPEATABLE READ")," \uaca9\ub9ac \uc218\uc900\uc5d0\uc11c \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uad73\uc774 \uc0ac\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. "),(0,r.kt)("h2",{id:"\uaca9\ub9ac-\uc218\uc900\uc5d0-\ub530\ub978-\ubd80\uc815\ud569-\ubb38\uc81c"},"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub978 \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("p",null,"\uaca9\ub9ac \uc218\uc900\uc5d0 \ub530\ub77c \ub354\ud2f0 \ub9ac\ub4dc, \ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c, \ud32c\ud140 \ub9ac\ub4dc \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud55c\ub2e4. "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uaca9\ub9ac \uc218\uc900 / \ubd80\uc815\ud569 \ubb38\uc81c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ub354\ud2f0 \ub9ac\ub4dc"),(0,r.kt)("th",{parentName:"tr",align:null},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c"),(0,r.kt)("th",{parentName:"tr",align:null},"\ud32c\ud140 \ub9ac\ub4dc"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ UNCOMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"READ COMMITTED"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O"),(0,r.kt)("td",{parentName:"tr",align:null},"O")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REPEATABLE READ"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"O(InnoDB\ub294 X)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SERIALIZABLE"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X"),(0,r.kt)("td",{parentName:"tr",align:null},"X")))),(0,r.kt)("h3",{id:"\ub354\ud2f0-\ub9ac\ub4dcdirty-read"},"\ub354\ud2f0 \ub9ac\ub4dc(Dirty read)"),(0,r.kt)("p",null,"\uc5b4\ub5a4 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ucc98\ub9ac\ud55c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc558\uc5b4\ub3c4 \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\ud2b8\ub79c\uc7ad\uc158 \uaca9\ub9ac \uc218\uc900\uc774 READ UNCOMMITTED\uc77c \ub54c \ubc1c\uc0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \ucee4\ubc0b\uc744 \ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, A\uac00 \ud574\ub2f9 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub294 \uacbd\uc6b0"),(0,r.kt)("h3",{id:"\ubc18\ubcf5-\uac00\ub2a5\ud558\uc9c0-\uc54a\uc740-\uc870\ud68cnon-repeatable-read"},"\ubc18\ubcf5 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 \uc870\ud68c(Non-repeatable read)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc758 \uac19\uc740 \ud589\uc5d0 \ub450 \ubc88 \uc774\uc0c1 \uc870\ud68c\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uac12\uc774 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc5ec\ub7ec \ubc88 \uc870\ud68c\ud558\ub358 \uc911 B\uac00 \ub808\ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc5ec A\uac00 \uc870\ud68c\ud55c \uac12\uc774 \ub2ec\ub77c\uc9c0\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: NON REPEATABLE READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN\n Bob->>Database: SELECT\n Database->>+Bob: Alice\n Alice->>Database: BEGIN\n Alice->>Database: UPDATE(Alice to Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT\n Database->>+Bob: Bob"}),(0,r.kt)("h3",{id:"\ud32c\ud140-\ub9ac\ub4dcphantom-read-phantom-row"},"\ud32c\ud140 \ub9ac\ub4dc(Phantom read, Phantom row)"),(0,r.kt)("p",null,"\ud55c \ud2b8\ub79c\uc7ad\uc158 \ub0b4\uc5d0\uc11c \ub3d9\uc77c\ud55c \ucffc\ub9ac \uc218\ud589\uc2dc, \uc218\ud589 \uacb0\uacfc\uac00 \ub2e4\ub978 \ud604\uc0c1",(0,r.kt)("br",{parentName:"p"}),"\n","\uc608) A\uac00 \ub808\ucf54\ub4dc\ub97c \uc870\ud68c\ud558\uace0 B\uac00 \ub808\ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc5ec A\uac00 \ub2e4\uc2dc \uc870\ud68c\ud560 \ub54c \uc874\uc7ac\ud558\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\uac00 \uc870\ud68c\ub418\ub294 \uacbd\uc6b0 "),(0,r.kt)("mermaid",{value:"---\ntitle: PHANTOM READ\n---\nsequenceDiagram\n participant Alice\n participant Database\n participant Bob\n Bob->>Database: BEGIN(TRX-ID: 1)\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 1\n Alice->>Database: BEGIN(TRX-ID: 2)\n Alice->>Database: INSERT(Bob)\n Alice->>Database: COMMIT\n Bob->>Database: SELECT COUNT\n Database->>+Bob: 2"}),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,"Real My SQL 8.0 - 5\uc7a5 \ud2b8\ub79c\uc7ad\uc158\uacfc \uc7a0\uae08, \ubc31\uc740\ube48, \uc774\uc131\uc6b1",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html"},"Isolation Level, MySQL")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6a3d698.93c4b199.js b/assets/js/d6a3d698.93c4b199.js deleted file mode 100644 index 3e721fea0..000000000 --- a/assets/js/d6a3d698.93c4b199.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2890],{9477:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/tags/image","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/d6a3d698.f4578e6a.js b/assets/js/d6a3d698.f4578e6a.js new file mode 100644 index 000000000..ed28ea1fd --- /dev/null +++ b/assets/js/d6a3d698.f4578e6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2890],{39477:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/tags/image","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/d6c08822.bc017d98.js b/assets/js/d6c08822.bc017d98.js new file mode 100644 index 000000000..252f47f72 --- /dev/null +++ b/assets/js/d6c08822.bc017d98.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2678],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),m=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=m(e.components);return n.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=m(r),s=a,b=c["".concat(u,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var m=2;m<p;m++)l[m]=r[m];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}c.displayName="MDXCreateElement"},12099:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>m});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:12,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/12",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",description:"\uccb4\uc2a4",date:"2023-03-31T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 31\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:"12",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"},nextItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"}},u={authorsImageUrls:[]},m=[{value:"\uccb4\uc2a4",id:"\uccb4\uc2a4",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],i={toc:m};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uccb4\uc2a4"},"\uccb4\uc2a4"),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","Rank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2)",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 "),(0,a.kt)("li",{parentName:"ul"},"\uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 ")),(0,a.kt)("p",null,"\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. ")),(0,a.kt)("p",null,"\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac)",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)"),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubd80\uac00\uc801\uc778 \ubd80\ubd84")),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 "),(0,a.kt)("li",{parentName:"ul"},"ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac "),(0,a.kt)("li",{parentName:"ul"},"\uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) ")),(0,a.kt)("p",null,"\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","DB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO \uc911\ubcf5 \uc81c\uac70")),(0,a.kt)("p",null,"\ud504\ub864\ub85c\uadf8\uc5d0 ",(0,a.kt)("a",{parentName:"p",href:"https://prolog.techcourse.co.kr/studylogs/2947"},"\uae00"),"\uc744 \uc791\uc131\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d"),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158 \ubab0\uc785\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc194\uc9c1\ud568"),(0,a.kt)("br",{parentName:"p"}),"\n","\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6c08822.bd47217d.js b/assets/js/d6c08822.bd47217d.js deleted file mode 100644 index 5eb1a1946..000000000 --- a/assets/js/d6c08822.bd47217d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2678],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>s});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),m=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=m(e.components);return n.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),c=m(r),s=a,b=c["".concat(u,".").concat(s)]||c[s]||k[s]||p;return r?n.createElement(b,l(l({ref:t},i),{},{components:r})):n.createElement(b,l({ref:t},i))}));function s(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var m=2;m<p;m++)l[m]=r[m];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}c.displayName="MDXCreateElement"},2099:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>k,frontMatter:()=>p,metadata:()=>o,toc:()=>m});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:12,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/12",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",description:"\uccb4\uc2a4",date:"2023-03-31T00:00:00.000Z",formattedDate:"2023\ub144 3\uc6d4 31\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.63,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0",slug:"12",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 1 \ud68c\uace0",permalink:"/13"},nextItem:{title:"\uc77c\ubc18\uc801\uc778 \ucc45\uc784 \ud560\ub2f9\uc744 \uc704\ud55c \ud328\ud134",permalink:"/11"}},u={authorsImageUrls:[]},m=[{value:"\uccb4\uc2a4",id:"\uccb4\uc2a4",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],i={toc:m};function k(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uccb4\uc2a4"},"\uccb4\uc2a4"),(0,a.kt)("p",null,"\uccb4\uc2a4 \ubbf8\uc158\uc5d0\ub294 \uac00\ube44\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4!",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4\ub294 \uc774\uc804 \ubbf8\uc158\ub4e4\ubcf4\ub2e4 \ud6e8\uc52c \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778\uc774\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \uac00\ube44\uc640 \ub098\ub294 \uccb4\uc2a4 \ub3c4\uba54\uc778\uc774 \uc775\uc219\ud574\uc11c \ub354 \ud3b8\ud55c \ub9c8\uc74c\uc73c\ub85c \uc2dc\uc791\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc5b4\ub824\uc6e0\ub358 \ubd80\ubd84\uc740 \uae30\ubb3c\uc758 \uc774\ub3d9, \uc774\ub3d9\uc2dc \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ubd80\ubd84\uc774\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uac00\ube44\uac00 \uc9d1\uc5d0\uac00\uc11c\ub3c4 \uae30\ubb3c\uc758 \uc774\ub3d9 \uad00\ub828\ud574 \uc0dd\uac01 \uc815\ub9ac\ud55c \uae00\uc744 \ubcf4\ub0b4\uc918\uc11c \ub354\uc6b1 \ube68\ub9ac \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud55c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5\uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","Rank\uc640 File\uc740 \uac01\uac01 \uc704\uce58\uac12\uc744 \uac00\uc9c0\uace0 \uc788\uace0, \uac12\uc758 \ucc28\uc774\ub97c \uc774\uc6a9\ud574\uc11c \uac01 \uae30\ubb3c\uc758 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uacc4\uc0b0\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c1\uc120 \u2192 Rank\uc640 File \ucc28\uc774 \uc911 \ud558\ub098\uac00 0\uc774\uc5b4\uc57c \ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub300\uac01\uc120 \u2192 Rank\uc640 File \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \uac19\uc544\uc57c \ud55c\ub2e4. ex) abs(-2) == abs(2)",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc774\ud2b8 \u2192 \ucc28\uc774\uc758 \uc808\ub300\uac12\uc774 \ud558\ub098\ub294 2 \ub098\uba38\uc9c0 \ud558\ub098\ub294 1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\ucc29 \uce78\uc758 \uae30\ubb3c \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc544\uad70 \u2192 \uc774\ub3d9\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc801\uad70 \u2192 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc801\uad70\uc744 \uc7a1\ub294\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uac04\uc5d0 \uae30\ubb3c \uc874\uc7ac \uc5ec\ubd80"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub3d9 \uacbd\ub85c\uc5d0 \uae30\ubb3c\uc774 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \ubbf8\uc158\uc740 \ud2b9\ubcc4\ud558\uac8c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc5f0\uacb0\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccb4\uc2a4 \uac8c\uc784\uc758 \uc0c1\ud0dc\ub97c \ub2e4\uc74c\uc758 \ub450\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uc815\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95 "),(0,a.kt)("li",{parentName:"ul"},"\uae30\ubcf4\ub97c \uc800\uc7a5\ud558\uace0 \uac8c\uc784\uc744 \ubd88\ub7ec\uc640 \uae30\ubcf4\ub300\ub85c \uc774\ub3d9\uc2dc\ud0a4\ub294 \ubc29\ubc95 ")),(0,a.kt)("p",null,"\uae30\ubb3c\uc774 \uc774\ub3d9\ud560 \ub54c\ub9c8\ub2e4 \uac12\uc744 \uc800\uc7a5\ud558\uace0 \uc2f6\uc5c8\uace0, \uae30\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubb3c \uc804\uccb4\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc774\uc720\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud134\uacfc \uac19\uc740 \ubd80\uac00\uc801\uc778 \uc694\uc18c\ub97c \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\uc774\ub3d9\uc744 \ud560 \ub54c \uae30\ubb3c\uc774 \uc7a1\ud788\ub294 \uacbd\uc6b0 update \ucffc\ub9ac(\uc774\ub3d9 \uae30\ubb3c)\uc640 delete(\uc7a1\ud78c \uae30\ubb3c) 2\uac1c\uc758 \ucffc\ub9ac\ub97c \ub0a0\ub824\uc57c \ud55c\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"\ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ub3c4\uba54\uc778\uc758 \ubcc0\uacbd\uc774 \ud06c\uac8c(\ucd08\uae30 \uc0c1\ud0dc\ub97c \uad6c\uc131\ud558\ub294 \ubd80\ubd84) \uc77c\uc5b4\ub098\uc57c \ud55c\ub2e4. ")),(0,a.kt)("p",null,"\uc815\ub9ac\ud558\uc790\uba74 \uae30\ubb3c \uc804\uccb4 \uc800\uc7a5\uacfc \uae30\ubcf4 \uc800\uc7a5\uc740 \ub2e4\uc74c\uacfc \ucc28\uc774\uac00 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcf4\ub4dc\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc\uc5d0\uc11c 32\uac1c\uc758 Insert \ucffc\ub9ac(\uae30\ubb3c\uc758 \uc704\uce58) + \uae30\ubb3c \uc774\ub3d9 \uc2dc \uc6c0\uc9c1\uc784 \ubcc0\uacbd(\uc7a1\ud788\ub294 \uacbd\uc6b0 2\uac1c\uc758 \ucffc\ub9ac)",(0,a.kt)("br",{parentName:"p"}),"\n","\uae30\ubcf4\uc800\uc7a5: \ucd08\uae30\uc0c1\ud0dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\uc131 + \uc800\uc7a5\ub41c \uae30\ubcf4\ub97c select \ucffc\ub9ac\ub85c \uc870\ud68c\ud574\uc11c \uc0ac\uc6a9(1\ud68c) + insert \ucffc\ub9ac(\uc774\ub3d9 \ub2f9 1\ud68c)"),(0,a.kt)("p",null,"\ucd94\uac00\ub85c \uae30\ubcf4\uc800\uc7a5\uc774 \uad6c\ud604\ub3c4 \ub354\uc6b1 \uac04\ub2e8\ud558\ub2e4. \ud83d\udc4d "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubd80\uac00\uc801\uc778 \ubd80\ubd84")),(0,a.kt)("p",null,"\ub9ac\ubdf0\uc5b4\uc778 \ucc30\ub9ac\ud83c\udf6b\uac00 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac8c\uc784\uc774 \uc9c4\ud589\ub41c\ub2e4\uba74 \uc5b4\ub5a8\uc9c0? \uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ub2e4\uc591\ud55c \uc2dc\ub3c4\ub97c \ud574\ubd24\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ub204\ub204\uc758 \ub3c4\uc6c0\uc73c\ub85c ConnectionPool \uad6c\ud604 "),(0,a.kt)("li",{parentName:"ul"},"ThreadLocal \uc0ac\uc6a9\ud574\uc11c \uc4f0\ub808\ub4dc \ubcc4 \uc138\uc158 \uad00\ub9ac "),(0,a.kt)("li",{parentName:"ul"},"\uc2e4\uc81c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uccb4\uc2a4 \uac8c\uc784\uc774 \uc9c4\ud589\ub418\ub294 Board\ub97c ConcurrentHashMap\uc73c\ub85c \uc800\uc7a5(\uc0ac\uc2e4 \uc774 \ubd80\ubd84\uc740 \ud604\uc7ac \uad6c\uc870\uc5d0\uc11c \ud544\uc694\uc5c6\uc9c0\ub9cc 2\uba85\uc774 \uc11c\ub85c \uac8c\uc784\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\uc11c \ub123\uc5b4\ubcf4\uc558\ub2e4.) ")),(0,a.kt)("p",null,"\ub450 \uba85\uc774 \uc11c\ub85c \uac19\uc740 \ubc29\uc5d0 \uc785\uc7a5\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4\uba74 \ucd9c\ub825\ud558\ub294 \ubd80\ubd84\uc774 \uae4c\ub2e4\ub85c\uc6cc\uc9c8 \uac83 \uac19\ub2e4\uace0 \uc608\uc0c1\ub418\uc5b4(Board\uc5d0 \uc635\uc800\ubc84 \ud328\ud134\uc744 \uc0ac\uc6a9\ud574\uc57c\ub418\ub098?) \ud574\ubcfc \uc5c4\ub450\uac00 \ub098\uc9c0 \uc54a\uc558\ub2e4. "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc9c0 \ubabb\ud55c \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","DB \uad00\ub828 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uba54\uc778 \ub85c\uc9c1\uc5d0\ub9cc \uc9d1\uc911\ud558\ub2e4\ubcf4\ub2c8 \uc815\uc801 \uc911\uc694\ud55c DB\uc758 \ucf54\ub4dc\uc758 \uc608\uc678\ucc98\ub9ac, \ube48 \uac12\uc744 \ubc18\ud658 \ud558\ub294 \ubd80\ubd84\uc744 \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucc30\ub9ac\uc758 \uaf3c\uaf3c\ud55c \ub9ac\ubdf0\ub85c DB\ubd80\ubd84\uacfc \ub098\ub9cc\uc758 JdbcTemplate\uc744 \uae54\ub054\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ub2f4\uac10"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd08\ubc18\uc5d0\ub294 \uc5ec\uc720\ub86d\uc9c0\ub9cc \uc81c\ucd9c \ub9c8\uac10\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \uc218\ub85d \uc0ac\ub78c\uc774 \uae09\ud574\uc9c0\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\ud560 \ub550 \uc18d\ub3c4\ub97c \uc870\uc808\ud558\uace0, \ub9c8\uc74c\uc5d0 \uc5ec\uc720\ub97c \uac00\uc838\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAO \uc911\ubcf5 \uc81c\uac70")),(0,a.kt)("p",null,"\ud504\ub864\ub85c\uadf8\uc5d0 ",(0,a.kt)("a",{parentName:"p",href:"https://prolog.techcourse.co.kr/studylogs/2947"},"\uae00"),"\uc744 \uc791\uc131\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","DAO\ub97c \uc791\uc131\ud558\ub294\ub370 try-catch-resources\uc640 \uc5ec\ub7ec \ucf54\ub4dc\uac00 \uc911\ubcf5\ub418\uc11c \uc81c\uac70\ud558\uace0\uc2f6\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud15c\ud50c\ub9bf \ucf5c\ubc31 \ud328\ud134\uc73c\ub85c \uae54\ub054\ud558\uac8c \uc911\ubcf5\uc744 \uc81c\uac70\ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\udc4d"),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ub204\uad6c\ubcf4\ub2e4 \ud398\uc5b4\ub97c \uc0dd\uac01\ud558\uace0, \ubc30\ub824\ud574\uc8fc\ub294 \ud398\uc5b4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04 \uc911\uac04 \ub2f9 \ub5a8\uc5b4\uc9c8\uae4c\ubd10 \uac71\uc815\ub3c4 \ud574\uc8fc\uace0, \ub098\uc758 \ucee8\ub514\uc158\ub3c4 \ud655\uc778\ud574\uc92c\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158 \ubab0\uc785\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\uadfc\uc5d0 \ubbf8\uc158\uc5d0 \uc798 \ubab0\uc785\ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac00\ube44\ub294 \ud398\uc5b4\ub97c \uc9c4\ud589\ud560 \ub54c \ubbf8\uc158\uc5d0 \ub300\ud55c \ubab0\uc785\ub3c4\uac00 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9d1\uc5d0\uac00\uc11c\ub3c4 \uccb4\uc2a4 \uc774\ub3d9\uc5d0 \ub300\ud55c \ub85c\uc9c1\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud560 \uc9c0 \uc0dd\uac01\ud55c \ub4a4 \uaf3c\uaf3c\ud574\uc11c \uc815\ub9ac\ud574\uc11c \ub098\uc5d0\uac8c \ubcf4\ub0b4\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub355\ubd84\uc5d0 \ub098\ub3c4 \uac00\ube44\uc758 \uc0dd\uac01\uc744 \uc54c \uc218 \uc788\uc5b4\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294\ub370 \uac00\uc18d\ub3c4\uac00 \ubd99\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubbf8\uc158\uc744 \uc798 \ub9c8\ubb34\ub9ac\ud558\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc804\ub2ec\ub418\uc11c \uadf8\ub7f0\uc9c0 \ub098\ub3c4 \ub369\ub2ec\uc544 \uc5f4\uc2ec\ud788 \ubbf8\uc158\uc744 \ud560 \uc218 \uc788\uc5c8\ub2e4.\ud83d\ude04 "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc194\uc9c1\ud568"),(0,a.kt)("br",{parentName:"p"}),"\n","\uba3c\uc800 \ud68c\uace0\ud558\uc790\uace0 \ub9d0 \uac78\uc5b4\uc918\uc11c \uc815\ub9d0 \uace0\ub9c8\uc6e0\ub2e4\uace0 \ud45c\ud604\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ubaa8\ub974\ub294\uac8c \uc788\uc73c\uba74 \uc194\uc9c1\ud558\uac8c \ub9d0\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\uc758 \uc758\uacac\uc744 \uc815\ub9ac\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\ub85c \uc804\ub2ec\ud560 \ub54c \uc774\ud574\uac00 \uc548\ub418\uc5c8\ub2e4\uace0 \uc815\ud655\ud788 \uc804\ub2ec\ud574\uc8fc\ub294 \ubd80\ubd84",(0,a.kt)("br",{parentName:"p"}),"\n","\uc194\uc9c1\ud568\uc740 \ud398\uc5b4\ud560 \ub54c \uc911\uc694\ud55c \ubd80\ubd84\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc30\ub9ac\ud83c\udf6b \uccb4\uc2a4 \ubbf8\uc158\ub54c \uaf3c\uaf3c\ud558\uac8c \ub9ac\ubdf0 \ub0a8\uaca8\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4!"))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d86f7a37.080d5db2.js b/assets/js/d86f7a37.080d5db2.js deleted file mode 100644 index 38867d4f6..000000000 --- a/assets/js/d86f7a37.080d5db2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3392],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),g=c(n),m=a,d=g["".concat(s,".").concat(m)]||g[m]||u[m]||i;return n?r.createElement(d,o(o({ref:t},p),{},{components:n})):r.createElement(d,o({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c<i;c++)o[c]=n[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},823:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const i={title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",tags:["nginx"]},o=void 0,l={unversionedId:"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",id:"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",description:"root",source:"@site/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5.mdx",sourceDirName:"Nginx",slug:"/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",permalink:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5.mdx",tags:[{label:"nginx",permalink:"/docs/tags/nginx"}],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",tags:["nginx"]},sidebar:"tutorialSidebar",previous:{title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",permalink:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4"},next:{title:"\ubb38\uc11c",permalink:"/docs/"}},s={},c=[{value:"root",id:"root",level:3},{value:"alias",id:"alias",level:3},{value:"try_files",id:"try_files",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],p={toc:c};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"root"},"root"),(0,a.kt)("p",null,"\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \ud30c\uc77c\uc744 \uc81c\uacf5\ud560 \ub54c \uc0ac\uc6a9\ub418\ub294 \uacbd\ub85c\ub97c \uc9c0\uc815\ud558\ub294 \ub370 \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","root\uc758 \uacbd\uc6b0 locaiton\uc73c\ub85c \ub118\uc5b4\uc628 \uacbd\ub85c\ub97c root \uacbd\ub85c \ub4a4\uc5d0 \ucd94\uac00\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash",metastring:"title=root",title:"root"},"# localhost/images/1.png \ud638\ucd9c /var/www/images/images/1.png \uac80\uc0c9\nlocation /images/ {\n root /var/www/images;\n}\n")),(0,a.kt)("h3",{id:"alias"},"alias"),(0,a.kt)("p",null,"location\uc73c\ub85c \ub9e4\uce6d\ub41c \ubd80\ubd84\uc744 \uc81c\uac70\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash",metastring:"title=alias",title:"alias"},"# localhost/images/1.png \ud638\ucd9c /var/www/images/1.png \uac80\uc0c9\nlocation /images/ {\n alias /var/www/images;\n}\n")),(0,a.kt)("h3",{id:"try_files"},"try_files"),(0,a.kt)("p",null,"try_files \ub514\ub809\ud2f0\ube0c\ub97c \uc774\uc6a9\ud574\uc11c \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc73c\uba74 \uc801\uc808\ud55c \uac12\uc744 \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 \uae30\ubcf8\uc73c\ub85c 404\ub97c \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"location /images/ {\n alias /var/www/images;\n try_files $uri $uri/ =404;\n}\n")),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 proxy \uc124\uc815\uc73c\ub85c\ub3c4 \uad6c\uc131\ud560 \uc218\ub3c4 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"location /images/ {\n root /root;\n try_files $uri $uri/ default-image;\n}\n\nlocation default-image {\n proxy_pass http://localhost/images/default_image.jpg;\n}\n")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/"},"Serving Static Content")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d86f7a37.17195363.js b/assets/js/d86f7a37.17195363.js new file mode 100644 index 000000000..7d923563c --- /dev/null +++ b/assets/js/d86f7a37.17195363.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3392],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),g=c(n),m=a,d=g["".concat(s,".").concat(m)]||g[m]||u[m]||i;return n?r.createElement(d,o(o({ref:t},p),{},{components:n})):r.createElement(d,o({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c<i;c++)o[c]=n[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},10823:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",tags:["nginx"]},o=void 0,l={unversionedId:"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",id:"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",description:"root",source:"@site/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5.mdx",sourceDirName:"Nginx",slug:"/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",permalink:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5.mdx",tags:[{label:"nginx",permalink:"/docs/tags/nginx"}],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",tags:["nginx"]},sidebar:"tutorialSidebar",previous:{title:"\uad6c\uc870 \ubc0f \uba85\ub839\uc5b4",permalink:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4"},next:{title:"\ubb38\uc11c",permalink:"/docs/"}},s={},c=[{value:"root",id:"root",level:3},{value:"alias",id:"alias",level:3},{value:"try_files",id:"try_files",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],p={toc:c};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"root"},"root"),(0,a.kt)("p",null,"\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \ud30c\uc77c\uc744 \uc81c\uacf5\ud560 \ub54c \uc0ac\uc6a9\ub418\ub294 \uacbd\ub85c\ub97c \uc9c0\uc815\ud558\ub294 \ub370 \uc0ac\uc6a9\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","root\uc758 \uacbd\uc6b0 locaiton\uc73c\ub85c \ub118\uc5b4\uc628 \uacbd\ub85c\ub97c root \uacbd\ub85c \ub4a4\uc5d0 \ucd94\uac00\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash",metastring:"title=root",title:"root"},"# localhost/images/1.png \ud638\ucd9c /var/www/images/images/1.png \uac80\uc0c9\nlocation /images/ {\n root /var/www/images;\n}\n")),(0,a.kt)("h3",{id:"alias"},"alias"),(0,a.kt)("p",null,"location\uc73c\ub85c \ub9e4\uce6d\ub41c \ubd80\ubd84\uc744 \uc81c\uac70\ud55c\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash",metastring:"title=alias",title:"alias"},"# localhost/images/1.png \ud638\ucd9c /var/www/images/1.png \uac80\uc0c9\nlocation /images/ {\n alias /var/www/images;\n}\n")),(0,a.kt)("h3",{id:"try_files"},"try_files"),(0,a.kt)("p",null,"try_files \ub514\ub809\ud2f0\ube0c\ub97c \uc774\uc6a9\ud574\uc11c \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc73c\uba74 \uc801\uc808\ud55c \uac12\uc744 \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 \uae30\ubcf8\uc73c\ub85c 404\ub97c \ubc18\ud658\ud55c\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"location /images/ {\n alias /var/www/images;\n try_files $uri $uri/ =404;\n}\n")),(0,a.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc774 proxy \uc124\uc815\uc73c\ub85c\ub3c4 \uad6c\uc131\ud560 \uc218\ub3c4 \uc788\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"location /images/ {\n root /root;\n try_files $uri $uri/ default-image;\n}\n\nlocation default-image {\n proxy_pass http://localhost/images/default_image.jpg;\n}\n")),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/"},"Serving Static Content")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d88bdb28.15c240b5.js b/assets/js/d88bdb28.15c240b5.js deleted file mode 100644 index 45bb26c3f..000000000 --- a/assets/js/d88bdb28.15c240b5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9788],{9417:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/d88bdb28.55b34781.js b/assets/js/d88bdb28.55b34781.js new file mode 100644 index 000000000..605ee80df --- /dev/null +++ b/assets/js/d88bdb28.55b34781.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9788],{29417:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/dab4c683.075bdb11.js b/assets/js/dab4c683.075bdb11.js deleted file mode 100644 index 49de283ce..000000000 --- a/assets/js/dab4c683.075bdb11.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6058],{7315:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/dab4c683.0a4d1c99.js b/assets/js/dab4c683.0a4d1c99.js new file mode 100644 index 000000000..8de522872 --- /dev/null +++ b/assets/js/dab4c683.0a4d1c99.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6058],{67315:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/db7928b3.2a9c0fe1.js b/assets/js/db7928b3.2a9c0fe1.js new file mode 100644 index 000000000..32e36e90a --- /dev/null +++ b/assets/js/db7928b3.2a9c0fe1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5046],{11478:e=>{e.exports=JSON.parse('{"permalink":"/tags/intelli-j","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/db7928b3.44ffe430.js b/assets/js/db7928b3.44ffe430.js deleted file mode 100644 index 09cede87d..000000000 --- a/assets/js/db7928b3.44ffe430.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5046],{1478:e=>{e.exports=JSON.parse('{"permalink":"/tags/intelli-j","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/dcf70953.d0be48ac.js b/assets/js/dcf70953.d0be48ac.js new file mode 100644 index 000000000..e1a9740b6 --- /dev/null +++ b/assets/js/dcf70953.d0be48ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1761],{83769:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/dcf70953.d8ef38cb.js b/assets/js/dcf70953.d8ef38cb.js deleted file mode 100644 index aa697fc23..000000000 --- a/assets/js/dcf70953.d8ef38cb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1761],{3769:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/dcfccecb.43b9686d.js b/assets/js/dcfccecb.43b9686d.js deleted file mode 100644 index e04396588..000000000 --- a/assets/js/dcfccecb.43b9686d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5841],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,k=m["".concat(i,".").concat(b)]||m[b]||u[b]||p;return r?n.createElement(k,o(o({ref:t},s),{},{components:r})):n.createElement(k,o({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c<p;c++)o[c]=r[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},2789:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:24,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/24",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",date:"2023-05-02T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 2\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.535,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:"24",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"},nextItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"}},i={authorsImageUrls:[]},c=[{value:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158"},"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ub09c\uc774\ub3c4 \ub192\uc774\uae30"),"\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@SuppressWarnings("NonAsciiCharacters")\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\n@Transactional\n@AutoConfigureMockMvc\n@SpringBootTest\npublic class RacingGameIntegrationTest {\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ube44\ubc84\uc758 \uc131\uaca9"),(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dcfccecb.fbd7db9c.js b/assets/js/dcfccecb.fbd7db9c.js new file mode 100644 index 000000000..df5954844 --- /dev/null +++ b/assets/js/dcfccecb.fbd7db9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5841],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=c(r),b=a,k=m["".concat(i,".").concat(b)]||m[b]||u[b]||p;return r?n.createElement(k,o(o({ref:t},s),{},{components:r})):n.createElement(k,o({ref:t},s))}));function b(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,o=new Array(p);o[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c<p;c++)o[c]=r[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},22789:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:24,tags:["Woowahan Techcourse","Retrospective"]},o=void 0,l={permalink:"/24",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",description:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",date:"2023-05-02T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 2\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:3.535,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0",slug:"24",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0",permalink:"/25"},nextItem:{title:"[\ud14c\ucf54\ucc57] 2. \ubc30\ud3ec",permalink:"/23"}},i={authorsImageUrls:[]},c=[{value:"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158",id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],s={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc6f9-\uc790\ub3d9\ucc28-\ubbf8\uc158"},"\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc0ac\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \ud55c\ub2e4\uace0 \uc2dc\uac04\uc774 \ub9ce\uc774 \uc5c6\uc5b4\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc84c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158\uc5d0\uc11c\ub294 \ube44\ubc84\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub808\ubca8 2\uc5d0\uc11c \uc9c4\ud589\ud558\ub294 \uccab \ubbf8\uc158\uc774\ub77c \ub9ce\uc774 \uae34\uc7a5\ub418\uc5c8\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ube44\ubc84\ub791 \ucd08\ubc18\uc5d0 \ub9db\uc788\ub294 \uac83\ub3c4 \ub9ce\uc774 \uba39\uc73c\uba74\uc11c \ube68\ub9ac \uce5c\ud574\uc838\uc11c \uc7ac\ubc0c\uac8c \ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc2a4\ud504\ub9c1\uc744 \uc870\uae08 \uc0ac\uc6a9\ud560 \uc904 \uc54c\uc544\uc11c, \ube44\ubc84\ub791 \uac19\uc774 \ud559\uc2b5\ud558\uba74\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uccab \ubbf8\uc158\uc774\ub77c \uadf8\ub7f0\uc9c0 \ud2b9\ubcc4\ud55c \ubd80\ubd84\uc740 \uc5c6\uc5c8\uace0, \ucd5c\ub300\ud55c \uae54\ub054\ud558\uac8c \uc791\uc131\ud558\ub824\uace0 \ub178\ub825\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c\uc774\ub3c4 \ub192\uc740 \ubbf8\uc158\uc774 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \ub9ac\ubdf0\uc5b4\uc778 \ub77c\ube48\uc5d0\uac8c \uce6d\ucc2c\uc744 \ub9ce\uc774 \ubc1b\uc544\uc11c \uae30\ubd84\uc774 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub77c\ube48 \uac10\uc0ac\ud569\ub2c8\ub2e4! "),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ucee8\ub514\uc158\ub3c4 \uc88b\uc9c0 \uc54a\uace0 \uc5f4\uc815\ub3c4 \uc2dd\uc740 \uac83 \uac19\uc740 \ub290\ub08c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc774 \ub2e4\uc18c \uc5ec\uc720\ub86d\ub2e4\uace0 \ub290\uaef4\uc838\uc11c, \uc2dc\uac04\uc5d0 \ub300\ud55c \ubd80\ubd84\ub3c4 \uc798 \uad00\ub9ac\ud558\uc9c0 \ubabb\ud55c \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud574\uc11c \ud398\uc5b4\uc5d0\uac8c \ub9ce\uc774 \ubbf8\uc548\ud588\uace0, \ub098 \uc790\uc2e0\uc5d0\uac8c \uc544\uc26c\uc6e0\ub358 \ubd80\ubd84\uc774 \ub9ce\uc558\ub2e4. "),(0,a.kt)("p",null,"\uc9c0\ub09c\ubc88 \ud68c\uace0\ub97c \ub2e4\uc2dc \ubcf4\ub294\ub370 \uc9d1\uc911\uc744 \uc798 \ubabb\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc740 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub3c4\uc804\uc801\uc774\uc9c0 \uc54a\uac70\ub098 \uc2dc\uac04\uc774 \ubd80\uc871\ud558\uc9c0 \uc54a\uc73c\uba74 \uc9d1\uc911\uc744 \uc798 \ubabb\ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba38\ub9bf\uc18d\uc5d0\uc11c \uc2dc\uac04\uc801 \uc5ec\uc720\uac00 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \ub54c\uac00 \uac00\uc7a5 \uc704\ud5d8\ud55c \uc21c\uac04\uc778 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,"\ud568\uaed8 \uc790\ub77c\uae30\uc5d0\uc11c \ub098\uc628 ",(0,a.kt)("inlineCode",{parentName:"p"},"\ub09c\uc774\ub3c4 \ub192\uc774\uae30"),"\uac00 \ud544\uc694\ud574\uc9c0\ub294 \uc21c\uac04\uc774\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc911\uc694\ub3c4\uac00 \uc788\ub294 \uc5b4\ub178\ud14c\uc774\uc158\ubd80\ud130 \ud074\ub798\uc2a4 \uc774\ub984\uc5d0 \uac00\uae5d\uac8c \uba85\uc2dc\ud558\uae30")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@SuppressWarnings("NonAsciiCharacters")\n@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)\n@Transactional\n@AutoConfigureMockMvc\n@SpringBootTest\npublic class RacingGameIntegrationTest {\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ube44\ubc84\uc758 \uc131\uaca9"),(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \uc131\uaca9\uc774 \uc88b\uc544\uc11c \ud3b8\ud558\uac8c \ud398\uc5b4\ub97c \ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\uba74\uc11c \uc131\uae09\ud558\uc9c0 \uc54a\uace0 \uc5ec\uc720\ub85c\uc6cc\uc11c \uc88b\uc558\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ubbf8\uc158\uc5d0 \uc9d1\uc911\ud558\ub294 \ubd80\ubd84"),(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud558\uc9c0 \ubabb\ud588\ub294\ub370\ub3c4 \uac19\uc774 \ud398\uc5b4\ub97c \uc798 \uc9c4\ud589\ud55c \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uac00 \ubbf8\uc158\uc5d0 \uc798 \uc9d1\uc911\ud574\uc11c \uadf8\ub807\uc9c0 \uc54a\uc558\ub098 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadfc\uc721\ub9e8 \ube44\ubc84\ub77c \uadf8\ub7f0\uc9c0 \uccb4\ub825\uc774 \uc88b\uc544\uc11c \uadf8\ub7f0\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uc911\uac04\uc5d0 \uc798 \uc548 \uc26c\uace0\ub3c4 \uc9d1\uc911\ud574\uc11c \ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \uac78 \ubcf4\uace0 \ub300\ub2e8\ud558\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud559\uc2b5\uc5d0 \ub300\ud55c \uc5f4\uc815"),(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\uac00\uc801\uc73c\ub85c \uc54c\uace0 \uc2f6\uc740 \ubd80\ubd84\uc744 \ub530\ub85c \ud559\uc2b5\ud558\ub294 \uc5f4\uc815\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube44\ubc84\uc640 \uc2a4\ud504\ub9c1\uc5d0 \ub300\ud574 \uc54c\uc544\uac00\ub294 \uc2dc\uac04\uc744 \ub9ce\uc774 \uac00\uc9c4 \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 5\uc6d4\ubd80\ud130 \uc870\uae08 \ub354 \ud654\uc774\ud305 \ud574\uc57c\uaca0\ub2e4."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddf9e0bd.6ea3fc88.js b/assets/js/ddf9e0bd.6ea3fc88.js new file mode 100644 index 000000000..7ce45d3af --- /dev/null +++ b/assets/js/ddf9e0bd.6ea3fc88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2542],{84039:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/8","page":8,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/7","nextPage":"/tags/woowahan-techcourse/page/9","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ddf9e0bd.91fd0166.js b/assets/js/ddf9e0bd.91fd0166.js deleted file mode 100644 index e8af8253b..000000000 --- a/assets/js/ddf9e0bd.91fd0166.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2542],{3274:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/8","page":8,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/7","nextPage":"/tags/woowahan-techcourse/page/9","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/df203c0f.7c6ea5cb.js b/assets/js/df203c0f.7c6ea5cb.js new file mode 100644 index 000000000..451f76400 --- /dev/null +++ b/assets/js/df203c0f.7c6ea5cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9924],{40491:(e,t,l)=>{l.r(t),l.d(t,{default:()=>d});var a=l(67294),n=l(86010),r=l(39960),s=l(88824),c=l(10833),o=l(35281),i=l(95999),u=l(54774),m=l(90197);function g(e){let{doc:t}=e;return a.createElement("article",{className:"margin-vert--lg"},a.createElement(r.Z,{to:t.permalink},a.createElement("h2",null,t.title)),t.description&&a.createElement("p",null,t.description))}function d(e){let{tag:t}=e;const l=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,i.I)({id:"theme.docs.tagDocListPageTitle.nDocsTagged",description:'Pluralized label for "{count} docs tagged". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One doc tagged|{count} docs tagged"},{count:t}))}(),d=(0,i.I)({id:"theme.docs.tagDocListPageTitle",description:"The title of the page for a docs tag",message:'{nDocsTagged} with "{tagName}"'},{nDocsTagged:l(t.count),tagName:t.label});return a.createElement(c.FG,{className:(0,n.Z)(o.k.wrapper.docsPages,o.k.page.docsTagDocListPage)},a.createElement(c.d,{title:d}),a.createElement(m.Z,{tag:"doc_tag_doc_list"}),a.createElement(u.Z,null,a.createElement("div",{className:"container margin-vert--lg"},a.createElement("div",{className:"row"},a.createElement("main",{className:"col col--8 col--offset-2"},a.createElement("header",{className:"margin-bottom--xl"},a.createElement("h1",null,d),a.createElement(r.Z,{href:t.allTagsPath},a.createElement(i.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),a.createElement("section",{className:"margin-vert--lg"},t.items.map((e=>a.createElement(g,{key:e.id,doc:e})))))))))}},88824:(e,t,l)=>{l.d(t,{c:()=>i});var a=l(67294),n=l(52263);const r=["zero","one","two","few","many","other"];function s(e){return r.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,a.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function i(){const e=o();return{selectMessage:(t,l)=>function(e,t,l){const a=e.split("|");if(1===a.length)return a[0];a.length>l.pluralForms.length&&console.error(`For locale=${l.locale}, a maximum of ${l.pluralForms.length} plural forms are expected (${l.pluralForms.join(",")}), but the message contains ${a.length}: ${e}`);const n=l.select(t),r=l.pluralForms.indexOf(n);return a[Math.min(r,a.length-1)]}(l,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/df203c0f.e4f37724.js b/assets/js/df203c0f.e4f37724.js deleted file mode 100644 index 976144016..000000000 --- a/assets/js/df203c0f.e4f37724.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9924],{491:(e,t,l)=>{l.r(t),l.d(t,{default:()=>d});var a=l(7294),n=l(6010),r=l(9960),s=l(8824),c=l(833),o=l(5281),i=l(5999),u=l(4774),m=l(197);function g(e){let{doc:t}=e;return a.createElement("article",{className:"margin-vert--lg"},a.createElement(r.Z,{to:t.permalink},a.createElement("h2",null,t.title)),t.description&&a.createElement("p",null,t.description))}function d(e){let{tag:t}=e;const l=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,i.I)({id:"theme.docs.tagDocListPageTitle.nDocsTagged",description:'Pluralized label for "{count} docs tagged". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One doc tagged|{count} docs tagged"},{count:t}))}(),d=(0,i.I)({id:"theme.docs.tagDocListPageTitle",description:"The title of the page for a docs tag",message:'{nDocsTagged} with "{tagName}"'},{nDocsTagged:l(t.count),tagName:t.label});return a.createElement(c.FG,{className:(0,n.Z)(o.k.wrapper.docsPages,o.k.page.docsTagDocListPage)},a.createElement(c.d,{title:d}),a.createElement(m.Z,{tag:"doc_tag_doc_list"}),a.createElement(u.Z,null,a.createElement("div",{className:"container margin-vert--lg"},a.createElement("div",{className:"row"},a.createElement("main",{className:"col col--8 col--offset-2"},a.createElement("header",{className:"margin-bottom--xl"},a.createElement("h1",null,d),a.createElement(r.Z,{href:t.allTagsPath},a.createElement(i.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),a.createElement("section",{className:"margin-vert--lg"},t.items.map((e=>a.createElement(g,{key:e.id,doc:e})))))))))}},8824:(e,t,l)=>{l.d(t,{c:()=>i});var a=l(7294),n=l(2263);const r=["zero","one","two","few","many","other"];function s(e){return r.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,a.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function i(){const e=o();return{selectMessage:(t,l)=>function(e,t,l){const a=e.split("|");if(1===a.length)return a[0];a.length>l.pluralForms.length&&console.error(`For locale=${l.locale}, a maximum of ${l.pluralForms.length} plural forms are expected (${l.pluralForms.join(",")}), but the message contains ${a.length}: ${e}`);const n=l.select(t),r=l.pluralForms.indexOf(n);return a[Math.min(r,a.length-1)]}(l,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/df862072.cebd22e7.js b/assets/js/df862072.cebd22e7.js new file mode 100644 index 000000000..3e56066c6 --- /dev/null +++ b/assets/js/df862072.cebd22e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7474],{24827:e=>{e.exports=JSON.parse('{"label":"Book","permalink":"/tags/book","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/df862072.ef651fec.js b/assets/js/df862072.ef651fec.js deleted file mode 100644 index 4fdd33316..000000000 --- a/assets/js/df862072.ef651fec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7474],{4827:e=>{e.exports=JSON.parse('{"label":"Book","permalink":"/tags/book","allTagsPath":"/tags","count":3}')}}]); \ No newline at end of file diff --git a/assets/js/dfa84138.4493a1cc.js b/assets/js/dfa84138.4493a1cc.js new file mode 100644 index 000000000..2c06f7e5b --- /dev/null +++ b/assets/js/dfa84138.4493a1cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1434],{22483:e=>{e.exports=JSON.parse('{"permalink":"/tags/data-base/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/data-base/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/dfa84138.c05af37e.js b/assets/js/dfa84138.c05af37e.js deleted file mode 100644 index 26fb0fdc6..000000000 --- a/assets/js/dfa84138.c05af37e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1434],{2483:e=>{e.exports=JSON.parse('{"permalink":"/tags/data-base/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/data-base/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e073eb07.90dbe5d6.js b/assets/js/e073eb07.90dbe5d6.js deleted file mode 100644 index 1a71adddd..000000000 --- a/assets/js/e073eb07.90dbe5d6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5819],{7743:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/e073eb07.c906eab1.js b/assets/js/e073eb07.c906eab1.js new file mode 100644 index 000000000..61575fc1c --- /dev/null +++ b/assets/js/e073eb07.c906eab1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5819],{57743:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/e0d68441.17644c25.js b/assets/js/e0d68441.17644c25.js deleted file mode 100644 index 9b812d3d3..000000000 --- a/assets/js/e0d68441.17644c25.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[628],{5301:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/12","page":12,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/11","nextPage":"/tags/retrospective/page/13","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e0d68441.71269803.js b/assets/js/e0d68441.71269803.js new file mode 100644 index 000000000..5d10c7142 --- /dev/null +++ b/assets/js/e0d68441.71269803.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[628],{75301:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/12","page":12,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/11","nextPage":"/tags/retrospective/page/13","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e0e4666e.a51bac0c.js b/assets/js/e0e4666e.a51bac0c.js new file mode 100644 index 000000000..2db57b02e --- /dev/null +++ b/assets/js/e0e4666e.a51bac0c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4665],{16482:e=>{e.exports=JSON.parse('{"label":"MySQL","permalink":"/tags/my-sql","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/e0e4666e.cf786395.js b/assets/js/e0e4666e.cf786395.js deleted file mode 100644 index b2619c85c..000000000 --- a/assets/js/e0e4666e.cf786395.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4665],{6482:e=>{e.exports=JSON.parse('{"label":"MySQL","permalink":"/tags/my-sql","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/e21c8cc4.331f903f.js b/assets/js/e21c8cc4.331f903f.js deleted file mode 100644 index e2c50ffab..000000000 --- a/assets/js/e21c8cc4.331f903f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6049],{8765:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/e21c8cc4.a787cf7b.js b/assets/js/e21c8cc4.a787cf7b.js new file mode 100644 index 000000000..2e4717b62 --- /dev/null +++ b/assets/js/e21c8cc4.a787cf7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6049],{48765:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/e2de2dbb.9ac0053b.js b/assets/js/e2de2dbb.9ac0053b.js new file mode 100644 index 000000000..f57c0780d --- /dev/null +++ b/assets/js/e2de2dbb.9ac0053b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6710],{47023:a=>{a.exports=JSON.parse('{"label":"Java","permalink":"/tags/java","allTagsPath":"/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/e3a9c3a3.af4511cc.js b/assets/js/e3a9c3a3.af4511cc.js deleted file mode 100644 index 30e275d8e..000000000 --- a/assets/js/e3a9c3a3.af4511cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8855],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function u(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},i=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,c=e.parentName,i=u(e,["components","mdxType","originalType","parentName"]),b=p(r),m=o,s=b["".concat(c,".").concat(m)]||b[m]||k[m]||l;return r?n.createElement(s,a(a({ref:t},i),{},{components:r})):n.createElement(s,a({ref:t},i))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,a=new Array(l);a[0]=b;var u={};for(var c in t)hasOwnProperty.call(t,c)&&(u[c]=t[c]);u.originalType=e,u.mdxType="string"==typeof e?e:o,a[1]=u;for(var p=2;p<l;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}b.displayName="MDXCreateElement"},8729:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const l={title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:1,tags:["Book"]},a=void 0,u={permalink:"/1",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",source:"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",description:"\ucc45 \uc815\ubcf4",date:"2023-01-01T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 1\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:4.425,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:"1",tags:["Book"]},prevItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},c={authorsImageUrls:[]},p=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:p};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ubc15\uc194\ubbf8 ")),(0,o.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,o.kt)("p",null,"\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. "),(0,o.kt)("p",null,"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,o.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e3a9c3a3.df912e5c.js b/assets/js/e3a9c3a3.df912e5c.js new file mode 100644 index 000000000..883612a63 --- /dev/null +++ b/assets/js/e3a9c3a3.df912e5c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8855],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function u(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},i=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,c=e.parentName,i=u(e,["components","mdxType","originalType","parentName"]),b=p(r),m=o,s=b["".concat(c,".").concat(m)]||b[m]||k[m]||l;return r?n.createElement(s,a(a({ref:t},i),{},{components:r})):n.createElement(s,a({ref:t},i))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,a=new Array(l);a[0]=b;var u={};for(var c in t)hasOwnProperty.call(t,c)&&(u[c]=t[c]);u.originalType=e,u.mdxType="string"==typeof e?e:o,a[1]=u;for(var p=2;p<l;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}b.displayName="MDXCreateElement"},78729:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const l={title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:1,tags:["Book"]},a=void 0,u={permalink:"/1",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",source:"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",description:"\ucc45 \uc815\ubcf4",date:"2023-01-01T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 1\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:4.425,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",slug:"1",tags:["Book"]},prevItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},c={authorsImageUrls:[]},p=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:p};function k(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ubc15\uc194\ubbf8 ")),(0,o.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,o.kt)("p",null,"\uc800\uc790\uc758 \uacbd\ud5d8\uacfc \ud568\uaed8 \uae00\uc4f0\uae30\uc5d0 \ub300\ud55c \uac00\ubcbc\uc6b4 \uc870\uc5b8\uc774 \ub2f4\uaca8\uc788\uc5b4 \uac00\ubccd\uac8c \uc77d\uae30 \uc88b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uae00\uc744 \uc798 \uc791\uc131\ud574 \ubcf4\uace0 \uc2f6\uc744 \ub54c \uc801\uc6a9\ud574 \ubcfc \uc218 \uc788\ub294 \uc815\ubcf4\uac00 \ub9ce\uc544\uc11c \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4. "),(0,o.kt)("p",null,"\uc6b0\uc544\ud55c \ud14c\ud06c\ucf54\uc2a4\uc758 \ud504\ub9ac\ucf54\uc2a4\ub97c \uc9c4\ud589\ud560 \ub54c \ud6c4\uae30\ub97c \uc791\uc131\ud558\uace0 \ub098\uba74 \ud56d\uc0c1 \uae00\uc774 \ub531\ub531\ud558\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\ub2e4\ub978 \uc9c0\uc6d0\uc790\ub4e4\uc758 \uc77d\uae30 \ud3b8\ud558\uace0, \ubc1d\uc740 \ub290\ub08c\uc744 \uc8fc\ub294 \uae00\uc744 \ubcf4\uba74 \ubd80\ub7ec\uc6b4 \ub9c8\uc74c\uc744 \uac00\uc9c0\uae30\ub3c4 \ud588\ub2e4.",(0,o.kt)("br",{parentName:"p"}),"\n","\uc774 \ucc45\uc744 \uc77d\uc5c8\uc73c\ub2c8 2023\ub144\uc5d0\ub294 \uc870\uae08 \ub354 \uae00\uc744 \uc798 \uc801\uc5b4\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,o.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ubb38\uc7a5\uc774 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74\n\ub0b4\uc6a9\uc744 \uc77c\ubaa9\uc694\uc5f0\ud558\uac8c \uc815\ub9ac\ud588\uace0, \uae00\uc758 \uc758\ub3c4\ub3c4 \uc090\ub6a4\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub3c4 \uc801\uc808\ud55c \uac83\uc73c\ub85c \uace8\ub790\ub294\ub370\u2026 \uadf8\ub7f0\ub370\ub3c4 \uc5b4\ub518\uac00\uac00 \uc2ec\uc2ec\ud558\uace0 \uc9c0\ub8e8\ud558\ub2e4\uba74? \ucd95\ucd95 \ucc98\uc9c0\uace0 \ub530\ubd84\ud558\ub2e4\uba74? \ub9d0\uaf2c\ub9ac\ub97c \ubaa8\uc870\ub9ac \u2018~\ub2e4\u2019\ub85c \ud1b5\uc77c\ud55c \uac74 \uc544\ub2cc\uc9c0 \uc810\uac80\ud574 \ubcf4\uc138\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9d0\uaf2c\ub9ac\ub97c \uc798 \uac16\uace0 \ub180\uc544\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc7a5\uc758 \ub9c8\uc9c0\ub9c9 \uae00\uc790\ub97c \ub9e4\ubc88 \ub2e4\ub974\uac8c \uace0\uccd0\uc4f0\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uae00\uc5d0 \ud65c\uae30\ub97c \ub354\ud560 \uc218 \uc788\uc8e0. \ub54c\ub860 \ubb38\uc7a5\uc744 \ub2e4 \ub9c8\uce58\uc9c0 \uc54a\uace0, \ub2e8\uc5b4\ub85c\ub9cc \ub05d\ub9fa\ub294 \uac83\ub3c4 \ubc29\ubc95. \ubb38\uc7a5\uacfc \ubb38\uc7a5 \uc0ac\uc774\uc5d0 \uc27c\ud45c\uac00 \ub4e4\uc5b4\uc11c\uba70 \uae00 \uc804\uccb4\uc5d0 \ud65c\uae30\uac00 \ub3cc\uac8c \ub3fc\uc694. \ubb38\uc7a5\uc758 \uae38\uc774\ub3c4 \ub2e4\ucc44\ub85c\uc6cc\uc9c0\ub294 \ub355\ubd84\uc5d0 \ub364\uc73c\ub85c \uc5bb\uac8c \ub418\ub294 \uac83\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c, \uae00\uc758 \ub9ac\ub4ec.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc774\uc804 \ubb38\uc7a5\uc5d0\uc11c \ub05d\ub09c \uae00\uc790\ub85c, \ub2e4\uc74c \ubb38\uc7a5\uc744 \ub05d\ub9fa\uc9c0 \uc54a\uae30. \ud55c\ub450 \ubb38\ub2e8\ub9c8\ub2e4 \ub2e8\uc5b4 \uc218\uc900\uc758 \uc544\uc8fc \uc9e7\uc740 \ubb38\uc7a5 \ubc30\uce58\ud558\uae30.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc758 \uc9c4\uc9dc \uc774\uc720, \uae00\uc758 \uc9c4\uc9dc \ubaa9\uc801, \uae00\uc758 \uc9c4\uc9dc \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uace0 \uc560\uc37c\uc2b5\ub2c8\ub2e4. \uc9c0\uae08\ucc98\ub7fc \ud2c0\uc744 \ub5a0\uc62c\ub9b0\ub2e4\uac70\ub098, \ub208\uce58\ub97c \ubcf8\ub2e4\uac70\ub098, \uc815\uce58\uc801\uc778 \uc148\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc81c\ubaa9\uc740 \uc9e7\uac8c, \ubcf4\uae30 \uc27d\uac8c, \uc77d\uae30 \uc27d\uac8c, \ubc1c\uc74c\uc774 \ube44\uc2b7\ud558\uac8c, \uc21c\uc11c\ub97c \ubc14\uafd4\uc11c")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub4ec\uc744 \ub54c, \ub178\ub798\uc5d0 \uac00\uae4c\uc6cc\uc9c8 \ubc29\ubc95\uc740 \uc5c6\uc744\uc9c0 \uace0\ubbfc\ud574\ubd05\ub2c8\ub2e4. \uac10\ud788 \uac00 \ub2ff\uc744 \uc218 \uc5c6\ub294 \ubaa9\ud45c\uc774\uaca0\uc9c0\ub9cc, \ud560 \uc218 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \ub9ac\ub4ec\uc774\ub77c\ub3c4 \ubd99\uc5ec\uc8fc\uace0 \uc2f6\uc5b4\uc694.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uc5ec\ub294 \ub9d0\uacfc \ub9c8\uc9c0\ub9c9 \ub9d0\uc5d0 \uc791\uc815\ud558\uace0 \ub9c8\uc74c\uc744 \ub2f4\ub294 \uc5f0\uc2b5\uc744 \ud574\ubd05\uc2dc\ub2e4. \uae00\uc758 \uc5b4\ub290 \uad6c\uc11d\uc774\ub77c\ub3c4 \ubed4\ud55c \uae00\uc790\ub294 \ub0a8\uae30\uc9c0 \uc54a\uaca0\ub178\ub77c \ub2e4\uc9d0\ud558\uba70 \uc368\ubcf4\ub294 \uac81\ub2c8\ub2e4. \ub098\ub9cc\uc774 \uac00\uc9c4 \uc720\uc77c\ud55c \uba54\uc2dc\uc9c0\uc5d0 \uc9d1\uc911\ud558\uba74\uc11c\uc694. \uadf8\ub7fc \uc0dd\uac01\uc774 \ub2ec\ub77c\uc9c0\uace0, \uace0\ub974\ub294 \ub2e8\uc5b4\ub3c4 \ub2ec\ub77c\uc9c0\uace0, \ub0a8\uae34 \ubb38\uc7a5\ub3c4 \ub2ec\ub77c\uc838\uc694. \uacb0\uad6d\uc5d0\ub294 \uae00\uc744 \uc4f4 \uc0ac\ub78c\uc778 \ub098 \uc790\uc2e0\ub3c4 \ub0a8\ub2ec\ub77c\uc9c8 \uac81\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\ub9de\ucda4\ubc95\uc740 \uc911\uc694\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9de\ucda4\ubc95\ubcf4\ub2e4 \ub354 \uc911\uc694\ud55c \uac74 \uac70\uae30\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc785\ub2c8\ub2e4. \ub0b4 \ub9c8\uc74c\uc744 \uae00\uc5d0 \ub2f4\uc544 \uc2e4\uc5b4 \ubcf4\ub0b4\uae30 \uc804, \ub9de\ucda4\ubc95\uc744 \uc810\uac80\ud558\ub294 \uc774\uc720 \uc5ed\uc2dc \uadf8\uac81\ub2c8\ub2e4. \uc624\uc9c1 \ub0b4 \ub9c8\uc74c\uc774 \ub0a8\uc5d0\uac8c \uc77d\ud788\ub294 \ub3d9\uc548 \ubc29\ud574\uac00 \ub418\uc9c0 \uc54a\uae30\ub97c \ubc14\ub77c\uae30 \ub54c\ubb38\uc774\uc8e0. \ub0b4\uac00 \uc4f4 \uae00\ub3c4, \ub0a8\uc774 \uc4f4 \uae00\ub3c4. \uc5b8\uc81c\ub098 \uadf8 \uc548\uc5d0 \ub2f4\uae34 \ub9c8\uc74c\uc774 \uba3c\uc800\uc785\ub2c8\ub2e4.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"\uae00\uc744 \uc4f4\ub2e4\uace0 \uae00\uc774 \uc644\uc131\ub418\ub294 \uac8c \uc544\ub2c8\uc5d0\uc694. \uae00\uacfc \ub2ee\uc740 \ubaa8\uc2b5\uc73c\ub85c \uc0b4 \ub54c, \uae00\uc740 \ube44\ub85c\uc18c \uc644\uc131\ub429\ub2c8\ub2e4.")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e4ebfe18.102e5809.js b/assets/js/e4ebfe18.102e5809.js deleted file mode 100644 index f0c03ec37..000000000 --- a/assets/js/e4ebfe18.102e5809.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9940],{7954:e=>{e.exports=JSON.parse('{"permalink":"/page/3","page":3,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/2","nextPage":"/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e4ebfe18.5f539aea.js b/assets/js/e4ebfe18.5f539aea.js new file mode 100644 index 000000000..6acce3c67 --- /dev/null +++ b/assets/js/e4ebfe18.5f539aea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9940],{57954:e=>{e.exports=JSON.parse('{"permalink":"/page/3","page":3,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/2","nextPage":"/page/4","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e5f297b0.70a71e63.js b/assets/js/e5f297b0.70a71e63.js deleted file mode 100644 index 2c6d6ce1b..000000000 --- a/assets/js/e5f297b0.70a71e63.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4109],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),k=s(a),m=r,h=k["".concat(o,".").concat(m)]||k[m]||u[m]||l;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s<l;s++)i[s]=a[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},5769:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const l={title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:35,tags:["Java","Spring Boot","Spring"]},i=void 0,p={permalink:"/35",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",source:"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",description:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",date:"2023-07-24T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 24\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Spring Boot",permalink:"/tags/spring-boot"},{label:"Spring",permalink:"/tags/spring"}],readingTime:4.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:"35",tags:["Java","Spring Boot","Spring"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"},nextItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"}},o={authorsImageUrls:[]},s=[{value:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31",level:2},{value:"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"Switch Expressions(Java 14)",id:"switch-expressionsjava-14",level:3},{value:"Text Block(Java 15)",id:"text-blockjava-15",level:3},{value:"NPE \uba54\uc2dc\uc9c0(Java 15)",id:"npe-\uba54\uc2dc\uc9c0java-15",level:3},{value:"Record(Java 16)",id:"recordjava-16",level:3},{value:"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d",id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d",level:3},{value:"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd",id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd",level:3},{value:"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c",id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c",level:3},{value:"HTTP interface client",id:"http-interface-client",level:3},{value:"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:s};function u(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31"},"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1"),(0,r.kt)("p",null,"\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,r.kt)("h3",{id:"switch-expressionsjava-14"},"Switch Expressions(Java 14)"),(0,r.kt)("p",null,"Java 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"enum RESULT {\n WIN, LOSE, DRAW\n}\n\nRESULT result = RESULT.WIN;\n\nint prize = switch (result) {\n case WIN -> 10_000_000;\n case LOSE, DRAW -> 5_000_000;\n default -> 0;\n};\n")),(0,r.kt)("p",null,"\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"->")," \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"case\ub97c \ucf64\ub9c8(",(0,r.kt)("inlineCode",{parentName:"li"},","),")\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"text-blockjava-15"},"Text Block(Java 15)"),(0,r.kt)("p",null,"Java 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'@Repository\npublic interface PostRepository extends JpaRepository<Post, Long> {\n @Query("""\n SELECT p FROM Post p\n WHERE p.title LIKE %:keyword%\n OR p.content LIKE %:keyword%\n """)\n List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);\n}\n')),(0,r.kt)("h3",{id:"npe-\uba54\uc2dc\uc9c0java-15"},"NPE \uba54\uc2dc\uc9c0(Java 15)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'String name = null;\nname.chars();\n\n/** \n# before\njava.lang.NullPointerException\n at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\n\n# after\nCannot invoke "String.chars()" because "name" is null\njava.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null\n*/\n')),(0,r.kt)("h3",{id:"recordjava-16"},"Record(Java 16)"),(0,r.kt)("p",null,"Lombok\uc758 ",(0,r.kt)("inlineCode",{parentName:"p"},"@Data"),", kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Record\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public record PostDto(String title, String content) {\n}\n")),(0,r.kt)("h3",{id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d"},"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("h2",{id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Java 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd"},"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd"),(0,r.kt)("p",null,"Jakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. "),(0,r.kt)("h3",{id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c"},"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c"),(0,r.kt)("p",null,"6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello")'),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello/")'),"\uac00 \ub3d9\uc77c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello"),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello/"),"\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. "),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"PathPatternParser used by default (with the ability to opt into PathMatcher). ")),(0,r.kt)("h3",{id:"http-interface-client"},"HTTP interface client"),(0,r.kt)("p",null,"\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"\ud1a0\ube44\ub2d8\uc758 \uac15\uc758"),"\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Gradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. "),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=1WT6oxchM9M"},"\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=7SlDdzVk6GE"},"\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.samsungsds.com/kr/insights/java_jakarta.html"},"Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x"},"What's New in Spring Framework 6.x"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes"},"Spring Boot 3.0 Release Notes"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes"},"Spring Boot 3.1 Release Notes")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e5f297b0.fbff669c.js b/assets/js/e5f297b0.fbff669c.js new file mode 100644 index 000000000..093ea3bf7 --- /dev/null +++ b/assets/js/e5f297b0.fbff669c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4109],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),k=s(a),m=r,h=k["".concat(o,".").concat(m)]||k[m]||u[m]||l;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s<l;s++)i[s]=a[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},55769:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const l={title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:35,tags:["Java","Spring Boot","Spring"]},i=void 0,p={permalink:"/35",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",source:"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",description:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",date:"2023-07-24T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 24\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Spring Boot",permalink:"/tags/spring-boot"},{label:"Spring",permalink:"/tags/spring"}],readingTime:4.725,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",slug:"35",tags:["Java","Spring Boot","Spring"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"},nextItem:{title:"\uc6f9\uc18c\ucf13",permalink:"/34"}},o={authorsImageUrls:[]},s=[{value:"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1",id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31",level:2},{value:"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"Switch Expressions(Java 14)",id:"switch-expressionsjava-14",level:3},{value:"Text Block(Java 15)",id:"text-blockjava-15",level:3},{value:"NPE \uba54\uc2dc\uc9c0(Java 15)",id:"npe-\uba54\uc2dc\uc9c0java-15",level:3},{value:"Record(Java 16)",id:"recordjava-16",level:3},{value:"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d",id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d",level:3},{value:"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d",level:2},{value:"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd",id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd",level:3},{value:"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c",id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c",level:3},{value:"HTTP interface client",id:"http-interface-client",level:3},{value:"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d",id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],c={toc:s};function u(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"\uc790\ubc14-17-\uc2a4\ud504\ub9c1-60-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-31"},"\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1"),(0,r.kt)("p",null,"\ud300 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","2.7 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc5c8\uc9c0\ub9cc LTS \uae30\uac04\uacfc \ucde8\uc57d\uc810 \ud328\uce58\ub85c \uc778\ud55c \ubc84\uc804\uc5c5 \ub4f1\uc744 \uace0\ub824\ud588\uc744 \ub54c 3.1\uacfc \uc790\ubc14 17\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\ub2e4."),(0,r.kt)("h2",{id:"\uc790\ubc14-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc790\ubc14 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca8 2\uae4c\uc9c0\ub294 \uc790\ubc14 11\uc744 \uc0ac\uc6a9\ud588\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc790\ubc14 11\ubd80\ud130 \uc790\ubc14 17\uae4c\uc9c0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc815\uc2dd \ub9b4\ub9ac\uc988 \uae30\uc900\uc73c\ub85c \uc815\ub9ac\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4."),(0,r.kt)("h3",{id:"switch-expressionsjava-14"},"Switch Expressions(Java 14)"),(0,r.kt)("p",null,"Java 14\uc5d0\uc11c\ub294 \uae30\uc874\uc758 Switch \ubb38\uc744 \uac04\uacb0\ud558\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub294 Switch \uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"enum RESULT {\n WIN, LOSE, DRAW\n}\n\nRESULT result = RESULT.WIN;\n\nint prize = switch (result) {\n case WIN -> 10_000_000;\n case LOSE, DRAW -> 5_000_000;\n default -> 0;\n};\n")),(0,r.kt)("p",null,"\uc8fc\uc694 \ud2b9\uc9d5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"->")," \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud558\uc5ec \uac01 case\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc14\ub85c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"case\ub97c \ucf64\ub9c8(",(0,r.kt)("inlineCode",{parentName:"li"},","),")\ub85c \uc5f0\uacb0\ud558\uc5ec \ud558\ub098\uc758 case\uc5d0 \uc5ec\ub7ec \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"break \ubb38\uc774 \ud544\uc694 \uc5c6\ub2e4."),(0,r.kt)("li",{parentName:"ul"},"default \ube14\ub85d\uc744 \ud1b5\ud574 \uae30\ubcf8 \uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.")),(0,r.kt)("h3",{id:"text-blockjava-15"},"Text Block(Java 15)"),(0,r.kt)("p",null,"Java 15\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \ubb38\uc790\uc5f4 \ud45c\ud604\ubc29\uc2dd\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uae34 \ubb38\uc790\uc5f4\uc744 + \uc5f0\uc0b0\uc790\uc758 \ub3c4\uc6c0 \uc5c6\uc774 \uac00\ub3c5\uc131\uc788\uac8c \uc791\uc131\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'@Repository\npublic interface PostRepository extends JpaRepository<Post, Long> {\n @Query("""\n SELECT p FROM Post p\n WHERE p.title LIKE %:keyword%\n OR p.content LIKE %:keyword%\n """)\n List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);\n}\n')),(0,r.kt)("h3",{id:"npe-\uba54\uc2dc\uc9c0java-15"},"NPE \uba54\uc2dc\uc9c0(Java 15)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'String name = null;\nname.chars();\n\n/** \n# before\njava.lang.NullPointerException\n at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)\n\n# after\nCannot invoke "String.chars()" because "name" is null\njava.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null\n*/\n')),(0,r.kt)("h3",{id:"recordjava-16"},"Record(Java 16)"),(0,r.kt)("p",null,"Lombok\uc758 ",(0,r.kt)("inlineCode",{parentName:"p"},"@Data"),", kotlin\uc758 data \ud074\ub798\uc2a4\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Record\ub97c \uc120\uc5b8\ud558\ub294 \uacbd\uc6b0 \uc811\uadfc\uc790, \uc0dd\uc131\uc790, equals & hashcode, toString\uc774 \uc81c\uacf5\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub370\uc774\ud130 \uc804\uc1a1 \uc6a9\ub3c4\ub85c \uc801\ud569\ud574 \ubcf4\uc778\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public record PostDto(String title, String content) {\n}\n")),(0,r.kt)("h3",{id:"\ucd94\uac00\uc801\uc778-\ubcc0\uacbd\uc0ac\ud56d"},"\ucd94\uac00\uc801\uc778 \ubcc0\uacbd\uc0ac\ud56d"),(0,r.kt)("p",null,"\uc774\uc678\uc5d0\ub3c4 stream\uc758 toList, \uc778\uc2a4\ud134\uc2a4\uc758 \ud0c0\uc785\uc744 \uac04\ud3b8\ud558\uac8c \uccb4\ud06c\ud558\ub294 Pattern Matching Instanceof, Sealed class \ub4f1\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4. "),(0,r.kt)("h2",{id:"\uc2a4\ud504\ub9c1-\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ubcc0\uacbd-\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ubcc0\uacbd \uc0ac\ud56d"),(0,r.kt)("p",null,"\uc2a4\ud504\ub9c1\uacfc \uc2a4\ud504\ub9c1 \ubd80\ud2b8\uc5d0\ub3c4 \ub9ce\uc740 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ud544\uc694\ud574\ubcf4\uc774\ub294 \uba87\uac1c \uc815\ub3c4\ub9cc \uc815\ub9ac\ud588\ub2e4. "),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Java 17, Jakarta EE 9 \uc774\uc0c1\uc774\uc5b4\uc57c \ud55c\ub2e4."),(0,r.kt)("h3",{id:"\ub124\uc784\uc2a4\ud398\uc774\uc2a4-\ubcc0\uacbd"},"\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \ubcc0\uacbd"),(0,r.kt)("p",null,"Jakarta EE 9\uac00 \uc801\uc6a9\ub418\uba74\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub3c4 \uc804\ubc18\uc801\uc73c\ub85c javax -> jakarta\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. "),(0,r.kt)("h3",{id:"pathpatternparser---trailing-slash-\ud5c8\uc6a9\ud558\uc9c0-\uc54a\uc74c"},"PathPatternParser - trailing slash \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc74c"),(0,r.kt)("p",null,"6.0 \uc774\uc804\uc758 \uacbd\uc6b0 \uae30\ubcf8 \uc124\uc815 \uae30\uc900\uc73c\ub85c ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello")'),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},'@GetMapping("/hello/")'),"\uac00 \ub3d9\uc77c\ud588\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","6.0 \uc774\ud6c4\uc758 PathPatternParser\uac00 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ub418\uace0, ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello"),"\uc640 ",(0,r.kt)("inlineCode",{parentName:"p"},"/hello/"),"\ub294 \uc11c\ub85c \ub2e4\ub978 URL\ub85c \ub9e4\uce6d\ub41c\ub2e4. "),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"PathPatternParser used by default (with the ability to opt into PathMatcher). ")),(0,r.kt)("h3",{id:"http-interface-client"},"HTTP interface client"),(0,r.kt)("p",null,"\uc790\ubc14 \uc778\ud130\ud398\uc774\uc2a4\uc640 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec HTTP \uc694\uccad\uc744 \uc704\ud55c \uc11c\ube44\uc2a4\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ucd94\uac00\ub418\uc5c8\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"\ud1a0\ube44\ub2d8\uc758 \uac15\uc758"),"\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,r.kt)("h3",{id:"\uc2a4\ud504\ub9c1-\ubd80\ud2b8-\ucd5c\uc18c-\uc694\uad6c\uc0ac\ud56d"},"\uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ucd5c\uc18c \uc694\uad6c\uc0ac\ud56d"),(0,r.kt)("p",null,"Gradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6",(0,r.kt)("br",{parentName:"p"}),"\n","\uc774\uc678\uc5d0\ub3c4 \uc11c\ub4dc\ud30c\ud2f0\ub4e4\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc988 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \ubc84\uc804\uc5d0 \ub9de\ub294 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ub97c \ucc38\uace0\ud560 \uc218 \uc788\uc744 \uac83 \uac19\ub2e4. "),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=1WT6oxchM9M"},"\uc5b4\ub290\xa0\uc6d4\uae09\uc7c1\uc774\uac1c\ubc1c\uc790\xa0\uc758 \uc2a4\ud504\ub9c1 \ubd80\ud2b8 \ub530\ub77c\uc7a1\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=7SlDdzVk6GE"},"\uc790\ubc14 9-16 \uc8fc\uc694 \ud2b9\uc9d5 \ubcf5\uc2b5\ud558\uae30"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.samsungsds.com/kr/insights/java_jakarta.html"},"Java EE\uc5d0\uc11c Jakarta EE\ub85c\uc758 \uc804\ud658"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=Kb37Q5GCyZs"},"Spring 6\uc758 \uc0c8\ub85c\uc6b4 HTTP Interface\uc640 3 \uac00\uc9c0 REST Clients \ub77c\uc774\ube0c \ucf54\ub529"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x"},"What's New in Spring Framework 6.x"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes"},"Spring Boot 3.0 Release Notes"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1-Release-Notes"},"Spring Boot 3.1 Release Notes")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e7d2a655.8f244c74.js b/assets/js/e7d2a655.8f244c74.js new file mode 100644 index 000000000..55c6ea98c --- /dev/null +++ b/assets/js/e7d2a655.8f244c74.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8652],{71501:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/2","page":2,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse","nextPage":"/tags/woowahan-techcourse/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e7d2a655.cb5424b7.js b/assets/js/e7d2a655.cb5424b7.js deleted file mode 100644 index 5a5a7bef1..000000000 --- a/assets/js/e7d2a655.cb5424b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8652],{1501:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/2","page":2,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse","nextPage":"/tags/woowahan-techcourse/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e8d6e7ce.a32d1fb3.js b/assets/js/e8d6e7ce.a32d1fb3.js deleted file mode 100644 index 596558da4..000000000 --- a/assets/js/e8d6e7ce.a32d1fb3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3912],{5245:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/e8d6e7ce.e2dc4ae6.js b/assets/js/e8d6e7ce.e2dc4ae6.js new file mode 100644 index 000000000..614155e1b --- /dev/null +++ b/assets/js/e8d6e7ce.e2dc4ae6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3912],{65245:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/e9624b4f.8aa89eac.js b/assets/js/e9624b4f.8aa89eac.js new file mode 100644 index 000000000..2d24b991f --- /dev/null +++ b/assets/js/e9624b4f.8aa89eac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4564],{11780:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/13","page":13,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/12","nextPage":"/tags/retrospective/page/14","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e9624b4f.ef44d25f.js b/assets/js/e9624b4f.ef44d25f.js deleted file mode 100644 index 13ae3cac2..000000000 --- a/assets/js/e9624b4f.ef44d25f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4564],{1780:e=>{e.exports=JSON.parse('{"permalink":"/tags/retrospective/page/13","page":13,"postsPerPage":1,"totalPages":15,"totalCount":15,"previousPage":"/tags/retrospective/page/12","nextPage":"/tags/retrospective/page/14","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e9ff60ad.6425d7c1.js b/assets/js/e9ff60ad.6425d7c1.js new file mode 100644 index 000000000..db61d1414 --- /dev/null +++ b/assets/js/e9ff60ad.6425d7c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2530],{10242:e=>{e.exports=JSON.parse('{"permalink":"/tags/pattern","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/e9ff60ad.e030dcb0.js b/assets/js/e9ff60ad.e030dcb0.js deleted file mode 100644 index eba4da9e4..000000000 --- a/assets/js/e9ff60ad.e030dcb0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2530],{242:e=>{e.exports=JSON.parse('{"permalink":"/tags/pattern","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ee00b37a.87d26226.js b/assets/js/ee00b37a.87d26226.js new file mode 100644 index 000000000..ef17ec822 --- /dev/null +++ b/assets/js/ee00b37a.87d26226.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[63],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?p(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):p(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},p=Object.keys(e);for(r=0;r<p.length;r++)n=p[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r<p.length;r++)n=p[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(n),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return n?r.createElement(b,l(l({ref:t},u),{},{components:n})):r.createElement(b,l({ref:t},u))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c<p;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}s.displayName="MDXCreateElement"},62860:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const p={title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:27,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/27",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",description:"\uc9c0\ud558\ucca0 \ubbf8\uc158",date:"2023-05-25T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 25\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.91,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:"27",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"},nextItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"}},i={authorsImageUrls:[]},c=[{value:"\uc9c0\ud558\ucca0 \ubbf8\uc158",id:"\uc9c0\ud558\ucca0-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc9c0\ud558\ucca0-\ubbf8\uc158"},"\uc9c0\ud558\ucca0 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","API\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c")),(0,a.kt)("p",null,"\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"\ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654")),(0,a.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac")),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("admonition",{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131")),(0,a.kt)("p",null,"\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4."),(0,a.kt)("p",null,"\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Nested\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\n\n @Test\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\n // given\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\ucd08\ub85d", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", 5);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5", \uc624\ub978\ucabd, 5);\n\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uace0\ub3d9", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", 3);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804", \uc624\ub978\ucabd, 7);\n\n // when\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\n\n // then\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\n \uc870\ud68c_\uacb0\uacfc,\n \ub178\uc120_\uc815\ubcf4("2\ud638\uc120", "\ucd08\ub85d", 0, "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5"),\n \ub178\uc120_\uc815\ubcf4("9\ud638\uc120", "\uace0\ub3d9", 0, "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804")\n );\n }\n}\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc870\uc728\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud3b8\ud55c \ubd84\uc704\uae30")),(0,a.kt)("p",null,"\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ee00b37a.c8d04366.js b/assets/js/ee00b37a.c8d04366.js deleted file mode 100644 index 14d34bfb3..000000000 --- a/assets/js/ee00b37a.c8d04366.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[63],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?p(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):p(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},p=Object.keys(e);for(r=0;r<p.length;r++)n=p[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(r=0;r<p.length;r++)n=p[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(n),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return n?r.createElement(b,l(l({ref:t},u),{},{components:n})):r.createElement(b,l({ref:t},u))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=n.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c<p;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}s.displayName="MDXCreateElement"},2860:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const p={title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:27,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/27",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",description:"\uc9c0\ud558\ucca0 \ubbf8\uc158",date:"2023-05-25T00:00:00.000Z",formattedDate:"2023\ub144 5\uc6d4 25\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.91,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0",slug:"27",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30",permalink:"/28"},nextItem:{title:"\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5",permalink:"/26"}},i={authorsImageUrls:[]},c=[{value:"\uc9c0\ud558\ucca0 \ubbf8\uc158",id:"\uc9c0\ud558\ucca0-\ubbf8\uc158",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc9c0\ud558\ucca0-\ubbf8\uc158"},"\uc9c0\ud558\ucca0 \ubbf8\uc158"),(0,a.kt)("p",null,"\uc810\uc810 \uc77c\uc815\uc774 \ub9ce\uc544\uc9c0\ub294 \ub290\ub08c\uc774 \ub4e4\uba74\uc11c \ud68c\uace0\uac00 \ub2a6\uc5b4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc9c0\ud558\ucca0 \ubbf8\uc158\uc740 \ubc00\ub9ac\ub791 \ud398\uc5b4\ub97c \uc9c4\ud589\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac04\ub2e8\ud55c CRUD\ub9cc \uc788\ub358 \uc774\uc804 \ubbf8\uc158\ub4e4\uacfc \ub2ec\ub9ac, \uc870\uae08 \ubcf5\uc7a1\ud55c \ub3c4\uba54\uc778 \uc694\uad6c\uc0ac\ud56d\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c API, \ud14c\uc774\ube14, \ub3c4\uba54\uc778 \uc124\uacc4\ub97c \ud574\uc57c \ud588\ub294\ub370 \uc5b4\ub5a4 \uac83\ubd80\ud130 \ud574\uc57c \ud560\uc9c0 \uace0\ubbfc\uc744 \ub9ce\uc774 \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","API\uc640 \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc6b0\ub9ac\uac00 \uc815\ud560 \uc218 \uc788\ub294 \uc0c1\ud669\uc774\uc5c8\uace0, \ub3c4\uba54\uc778 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud588\uae30 \ub54c\ubb38\uc5d0 \ub3c4\uba54\uc778\uc744 \uba3c\uc800 \uad6c\ud604\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub178\uc120\uc758 \uad6c\uac04 \ucd94\uac00 \ubc0f \uc0ad\uc81c")),(0,a.kt)("p",null,"\ub178\uc120\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574\uc11c \ubc00\ub9ac\uc640 \uc774\uc57c\uae30\ub97c \ub098\ub234\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\uad6c\uac04\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc804\ubd80 \uc81c\uac70\ud558\uace0 \uc804\ubd80 \ucd94\uac00\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"\ubcc0\uacbd\ub41c \uc694\uc18c\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud558\ub294 \ubc29\ubc95")),(0,a.kt)("p",null,"\ud398\uc5b4 \uc2dc\uac04\uc774 \uc9e7\uc544\uc11c \ub354\uc6b1 \uac04\ub2e8\ud55c 1\ubc88\uc744 \uc120\ud0dd\ud588\uace0, \uc2dc\uac04 \ub0b4 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud574 \ub354 \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud558\ub294 \uac83\ub3c4 \uc88b\uc740 \ud2b8\ub808\uc774\ub4dc\uc624\ud504\uc600\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd94\ud6c4 \ud398\uc5b4\uac00 \ub05d\ub098\uace0 \ub9ac\ubdf0\uc5b4\uc778 \uc11c\ube0c\uc6e8\uc774\uac00 \uc77c\ubd80\ubd84\ub9cc \ubc18\uc601\ud558\ub294 \uac83\uc73c\ub85c \uac1c\uc120\ud574 \ubcf4\ub294 \uac83\ub3c4 \uc88b\uc744 \uac83 \uac19\ub2e4\uace0 \ucf54\uba58\ud2b8\ub97c \ub0a8\uaca8\uc8fc\uc154\uc11c \ucd94\uac00 \ubc0f \uc81c\uac70\ub41c \uc694\uc18c\ub9cc \ubc18\uc601\ud558\ub3c4\ub85d \ubcc0\uacbd\ud588\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubbf8\uc158\uc758 \ub09c\uc774\ub3c4\uac00 \uc62c\ub77c\uac04 \ub9cc\ud07c, \ud398\uc5b4 \ud560 \ub550 \ucee8\ub514\uc158 \uad00\ub9ac\ub3c4 \uc798\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \ubbf8\uc158 \ud560 \ub54c\ub3c4 \uc9d1\uc911\ud574\uc11c \uc798 \ub05d\ub0b8 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc54c\uc544\uc57c \ud558\ub294 \uac8c \ub9ce\uc544\uc9c0\uba74\uc11c \uac00\ub054 \uc870\ubc14\uc2ec\uc744 \uac00\uc9c8 \ub54c\uac00 \uc788\ub294 \uac83 \uac19\uc740\ub370, \uc870\ubc14\uc2ec\uc744 \uacbd\uacc4\ud560 \ud544\uc694\uac00 \uc788\uc744 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubd80\uc871\ud55c \ubd80\ubd84\uc740 \uc778\uc815\ud558\uace0, \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc57c\uaca0\ub2e4. "),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654")),(0,a.kt)("p",null,"\uc694\uae08 \uc815\ucc45\uc740 \uae30\ubcf8\uc694\uae08 \uc815\ucc45, \uac70\ub9ac\ubcc4 \uc694\uae08 \uc815\ucc45, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc774 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc694\uae08\uc744 \ub354\ud558\ub294 \ubd80\ubd84\uacfc, \ud560\uc778\ud558\ub294 \ubd80\ubd84\uc774 \uc788\uc5b4\uc11c \uc774 \ub458\uc744 \ubd84\ub9ac\ud560\uae4c \uc0dd\uac01\ud588\uc9c0\ub9cc, \uc774 \uc815\ub3c4 \ud06c\uae30\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \uc624\ud788\ub824 \ubd84\ub9ac\ud558\uc9c0 \uc54a\uace0 \ud558\ub098\ub85c \ud569\uce58\ub294 \uac8c \ub354 \uc88b\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ubd84\ub9ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc815\ucc45\uc758 \uc21c\uc11c\uac00 \uc911\uc694\ud55c\ub370, \uc5f0\ub839\ubcc4 \ud560\uc778 \uc815\ucc45\uc744 \ub9c8\uc9c0\ub9c9\uc5d0 \ub450\uc5b4\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ucc45\uc784 \uc5f0\uc1c4 \ud328\ud134\ub3c4 \uace0\ub824\ub97c \ud588\uc9c0\ub9cc \uc870\uae08 \ub354 \uac04\uacb0\ud574 \ubcf4\uc774\ub294 \ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc744 \uc120\ud0dd\ud588\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub3c4\uba54\uc778\uc5d0 \ud2b9\uc815 \uae30\uc220\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac")),(0,a.kt)("p",null,"\ucc98\uc74c\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uc5d0 jgrapht \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc758\uc874\ud558\uace0 \uc788\ub294 \ud074\ub798\uc2a4\ub97c \ub450\uc5b4\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0\uac00 jgrapht\uc640 \uac15\uacb0\ud569\uc774 \ub418\uc5b4\ubc84\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\uc5d0\ub294 \uacbd\ub85c \uac80\uc0c9\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uace0, \uc138\ubd80 \uad6c\ud604\uc740 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \uc678\ubd80\ub85c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ucd5c\ub300\ud55c \uac04\uacb0\ud558\uac8c \uad6c\ud604\ud55c\ub2e4\uace0 \uc0dd\uac01\uc744 \ud574\ub3c4, \uc774\ub7f0 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub450\uc5b4 \uacb0\ud569\uc744 \ud53c\ud558\ub294 \uac83\uc774 \uc88b\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("admonition",{title:"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud55c \uac1c\ubcc4 \uac1d\uccb4\uac00 \uc874\uc7ac\ud558\uace0, \uadf8 \uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\ub294 \ud558\ub098\uc758 \uad6c\ud604\uccb4\uac00 \ub530\ub85c \uc874\uc7ac\ud558\ub294 \ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ub54c \uc0ac\uc6a9\uc790\ub294 \uac1c\ubcc4 \uac1d\uccb4\uc640 \ud569\uc131 \uac1d\uccb4(\uac1c\ubcc4 \uac1d\uccb4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\ub294)\ub97c \ub611\uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc778\uc218 \ud14c\uc2a4\ud2b8 \uc791\uc131")),(0,a.kt)("p",null,"\uc778\uc218 \ud14c\uc2a4\ud2b8\ub294 \uc0ac\uc6a9\uc790 \uc2a4\ud1a0\ub9ac \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ud14c\uc2a4\ud2b8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ube0c\ub77c\uc6b4\uc774 \ud574\uc8fc\uc2e0 \uac15\uc758 + \uc720\ud29c\ube0c\uc5d0 \uc788\ub294 \ube0c\ub77c\uc6b4\uc758 \uac15\uc758\ub97c \ubcf4\uace0 \uc9c0\ud558\ucca0 \ubbf8\uc158\uc5d0 \uc778\uc218 \ud14c\uc2a4\ud2b8\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uba54\uc11c\ub4dc, \ubcc0\uc218\uba85\uc744 \uc804\ubd80 \ud55c\uae00\ub85c \uc791\uc131\ud588\ub294\ub370 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc744 \uc54c\uae30 \ud3b8\ud558\uace0 \uc77d\uae30\ub3c4 \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc778\uc218 \ud14c\uc2a4\ud2b8\uc5d0 \ud544\uc694\ud55c Steps\ub97c \ub9cc\ub4dc\ub294 \uacfc\uc815\uc774 \ub108\ubb34 \uc7ac\ubc0c\uc5c8\ub2e4."),(0,a.kt)("p",null,"\uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Nested\npublic class \ub178\uc120\uc744_\uc804\uccb4_\uc870\ud68c\ud560_\ub54c {\n\n @Test\n void \uc0c1\ud589\uc885\uc810\uc5ed_\ubd80\ud130_\ud558\ud589\uc885\uc810\uc5ed\uc73c\ub85c_\uc815\ub82c\ub41c_\uacb0\uacfc\ub97c_\ubc18\ud658\ud55c\ub2e4() {\n // given\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\ucd08\ub85d", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", 5);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("2\ud638\uc120", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5", \uc624\ub978\ucabd, 5);\n\n \ub178\uc120_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uace0\ub3d9", 0);\n \ub178\uc120\uc5d0_\uad6c\uac04\uc774_\uc874\uc7ac\ud558\uc9c0_\uc54a\uc744_\ub54c_\ucd08\uae30_\uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", 3);\n \uad6c\uac04_\uc0dd\uc131_\uc694\uccad("9\ud638\uc120", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804", \uc624\ub978\ucabd, 7);\n\n // when\n final var \uc870\ud68c_\uacb0\uacfc = \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uc694\uccad();\n\n // then\n \uc694\uccad_\uacb0\uacfc\uc758_\uc0c1\ud0dc\ub97c_\uac80\uc99d\ud55c\ub2e4(\uc870\ud68c_\uacb0\uacfc, \uc815\uc0c1_\uc694\uccad);\n \ub178\uc120_\uc804\uccb4_\uc870\ud68c_\uacb0\uacfc\ub97c_\ud655\uc778\ud55c\ub2e4(\n \uc870\ud68c_\uacb0\uacfc,\n \ub178\uc120_\uc815\ubcf4("2\ud638\uc120", "\ucd08\ub85d", 0, "\uc7a0\uc2e4", "\uc7a0\uc2e4\uc0c8\ub0b4", "\uc885\ud569\uc6b4\ub3d9\uc7a5"),\n \ub178\uc120_\uc815\ubcf4("9\ud638\uc120", "\uace0\ub3d9", 0, "\ubd09\uc740\uc0ac", "\uc885\ud569\uc6b4\ub3d9\uc7a5", "\uc0bc\uc804")\n );\n }\n}\n')),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc758\uacac \uc870\uc728\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\uac00 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\uc11c \uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \uc9c4\ud589\uc774 \uc218\uc6d4\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uc0ac\uc18c\ud1b5\uc774 \ub9e4\uc6b0 \uc798 \ub3fc\uc11c \uc88b\uc558\uace0 \ub355\ubd84\uc5d0 \uc2dc\uac04 \ub0b4\uc5d0 \uc694\uad6c\uc0ac\ud56d\uc744 \ub9cc\uc871\ud574 \ubbf8\uc158\uc744 \uc81c\ucd9c\ud560 \uc218 \uc788\uc5c8\ub358 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uaf3c\uaf3c\ud558\uac8c \ucf54\ub529\ud558\uae30")),(0,a.kt)("p",null,"\ubc00\ub9ac\ub294 \ucf54\ub529\uc744 \uc5c4\uccad \uaf3c\uaf3c\ud558\uac8c \ud558\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ubcc0\uc218\uba85, \uba54\uc11c\ub4dc\uba85\uc744 \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud588\uace0, \uc88b\uc740 \ubcc0\uc218\uba85\uc744 \uc798 \uc9d3\ub294 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ucf54\ub529\ud560 \ub54c \ub0b4\uac00 \ud3c9\uc18c\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub529 \ucee8\ubca4\uc158\uc5d0 \ub9de\ucdb0\uc8fc\ub294 \uac83 \uac19\uc544\uc11c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud588\ub2e4! "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud3b8\ud55c \ubd84\uc704\uae30")),(0,a.kt)("p",null,"\uc804\uccb4\uc801\uc73c\ub85c \ud398\uc5b4 \ud560 \ub54c \ud3b8\ud558\uac8c \uc9c4\ud589\ud588\ub358 \uac83 \uac19\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc77c\uc815\ub3c4 \uadf8\ub807\uace0, \ud398\uc5b4 \uc9c4\ud589\ud560 \ub54c\ub3c4 \uadf8\ub807\uace0 \ud070 \ubb38\uc81c\uac00 \uc5c6\uc5c8\ub358 \uac83 \uac19\uc544\uc11c \uc88b\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub294 \uacfc\uc5f0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uc5d0\uac8c \ud3b8\ud55c \uc0ac\ub78c\uc77c\uae4c?"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ee92877e.2407f4c9.js b/assets/js/ee92877e.2407f4c9.js new file mode 100644 index 000000000..deb939719 --- /dev/null +++ b/assets/js/ee92877e.2407f4c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8716],{41106:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/ee92877e.3aa09934.js b/assets/js/ee92877e.3aa09934.js deleted file mode 100644 index e74d6fdec..000000000 --- a/assets/js/ee92877e.3aa09934.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8716],{1106:e=>{e.exports=JSON.parse('{"label":"Retrospective","permalink":"/tags/retrospective","allTagsPath":"/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/eec33099.b1f24980.js b/assets/js/eec33099.b1f24980.js new file mode 100644 index 000000000..ce70b9884 --- /dev/null +++ b/assets/js/eec33099.b1f24980.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4953],{80133:e=>{e.exports=JSON.parse('{"permalink":"/page/40","page":40,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/39","nextPage":"/page/41","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/eec33099.ddb03140.js b/assets/js/eec33099.ddb03140.js deleted file mode 100644 index bb4896c15..000000000 --- a/assets/js/eec33099.ddb03140.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4953],{133:e=>{e.exports=JSON.parse('{"permalink":"/page/40","page":40,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/39","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ef5b2427.dc74b19d.js b/assets/js/ef5b2427.dc74b19d.js deleted file mode 100644 index 14392ba9a..000000000 --- a/assets/js/ef5b2427.dc74b19d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9606],{195:e=>{e.exports=JSON.parse('{"permalink":"/page/22","page":22,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/21","nextPage":"/page/23","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ef5b2427.f5881651.js b/assets/js/ef5b2427.f5881651.js new file mode 100644 index 000000000..8f968b7cd --- /dev/null +++ b/assets/js/ef5b2427.f5881651.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9606],{50195:e=>{e.exports=JSON.parse('{"permalink":"/page/22","page":22,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/21","nextPage":"/page/23","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f042b56c.2fd3c78c.js b/assets/js/f042b56c.2fd3c78c.js new file mode 100644 index 000000000..6fa79e0b7 --- /dev/null +++ b/assets/js/f042b56c.2fd3c78c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8919],{27490:e=>{e.exports=JSON.parse('{"permalink":"/tags/teco-chat","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/teco-chat/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f042b56c.ba47ed4b.js b/assets/js/f042b56c.ba47ed4b.js deleted file mode 100644 index 2fbc275e1..000000000 --- a/assets/js/f042b56c.ba47ed4b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8919],{7490:e=>{e.exports=JSON.parse('{"permalink":"/tags/teco-chat","page":1,"postsPerPage":1,"totalPages":3,"totalCount":3,"nextPage":"/tags/teco-chat/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f078e301.b35d52d8.js b/assets/js/f078e301.b35d52d8.js new file mode 100644 index 000000000..a810fd4b1 --- /dev/null +++ b/assets/js/f078e301.b35d52d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1926],{18385:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/6","page":6,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/5","nextPage":"/tags/woowahan-techcourse/page/7","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f078e301.bf46e07b.js b/assets/js/f078e301.bf46e07b.js deleted file mode 100644 index 2b7ca1586..000000000 --- a/assets/js/f078e301.bf46e07b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1926],{8385:e=>{e.exports=JSON.parse('{"permalink":"/tags/woowahan-techcourse/page/6","page":6,"postsPerPage":1,"totalPages":11,"totalCount":11,"previousPage":"/tags/woowahan-techcourse/page/5","nextPage":"/tags/woowahan-techcourse/page/7","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f0978ee1.26aeaeb0.js b/assets/js/f0978ee1.26aeaeb0.js deleted file mode 100644 index 1bb4c26d8..000000000 --- a/assets/js/f0978ee1.26aeaeb0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7740],{9366:e=>{e.exports=JSON.parse('{"label":"awt","permalink":"/tags/awt","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/f0978ee1.fc391fa7.js b/assets/js/f0978ee1.fc391fa7.js new file mode 100644 index 000000000..e9f949c90 --- /dev/null +++ b/assets/js/f0978ee1.fc391fa7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7740],{69366:e=>{e.exports=JSON.parse('{"label":"awt","permalink":"/tags/awt","allTagsPath":"/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/f105176d.3d9a557f.js b/assets/js/f105176d.3d9a557f.js deleted file mode 100644 index 7e51bdc02..000000000 --- a/assets/js/f105176d.3d9a557f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5094],{3905:(e,t,n)=>{n.d(t,{Zo:()=>i,kt:()=>b});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){l(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,l=function(e,t){if(null==e)return{};var n,r,l={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var u=r.createContext({}),c=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},i=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,u=e.parentName,i=p(e,["components","mdxType","originalType","parentName"]),m=c(n),b=l,s=m["".concat(u,".").concat(b)]||m[b]||k[b]||o;return n?r.createElement(s,a(a({ref:t},i),{},{components:n})):r.createElement(s,a({ref:t},i))}));function b(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=m;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p.mdxType="string"==typeof e?e:l,a[1]=p;for(var c=2;c<o;c++)a[c]=n[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},861:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>k,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var r=n(7462),l=(n(7294),n(3905));const o={title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:3,tags:["Book"]},a=void 0,p={permalink:"/3",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",source:"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",description:"\ucc45 \uc815\ubcf4",date:"2023-01-07T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 7\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.415,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:"3",tags:["Book"]},prevItem:{title:"JSR-310",permalink:"/4"},nextItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},u={authorsImageUrls:[]},c=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173",id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:c};function k(e){let{components:t,...n}=e;return(0,l.kt)("wrapper",(0,r.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",(0,l.kt)("br",{parentName:"p"}),"\n","\uc870\uc601\ud638")),(0,l.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,l.kt)("p",null,"\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. "),(0,l.kt)("p",null,"\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0",(0,l.kt)("br",{parentName:"p"}),"\n","\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4."),(0,l.kt)("h3",{id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173"},"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173"),(0,l.kt)("p",null,"\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558"),(0,l.kt)("li",{parentName:"ul"},"\ucc45\uc784\uc758 \ucd94\uc0c1\ud654")),(0,l.kt)("p",null,"\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac")),(0,l.kt)("p",null,"\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558")),(0,l.kt)("p",null,"\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00")),(0,l.kt)("p",null,"\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0")),(0,l.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\np.21")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\np.33")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},(0,l.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8")),(0,l.kt)("p",{parentName:"blockquote"},"\uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95"),(0,l.kt)("p",{parentName:"blockquote"},"\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\np.35")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\np.38")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\np.105")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\np.158")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f105176d.7dafd1f9.js b/assets/js/f105176d.7dafd1f9.js new file mode 100644 index 000000000..efc66d922 --- /dev/null +++ b/assets/js/f105176d.7dafd1f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5094],{3905:(e,t,n)=>{n.d(t,{Zo:()=>i,kt:()=>b});var r=n(67294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){l(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,l=function(e,t){if(null==e)return{};var n,r,l={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var u=r.createContext({}),c=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},i=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,u=e.parentName,i=p(e,["components","mdxType","originalType","parentName"]),m=c(n),b=l,s=m["".concat(u,".").concat(b)]||m[b]||k[b]||o;return n?r.createElement(s,a(a({ref:t},i),{},{components:n})):r.createElement(s,a({ref:t},i))}));function b(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=m;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p.mdxType="string"==typeof e?e:l,a[1]=p;for(var c=2;c<o;c++)a[c]=n[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},50861:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>k,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var r=n(87462),l=(n(67294),n(3905));const o={title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:3,tags:["Book"]},a=void 0,p={permalink:"/3",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",source:"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",description:"\ucc45 \uc815\ubcf4",date:"2023-01-07T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 7\uc77c",tags:[{label:"Book",permalink:"/tags/book"}],readingTime:5.415,hasTruncateMarker:!1,authors:[],frontMatter:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",slug:"3",tags:["Book"]},prevItem:{title:"JSR-310",permalink:"/4"},nextItem:{title:"2022\ub144 \ud68c\uace0",permalink:"/2"}},u={authorsImageUrls:[]},c=[{value:"\ucc45 \uc815\ubcf4",id:"\ucc45-\uc815\ubcf4",level:3},{value:"\uc77d\uace0 \ub098\uc11c",id:"\uc77d\uace0-\ub098\uc11c",level:3},{value:"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173",id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173",level:3},{value:"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4",id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4",level:3}],i={toc:c};function k(e){let{components:t,...n}=e;return(0,l.kt)("wrapper",(0,r.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h3",{id:"\ucc45-\uc815\ubcf4"},"\ucc45 \uc815\ubcf4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",(0,l.kt)("br",{parentName:"p"}),"\n","\uc870\uc601\ud638")),(0,l.kt)("h3",{id:"\uc77d\uace0-\ub098\uc11c"},"\uc77d\uace0 \ub098\uc11c"),(0,l.kt)("p",null,"\uc870\uc601\ud638\ub2d8\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \uc77d\uace0 \ub098\uc11c \ub2e4\uc2dc \ud55c \ubc88 \uc77d\uc5b4\ubcf4\uc558\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\uc544\uc9c1 \uc774\ud574\uac00 \uc548\ub418\ub294 \ubd80\ubd84\uc774 \ub9ce\uc9c0\ub9cc, \uadf8\ub798\ub3c4 \ud56d\uc0c1 \uc0c8\ub85c\uc6c0\uc744 \ub290\ub080\ub2e4.",(0,l.kt)("br",{parentName:"p"}),"\n","\ub354\ud560 \ub098\uc704 \uc5c6\uc774 \ud73c\ub96d\ud55c \uac1d\uccb4\uc9c0\ud5a5 \ucc45\uc774\uace0, \uc870\uae08 \ub354 \uacf5\ubd80\ud558\uace0 \ub2e4\uc2dc \uc77d\uc5b4\ubd10\uc57c\ub420 \uac83 \uac19\ub2e4. "),(0,l.kt)("p",null,"\ucee4\ud53c \uc804\ubb38\uc810, \uc9c0\ud558\ucca0 \ub178\uc120\ub3c4, \uc774\uc0c1\ud55c \ub098\ub77c\uc758 \uc5d8\ub9ac\uc2a4\ub97c \uc608\uc2dc\ub85c \ub4e0 \uc124\uba85\uc774 \ub108\ubb34 \uc88b\uc558\uace0",(0,l.kt)("br",{parentName:"p"}),"\n","\uc88b\uc740 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \ub108\ubb34 \ubb34\uac81\uc9c0 \uc54a\uc544 \uac00\ubccd\uac8c \uc77d\uae30\ub3c4 \uc88b\uc740 \uac83 \uac19\ub2e4."),(0,l.kt)("h3",{id:"\ucc45\uc784\uc758-\uc790\uc728\uc131\uc744-\uac15\uc870\ud558\ub294-\uc774\uc720-p173"},"\ucc45\uc784\uc758 \uc790\uc728\uc131\uc744 \uac15\uc870\ud558\ub294 \uc774\uc720 p.173"),(0,l.kt)("p",null,"\ud611\ub825\uc744 \ub2e8\uc21c\ud558\uac8c \ub9cc\ub4e0\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ud45c\ud604 \u2192 \ud611\ub825\uc758 \ubcf5\uc7a1\ud568 \uc800\ud558"),(0,l.kt)("li",{parentName:"ul"},"\ucc45\uc784\uc758 \ucd94\uc0c1\ud654")),(0,l.kt)("p",null,"\uc678\ubd80\uc640 \ub0b4\ubd80\ub97c \uba85\ud655\ud558\uac8c \ubd84\ub9ac\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc694\uccad\ud558\ub294 \uac1d\uccb4\uac00 \ubab0\ub77c\ub3c4 \ub418\ub294 \ubd80\ubd84\uc774 \ucea1\uc290\ud654\ub428\uc73c\ub85c \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uc758 \ubd84\ub9ac")),(0,l.kt)("p",null,"\ucc45\uc784\uc744 \uc218\ud589\ud558\ub294 \ub0b4\ubd80\uc801\uc778 \ubc29\ubc95\uc744 \ubcc0\uacbd\ud558\ub354\ub77c\ub3c4 \uc678\ubd80\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\ub294\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\ubcc0\uacbd\uc758 \ud30c\uae09\ud6a8\uacfc\ub97c \uac1d\uccb4 \ub0b4\ubd80\ub85c \ucea1\uc290\ud654 \u2192 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac1d\uccb4\uc640\uc758 \uacb0\ud569\ub3c4 \uc800\ud558")),(0,l.kt)("p",null,"\ud611\ub825\uc758 \ub300\uc0c1\uc744 \ub2e4\uc591\ud558\uac8c \uc120\ud0dd\ud560 \uc218 \uc788\ub294 \uc720\uc5f0\uc131\uc744 \uc81c\uacf5\ud55c\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc720\uc5f0\ud55c \uc124\uacc4 \u2192 \uc7ac\uc0ac\uc6a9\uc131 \uc99d\uac00")),(0,l.kt)("p",null,"\uac1d\uccb4\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\uc751\uc9d1\ub3c4\ub97c \ub192\uc740 \uc0c1\ud0dc\ub85c \uc720\uc9c0")),(0,l.kt)("h3",{id:"\ubc11\uc904-\uce5c-\ubb38\uc7a5\ub4e4"},"\ubc11\uc904 \uce5c \ubb38\uc7a5\ub4e4"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubaa9\ud45c\ub294 \uc2e4\uc138\uacc4\ub97c \ubaa8\ubc29\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\n\uc624\ud788\ub824 \uc0c8\ub85c\uc6b4 \uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\n\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc790\uc758 \uc5ed\ud560\uc740 \ub2e8\uc21c\ud788 \uc2e4\uc138\uacc4\ub97c \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc548\uc73c\ub85c \uc62e\uaca8 \ub2f4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uace0\uac1d\uacfc \uc0ac\uc6a9\uc790\ub97c \ub9cc\uc871\uc2dc\ud0ac \uc218 \uc788\ub294 \uc2e0\uc138\uacc4\ub97c \ucc3d\uc870\ud558\ub294 \uac83\uc774\ub2e4.\np.21")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uacfc\uac70\uc758 \uc804\ud1b5\uc801\uc778 \uac1c\ubc1c \ubc29\ubc95\uc740 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uc5c4\uaca9\ud558\uac8c \uad6c\ubd84\ud55c\ub2e4.\n\uc774\uc5d0 \ubc18\ud574 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc640 \ud504\ub85c\uc138\uc2a4\ub97c \uac1d\uccb4\ub77c\ub294 \ud558\ub098\uc758 \ud2c0 \uc548\uc5d0 \ud568\uaed8 \ubb36\uc5b4 \ub193\uc74c\uc73c\ub85c\uc368 \uac1d\uccb4\uc758 \uc790\uc728\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.\n\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub85c \uad6c\uc131\ub41c \uacf5\ub3d9\uccb4\ub294 \uc720\uc9c0 \ubcf4\uc218\uac00 \uc27d\uace0 \uc7ac\uc0ac\uc6a9\uc774 \uc6a9\uc774\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub294 \uac00\ub2a5\uc131\uc744 \uc81c\uc2dc\ud55c\ub2e4.\np.33")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},(0,l.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc9c0\ud5a5\uc758 \ubcf8\uc9c8")),(0,l.kt)("p",{parentName:"blockquote"},"\uc2dc\uc2a4\ud15c\uc744 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc790\uc728\uc801\uc778 \uac1d\uccb4\ub4e4\uc758 \uacf5\ub3d9\uccb4\ub85c \ubc14\ub77c\ubcf4\uace0 \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 \uc2dc\uc2a4\ud15c\uc744 \ubd84\ud560\ud558\ub294 \ubc29\ubc95"),(0,l.kt)("p",{parentName:"blockquote"},"\uc790\uc728\uc801\uc778 \uac1d\uccb4\ub780 \uc0c1\ud0dc\uc640 \ud589\uc704\ub97c \ud568\uaed8 \uc9c0\ub2c8\uba70 \uc2a4\uc2a4\ub85c \uc790\uae30 \uc790\uc2e0\uc744 \ucc45\uc784\uc9c0\ub294 \uac1d\uccb4\ub97c \uc758\ubbf8\ud55c\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \uc2dc\uc2a4\ud15c\uc758 \ud589\uc704\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud55c\ub2e4. \uac01 \uac1d\uccb4\ub294 \ud611\ub825 \ub0b4\uc5d0\uc11c \uc815\ud574\uc9c4 \uc5ed\ud560\uc744 \uc218\ud589\ud558\uba70 \uc5ed\ud560\uc740 \uad00\ub828\ub41c \ucc45\uc784\uc758 \uc9d1\ud569\uc774\ub2e4."),(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ud611\ub825\ud558\uae30 \uc704\ud574 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\uace0, \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud55c \uac1d\uccb4\ub294 \uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \ub370 \uc801\ud569\ud55c \uba54\uc11c\ub4dc\ub97c \uc790\uc728\uc801\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4.\np.35")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ud074\ub798\uc2a4\uc758 \uad6c\uc870\uc640 \uba54\uc11c\ub4dc\uac00 \uc544\ub2c8\ub77c \uac1d\uccb4\uc758 \uc5ed\ud560, \ucc45\uc784, \ud611\ub825\uc5d0 \uc9d1\uc911\ud558\ub77c.\n\uac1d\uccb4\uc9c0\ud5a5\uc740 \uac1d\uccb4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774\uc9c0 \ud074\ub798\uc2a4\ub97c \uc9c0\ud5a5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.\np.38")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub3d9\uc801\uc73c\ub85c \ubcc0\ud558\ub294 \uac1d\uccb4\uc758 \u2018\uc0c1\ud0dc\u2019\uc640 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \u2018\ud589\uc704\u2019\ub2e4.\n\ud074\ub798\uc2a4\ub294 \ud0c0\uc785\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uad6c\ud604 \uba54\ucee4\ub2c8\uc998\uc774\ub77c\ub294 \uc0ac\uc2e4\uc744 \uae30\uc5b5\ud558\ub77c.\np.105")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\ucc45\uc784 \uc8fc\ub3c4 \uc124\uacc4\uc758 \ud575\uc2ec\uc740 \uc5b4\ub5a4 \ud589\uc704\uac00 \ud544\uc694\ud55c\uc9c0\ub97c \uba3c\uc800 \uacb0\uc815\ud55c \ud6c4\uc5d0 \uc774 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac1d\uccb4\ub97c \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.\n\uc774 \uacfc\uc815\uc744 \ud754\ud788 What/Who \uc0ac\uc774\ud074\uc774\ub77c\uace0 \ud55c\ub2e4.\n\u2019\uc5b4\ub5a4 \ud589\uc704(What)\u2019\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud55c \ud6c4 \u2018\ub204\uac00(who)\u2019 \uadf8 \ud589\uc704\ub97c \uc218\ud589\ud560 \uac83\uc778\uc9c0 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.\n\uc5ec\uae30\uc11c \u2018\uc5b4\ub5a4 \ud589\uc704\u2019\uac00 \ubc14\ub85c \uba54\uc2dc\uc9c0\ub2e4.\np.158")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f14eea08.87f77a96.js b/assets/js/f14eea08.87f77a96.js new file mode 100644 index 000000000..367c16913 --- /dev/null +++ b/assets/js/f14eea08.87f77a96.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9607],{3905:(t,e,a)=>{a.d(e,{Zo:()=>i,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function o(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?l(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function c(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},l=Object.keys(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),d=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},i=function(t){var e=d(t.components);return n.createElement(p.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,p=t.parentName,i=c(t,["components","mdxType","originalType","parentName"]),s=d(a),h=r,m=s["".concat(p,".").concat(h)]||s[h]||u[h]||l;return a?n.createElement(m,o(o({ref:e},i),{},{components:a})):n.createElement(m,o({ref:e},i))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,o=new Array(l);o[0]=s;var c={};for(var p in e)hasOwnProperty.call(e,p)&&(c[p]=e[p]);c.originalType=t,c.mdxType="string"==typeof t?t:r,o[1]=c;for(var d=2;d<l;d++)o[d]=a[d];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},20090:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const l={title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",slug:41,tags:["cloudwatch","log","monitoring"]},o=void 0,c={permalink:"/41",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md",source:"@site/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md",title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",description:"CloudWatch",date:"2023-08-17T00:00:00.000Z",formattedDate:"2023\ub144 8\uc6d4 17\uc77c",tags:[{label:"cloudwatch",permalink:"/tags/cloudwatch"},{label:"log",permalink:"/tags/log"},{label:"monitoring",permalink:"/tags/monitoring"}],readingTime:5.185,hasTruncateMarker:!1,authors:[],frontMatter:{title:"CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",slug:"41",tags:["cloudwatch","log","monitoring"]},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac",permalink:"/40"}},p={authorsImageUrls:[]},d=[{value:"CloudWatch",id:"cloudwatch",level:2},{value:"CloudWatch Metrics",id:"cloudwatch-metrics",level:2},{value:"CloudWatch Agent \uc124\uce58",id:"cloudwatch-agent-\uc124\uce58",level:2},{value:"IAM \uc5ed\ud560 \uc124\uc815",id:"iam-\uc5ed\ud560-\uc124\uc815",level:3},{value:"\uc124\uce58",id:"\uc124\uce58",level:3},{value:"Wizard",id:"wizard",level:3},{value:"\uc124\uc815 \ud30c\uc77c \uc801\uc6a9",id:"\uc124\uc815-\ud30c\uc77c-\uc801\uc6a9",level:3},{value:"types.db: no such file or directory \uc5d0\ub7ec",id:"typesdb-no-such-file-or-directory-\uc5d0\ub7ec",level:3},{value:"\uc9c0\ud45c \ud655\uc778",id:"\uc9c0\ud45c-\ud655\uc778",level:3},{value:"\ub85c\uadf8",id:"\ub85c\uadf8",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:2}],i={toc:d};function u(t){let{components:e,...l}=t;return(0,r.kt)("wrapper",(0,n.Z)({},i,l,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"cloudwatch"},"CloudWatch"),(0,r.kt)("p",null,"AWS \ub9ac\uc18c\uc2a4\uc640 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc9c0\ud45c\uc640 \ub85c\uadf8\uc5d0 \ub300\ud55c \ubaa8\ub2c8\ud130\ub9c1\uc744 \uc81c\uacf5\ud558\ub294 \uc11c\ube44\uc2a4\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc9c0\ud45c\ub97c \uac10\uc2dc\ud558\uc5ec \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub294 \uae30\ub2a5\ub3c4 \uc81c\uacf5\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud504\ub9ac\ud2f0\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \ub300\uc2dc\ubcf4\ub4dc\ub2f9 3$/M \uc758 \ube44\uc6a9\uc774 \uccad\uad6c\ub418\uace0, \uc9c0\ud45c\ub098 \ub85c\uadf8\uc758 \uc591\uc5d0 \ub530\ub77c \ube44\uc6a9\uc774 \ucd94\uac00\uc801\uc73c\ub85c \uccad\uad6c\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc694\uae08 \uc815\ubcf4\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub294 ",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/cloudwatch/pricing/"},"\ub2e4\uc74c \ub9c1\ud06c"),"\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h2",{id:"cloudwatch-metrics"},"CloudWatch Metrics"),(0,r.kt)("p",null,"\uae30\ubcf8\uc801\uc73c\ub85c 5\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc218\uc9d1\ub41c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc138\ubd80 \ubaa8\ub2c8\ud130\ub9c1(Detailed Monitoring)\uc744 \ud65c\uc131\ud654\ud558\uba74 1\ubd84\ub9c8\ub2e4 \uc9c0\ud45c\ub97c \uc218\uc9d1\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub300\uc2dc\ubcf4\ub4dc\uc5d0\uc11c InstanceId\ub85c \uac80\uc0c9\ud558\uc5ec \uc218\uc9d1\ub41c \uc9c0\ud45c\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch1.png",src:a(7138).Z,width:"3214",height:"1636"})),(0,r.kt)("p",null,"CPUUtilization, NetworkIn, NetworkOut\uacfc \uac19\uc740 \uae30\ubcf8\uc801\uc778 \uc9c0\ud45c\ub97c \uc81c\uacf5\ud558\uace0, \uba54\ubaa8\ub9ac, \ub514\uc2a4\ud06c \uacf5\uac04\uacfc \uac19\uc740 \uc9c0\ud45c\ub97c \ud655\uc778\ud558\ub824\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\ub97c \uc124\uc815\ud574\uc57c \ud55c\ub2e4."),(0,r.kt)("h2",{id:"cloudwatch-agent-\uc124\uce58"},"CloudWatch Agent \uc124\uce58"),(0,r.kt)("p",null,"CloudWatch Agent \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\uc640 \ub85c\uadf8\ub97c \uc218\uc9d1\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"iam-\uc5ed\ud560-\uc124\uc815"},"IAM \uc5ed\ud560 \uc124\uc815"),(0,r.kt)("p",null,"\uae30\ubcf8\uc801\uc73c\ub85c EC2 \uc778\uc2a4\ud134\uc2a4\uac00 CloudWatchAgentServerPolicy\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","IAM \u2192 \uc5ed\ud560\uc5d0\uc11c \uc5ed\ud560 \uc0dd\uc131\uc744 \ud074\ub9ad\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch2.png",src:a(22427).Z,width:"2614",height:"1602"})),(0,r.kt)("p",null,"CloudWatchAgentServerPolicy \uad8c\ud55c \uc815\ucc45\uc744 \uc120\ud0dd\ud558\uace0, \uc801\ub2f9\ud55c \uc5ed\ud560 \uc774\ub984\uc744 \uc785\ub825\ud574\uc11c \uc5ed\ud560\uc744 \uc0dd\uc131\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch3.png",src:a(60912).Z,width:"2650",height:"1616"})),(0,r.kt)("p",null,"EC2 \uc778\uc2a4\ud134\uc2a4 \ubaa9\ub85d\uc73c\ub85c \ub4e4\uc5b4\uac00\uc11c, CloudWatch Agent\ub97c \uc124\uce58\ud560 EC2 \uc778\uc2a4\ud134\uc2a4\ub97c \ud074\ub9ad\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc791\uc5c5 \u2192 \ubcf4\uc548 \u2192 IAM \uc5ed\ud560 \uc218\uc815\uc5d0\uc11c \uc774\uc804\uc5d0 \uc0dd\uc131\ud55c \uc5ed\ud560\uc744 \uc9c0\uc815\ud55c\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch4.png",src:a(80939).Z,width:"1764",height:"800"})),(0,r.kt)("h3",{id:"\uc124\uce58"},"\uc124\uce58"),(0,r.kt)("p",null,"\ud658\uacbd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. "),(0,r.kt)("p",null,"OS: ubuntu 22.04",(0,r.kt)("br",{parentName:"p"}),"\n","\uc778\uc2a4\ud134\uc2a4 \uc720\ud615: t4g.small (ARM64) "),(0,r.kt)("p",null,"\uc544\ub798 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uce58\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb\nsudo dpkg -i -E ./amazon-cloudwatch-agent.deb\n")),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html"},"\uc0ac\uc6a9 \uc124\uba85\uc11c"),"\uc5d0 \uac01 \uc778\uc2a4\ud134\uc2a4 \uc720\ud615\ub9c8\ub2e4 \ub2e4\uc6b4\ub85c\ub4dc \ub9c1\ud06c\uac00 \uc790\uc138\ud558\uac8c \uc548\ub0b4\ub418\uc5b4 \uc788\ub2e4."),(0,r.kt)("h3",{id:"wizard"},"Wizard"),(0,r.kt)("p",null,"CloudWatch Wizard\ub97c \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c \uc124\uc815 \ud30c\uc77c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8\ub97c \uc218\uc9d1\ud558\ub3c4\ub85d \uc124\uc815\ud558\ub294 \uacbd\uc6b0 Wizard \uc2e4\ud589 \uba85\ub839\uc5b4 \uc785\ub825 \uc804 log \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \ubcf5\uc0ac\ud574\ub450\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec Wizard\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard\n")),(0,r.kt)("p",null,"\uc124\uc815\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74 \uc124\uc815 \ud30c\uc77c\uc774 \uc5b4\ub5bb\uac8c \uad6c\uc131\ub420\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ub85c\uadf8\ub97c \ucd94\uac00\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \uc785\ub825\ucc3d\uc774 \ub098\uc624\uba74 \uc900\ube44\ud574\ub480\ub358 \ub85c\uadf8 \ud30c\uc77c\uc758 \uc808\ub300 \uacbd\ub85c\ub97c \uc785\ub825\ud55c\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch5.png",src:a(71028).Z,width:"2320",height:"1328"})),(0,r.kt)("p",null,"\uc911\uac04\uc5d0 SSM parameter store\uc5d0 \uc124\uc815 \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \uac83\uc774\ub0d0\uace0 \ubb3c\uc5b4\ubcf4\ub294 \ucc3d\uc774 \ub098\uc628\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"Do you want to store the config in the SSM parameter store?\n1. yes\n2. no\n")),(0,r.kt)("p",null,"\ucd94\uac00\uc801\uc73c\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 2\ubc88\uc744 \uc120\ud0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","Parameter Store \uad00\ub9ac\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uc758 ",(0,r.kt)("a",{parentName:"p",href:"https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/"},"\ubb38\uc11c"),"\ub97c \ucc38\uace0\ud558\uba74 \uc88b\uc744 \uac70 \uac19\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815\uc774 \uc644\ub8cc\ub418\uba74 ",(0,r.kt)("inlineCode",{parentName:"p"},"/opt/aws/amazon-cloudwatch-agent/bin/config.json")," \uc5d0 \uc124\uc815\uc5d0 \ub300\ud55c \ub0b4\uc6a9\uc774 \uc800\uc7a5\ub41c\ub2e4. "),(0,r.kt)("h3",{id:"\uc124\uc815-\ud30c\uc77c-\uc801\uc6a9"},"\uc124\uc815 \ud30c\uc77c \uc801\uc6a9"),(0,r.kt)("p",null,"\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub97c \uc785\ub825\ud558\uc5ec \uc124\uc815\ud30c\uc77c\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","file \ub4a4\uc5d0\ub294 \uc124\uc815 \ud30c\uc77c\uc5d0 \ub300\ud55c \uc808\ub300\uacbd\ub85c(\uc544\ub798 \uba85\ub839\uc5b4 \uae30\uc900 \uae30\ubcf8 \uc0dd\uc131 \uc704\uce58)\ub97c \uc785\ub825\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json\n")),(0,r.kt)("h3",{id:"typesdb-no-such-file-or-directory-\uc5d0\ub7ec"},"types.db: no such file or directory \uc5d0\ub7ec"),(0,r.kt)("p",null,"\ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 types.db \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc11c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory\n")),(0,r.kt)("p",null,"types.db \ud30c\uc77c \uc0dd\uc131"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo mkdir /usr/share/collectd\nsudo touch /usr/share/collectd/types.db\n")),(0,r.kt)("h3",{id:"\uc9c0\ud45c-\ud655\uc778"},"\uc9c0\ud45c \ud655\uc778"),(0,r.kt)("p",null,"CloudWatch Metrics\uc5d0 \uac00\ubcf4\uba74 CWAgent\ub77c\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\uac00 \ucd94\uac00\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\uc124\uc815 \ud30c\uc77c\uc5d0 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \ucd94\uac00\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4. "),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch6.png",src:a(15055).Z,width:"2638",height:"708"})),(0,r.kt)("h3",{id:"\ub85c\uadf8"},"\ub85c\uadf8"),(0,r.kt)("p",null,"CloudWatch \u2192 \ub85c\uadf8 \uadf8\ub8f9\uc73c\ub85c \uac00\uba74 Wizard\ub85c \ucd94\uac00\ud55c \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"./cloudwatch7.png",src:a(30720).Z,width:"2792",height:"1652"})),(0,r.kt)("h2",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html"},"CloudWatch\ub780 \ubb34\uc5c7\uc785\ub2c8\uae4c?"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://aws.amazon.com/ko/cloudwatch/pricing/"},"Amazon CloudWatch \uc694\uae08"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html"},"Linux \uc778\uc2a4\ud134\uc2a4 \uc9c0\ud45c"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html"},"\uc11c\ubc84\uc5d0 CloudWatch \uc5d0\uc774\uc804\ud2b8 \uc124\uce58 \ubc0f \uc2e4\ud589"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://dev.classmethod.jp/articles/manage-the-cloudwatch-agent-from-the-parameter-store/"},"CloudWatch Agent\ub97c Parameter Store\uc5d0\uc11c \uad00\ub9ac\ud574 \ubcf4\uae30")))}u.isMDXComponent=!0},7138:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch1-859296155df6c20d0846f1388022a86c.png"},22427:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch2-ca9c26868dec08ea7133e2774f49798a.png"},60912:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch3-da10422b87e1901286b6d3e85e2c01cc.png"},80939:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch4-1e7eddc7e8dd890ac18352e900df8e07.png"},71028:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch5-67d1bd59d4552f4fe481452eddc78a5e.png"},15055:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch6-06ead809f7510938baee41505bc72b97.png"},30720:(t,e,a)=>{a.d(e,{Z:()=>n});const n=a.p+"assets/images/cloudwatch7-a86dfc0db307ddf7d1660d2b9e419c96.png"}}]); \ No newline at end of file diff --git a/assets/js/f156dfb9.5680e4f0.js b/assets/js/f156dfb9.5680e4f0.js new file mode 100644 index 000000000..2d43704ec --- /dev/null +++ b/assets/js/f156dfb9.5680e4f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5602],{83311:e=>{e.exports=JSON.parse('{"label":"Time","permalink":"/tags/time","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/f156dfb9.fd070313.js b/assets/js/f156dfb9.fd070313.js deleted file mode 100644 index faa6cb719..000000000 --- a/assets/js/f156dfb9.fd070313.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5602],{3311:e=>{e.exports=JSON.parse('{"label":"Time","permalink":"/tags/time","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/f1783c84.2149eb01.js b/assets/js/f1783c84.2149eb01.js deleted file mode 100644 index 99134f5b2..000000000 --- a/assets/js/f1783c84.2149eb01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7465],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>d});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),m=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=m(e.components);return r.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=m(a),d=n,f=s["".concat(p,".").concat(d)]||s[d]||u[d]||l;return a?r.createElement(f,o(o({ref:t},c),{},{components:a})):r.createElement(f,o({ref:t},c))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:n,o[1]=i;for(var m=2;m<l;m++)o[m]=a[m];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}s.displayName="MDXCreateElement"},8719:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var r=a(7462),n=(a(7294),a(3905));const l={title:"JSR-310",slug:4,tags:["Java","Time"]},o=void 0,i={permalink:"/4",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-08-JSR-310.mdx",source:"@site/blog/2023/2023-01-08-JSR-310.mdx",title:"JSR-310",description:"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",date:"2023-01-08T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 8\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Time",permalink:"/tags/time"}],readingTime:1.685,hasTruncateMarker:!1,authors:[],frontMatter:{title:"JSR-310",slug:"4",tags:["Java","Time"]},prevItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"},nextItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"}},p={authorsImageUrls:[]},m=[{value:"LocalDate, LocalTime, LocalDateTime",id:"localdate-localtime-localdatetime",level:3},{value:"Instant",id:"instant",level:3},{value:"Duration, Period",id:"duration-period",level:3},{value:"TemporalAdjusters",id:"temporaladjusters",level:3},{value:"DateTimeFormatter",id:"datetimeformatter",level:3},{value:"ZoneId, ZoneOffset",id:"zoneid-zoneoffset",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:m};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",(0,n.kt)("br",{parentName:"p"}),"\n","ISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131",(0,n.kt)("br",{parentName:"p"}),"\n","\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131"),(0,n.kt)("admonition",{title:"ISO-8601",type:"note"},(0,n.kt)("p",{parentName:"admonition"},"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900")),(0,n.kt)("h3",{id:"localdate-localtime-localdatetime"},"LocalDate, LocalTime, LocalDateTime"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"instant"},"Instant"),(0,n.kt)("p",null,"\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604"),(0,n.kt)("h3",{id:"duration-period"},"Duration, Period"),(0,n.kt)("p",null,"\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"temporaladjusters"},"TemporalAdjusters"),(0,n.kt)("p",null,"\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface TemporalAdjuster {\n Temporal adjustInto(Temporal temporal);\n}\n")),(0,n.kt)("h3",{id:"datetimeformatter"},"DateTimeFormatter"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5"),(0,n.kt)("h3",{id:"zoneid-zoneoffset"},"ZoneId, ZoneOffset"),(0,n.kt)("p",null,"ZoneId\ub294 \uc9c0\uc5ed ID\ub294 ",(0,n.kt)("inlineCode",{parentName:"p"},"\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019")," \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","ZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"Instant instant = Instant.now();\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\n")),(0,n.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001810171"},"\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://d2.naver.com/helloworld/645609"},"Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.w3.org/TR/NOTE-datetime"},"ISO-8601")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4"},"JSR-310 Spec")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.baeldung.com/java-temporal-adjuster"},"Temporal Adjuster")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html"},"DateTimeFormatter"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f1783c84.d136e81e.js b/assets/js/f1783c84.d136e81e.js new file mode 100644 index 000000000..a8245f487 --- /dev/null +++ b/assets/js/f1783c84.d136e81e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7465],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),m=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=m(e.components);return r.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=m(a),d=n,f=s["".concat(p,".").concat(d)]||s[d]||u[d]||l;return a?r.createElement(f,o(o({ref:t},c),{},{components:a})):r.createElement(f,o({ref:t},c))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:n,o[1]=i;for(var m=2;m<l;m++)o[m]=a[m];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}s.displayName="MDXCreateElement"},28719:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>m});var r=a(87462),n=(a(67294),a(3905));const l={title:"JSR-310",slug:4,tags:["Java","Time"]},o=void 0,i={permalink:"/4",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-01-08-JSR-310.mdx",source:"@site/blog/2023/2023-01-08-JSR-310.mdx",title:"JSR-310",description:"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",date:"2023-01-08T00:00:00.000Z",formattedDate:"2023\ub144 1\uc6d4 8\uc77c",tags:[{label:"Java",permalink:"/tags/java"},{label:"Time",permalink:"/tags/time"}],readingTime:1.685,hasTruncateMarker:!1,authors:[],frontMatter:{title:"JSR-310",slug:"4",tags:["Java","Time"]},prevItem:{title:"Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95",permalink:"/5"},nextItem:{title:"[\ucc45] \uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574",permalink:"/3"}},p={authorsImageUrls:[]},m=[{value:"LocalDate, LocalTime, LocalDateTime",id:"localdate-localtime-localdatetime",level:3},{value:"Instant",id:"instant",level:3},{value:"Duration, Period",id:"duration-period",level:3},{value:"TemporalAdjusters",id:"temporaladjusters",level:3},{value:"DateTimeFormatter",id:"datetimeformatter",level:3},{value:"ZoneId, ZoneOffset",id:"zoneid-zoneoffset",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],c={toc:m};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"\uc774\uc804\uc5d0 \ub9ce\uc740 \ubb38\uc81c\uac00 \uc788\ub358 \uc790\ubc14\uc758 \ud074\ub798\uc2a4(Calendar, Date)\ub97c \ub300\uccb4\ud558\ub294 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API",(0,n.kt)("br",{parentName:"p"}),"\n","ISO-8601\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131",(0,n.kt)("br",{parentName:"p"}),"\n","\uc124\uacc4 \ubaa9\ud45c \u2192 \ubd88\ubcc0, Fluent API, \uba85\ud655\ud558\uace0 \uba85\uc2dc\uc801, \ud655\uc7a5 \uac00\ub2a5\uc131"),(0,n.kt)("admonition",{title:"ISO-8601",type:"note"},(0,n.kt)("p",{parentName:"admonition"},"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc5d0 \uad00\ub828\ub41c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uad6d\uc81c \ud45c\uc900")),(0,n.kt)("h3",{id:"localdate-localtime-localdatetime"},"LocalDate, LocalTime, LocalDateTime"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"instant"},"Instant"),(0,n.kt)("p",null,"\uc720\ub2c9\uc2a4 \uc2dc\uac04(1970-01-01, 00:00:00 UTC) \uae30\uc900\uc73c\ub85c \ud2b9\uc815 \uc9c0\uc810\uae4c\uc9c0\uc758 \uc2dc\uac04\uc744 \ucd08\ub85c \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\uae30\uacc4\uc758 \uad00\uc810\uc5d0\uc11c \uc2dc\uac04 \ud45c\ud604"),(0,n.kt)("h3",{id:"duration-period"},"Duration, Period"),(0,n.kt)("p",null,"\uac04\uaca9\uc744 \ud45c\ud604\ud558\ub294 \ud074\ub798\uc2a4"),(0,n.kt)("h3",{id:"temporaladjusters"},"TemporalAdjusters"),(0,n.kt)("p",null,"\ubcf5\uc7a1\ud55c \ub0a0\uc9dc \uc870\uc815\uc774 \ud544\uc694\ud560 \ub54c \uc0ac\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \ucee4\uc2a4\ud140 TemporalAdjuster\ub97c \uad6c\ud604 \uac00\ub2a5"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"@FunctionalInterface\npublic interface TemporalAdjuster {\n Temporal adjustInto(Temporal temporal);\n}\n")),(0,n.kt)("h3",{id:"datetimeformatter"},"DateTimeFormatter"),(0,n.kt)("p",null,"\ub0a0\uc9dc\uc640 \uc2dc\uac04 \ud3ec\ub9f7 \ud074\ub798\uc2a4",(0,n.kt)("br",{parentName:"p"}),"\n","\ud2b9\uc815 \ub0a0\uc9dc \ud328\ud134\uc774\ub098, DateTimeFormatterBuilder\ub97c \uc774\uc6a9\ud574\uc11c \ucee4\uc2a4\ud140\ud55c \ud3ec\ub9f7\uc744 \uc0dd\uc131 \uac00\ub2a5"),(0,n.kt)("h3",{id:"zoneid-zoneoffset"},"ZoneId, ZoneOffset"),(0,n.kt)("p",null,"ZoneId\ub294 \uc9c0\uc5ed ID\ub294 ",(0,n.kt)("inlineCode",{parentName:"p"},"\u2018\uc9c0\uc5ed/\ub3c4\uc2dc\u2019")," \ud615\uc2dd, ZoneOffset\uc740 \uc2dc\ucc28 UTC \uae30\uc900 \uace0\uc815\ub41c \uc2dc\uac04 \ucc28\uc774 \uc774\uc6a9",(0,n.kt)("br",{parentName:"p"}),"\n","ZoneId\uc758 \uacbd\uc6b0 IANA Time Zone Database\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc9c0\uc5ed \uc9d1\ud569 \uc815\ubcf4 \uc0ac\uc6a9"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-java"},"Instant instant = Instant.now();\nLocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);\n")),(0,n.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://product.kyobobook.co.kr/detail/S000001810171"},"\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://d2.naver.com/helloworld/645609"},"Java\uc758 \ub0a0\uc9dc\uc640 \uc2dc\uac04 API")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.w3.org/TR/NOTE-datetime"},"ISO-8601")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://download.oracle.com/otn-pub/jcp/date_time-0.2-edr-oth-JSpec/date_time-0_2-edr-spec.pdf?AuthParam=1673171124_74a718be92efe4911c6977c02965aff4"},"JSR-310 Spec")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.baeldung.com/java-temporal-adjuster"},"Temporal Adjuster")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html"},"DateTimeFormatter"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f20d36f2.5a75fd76.js b/assets/js/f20d36f2.5a75fd76.js new file mode 100644 index 000000000..a295cf2c2 --- /dev/null +++ b/assets/js/f20d36f2.5a75fd76.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7689],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c<p;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}s.displayName="MDXCreateElement"},48036:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const p={title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:8,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/8",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",description:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",date:"2023-02-14T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.56,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:"8",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"},nextItem:{title:"Parameterized Tests",permalink:"/7"}},i={authorsImageUrls:[]},c=[{value:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc"},"\uc790\ub3d9\ucc28 \uacbd\uc8fc"),(0,a.kt)("p",null,"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. "),(0,a.kt)("p",null,"\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. "),(0,a.kt)("p",null,"\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("mermaid",{value:"---\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\n---\ngraph TD\n Cars --\x3e Car\n Car --\x3e Name\n Car --\x3e Position\n RacingGame --\x3e Count\n RacingGame --\x3e NumberGenerator\n RacingGame --\x3e Cars\n RacingCarController --\x3e RacingGame\n RandomNumberGenerator -.-> NumberGenerator\n RacingCarController --\x3e InputView\n InputView --\x3e InputValidator\n RacingCarController --\x3e OutputView"}),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4."),(0,a.kt)("p",null,"\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,"\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Assertions extracting")),(0,a.kt)("p",null,"\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Test\nvoid extracting() {\n final Cars cars = new Cars(List.of("car1", "car2"));\n\n assertThat(cars.getCars())\n .extracting(Car::getName)\n .containsExactly("car1", "car2");\n}\n')),(0,a.kt)("hr",null),(0,a.kt)("p",null,"\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?)",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,"\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f20d36f2.ed110c7d.js b/assets/js/f20d36f2.ed110c7d.js deleted file mode 100644 index e480e4c79..000000000 --- a/assets/js/f20d36f2.ed110c7d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7689],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?p(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):p(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},p=Object.keys(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)r=p[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,p=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),s=c(r),k=a,b=s["".concat(i,".").concat(k)]||s[k]||m[k]||p;return r?n.createElement(b,l(l({ref:t},u),{},{components:r})):n.createElement(b,l({ref:t},u))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var p=r.length,l=new Array(p);l[0]=s;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var c=2;c<p;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}s.displayName="MDXCreateElement"},8036:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>o,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const p={title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:8,tags:["Woowahan Techcourse","Retrospective"]},l=void 0,o={permalink:"/8",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",description:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",date:"2023-02-14T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 14\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:7.56,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",slug:"8",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",permalink:"/9"},nextItem:{title:"Parameterized Tests",permalink:"/7"}},i={authorsImageUrls:[]},c=[{value:"\uc790\ub3d9\ucc28 \uacbd\uc8fc",id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],u={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc790\ub3d9\ucc28-\uacbd\uc8fc"},"\uc790\ub3d9\ucc28 \uacbd\uc8fc"),(0,a.kt)("p",null,"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158\uc5d0\uc11c\ub294 \ub2e4\uc990\uacfc \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\ud14c\ucf54 \ub4e4\uc5b4\uc640\uc11c \uccab \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub77c \ub9ce\uc774 \ub5a8\ub838\uc9c0\ub9cc, \ub2e4\uc990\uc774 \ub300\ud654\ub97c \uc798 \uc774\ub04c\uc5b4\uc918 \ub108\ubb34 \uc990\uac70\uc6e0\ub2e4. "),(0,a.kt)("p",null,"\uccab\ub0a0\uc740 \uac04\ub2e8\ud788 \ucee8\ubca4\uc158\uacfc \ud658\uacbd\uc744 \uc124\uc815\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc84c\uace0 \ub2e4\uc74c \ub0a0\ubd80\ud130 \uc790\ub3d9\ucc28 \uacbd\uc8fc\ub97c \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc2dc\uc791\uc740 \uac04\ub2e8\ud558\uac8c \uc694\uad6c\uc0ac\ud56d\uc744 \uc815\ub9ac\ud558\uace0, \uc5b4\ub5bb\uac8c \ucf54\ub4dc\ub97c \uc791\uc131\ud560\uc9c0 \uac19\uc774 \uace0\ubbfc\ud588\ub2e4. "),(0,a.kt)("p",null,"\uc2dc\uc791\ud558\uae30 \uc804 \uc544\ub798\uc640 \uac19\uc774 mermaid\ub97c \uc774\uc6a9\ud558\uc5ec \uc758\uc874\uc131 \ubc29\ud5a5\uc5d0 \ub300\ud574\uc11c \uac04\ub2e8\ud55c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc2dc\uc791\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mermaid\ub294 \ucf54\ub4dc\ub85c \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0dd\uc131 \ud574\uc8fc\ub294 \ub3c4\uad6c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ucf54\ub4dc \uae30\ubc18\uc774\ub77c \ube60\ub978 \uc2dc\uac04 \uc548\uc5d0 \uc0dd\uac01\ud55c \uac83\uc744 \uc2dc\uac01\ud654\ud560 \uc218 \uc788\ub2e4. "),(0,a.kt)("li",{parentName:"ul"},"github\uc5d0\uc11c mermaid\ub97c \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \ucf54\ub4dc\ub97c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ubd80\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.")),(0,a.kt)("mermaid",{value:"---\ntitle: \uc790\ub3d9\ucc28 \uacbd\uc8fc \uccab \ub9ac\ubdf0 \uc694\uccad\uc2dc \uad6c\uc870\n---\ngraph TD\n Cars --\x3e Car\n Car --\x3e Name\n Car --\x3e Position\n RacingGame --\x3e Count\n RacingGame --\x3e NumberGenerator\n RacingGame --\x3e Cars\n RacingCarController --\x3e RacingGame\n RandomNumberGenerator -.-> NumberGenerator\n RacingCarController --\x3e InputView\n InputView --\x3e InputValidator\n RacingCarController --\x3e OutputView"}),(0,a.kt)("p",null,"\ubbf8\uc158\uc744 \uc9c4\ud589\ud558\ub294 \ub370 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub294 \uc54a\uc558\uace0, \ud398\uc5b4\ub97c \ub9c8\uce58\uae30 \uc804 \uc11c\ub85c \uace0\ubbfc\ub418\ub294 \ubd80\ubd84\uc744 \uc815\ub9ac\ud588\uc744 \ub54c \uc88b\uc558\ub2e4."),(0,a.kt)("p",null,"\ud398\uc5b4\ud558\uba74\uc11c \uc798\ud588\ub2e4\uace0 \uc0dd\uac01\ud588\ub358 \uc810\uc740 \uc11c\ub85c\uc758 \uc0dd\uac01\uacfc \ub9ac\ubdf0 \ubc1b\uc740 \uac83\uc744 \uacf5\uc720\ud55c \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ud329\ud130\ub9c1\uc744 \uc5b4\ub5bb\uac8c \ud588\ub294\uc9c0? \uc774\ub7f0 \ub9ac\ubdf0\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0dd\uac01\ud558\ub294\uc9c0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c8 \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,"\ub9ac\ud329\ud130\ub9c1\uc774 \ub05d\ub09c \ud6c4 \uba54\uc11c\ub4dc\uba85, \ud14c\uc2a4\ud2b8\uc2dc \ucd9c\ub825\ud558\ub294 \uba54\uc2dc\uc9c0\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\uac00 \ub9ce\uc774 \ub2ec\ub838\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uac1d\uccb4\uac00 \uc5b4\ub5a4 \ucc45\uc784\uacfc \uc5ed\ud560\uc744 \uac00\uc9c0\ub294\uc9c0 \uc0dd\uac01\ud558\ub294 \uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uba85\ud655\ud55c \uba54\uc11c\ub4dc\uba85\uc744 \uc791\uc131\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4. "),(0,a.kt)("p",null,"\ud3c9\uc18c\uc5d0 \ud504\ub85c\uadf8\ub798\ubc0d \uc774\uc57c\uae30\uac00 \uc544\ub2cc \ub2e4\ub978 \uc8fc\uc81c\ub85c \uc774\uc57c\uae30\ud558\uba74 \uc798 \ub4e4\uc73c\ub824\uace0 \ud558\ub294 \ud3b8\uc774\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\ub0b4\uac00 \uc88b\uc544\ud558\ub294 \uc8fc\uc81c, \uad00\uc2ec\uac00\ub294 \uc8fc\uc81c\uc778 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \uc774\uc57c\uae30\ub97c \ud560 \ub550 \ub9d0\uc774 \ub9ce\uc544\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\ubd80\ud130\ub294 \ub354 \ub9ce\uc740 \uc2dc\uac04\uc744 \ud398\uc5b4\uc758 \uc758\uacac\uacfc \uc774\uc57c\uae30\ub97c \ub4e3\ub294 \uacf3\uc5d0 \uc0ac\uc6a9\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Assertions extracting")),(0,a.kt)("p",null,"\uacb0\uacfc \ub0b4\ubd80\uc5d0 \uc788\ub294 \uac12\uc744 \ud655\uc778\ud558\uace0 \uc2f6\uc744 \ub54c extracting \ud0a4\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub0b4\ubd80\uc758 \uac12\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c stream\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc99d\ud560 \uac12\uc744 \uc0dd\uc131\ud588\uc9c0\ub9cc, \ud574\ub2f9 \ubc29\ubc95\uc744 \uc774\uc6a9\ud574\uc11c \uc808\ucc28\ub97c \uc904\uc77c \uc218 \uc788\uc5c8\ub2e4."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},'@Test\nvoid extracting() {\n final Cars cars = new Cars(List.of("car1", "car2"));\n\n assertThat(cars.getCars())\n .extracting(Car::getName)\n .containsExactly("car1", "car2");\n}\n')),(0,a.kt)("hr",null),(0,a.kt)("p",null,"\uc544\ub798\ub294 \ub9ac\ubdf0\uc5b4\ub2d8\uacfc \ub300\ud654\ub97c \ub098\ub204\uba74\uc11c \uc5bb\uc740 \ub2f5\ubcc0 + \ub098\uc758 \uc758\uacac\uc774\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc81c\uc5b4\ud560 \uc218 \uc5c6\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \ub300\uc0c1\uc774 \uac80\uc99d\ub41c \uac83\uc774\ub77c\uba74 \uc791\uc131\ud558\uc9c0 \uc54a\uac70\ub098, \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ubd80\ubd84\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub354\uc6b1 \uaf3c\uaf3c\ud558\uac8c \uc791\uc131\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \uac1c\uc778\uc801\uc778 \uc0dd\uac01\uc774\uc9c0\ub9cc \ub0b4\uac00 \uc548\uc815\uac10\uc774 \ub4e4 \uc218 \uc788\uc744 \uc815\ub3c4\ub85c \ucd9c\ub825 \ubc94\uc704 \ub0b4\uc758 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294\uc9c0 \uc815\ub3c4 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uae4c?"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ub2e8\uc21c \uc704\uc784\uc744 \ud558\ub294 \uba54\uc11c\ub4dc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8")),(0,a.kt)("p",null,"\uc704\uc784\uc774\ub77c\ub294 \uac83\uc740 \uc5ed\ud560\uacfc \ucc45\uc784\uc744 \ub118\uaca8\uc900\ub2e4\ub294 \uac83\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc99d\ud558\ub294 \uac83\ubcf4\ub2e4 \uacb0\uacfc\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e8\uc21c\ud788 \uc704\uc784\ub9cc \ud558\ub294 \ud14c\uc2a4\ud2b8\uc758 \uacbd\uc6b0 \uacb0\uacfc\ub97c \uac80\uc99d\ud55c\ub2e4\uba74 \ud14c\uc2a4\ud2b8\uac00 \uc911\ubcf5\ub418\uc9c0 \uc54a\uc744\uae4c \uc0dd\uac01\ud588\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c \uc911\ubcf5\ub41c \ud14c\uc2a4\ud2b8\ub97c \uc904\uc774\uae30 \uc704\ud574 \ub0b4\ubd80\uc758 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294\uc9c0 \uac80\uc99d\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\uc9c0\ub9cc",(0,a.kt)("br",{parentName:"p"}),"\n","\uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \ud14c\uc2a4\ud2b8 \ud558\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc778 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c getter \uc0ac\uc6a9")),(0,a.kt)("p",null,"\ud14c\uc2a4\ud2b8 \uc6a9\ub3c4\ub85c \ub3c4\uba54\uc778\uc5d0 \uc0c8\ub85c\uc6b4 \uba54\uc11c\ub4dc\uac00 \uc0dd\uc131\ub418\ub294 \uac83\uc740 \uc88b\uc9c0 \ubabb\ud558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud544\uc694\uc758 \uacbd\uc6b0 \uc0dd\uc131\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uae30\uc874\uc5d0 \uc788\ub294 \uba54\uc11c\ub4dc\ub4e4\uc744 \ud65c\uc6a9\ud574\ubcf4\ub294 \uac83\uc774 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ub9e4\uc6b0 \ub3d9\uc758\ud558\uace0, \uc55e\uc73c\ub85c\ub3c4 \ucd5c\ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc\ub97c \ub3c4\uba54\uc778\uc5d0 \uc791\uc131\ud558\uc9c0 \uc54a\uc744 \uac83 \uac19\ub2e4."),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\uc9c8\ubb38\uc774\ub098 \uc0dd\uac01\ud560 \uc810\uc774 \uc788\uc744 \ub54c \ub9e4\uc6b0 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0dd\uac01\uc744 \uc815\ub9ac\ud55c \ud6c4 \uc790\uc2e0\uc758 \uc758\uacac\uc744 \uba85\ub8cc\ud558\uac8c \uc804\ub2ec\ud574\uc8fc\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc9c0\uc2dd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc2b5\ub4dd\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub09c \uc0dd\uac01\uc744 \uc798 \uc815\ub9ac\ud558\uc9c0 \uc54a\uc740 \ucc44\ub85c \ub0b4\ubc84\ub824 \ub454 \uc595\uc740 \uc9c0\uc2dd\uc774 \ub9ce\uc740 \uac83 \uac19\ub2e4. (\uc774\ub7f0 \uac83\ub3c4 \uc544\ub294 \uac83\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc744\uae4c?)",(0,a.kt)("br",{parentName:"p"}),"\n","\uc55e\uc73c\ub85c \uc870\uae08 \ub354 \uba38\ub9bf\uc18d\uc5d0\uc11c \uc815\ub9ac\ud558\uace0, \ubb38\uc81c\uc5d0 \ub300\ud574 \uae4a\uac8c \uace0\ubbfc\ud558\ub294 \uc2dc\uac04\uc744 \ub298\ub824\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,"\uac1c\ubc1c\uc5d0 \uc5f4\uc815\uc744 \uac00\uc9c4 \uac8c \ub290\uaef4\uc9c4\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac1c\ubc1c\uc744 \uc88b\uc544\ud558\uc9c0\ub9cc, \ucd5c\uadfc\uc5d0\ub294 \uc758\uc9c0\uac00 \uc57d\ud574\uc84c\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc5f4\uc815\uc774 \uac00\ub4dd\ud55c \uc0ac\ub78c\uc744 \ub9cc\ub098\ub2c8 \ub098\ub3c4 \uc5f4\uc815\uc801\uc778 \uc0ac\ub78c\uc774 \ub418\ub294 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uce6d\ucc2c\uc744 \ub9ce\uc774 \ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ub9ce\uc774 \ud574\uc8fc\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc9c4\uc2ec\uc744 \ub2f4\uae34 \uce6d\ucc2c\uc744 \ud574\uc92c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uce6d\ucc2c\uc740 \uace0\ub798\ub3c4 \ucda4\ucd94\uac8c \ud558\ub358\uac00?",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub798\uc11c \uc990\uac70\uc6b4 \ub9c8\uc74c\uc73c\ub85c \ud398\uc5b4 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud588\uc5c8\ub358 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"\uc5b4\ub5a4 \uc774\uc720 \ub54c\ubb38\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \uac19\uc774 \ud398\uc5b4\ud558\ub294\ub370 \ud3b8\ud55c \ub9c8\uc74c\uc774 \ub4e4\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 \ubc14\ub85c \ubc30\uc6b8 \uc218 \uc5c6\uc9c0\ub9cc.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uac19\uc774 \uc77c\ud560 \ub54c \ud3b8\ud55c \uc0ac\ub78c, \uac19\uc774 \uc77c\ud558\uace0 \uc2f6\uc740 \uc0ac\ub78c\uc774 \ub418\uae30 \uc704\ud574 \uae4a\uc774 \uace0\ubbfc\ud574\ubd10\uc57c\uaca0\ub2e4."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2b7d1a9.b8614e66.js b/assets/js/f2b7d1a9.b8614e66.js deleted file mode 100644 index 05173a942..000000000 --- a/assets/js/f2b7d1a9.b8614e66.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2382],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>k});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},m=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),u=s(n),k=a,c=u["".concat(i,".").concat(k)]||u[k]||d[k]||l;return n?r.createElement(c,p(p({ref:t},m),{},{components:n})):r.createElement(c,p({ref:t},m))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,p=new Array(l);p[0]=u;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,p[1]=o;for(var s=2;s<l;s++)p[s]=n[s];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},6030:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const l={title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:9,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,o={permalink:"/9",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",description:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",date:"2023-02-26T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 26\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:10.22,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:"9",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"},nextItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"}},i={authorsImageUrls:[]},s=[{value:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30",level:3},{value:"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:s};function d(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30"},"\uc0ac\ub2e4\ub9ac \ud0c0\uae30"),(0,a.kt)("p",null,"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95")),(0,a.kt)("h3",{id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n\n LadderGame --\x3e Position\n Ladder --\x3e Position\n Items --\x3e Position\n Line --\x3e Position\n Players --\x3e Position\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item\n Players --\x3e Player\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n final Map<Player, Item> result = new LinkedHashMap<>();\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\n for (Position position : Position.range(players.count())) {\n final Position resultPosition = ladder.play(position);\n result.put(players.get(position), items.get(resultPosition));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"Position\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n Line --\x3e Position\n\n Players --\x3e Ladder\n Player --\x3e Ladder\n\n Item --\x3e Position\n Player --\x3e Position\n\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item --\x3e ItemName\n Players --\x3e Player --\x3e PlayerName\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n\n OutputView --\x3e LadderMessageGenerator"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\n final Map<Player, Position> playResult = players.play(ladder);\n\n final Map<Player, Item> result = new LinkedHashMap<>();\n for (Player player : playResult.keySet()) {\n result.put(player, toItem(playResult.get(player)));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","PR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","github pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)"),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784"),(0,a.kt)("br",{parentName:"p"}),"\n","Players\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. ")),(0,a.kt)("p",null,"\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","Position\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! "),(0,a.kt)("p",null,"\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!"),(0,a.kt)("p",null,"\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2b7d1a9.e6ee1f04.js b/assets/js/f2b7d1a9.e6ee1f04.js new file mode 100644 index 000000000..3942b0ede --- /dev/null +++ b/assets/js/f2b7d1a9.e6ee1f04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2382],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>k});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},m=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),u=s(n),k=a,c=u["".concat(i,".").concat(k)]||u[k]||d[k]||l;return n?r.createElement(c,p(p({ref:t},m),{},{components:n})):r.createElement(c,p({ref:t},m))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,p=new Array(l);p[0]=u;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,p[1]=o;for(var s=2;s<l;s++)p[s]=n[s];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},56030:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const l={title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:9,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,o={permalink:"/9",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",description:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",date:"2023-02-26T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 26\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:10.22,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:"9",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"},nextItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"}},i={authorsImageUrls:[]},s=[{value:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30",level:3},{value:"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:s};function d(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30"},"\uc0ac\ub2e4\ub9ac \ud0c0\uae30"),(0,a.kt)("p",null,"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95")),(0,a.kt)("h3",{id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n\n LadderGame --\x3e Position\n Ladder --\x3e Position\n Items --\x3e Position\n Line --\x3e Position\n Players --\x3e Position\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item\n Players --\x3e Player\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n final Map<Player, Item> result = new LinkedHashMap<>();\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\n for (Position position : Position.range(players.count())) {\n final Position resultPosition = ladder.play(position);\n result.put(players.get(position), items.get(resultPosition));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"Position\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n Line --\x3e Position\n\n Players --\x3e Ladder\n Player --\x3e Ladder\n\n Item --\x3e Position\n Player --\x3e Position\n\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item --\x3e ItemName\n Players --\x3e Player --\x3e PlayerName\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n\n OutputView --\x3e LadderMessageGenerator"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\n final Map<Player, Position> playResult = players.play(ladder);\n\n final Map<Player, Item> result = new LinkedHashMap<>();\n for (Player player : playResult.keySet()) {\n result.put(player, toItem(playResult.get(player)));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","PR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","github pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)"),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784"),(0,a.kt)("br",{parentName:"p"}),"\n","Players\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. ")),(0,a.kt)("p",null,"\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","Position\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! "),(0,a.kt)("p",null,"\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!"),(0,a.kt)("p",null,"\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f332d221.084f6ccb.js b/assets/js/f332d221.084f6ccb.js deleted file mode 100644 index e1d9d9534..000000000 --- a/assets/js/f332d221.084f6ccb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2717],{9371:e=>{e.exports=JSON.parse('{"permalink":"/page/10","page":10,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/9","nextPage":"/page/11","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f332d221.a1b5a06f.js b/assets/js/f332d221.a1b5a06f.js new file mode 100644 index 000000000..7ac72fb11 --- /dev/null +++ b/assets/js/f332d221.a1b5a06f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2717],{99371:e=>{e.exports=JSON.parse('{"permalink":"/page/10","page":10,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/9","nextPage":"/page/11","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f3e308ad.35ece12d.js b/assets/js/f3e308ad.35ece12d.js new file mode 100644 index 000000000..4a4ee3a3a --- /dev/null +++ b/assets/js/f3e308ad.35ece12d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6123],{16240:e=>{e.exports=JSON.parse('{"permalink":"/page/33","page":33,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/32","nextPage":"/page/34","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f3e308ad.bc5f4544.js b/assets/js/f3e308ad.bc5f4544.js deleted file mode 100644 index 3cba95d97..000000000 --- a/assets/js/f3e308ad.bc5f4544.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6123],{6240:e=>{e.exports=JSON.parse('{"permalink":"/page/33","page":33,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/32","nextPage":"/page/34","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f4c6e7e6.b08f8526.js b/assets/js/f4c6e7e6.b08f8526.js new file mode 100644 index 000000000..c093d64f6 --- /dev/null +++ b/assets/js/f4c6e7e6.b08f8526.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[31],{77922:e=>{e.exports=JSON.parse('{"label":"book","permalink":"/docs/tags/book","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","title":"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30","description":"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac","permalink":"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30"}]}')}}]); \ No newline at end of file diff --git a/assets/js/f4c6e7e6.f66033e9.js b/assets/js/f4c6e7e6.f66033e9.js deleted file mode 100644 index ea38ca232..000000000 --- a/assets/js/f4c6e7e6.f66033e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[31],{7922:e=>{e.exports=JSON.parse('{"label":"book","permalink":"/docs/tags/book","allTagsPath":"/docs/tags","count":1,"items":[{"id":"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","title":"\uc0c1\uc790 \ubc16\uc73c\ub85c \ud0c8\ucd9c\ud558\uae30","description":"\u26a0\ufe0f \uc790\uae30\ubc30\ubc18\uc758 \uc6d0\ub9ac","permalink":"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30"}]}')}}]); \ No newline at end of file diff --git a/assets/js/f4f49e13.dbbd6b3d.js b/assets/js/f4f49e13.dbbd6b3d.js deleted file mode 100644 index 1bb3689d8..000000000 --- a/assets/js/f4f49e13.dbbd6b3d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6887],{6329:e=>{e.exports=JSON.parse('{"permalink":"/page/12","page":12,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/11","nextPage":"/page/13","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f4f49e13.ef1b692b.js b/assets/js/f4f49e13.ef1b692b.js new file mode 100644 index 000000000..fea28b59b --- /dev/null +++ b/assets/js/f4f49e13.ef1b692b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6887],{26329:e=>{e.exports=JSON.parse('{"permalink":"/page/12","page":12,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/11","nextPage":"/page/13","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f580a9d0.1c9d5285.js b/assets/js/f580a9d0.1c9d5285.js deleted file mode 100644 index 435f8ed27..000000000 --- a/assets/js/f580a9d0.1c9d5285.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9887],{8989:e=>{e.exports=JSON.parse('{"permalink":"/tags/python","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f580a9d0.ff66fa3d.js b/assets/js/f580a9d0.ff66fa3d.js new file mode 100644 index 000000000..1dcdbeec1 --- /dev/null +++ b/assets/js/f580a9d0.ff66fa3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9887],{78989:e=>{e.exports=JSON.parse('{"permalink":"/tags/python","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f619e31e.18ccdac9.js b/assets/js/f619e31e.18ccdac9.js new file mode 100644 index 000000000..7674f01a2 --- /dev/null +++ b/assets/js/f619e31e.18ccdac9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5888],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,m=c(e,["components","mdxType","originalType","parentName"]),u=p(r),k=a,d=u["".concat(l,".").concat(k)]||u[k]||s[k]||o;return r?n.createElement(d,i(i({ref:t},m),{},{components:r})):n.createElement(d,i({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},55069:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:37,tags:["Mockito","static"]},i=void 0,c={permalink:"/37",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",source:"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",description:"\uac1c\uc694",date:"2023-07-30T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 30\uc77c",tags:[{label:"Mockito",permalink:"/tags/mockito"},{label:"static",permalink:"/tags/static"}],readingTime:2.66,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:"37",tags:["Mockito","static"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"}},l={authorsImageUrls:[]},p=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"Mocking static methods",id:"mocking-static-methods",level:3},{value:"\ub9c8\uce58\uba70",id:"\ub9c8\uce58\uba70",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:p};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. "),(0,a.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public void upload(BufferedImage bufferedImage) {\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\n try {\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\n } catch (IOException e) {\n throw new DrawException(IMAGE_SAVE_FAIL);\n }\n}\n")),(0,a.kt)("h3",{id:"mocking-static-methods"},"Mocking static methods"),(0,a.kt)("p",null,"Mockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. "),(0,a.kt)("p",null,"JUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"// given\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\nRouteImageUploader routeImageUploader = new RouteImageUploader();\n\n// expect\ntry (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {\n routeImageUploader.upload(bufferedImage);\n imageIO.verify(\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\n times(1)\n );\n}\n")),(0,a.kt)("h3",{id:"\ub9c8\uce58\uba70"},"\ub9c8\uce58\uba70"),(0,a.kt)("p",null,"\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uae30 \ub54c\ubb38\uc5d0 \ucd5c\ub300\ud55c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks"},"Mocking static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/mockito-mock-static-methods"},"Mockito mock static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/mockito/mockito/issues/1013"},"Enable mocking static methods in Mockito")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f619e31e.40a5b40c.js b/assets/js/f619e31e.40a5b40c.js deleted file mode 100644 index 9b1ad7afc..000000000 --- a/assets/js/f619e31e.40a5b40c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5888],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,m=c(e,["components","mdxType","originalType","parentName"]),u=p(r),k=a,d=u["".concat(l,".").concat(k)]||u[k]||s[k]||o;return r?n.createElement(d,i(i({ref:t},m),{},{components:r})):n.createElement(d,i({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},5069:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:37,tags:["Mockito","static"]},i=void 0,c={permalink:"/37",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",source:"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",description:"\uac1c\uc694",date:"2023-07-30T00:00:00.000Z",formattedDate:"2023\ub144 7\uc6d4 30\uc77c",tags:[{label:"Mockito",permalink:"/tags/mockito"},{label:"static",permalink:"/tags/static"}],readingTime:2.66,hasTruncateMarker:!1,authors:[],frontMatter:{title:"Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30",slug:"37",tags:["Mockito","static"]},prevItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c",permalink:"/38"},nextItem:{title:"\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd",permalink:"/36"}},l={authorsImageUrls:[]},p=[{value:"\uac1c\uc694",id:"\uac1c\uc694",level:3},{value:"Mocking static methods",id:"mocking-static-methods",level:3},{value:"\ub9c8\uce58\uba70",id:"\ub9c8\uce58\uba70",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:p};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uac1c\uc694"},"\uac1c\uc694"),(0,a.kt)("p",null,"\uc815\uc801 \ud329\ud130\ub9ac \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud55c\ub2e4\ub294 \uac83\uc740 \uac1d\uccb4\uc9c0\ud5a5\uc801\uc778 \uad00\uc810\uc5d0\uc11c \ubcfc \ub54c \uc548\ud2f0\ud328\ud134\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ud2b9\uc218\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud55c\ub2e4. "),(0,a.kt)("p",null,"\uc608\ub97c \ub4e4\uc5b4 \ub808\uac70\uc2dc \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8 \ud55c\ub2e4\ub358\uc9c0, IO \uad00\ub828\ud55c \ubd80\ubd84\uc744 \ud14c\uc2a4\ud2b8 \ud560 \ub54c \uc815\ub9d0 \ud544\uc694\ud55c \ubd80\ubd84\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. "),(0,a.kt)("p",null,"\ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba70 ImageIo.write \uba54\uc11c\ub4dc\uac00 \ud638\ucd9c\ub418\ub294 \uc9c0 \uac80\uc99d\uc774 \ud544\uc694\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 static \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubd80\ubd84\uc744 \ub530\ub85c RouteImageUploader \ud074\ub798\uc2a4\ub85c \ucd5c\ub300\ud55c \ubd84\ub9ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubbf8\uc9c0 \uc800\uc7a5 \uae30\ub2a5 \uc790\uccb4\uac00 \uc678\ubd80\ub85c \ub098\uac00\ub294 \uc0c1\ud638\uc791\uc6a9\uc774\uace0, \ud638\ucd9c \ud69f\uc218\ub97c \uac80\uc0ac\ud558\ub294\ub370\ub294 mock\uc744 \uc0ac\uc6a9\ud558\ub294\uac8c \uc801\uc808\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public void upload(BufferedImage bufferedImage) {\n File file = new File(\ud30c\uc77c\uacbd\ub85c);\n try {\n ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);\n } catch (IOException e) {\n throw new DrawException(IMAGE_SAVE_FAIL);\n }\n}\n")),(0,a.kt)("h3",{id:"mocking-static-methods"},"Mocking static methods"),(0,a.kt)("p",null,"Mockito 3.4.0 \uc774\ud6c4\uc5d0\ub294 static method\ub97c \ubaa8\ud0b9\ud560 \uc218 \uc788\ub294 Mockito.mockStatic \uba54\uc11c\ub4dc\ub97c \uc9c0\uc6d0\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","mockStatic\uc744 \uc0ac\uc6a9\ud558\uba74 ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc774 \ubc18\ud658\ub418\ub294\ub370 \uc0ac\uc6a9 \ud6c4 \uaf2d close\ub97c \ud574\uc918\uc57c \ud55c\ub2e4. "),(0,a.kt)("p",null,"JUnit\uc758 @BeforeAll\ub85c \uc124\uc815\ud558\uace0 @AfterAll \uba54\uc11c\ub4dc\ub85c \uc885\ub8cc\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uc9c0\ub9cc ",(0,a.kt)("inlineCode",{parentName:"p"},"MockedStatic<T>"),"\uc758 \uc0c1\uc704 \uc778\ud130\ud398\uc774\uc2a4\uc778 ScopedMock\uc774 AutoCloseable\uc744 \uad6c\ud604\ud558\uace0 \uc788\uae30\uc5d0 try-with-resources\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \ub354\uc6b1 \uc88b\uc740 \uac83 \uac19\ub2e4. "),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"// given\nBufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);\nRouteImageUploader routeImageUploader = new RouteImageUploader();\n\n// expect\ntry (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {\n routeImageUploader.upload(bufferedImage);\n imageIO.verify(\n () -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),\n times(1)\n );\n}\n")),(0,a.kt)("h3",{id:"\ub9c8\uce58\uba70"},"\ub9c8\uce58\uba70"),(0,a.kt)("p",null,"\uc815\uc801 \uba54\uc11c\ub4dc\ub97c \ubaa8\ud0b9\ud558\ub294 \uac83\uc740 \uc548\ud2f0\ud328\ud134\uc774\uae30 \ub54c\ubb38\uc5d0 \ucd5c\ub300\ud55c \uc801\uc808\ud55c \ucd94\uc0c1\ud654\ub97c \uc774\uc6a9\ud574 \ud14c\uc2a4\ud2b8 \ud558\uae30 \uc88b\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uc5f0\uc2b5\uc744 \ud558\uc790.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud558\uc9c0\ub9cc \ucd94\uc0c1\ud654\ub97c \ud558\uba74 \ud560 \uc218\ub85d \ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\ub294 \uc99d\uac00\ud55c\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud56d\uc0c1 \uc0c1\ud669\uc744 \uace0\ub824\ud558\uace0 \uac04\uacb0\ud568\uc744 \ud3ec\uae30\ud560 \ub9cc\ud07c \uc911\uc694\ud55c \ubd80\ubd84\uc778\uc9c0 \uc801\uc808\ud55c \ud2b8\ub808\uc774\ub4dc\uc624\ud504\ub97c \uace0\ub824\ud558\uc790. "),(0,a.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#static_mocks"},"Mocking static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://www.baeldung.com/mockito-mock-static-methods"},"Mockito mock static methods"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/mockito/mockito/issues/1013"},"Enable mocking static methods in Mockito")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f63a747b.48a42935.js b/assets/js/f63a747b.48a42935.js deleted file mode 100644 index 9700d0247..000000000 --- a/assets/js/f63a747b.48a42935.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5131],{1723:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/f63a747b.526c749a.js b/assets/js/f63a747b.526c749a.js new file mode 100644 index 000000000..92fc79a62 --- /dev/null +++ b/assets/js/f63a747b.526c749a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5131],{81723:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/f75a8651.58849463.js b/assets/js/f75a8651.58849463.js deleted file mode 100644 index ef7387e79..000000000 --- a/assets/js/f75a8651.58849463.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8882],{4633:e=>{e.exports=JSON.parse('{"permalink":"/page/8","page":8,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/7","nextPage":"/page/9","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f75a8651.8526f68b.js b/assets/js/f75a8651.8526f68b.js new file mode 100644 index 000000000..0786f2cd7 --- /dev/null +++ b/assets/js/f75a8651.8526f68b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8882],{44633:e=>{e.exports=JSON.parse('{"permalink":"/page/8","page":8,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/7","nextPage":"/page/9","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/f8409a7e.d0d09c6d.js b/assets/js/f8409a7e.d0d09c6d.js deleted file mode 100644 index 2acc6d582..000000000 --- a/assets/js/f8409a7e.d0d09c6d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3206],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),f=p(r),d=o,m=f["".concat(l,".").concat(d)]||f[d]||s[d]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var p=2;p<i;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},9568:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>s,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const i={id:"intro",title:"\ubb38\uc11c",slug:"/"},a=void 0,c={unversionedId:"intro",id:"intro",title:"\ubb38\uc11c",description:"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac",source:"@site/docs/intro.mdx",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/intro.mdx",tags:[],version:"current",lastUpdatedAt:1692020366,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 14\uc77c",frontMatter:{id:"intro",title:"\ubb38\uc11c",slug:"/"},sidebar:"tutorialSidebar",previous:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",permalink:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5"},next:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",permalink:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30"}},l={},p=[],u={toc:p};function s(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f8409a7e.faea8bc7.js b/assets/js/f8409a7e.faea8bc7.js new file mode 100644 index 000000000..64e6624ce --- /dev/null +++ b/assets/js/f8409a7e.faea8bc7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3206],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),f=p(r),d=o,m=f["".concat(l,".").concat(d)]||f[d]||s[d]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var p=2;p<i;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},69568:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>s,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const i={id:"intro",title:"\ubb38\uc11c",slug:"/"},a=void 0,c={unversionedId:"intro",id:"intro",title:"\ubb38\uc11c",description:"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac",source:"@site/docs/intro.mdx",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/intro.mdx",tags:[],version:"current",lastUpdatedAt:1692279964,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 17\uc77c",frontMatter:{id:"intro",title:"\ubb38\uc11c",slug:"/"},sidebar:"tutorialSidebar",previous:{title:"\uc815\uc801 \ucee8\ud150\uce20 \uc81c\uacf5",permalink:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5"},next:{title:"\uac74\uac15\ud558\uac8c \ub098\uc544\uc9c0\uae30",permalink:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30"}},l={},p=[],u={toc:p};function s(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"\ub9c8\uc74c\uc5d0 \ub4e0 \ud0a4\uc6cc\ub4dc \uc815\ub9ac"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fbd57548.2041a289.js b/assets/js/fbd57548.2041a289.js new file mode 100644 index 000000000..50b948ab2 --- /dev/null +++ b/assets/js/fbd57548.2041a289.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6837],{30990:e=>{e.exports=JSON.parse('{"permalink":"/page/11","page":11,"postsPerPage":1,"totalPages":41,"totalCount":41,"previousPage":"/page/10","nextPage":"/page/12","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/fbd57548.f07ae534.js b/assets/js/fbd57548.f07ae534.js deleted file mode 100644 index 6a9629bc7..000000000 --- a/assets/js/fbd57548.f07ae534.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6837],{990:e=>{e.exports=JSON.parse('{"permalink":"/page/11","page":11,"postsPerPage":1,"totalPages":40,"totalCount":40,"previousPage":"/page/10","nextPage":"/page/12","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/fcb446a5.0568607d.js b/assets/js/fcb446a5.0568607d.js new file mode 100644 index 000000000..8d69acb08 --- /dev/null +++ b/assets/js/fcb446a5.0568607d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3440],{3905:(t,e,a)=>{a.d(e,{Zo:()=>m,kt:()=>c});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?l(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},l=Object.keys(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},m=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,m=i(t,["components","mdxType","originalType","parentName"]),k=u(a),c=r,s=k["".concat(o,".").concat(c)]||k[c]||d[c]||l;return a?n.createElement(s,p(p({ref:e},m),{},{components:a})):n.createElement(s,p({ref:e},m))}));function c(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,p=new Array(l);p[0]=k;var i={};for(var o in e)hasOwnProperty.call(e,o)&&(i[o]=e[o]);i.originalType=t,i.mdxType="string"==typeof t?t:r,p[1]=i;for(var u=2;u<l;u++)p[u]=a[u];return n.createElement.apply(null,p)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},84425:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>p,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const l={title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",last_update:{date:"2023/08/01",author:"\ud5c8\ube0c"}},p=void 0,i={unversionedId:"\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",id:"\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",description:"\uacc4\uc815 \ubcc4 \ud130\ubbf8\ub110 \uc124\uc815",source:"@site/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815.md",sourceDirName:"\ub9ac\ub205\uc2a4",slug:"/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815.md",tags:[],version:"current",lastUpdatedBy:"\ud5c8\ube0c",lastUpdatedAt:1690848e3,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 1\uc77c",frontMatter:{title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",last_update:{date:"2023/08/01",author:"\ud5c8\ube0c"}},sidebar:"tutorialSidebar",previous:{title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815"},next:{title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",permalink:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131"}},o={},u=[{value:"\uacc4\uc815 \ubcc4 \ud130\ubbf8\ub110 \uc124\uc815",id:"\uacc4\uc815-\ubcc4-\ud130\ubbf8\ub110-\uc124\uc815",level:3},{value:"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790",id:"\uc774\uc2a4\ucf00\uc774\ud504-\ubb38\uc790",level:3},{value:"\uc0c9\uc0c1 \uc124\uc815",id:"\uc0c9\uc0c1-\uc124\uc815",level:3},{value:"\uc0c9\uc0c1\ud45c",id:"\uc0c9\uc0c1\ud45c",level:3},{value:"~/.bashrc \ud30c\uc77c\uc5d0 \uc801\uc6a9",id:"bashrc-\ud30c\uc77c\uc5d0-\uc801\uc6a9",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:u};function d(t){let{components:e,...a}=t;return(0,r.kt)("wrapper",(0,n.Z)({},m,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uacc4\uc815-\ubcc4-\ud130\ubbf8\ub110-\uc124\uc815"},"\uacc4\uc815 \ubcc4 \ud130\ubbf8\ub110 \uc124\uc815"),(0,r.kt)("p",null,"PS1\uc740 \ub9ac\ub205\uc2a4 \uae30\ubc18 \uc6b4\uc601 \uccb4\uc81c\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 \uc258 \ud504\ub86c\ud504\ud2b8\ub97c \uc124\uc815\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ub418\ub294 \ud658\uacbd \ubcc0\uc218\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \ud658\uacbd \ubcc0\uc218\ub97c \ubcc0\uacbd\ud558\uba74 \uc0ac\uc6a9\uc790\uba85, \uc2dc\uac04 \uc815\ubcf4 \ub4f1 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uc6d0\ud558\ub294 \ub300\ub85c \uc124\uc815\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","~/.bashrc \ud30c\uc77c\uc5d0 PS1\uc5d0 \ub300\ud55c \uac12\uc744 \uc124\uc815\ud558\uc5ec \ub3d9\uc77c\ud55c \uacc4\uc815\uc73c\ub85c \uc7ac\uc811\uc18d\ud558\uc5ec\ub3c4 \uc124\uc815\uc744 \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"\uc774\uc2a4\ucf00\uc774\ud504-\ubb38\uc790"},"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790"),(0,r.kt)("p",null,"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc258 \ud504\ub86c\ud504\ud2b8\uc5d0 \uc11c\ubc84\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \ucd94\uac00\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790"),(0,r.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\u"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc0ac\uc6a9\uc790 \uc774\ub984")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\h"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud638\uc2a4\ud2b8 \uc774\ub984")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\w"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac (\uc804\uccb4 \uacbd\ub85c)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\W"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac (\ub514\ub809\ud1a0\ub9ac \uc774\ub984)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\d"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \ub0a0\uc9dc (YYYY-MM-DD)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\t"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc2dc\uac04 (HH:MM:SS)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\n"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc904 \ubc14\uafc8 \ubb38\uc790")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\$"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc77c\ubc18 \uc0ac\uc6a9\uc790 $ root\uc758 \uacbd\uc6b0 #")))),(0,r.kt)("h3",{id:"\uc0c9\uc0c1-\uc124\uc815"},"\uc0c9\uc0c1 \uc124\uc815"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"\\e[")," - \uc0c9\uc0c1 \ubcc0\uacbd\uc744 \uc2dc\uc791\ud558\uace0 \uc2f6\uc744 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"\uc0c9\uc0c1\ucf54\ub4dcm")," - \uc0c9\uc0c1\uc744 \uc120\ud0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"\\e[0m")," - \uc0c9\uc0c1 \ubcc0\uacbd\uc744 \uc885\ub8cc\ud558\uace0 \uc2f6\uc744 \ub54c \uc0ac\uc6a9\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'\ube68\uac04\uc0c9 hello world \u2192 "\\e[31mhello world!\\e[0m"\n')),(0,r.kt)("p",null,"echo -e \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc0c9\uc0c1\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc801\uc6a9\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'echo -e "\\e[31mhello world! \\e[0m"\n')),(0,r.kt)("h3",{id:"\uc0c9\uc0c1\ud45c"},"\uc0c9\uc0c1\ud45c"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uc0c9\uc0c1"),(0,r.kt)("th",{parentName:"tr",align:null},"\uae00\uc790\uc0c9"),(0,r.kt)("th",{parentName:"tr",align:null},"\ubc30\uacbd\uc0c9"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Black"),(0,r.kt)("td",{parentName:"tr",align:null},"30"),(0,r.kt)("td",{parentName:"tr",align:null},"40")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Red"),(0,r.kt)("td",{parentName:"tr",align:null},"31"),(0,r.kt)("td",{parentName:"tr",align:null},"41")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Green"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null},"42")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Yellow"),(0,r.kt)("td",{parentName:"tr",align:null},"33"),(0,r.kt)("td",{parentName:"tr",align:null},"43")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Blue"),(0,r.kt)("td",{parentName:"tr",align:null},"34"),(0,r.kt)("td",{parentName:"tr",align:null},"44")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Purple"),(0,r.kt)("td",{parentName:"tr",align:null},"35"),(0,r.kt)("td",{parentName:"tr",align:null},"45")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Cyan"),(0,r.kt)("td",{parentName:"tr",align:null},"36"),(0,r.kt)("td",{parentName:"tr",align:null},"46")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"White"),(0,r.kt)("td",{parentName:"tr",align:null},"37"),(0,r.kt)("td",{parentName:"tr",align:null},"47")))),(0,r.kt)("h3",{id:"bashrc-\ud30c\uc77c\uc5d0-\uc801\uc6a9"},"~/.bashrc \ud30c\uc77c\uc5d0 \uc801\uc6a9"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"sudo vim ~/.bashrc")," \uc744 \uc785\ub825\ud558\uc5ec \uc124\uc815 \ud30c\uc77c\uc744 \uc5f0 \ud6c4\uc5d0 \uc801\uc6a9\ud558\uace0 \uc2f6\uc740 \ubb38\uc790\ub97c PS1 \ud658\uacbd\ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="~/.bashrc"',title:'"~/.bashrc"'},'PS1="\\e[32m[\\t TRIPDRAW-DEV \\u]\\$ \\e[0m"\n')),(0,r.kt)("p",null,"\uc801\uc6a9\uc740 source \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"source ~/.bashrc\n")),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://linuxhint.com/bash-ps1-customization/"},"Linux Hint")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fcb446a5.8d1c9dd3.js b/assets/js/fcb446a5.8d1c9dd3.js deleted file mode 100644 index 4e4f5a673..000000000 --- a/assets/js/fcb446a5.8d1c9dd3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3440],{3905:(t,e,a)=>{a.d(e,{Zo:()=>m,kt:()=>c});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?l(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},l=Object.keys(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},m=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,m=i(t,["components","mdxType","originalType","parentName"]),k=u(a),c=r,s=k["".concat(o,".").concat(c)]||k[c]||d[c]||l;return a?n.createElement(s,p(p({ref:e},m),{},{components:a})):n.createElement(s,p({ref:e},m))}));function c(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,p=new Array(l);p[0]=k;var i={};for(var o in e)hasOwnProperty.call(e,o)&&(i[o]=e[o]);i.originalType=t,i.mdxType="string"==typeof t?t:r,p[1]=i;for(var u=2;u<l;u++)p[u]=a[u];return n.createElement.apply(null,p)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},4425:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>p,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var n=a(7462),r=(a(7294),a(3905));const l={title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",last_update:{date:"2023/08/01",author:"\ud5c8\ube0c"}},p=void 0,i={unversionedId:"\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",id:"\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",description:"\uacc4\uc815 \ubcc4 \ud130\ubbf8\ub110 \uc124\uc815",source:"@site/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815.md",sourceDirName:"\ub9ac\ub205\uc2a4",slug:"/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",draft:!1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815.md",tags:[],version:"current",lastUpdatedBy:"\ud5c8\ube0c",lastUpdatedAt:1690848e3,formattedLastUpdatedAt:"2023\ub144 8\uc6d4 1\uc77c",frontMatter:{title:"\ud130\ubbf8\ub110 \uc258 \ud504\ub86c\ud504\ud2b8 \uc124\uc815",last_update:{date:"2023/08/01",author:"\ud5c8\ube0c"}},sidebar:"tutorialSidebar",previous:{title:"Swap \uba54\ubaa8\ub9ac \uc124\uc815",permalink:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815"},next:{title:"\ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131",permalink:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131"}},o={},u=[{value:"\uacc4\uc815 \ubcc4 \ud130\ubbf8\ub110 \uc124\uc815",id:"\uacc4\uc815-\ubcc4-\ud130\ubbf8\ub110-\uc124\uc815",level:3},{value:"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790",id:"\uc774\uc2a4\ucf00\uc774\ud504-\ubb38\uc790",level:3},{value:"\uc0c9\uc0c1 \uc124\uc815",id:"\uc0c9\uc0c1-\uc124\uc815",level:3},{value:"\uc0c9\uc0c1\ud45c",id:"\uc0c9\uc0c1\ud45c",level:3},{value:"~/.bashrc \ud30c\uc77c\uc5d0 \uc801\uc6a9",id:"bashrc-\ud30c\uc77c\uc5d0-\uc801\uc6a9",level:3},{value:"\ucc38\uace0 \uc790\ub8cc",id:"\ucc38\uace0-\uc790\ub8cc",level:3}],m={toc:u};function d(t){let{components:e,...a}=t;return(0,r.kt)("wrapper",(0,n.Z)({},m,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"\uacc4\uc815-\ubcc4-\ud130\ubbf8\ub110-\uc124\uc815"},"\uacc4\uc815 \ubcc4 \ud130\ubbf8\ub110 \uc124\uc815"),(0,r.kt)("p",null,"PS1\uc740 \ub9ac\ub205\uc2a4 \uae30\ubc18 \uc6b4\uc601 \uccb4\uc81c\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 \uc258 \ud504\ub86c\ud504\ud2b8\ub97c \uc124\uc815\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ub418\ub294 \ud658\uacbd \ubcc0\uc218\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","\ud574\ub2f9 \ud658\uacbd \ubcc0\uc218\ub97c \ubcc0\uacbd\ud558\uba74 \uc0ac\uc6a9\uc790\uba85, \uc2dc\uac04 \uc815\ubcf4 \ub4f1 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uc6d0\ud558\ub294 \ub300\ub85c \uc124\uc815\ud560 \uc218 \uc788\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n","~/.bashrc \ud30c\uc77c\uc5d0 PS1\uc5d0 \ub300\ud55c \uac12\uc744 \uc124\uc815\ud558\uc5ec \ub3d9\uc77c\ud55c \uacc4\uc815\uc73c\ub85c \uc7ac\uc811\uc18d\ud558\uc5ec\ub3c4 \uc124\uc815\uc744 \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("h3",{id:"\uc774\uc2a4\ucf00\uc774\ud504-\ubb38\uc790"},"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790"),(0,r.kt)("p",null,"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc258 \ud504\ub86c\ud504\ud2b8\uc5d0 \uc11c\ubc84\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \ucd94\uac00\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uc774\uc2a4\ucf00\uc774\ud504 \ubb38\uc790"),(0,r.kt)("th",{parentName:"tr",align:null},"\uc124\uba85"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\u"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc0ac\uc6a9\uc790 \uc774\ub984")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\h"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud638\uc2a4\ud2b8 \uc774\ub984")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\w"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac (\uc804\uccb4 \uacbd\ub85c)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\W"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac (\ub514\ub809\ud1a0\ub9ac \uc774\ub984)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\d"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \ub0a0\uc9dc (YYYY-MM-DD)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\t"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud604\uc7ac \uc2dc\uac04 (HH:MM:SS)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\n"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc904 \ubc14\uafc8 \ubb38\uc790")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"\\$"),(0,r.kt)("td",{parentName:"tr",align:null},"\uc77c\ubc18 \uc0ac\uc6a9\uc790 $ root\uc758 \uacbd\uc6b0 #")))),(0,r.kt)("h3",{id:"\uc0c9\uc0c1-\uc124\uc815"},"\uc0c9\uc0c1 \uc124\uc815"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"\\e[")," - \uc0c9\uc0c1 \ubcc0\uacbd\uc744 \uc2dc\uc791\ud558\uace0 \uc2f6\uc744 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"\uc0c9\uc0c1\ucf54\ub4dcm")," - \uc0c9\uc0c1\uc744 \uc120\ud0dd\ud55c\ub2e4.",(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"\\e[0m")," - \uc0c9\uc0c1 \ubcc0\uacbd\uc744 \uc885\ub8cc\ud558\uace0 \uc2f6\uc744 \ub54c \uc0ac\uc6a9\ud55c\ub2e4."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'\ube68\uac04\uc0c9 hello world \u2192 "\\e[31mhello world!\\e[0m"\n')),(0,r.kt)("p",null,"echo -e \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc0c9\uc0c1\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc801\uc6a9\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'echo -e "\\e[31mhello world! \\e[0m"\n')),(0,r.kt)("h3",{id:"\uc0c9\uc0c1\ud45c"},"\uc0c9\uc0c1\ud45c"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"\uc0c9\uc0c1"),(0,r.kt)("th",{parentName:"tr",align:null},"\uae00\uc790\uc0c9"),(0,r.kt)("th",{parentName:"tr",align:null},"\ubc30\uacbd\uc0c9"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Black"),(0,r.kt)("td",{parentName:"tr",align:null},"30"),(0,r.kt)("td",{parentName:"tr",align:null},"40")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Red"),(0,r.kt)("td",{parentName:"tr",align:null},"31"),(0,r.kt)("td",{parentName:"tr",align:null},"41")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Green"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null},"42")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Yellow"),(0,r.kt)("td",{parentName:"tr",align:null},"33"),(0,r.kt)("td",{parentName:"tr",align:null},"43")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Blue"),(0,r.kt)("td",{parentName:"tr",align:null},"34"),(0,r.kt)("td",{parentName:"tr",align:null},"44")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Purple"),(0,r.kt)("td",{parentName:"tr",align:null},"35"),(0,r.kt)("td",{parentName:"tr",align:null},"45")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Cyan"),(0,r.kt)("td",{parentName:"tr",align:null},"36"),(0,r.kt)("td",{parentName:"tr",align:null},"46")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"White"),(0,r.kt)("td",{parentName:"tr",align:null},"37"),(0,r.kt)("td",{parentName:"tr",align:null},"47")))),(0,r.kt)("h3",{id:"bashrc-\ud30c\uc77c\uc5d0-\uc801\uc6a9"},"~/.bashrc \ud30c\uc77c\uc5d0 \uc801\uc6a9"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"sudo vim ~/.bashrc")," \uc744 \uc785\ub825\ud558\uc5ec \uc124\uc815 \ud30c\uc77c\uc744 \uc5f0 \ud6c4\uc5d0 \uc801\uc6a9\ud558\uace0 \uc2f6\uc740 \ubb38\uc790\ub97c PS1 \ud658\uacbd\ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uace0 \uc800\uc7a5\ud55c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="~/.bashrc"',title:'"~/.bashrc"'},'PS1="\\e[32m[\\t TRIPDRAW-DEV \\u]\\$ \\e[0m"\n')),(0,r.kt)("p",null,"\uc801\uc6a9\uc740 source \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4. "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"source ~/.bashrc\n")),(0,r.kt)("h3",{id:"\ucc38\uace0-\uc790\ub8cc"},"\ucc38\uace0 \uc790\ub8cc"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://linuxhint.com/bash-ps1-customization/"},"Linux Hint")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd5d2408.a13ff87c.js b/assets/js/fd5d2408.a13ff87c.js deleted file mode 100644 index 3e41e29fe..000000000 --- a/assets/js/fd5d2408.a13ff87c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3614],{4631:e=>{e.exports=JSON.parse('{"permalink":"/tags/time","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/fd5d2408.f64b5f70.js b/assets/js/fd5d2408.f64b5f70.js new file mode 100644 index 000000000..041d99195 --- /dev/null +++ b/assets/js/fd5d2408.f64b5f70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3614],{64631:e=>{e.exports=JSON.parse('{"permalink":"/tags/time","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/fd60e617.80f0ac19.js b/assets/js/fd60e617.80f0ac19.js new file mode 100644 index 000000000..2df20f44c --- /dev/null +++ b/assets/js/fd60e617.80f0ac19.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[16],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>k});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},m=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),u=s(n),k=a,c=u["".concat(i,".").concat(k)]||u[k]||d[k]||l;return n?r.createElement(c,p(p({ref:t},m),{},{components:n})):r.createElement(c,p({ref:t},m))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,p=new Array(l);p[0]=u;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,p[1]=o;for(var s=2;s<l;s++)p[s]=n[s];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},80844:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const l={title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:9,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,o={permalink:"/9",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",description:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",date:"2023-02-26T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 26\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:10.22,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:"9",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"},nextItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"}},i={authorsImageUrls:[]},s=[{value:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30",level:3},{value:"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:s};function d(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30"},"\uc0ac\ub2e4\ub9ac \ud0c0\uae30"),(0,a.kt)("p",null,"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95")),(0,a.kt)("h3",{id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n\n LadderGame --\x3e Position\n Ladder --\x3e Position\n Items --\x3e Position\n Line --\x3e Position\n Players --\x3e Position\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item\n Players --\x3e Player\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n final Map<Player, Item> result = new LinkedHashMap<>();\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\n for (Position position : Position.range(players.count())) {\n final Position resultPosition = ladder.play(position);\n result.put(players.get(position), items.get(resultPosition));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"Position\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n Line --\x3e Position\n\n Players --\x3e Ladder\n Player --\x3e Ladder\n\n Item --\x3e Position\n Player --\x3e Position\n\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item --\x3e ItemName\n Players --\x3e Player --\x3e PlayerName\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n\n OutputView --\x3e LadderMessageGenerator"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\n final Map<Player, Position> playResult = players.play(ladder);\n\n final Map<Player, Item> result = new LinkedHashMap<>();\n for (Player player : playResult.keySet()) {\n result.put(player, toItem(playResult.get(player)));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","PR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","github pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)"),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784"),(0,a.kt)("br",{parentName:"p"}),"\n","Players\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. ")),(0,a.kt)("p",null,"\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","Position\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! "),(0,a.kt)("p",null,"\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!"),(0,a.kt)("p",null,"\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd60e617.c3b64779.js b/assets/js/fd60e617.c3b64779.js deleted file mode 100644 index 3fe80dace..000000000 --- a/assets/js/fd60e617.c3b64779.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[16],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>k});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},m=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),u=s(n),k=a,c=u["".concat(i,".").concat(k)]||u[k]||d[k]||l;return n?r.createElement(c,p(p({ref:t},m),{},{components:n})):r.createElement(c,p({ref:t},m))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,p=new Array(l);p[0]=u;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:a,p[1]=o;for(var s=2;s<l;s++)p[s]=n[s];return r.createElement.apply(null,p)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},844:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>p,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const l={title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:9,tags:["Woowahan Techcourse","Retrospective"]},p=void 0,o={permalink:"/9",editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",source:"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",description:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",date:"2023-02-26T00:00:00.000Z",formattedDate:"2023\ub144 2\uc6d4 26\uc77c",tags:[{label:"Woowahan Techcourse",permalink:"/tags/woowahan-techcourse"},{label:"Retrospective",permalink:"/tags/retrospective"}],readingTime:10.22,hasTruncateMarker:!1,authors:[],frontMatter:{title:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0",slug:"9",tags:["Woowahan Techcourse","Retrospective"]},prevItem:{title:"\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0",permalink:"/10"},nextItem:{title:"\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0",permalink:"/8"}},i={authorsImageUrls:[]},s=[{value:"\uc0ac\ub2e4\ub9ac \ud0c0\uae30",id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30",level:3},{value:"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95",id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95",level:3},{value:"\ubd80\uc871\ud588\ub358 \ubd80\ubd84",id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84",level:3},{value:"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84",id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84",level:3},{value:"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84",id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84",level:3}],m={toc:s};function d(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"\uc0ac\ub2e4\ub9ac-\ud0c0\uae30"},"\uc0ac\ub2e4\ub9ac \ud0c0\uae30"),(0,a.kt)("p",null,"\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158\uc5d0\uc11c\ub294 \uc6b0\uac00\uc640 \ud398\uc5b4\uac00 \ub9e4\uce6d\ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub2ec\ub9ac TDD\ub85c \uc9c4\ud589\ud558\ub294 \uac83\uc774 \ud544\uc218\uc600\uae30 \ub54c\ubb38\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc6b0\uac00\uc640 \ubbf8\uc158\uc5d0 \uad00\ud55c \uc18c\ud1b5\uc774 \uc798 \ub418\uc5b4\uc11c \ud070 \ubb38\uc81c \uc5c6\uc774 \ubbf8\uc158\uc744 \ub9c8\ubb34\ub9ac\ud560 \uc218 \uc788\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc6b0\uac00\uc640 \uc774\uc57c\uae30\uac00 \uc798 \ud1b5\ud574\uc11c \uadf8\ub7f0\uc9c0 1\ub2e8\uacc4\ub294 \ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\ub294\ub370, 2\ub2e8\uacc4\uc5d0\uc11c \ub9ce\uc774 \uace0\uc804\ud55c \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,"2\ub2e8\uacc4\uc5d0\uc11c\ub294 2\uac00\uc9c0 \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\ud574\ubd24\ub2e4."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"LadderGame\uc5d0\uc11c Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},"Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c Ladder\uc5d0\uac8c Position\uc744 \ub118\uaca8\uc8fc\uba70 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\ubc95")),(0,a.kt)("h3",{id:"position-\uae30\uc900\uc73c\ub85c-\uc0ac\ub2e4\ub9ac-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Position \uae30\uc900\uc73c\ub85c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"\uc0ac\uc2e4\uc0c1 index\ub97c Ladder\uc5d0\uac8c \ub118\uaca8\uc8fc\uace0, \ud574\ub2f9 index\uc5d0 \ub300\ud55c \uacb0\uacfc\ub97c \ubc1b\ub294 \ubc29\ubc95\uacfc \uc720\uc0ac\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uad6c\ud604\ud558\uace0 \ub098\ub2c8 \ub2e4\ub978 \ud074\ub798\uc2a4\ub4e4\uc774 Position\uc5d0 \ub300\ud55c \uc758\uc874\ub3c4\uac00 \ub108\ubb34 \ub192\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c Players\uac00 \ubcc4\ub2e4\ub978 \ucc45\uc784\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0 \uc54a\ub2e4\uace0 \ub290\uaf08\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n\n LadderGame --\x3e Position\n Ladder --\x3e Position\n Items --\x3e Position\n Line --\x3e Position\n Players --\x3e Position\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item\n Players --\x3e Player\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n final Map<Player, Item> result = new LinkedHashMap<>();\n // \uc0ac\uc6a9\uc790 \uc218\ub9cc\ud07c Position\uc744 \uac00\uc838\uc640\uc11c \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc9c4\ud589\ud55c\ub2e4.\n for (Position position : Position.range(players.count())) {\n final Position resultPosition = ladder.play(position);\n result.put(players.get(position), items.get(resultPosition));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"player\uc5d0\uac8c-ladder\ub97c-\uc804\ub2ec\ud558\uc5ec-\uac8c\uc784\uc744-\uc9c4\ud589\ud558\ub294-\ubc29\ubc95"},"Player\uc5d0\uac8c Ladder\ub97c \uc804\ub2ec\ud558\uc5ec \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub294 \ubc29\ubc95"),(0,a.kt)("p",null,"Position\uc5d0 \ub300\ud55c \uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub294 Player\uc5d0\uac8c Ladder\ub97c \ub118\uaca8\uc11c, Player\uac00 Ladder\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \uad6c\ud604\ud558\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774 \ubc29\ubc95\uc774 \uc0ac\ub2e4\ub9ac \uac8c\uc784\uc744 \uc704\ud574\uc11c \uac1d\uccb4\ub4e4\uc774 \uae34\ubc00\ud558\uac8c \ud611\ub825\ud558\uace0, \uc870\uae08 \ub354 \ucc45\uc784\uc758 \ubd84\ubc30\uac00 \uc798 \ub418\uc5b4\uc788\ub2e4\uace0 \uc0dd\uac01\uc774 \ub418\uc5c8\ub2e4. "),(0,a.kt)("mermaid",{value:"graph TD\n\n LadderGameController --\x3e LadderGame\n LadderGame --\x3e Ladder\n LadderGame --\x3e Players\n LadderGame --\x3e Items\n\n Ladder --\x3e Line\n Line --\x3e LineStatus\n Line --\x3e Position\n\n Players --\x3e Ladder\n Player --\x3e Ladder\n\n Item --\x3e Position\n Player --\x3e Position\n\n\n LadderGame --\x3e LadderGameResult\n\n Items --\x3e Item --\x3e ItemName\n Players --\x3e Player --\x3e PlayerName\n\n LadderGameController --\x3e InputView\n LadderGameController --\x3e OutputView\n\n OutputView --\x3e LadderMessageGenerator"}),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-java"},"public LadderGameResult play() {\n // \ucc38\uac00\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub2e4\ub9ac\ub97c \uc804\ub2ec\ud574\uc11c \uc0ac\ub2e4\ub9ac\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub3c4\ub85d \ud55c\ub2e4.\n final Map<Player, Position> playResult = players.play(ladder);\n\n final Map<Player, Item> result = new LinkedHashMap<>();\n for (Player player : playResult.keySet()) {\n result.put(player, toItem(playResult.get(player)));\n }\n return new LadderGameResult(result);\n}\n")),(0,a.kt)("h3",{id:"\ubd80\uc871\ud588\ub358-\ubd80\ubd84"},"\ubd80\uc871\ud588\ub358 \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\uc5d0 \uc2dc\uac04\uc744 \ub4e4\uc774\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc720\ube44\ucffc\ud130\uc2a4 \uc5b8\uc5b4\ub97c \uc815\ud558\ub294\ub370 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \ub4e4\uc5ec\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc0ac\ub2e4\ub9ac \ud0c0\uae30\uc758 \uc2e4\ud589 \uacb0\uacfc\ub97c Item\uc73c\ub85c \uc9d3\ub2e4\ub2c8.. \ubb54\uac00 \ub9cc\uc871\uc2a4\ub7fd\uc9c0 \uc54a\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc804 \ubbf8\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba85\uba85\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \ubd80\uc871\ud568\uc744 \ub9ce\uc774 \ub290\uaf08\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud398\uc5b4\uc640 \uc870\uae08 \ub354 \uce5c\ud574\uc9c0\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab\ub0a0\uc740 \ud398\uc5b4\uc640 \uce5c\ud574\uc9c0\ub294 \uc2dc\uac04\uc744 \uc870\uae08 \ub354 \uac00\uc838\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6b0\uac00\ub791 \ud68c\uace0\ud560 \ub54c \ub0b4\uac00 \uc2dc\uc791\ud558\uc790\ub9c8\uc790 \ucee8\ubca4\uc158 \uc815\ud558\uc790\uace0 \ud574\uc11c \ub9ce\uc774 \ub2f9\ud669\uc2a4\ub7ec\uc6e0\ub2e4\uace0 \ud55c\ub2e4. \uc6b0\uac00 \ubbf8\uc548.. \ud83e\udd72"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"README\ub97c \uc870\uae08 \ub354 \uaf3c\uaf3c\ud558\uac8c"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uc0c1\ud558\uac8c \ucf54\ub529\uc5d0 \uc9d1\uc911\ud558\uba74 README\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uba74\uc11c \uac19\uc774 \ucee4\ubc0b \ud558\ub294 \uac78 \ud56d\uc0c1 \uae4c\uba39\ub294\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub2e4\uc74c \ubbf8\uc158\uc5d0\ub294 \uc870\uae08 \ub354 \uc2e0\uacbd \uc368\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc88b\uc740 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uccab PR\ub54c \ub9ac\ubdf0\uc5b4\uc5d0\uac8c \uc9c8\ubb38\uc744 \ub0a8\uae30\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9ac\ubdf0\uc5b4\uc640\uc758 \uc2dc\uac04\uc774 \uc18c\uc911\ud55c \uc2dc\uac04\uc774\ub77c\ub294 \uac83\uc744 \uae4c\uba39\uc9c0 \ub9d0\uace0, \ub098\uc758 \uc131\uc7a5\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc9c8\ubb38\uc744 \uc0dd\uac01\ud574\uc57c\uaca0\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"PR \ud6c4\uc5d0\ub3c4 \uaf3c\uaf3c\ud558\uac8c \ud655\uc778\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\ubd84\uba85 \uc54c\uace0 \uc788\ub294 \ubd80\ubd84\uc774\uc9c0\ub9cc, \ub193\uce5c \ubd80\ubd84\uc774 \ub9ce\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","PR \ud558\uae30 \uc804\uc5d0\ub3c4 \uacc4\uc18d \ud655\uc778\uc744 \ud588\uc9c0\ub9cc, \uc544\ubb34\ub798\ub3c4 IntelliJ\uc5d0\uc11c \ubcf4\ub2c8 \ucf54\ub4dc\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uadf8\ub7f0\uc9c0 \ubcc0\uacbd\ud574\uc57c \ud560 \ubd80\ubd84\uc774 \uc798 \uc548\ubcf4\uc600\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","github pr\uc5d0\uc11c\ub294 \uc804\uccb4 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\ub2c8 PR \ud6c4\uc5d0\ub3c4 \uaf2d \ud655\uc778\ud574\uc57c\uaca0\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc801\uadf9\uc801\uc73c\ub85c \ub098\uc758 \uc758\uacac\uc744 \ub9d0\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\ub294 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \ud398\uc5b4\uc758 \uc758\uacac\uc774 \uad1c\ucc2e\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \uc218\uc6a9 \ud6c4 \uac1c\uc120\uc744 \ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\uc744 \ud588\uc5c8\ub294\ub370, \uc870\uae08 \ub354 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \ubc29\ud5a5\uc774 \uc788\ub2e4\uba74 \ub098\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uc758\uacac\uc744 \ub9d0\ud574\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\uc774 \ub4e0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub098\ub3c4 \uc124\ub4dd\ud558\ub294 \ud798\uc744 \uae30\ub974\uace0, \ud398\uc5b4\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc744 \uc54c \uc218 \uc788\uace0, \uacb0\uacfc\ubb3c\ub3c4 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ub098\uc624\uc9c0 \uc54a\uc744\uae4c? (\uace0\ubbfc \ub4e4\uc5b4\uc8fc\uc2e0 \ub9ac\ubdf0\uc5b4 \ud130\ud2c0\ud83d\udc22 \uac10\uc0ac\ud569\ub2c8\ub2e4.)"),(0,a.kt)("h3",{id:"\uc0c8\ub85c-\ud559\uc2b5\ud55c-\ubd80\ubd84"},"\uc0c8\ub85c \ud559\uc2b5\ud55c \ubd80\ubd84"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784"),(0,a.kt)("br",{parentName:"p"}),"\n","Players\uac00 Position\uc744 \uc0dd\uc131\ud558\uace0 Player\uc758 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ub828\ub41c \ucf54\uba58\ud2b8\uac00 \ub2ec\ub838\ub2e4.\n\uc2dc\uac04\uc744 \uac00\uc9c0\uace0 \uc0dd\uac01\ud574 \ubcf4\ub2c8 Position\uc744 \uac00\uc9c0\uace0 \uc788\ub294 \uac74 Player\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 Player\uac00 \ub2f4\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4\uace0 \uc0dd\uac01\ub418\uc5c8\ub2e4. "),(0,a.kt)("p",null,"\uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud55c \ud328\ud134\uc73c\ub85c GRASP\uc758 Creator \ud328\ud134\uc774 \uc788\ub294\ub370 \ub2e4\uc74c\uc758 \uc694\uc18c\ub97c \ucd5c\ub300\ud55c \ub9cc\uc871\ud558\ub294 \ud074\ub798\uc2a4\uc5d0 \uc0dd\uc131 \ucc45\uc784\uc744 \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \ud3ec\ud568 \ub610\ub294 \ucc38\uc870\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A \uac1d\uccb4\ub97c \uae30\ub85d\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\ub97c \uae34\ubc00\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"B\uac00 A\uc758 \ucd08\uae43\uac12\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. ")),(0,a.kt)("p",null,"\uc2e4\uc81c\ub85c \uac1d\uccb4\uc758 \uc0dd\uc131 \ucc45\uc784\uc5d0 \uad00\ud574\uc11c \uae4a\uc774 \uc0dd\uac01\ud558\uba74\uc11c \ucf54\ub529\uc744 \ud558\uc9c0 \uc54a\uc558\ub294\ub370, \uc774\ubc88 \ubbf8\uc158\uc744 \ud1b5\ud574 \uc2dc\uc57c\uac00 \ub113\uc5b4\uc9c4 \uac83 \uac19\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\ud328\ud0a4\uc9c0 \ubd84\ub9ac \uae30\uc900"),(0,a.kt)("br",{parentName:"p"}),"\n","\ud328\ud0a4\uc9c0 \ubd84\ub9ac\uc5d0 \ub300\ud55c \ub098\ub9cc\uc758 \uae30\uc900\uc774 \uc544\uc9c1 \uba85\ud655\ud558\uc9c0 \uc54a\uc544 \uc9c8\ubb38\uc774 \ub4e4\uc5b4\uc640\ub3c4 \uba85\ud655\ud558\uac8c \ub2f5\ubcc0\uc744 \ud558\uc9c0 \ubabb\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub9c8\uc9c0\ub9c9 \uc81c\ucd9c \uc804\uc5d0 \ub3c4\uba54\uc778 \ud328\ud0a4\uc9c0 \ub0b4\ubd80\ub97c \ubd84\ub9ac\ud574 \ubd24\ub294\ub370, \uae30\uc900\uc774 \uba85\ud655\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \uc88b\uc9c0 \uc54a\uc740 \uc120\ud0dd\uc774\uc5c8\ub358 \uac83 \uac19\ub2e4.\n\ud604\uc7ac \uc9c4\ud589\ud558\ub294 \ubbf8\uc158\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud06c\uae30\uac00 \uadf8\ub807\uac8c \ud06c\uc9c0 \uc54a\uc73c\ub2c8, domain \ud328\ud0a4\uc9c0\uc5d0\uc11c \uc138\ubd80 \ud328\ud0a4\uc9c0\ub85c \ubd84\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub420 \uac83 \uac19\ub2e4. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\uc0ac\uc6a9\ud558\ub294 \ucabd\uc5d0\uc11c \uc0dd\uac01\ud558\uae30 & \uc608\uce21\uac00\ub2a5\ud55c \ucf54\ub4dc \uc791\uc131\ud558\uae30"),(0,a.kt)("br",{parentName:"p"}),"\n","Position\uc5d0\uc11c \ub2e4\uc74c \uc704\uce58\ub098 \uc774\uc804 \uc704\uce58\ub97c \ubc18\ud658\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ud5c8\uc6a9 \ubc94\uc704(0~19)\uac00 \ubc97\uc5b4\ub09c\ub2e4\uba74, \uc758\ubbf8 \uc5c6\ub294 \uac12\uc774 \ub4e4\uc5b4\uac04 Position\uc744 \ubc18\ud658\ud558\ub3c4\ub85d \ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\uac74 Position\uc744 \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc744 \uace0\ub824\ud558\uc9c0 \ubabb\ud55c \ucf54\ub529\uc774\uc5c8\ub294\ub370, \uc0ac\uc6a9\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c\ub294 0~19\uc758 \uac12\uc774 \ubcf4\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uc0dd\uac01\ud560 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub530\ub77c\uc11c hasNext, hasPrevious\ub77c\ub294 \uc774\uc804 \uac12, \uc774\ud6c4 \uac12\uc774 \ubc94\uc704 \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874\uc758 \uac12\uc744 \uac00\uc838\uc624\ub294 \uba54\uc11c\ub4dc\ub294 \ubc94\uc704\uac00 \ubc97\uc5b4\ub098\uba74 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ubc29\ud5a5\uc73c\ub85c \ud574\uacb0\ud558\uc600\ub2e4. "),(0,a.kt)("h3",{id:"\ud398\uc5b4\uc5d0\uac8c-\ubc30\uc6b8-\ubd80\ubd84"},"\ud398\uc5b4\uc5d0\uac8c \ubc30\uc6b8 \ubd80\ubd84"),(0,a.kt)("p",null,"\ubc1d\uc740 \uae30\uc6b4\uc744 \uac00\uc9c0\uace0 \uc788\uace0 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \uce5c\ud654\ub825\uc774 \uc88b\uc740 \uac83 \uac19\uc558\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc774\ubc88\uc5d0 \ud398\uc5b4 \ud560 \ub54c \ucee8\ub514\uc158 \uad00\ub9ac\ub97c \uc81c\ub300\ub85c \ubabb\ud574\uc11c \ub9ce\uc774 \ubbf8\uc548\ud588\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ucd5c\uc0c1\uc758 \ucee8\ub514\uc158\uc73c\ub85c \ud398\uc5b4\ub97c \uc900\ube44\ud574 \ubd10\uc57c\uaca0\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uadf8\ub9ac\uace0 \uc6b0\uac00\ub791 \ud398\uc5b4\ub97c \ud558\uace0 \ub098\uc11c, \ub098\ub3c4 \ub2e4\ub978 \uc0ac\ub78c\ub4e4\uacfc \ub354 \uc798 \uc9c0\ub0b4\ubd10\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5b4 \uc870\uae08 \ub354 \uc6a9\uae30\ub97c \ub0b4 \uc7a1\ub2f4 \uc911\uc774\ub2e4! "),(0,a.kt)("p",null,"\uc758\uacac\uc744 \uc801\uadf9\uc801\uc73c\ub85c \ub0b4\uc918\uc11c \ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589\uc774 \uc798 \ub418\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ub610\ud55c \ud398\uc5b4 \uc9c4\ud589\uc774 \ub290\ub9b0 \uac83 \uac19\ub2e4\uace0 \ub9d0\ud574\uc918\uc11c \uc548\uc815\uc801\uc73c\ub85c \uc2dc\uac04 \uc548\uc5d0 \ubbf8\uc158\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc5c8\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\ud398\uc5b4\ud504\ub85c\uadf8\ub798\ubc0d \uc9c4\ud589 \uc18d\ub3c4\uc5d0 \ub300\ud574 \uc870\uae08 \ub354 \uc0dd\uac01\uc744 \ud574\ubd10\uc57c\uaca0\ub2e4!"),(0,a.kt)("p",null,"\ud56d\uc0c1 \uc9c0\ub098\uac08 \ub54c\ub9c8\ub2e4 \uc6c3\uc5b4\uc8fc\ub294\ub370, \ub098\ub3c4 \uc790\uc8fc \uc6c3\uc5b4\uc57c\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\ub2e4.",(0,a.kt)("br",{parentName:"p"}),"\n","\uc6c3\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc0ac\ub78c\uc774 \ubc1d\uc544 \ubcf4\uc5ec\uc11c \ub108\ubb34 \uc88b\uc740 \uac83 \uac19\ub2e4!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fe273484.6eaec45f.js b/assets/js/fe273484.6eaec45f.js new file mode 100644 index 000000000..7939a9cae --- /dev/null +++ b/assets/js/fe273484.6eaec45f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8355],{53034:e=>{e.exports=JSON.parse('{"permalink":"/tags/java","page":1,"postsPerPage":1,"totalPages":5,"totalCount":5,"nextPage":"/tags/java/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/fe273484.948d4238.js b/assets/js/fe273484.948d4238.js deleted file mode 100644 index 30739f8b6..000000000 --- a/assets/js/fe273484.948d4238.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8355],{3034:e=>{e.exports=JSON.parse('{"permalink":"/tags/java","page":1,"postsPerPage":1,"totalPages":5,"totalCount":5,"nextPage":"/tags/java/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/fe8cce0a.4603547c.js b/assets/js/fe8cce0a.4603547c.js deleted file mode 100644 index a106af65f..000000000 --- a/assets/js/fe8cce0a.4603547c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[955],{8535:e=>{e.exports=JSON.parse('{"label":"IntelliJ","permalink":"/tags/intelli-j","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/fe8cce0a.5b81fa8f.js b/assets/js/fe8cce0a.5b81fa8f.js new file mode 100644 index 000000000..358b7a42e --- /dev/null +++ b/assets/js/fe8cce0a.5b81fa8f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[955],{78535:e=>{e.exports=JSON.parse('{"label":"IntelliJ","permalink":"/tags/intelli-j","allTagsPath":"/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/fed8bc04.00e51af4.js b/assets/js/fed8bc04.00e51af4.js new file mode 100644 index 000000000..0e06b2aa4 --- /dev/null +++ b/assets/js/fed8bc04.00e51af4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8110],{96375:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/fed8bc04.67dc7606.js b/assets/js/fed8bc04.67dc7606.js deleted file mode 100644 index 07904d88d..000000000 --- a/assets/js/fed8bc04.67dc7606.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8110],{6375:e=>{e.exports=JSON.parse('{"label":"Woowahan Techcourse","permalink":"/tags/woowahan-techcourse","allTagsPath":"/tags","count":11}')}}]); \ No newline at end of file diff --git a/assets/js/ffb0fa11.99af157c.js b/assets/js/ffb0fa11.99af157c.js deleted file mode 100644 index 0e897923d..000000000 --- a/assets/js/ffb0fa11.99af157c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7400],{8214:e=>{e.exports=JSON.parse('{"permalink":"/tags/book/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/book/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ffb0fa11.e327857d.js b/assets/js/ffb0fa11.e327857d.js new file mode 100644 index 000000000..77c4ea6b1 --- /dev/null +++ b/assets/js/ffb0fa11.e327857d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7400],{58214:e=>{e.exports=JSON.parse('{"permalink":"/tags/book/page/3","page":3,"postsPerPage":1,"totalPages":3,"totalCount":3,"previousPage":"/tags/book/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/main.0ea3d648.js b/assets/js/main.0ea3d648.js new file mode 100644 index 000000000..41237a316 --- /dev/null +++ b/assets/js/main.0ea3d648.js @@ -0,0 +1,2 @@ +/*! For license information please see main.0ea3d648.js.LICENSE.txt */ +(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[179],{20830:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});var a=n(67294);function r(){return a.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},a.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(67294),r=n(87462),o=n(68356),i=n.n(o),l=n(16887);const s={"0050401e":[()=>n.e(9735).then(n.bind(n,85401)),"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",85401],"00931cc3":[()=>n.e(5669).then(n.t.bind(n,92291,19)),"~blog/default/page-30-25c.json",92291],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,24524)),"@theme/BlogTagsListPage",24524],"02689328":[()=>n.e(6346).then(n.t.bind(n,5577,19)),"~blog/default/tags-data-base-page-3-9db.json",5577],"0281109c":[()=>n.e(422).then(n.t.bind(n,25266,19)),"~blog/default/tags-jenkins-2e5-list.json",25266],"03e71e14":[()=>Promise.all([n.e(532),n.e(4371)]).then(n.bind(n,69056)),"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx?truncated=true",69056],"041ed4b0":[()=>n.e(6847).then(n.bind(n,79363)),"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx?truncated=true",79363],"0462f8fc":[()=>n.e(4481).then(n.bind(n,37572)),"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd.mdx",37572],"05b907fc":[()=>n.e(734).then(n.t.bind(n,92943,19)),"~blog/default/tags-retrospective-page-8-5ab-list.json",92943],"06ea9cd1":[()=>n.e(8296).then(n.bind(n,86635)),"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",86635],"0746167d":[()=>n.e(1113).then(n.t.bind(n,19758,19)),"~blog/default/tags-elastic-beanstalk-119-list.json",19758],"08726fcf":[()=>n.e(5487).then(n.t.bind(n,38441,19)),"~blog/default/tags-java-page-4-c22-list.json",38441],"087c46fa":[()=>n.e(96).then(n.t.bind(n,25774,19)),"~blog/default/tags-spring-boot-889.json",25774],"09fbb6bd":[()=>n.e(5964).then(n.t.bind(n,41679,19)),"~blog/default/page-16-d6c.json",41679],"0a2eaa84":[()=>n.e(8942).then(n.t.bind(n,52930,19)),"~blog/default/tags-data-base-4e8.json",52930],"0a7a6076":[()=>n.e(5212).then(n.bind(n,50328)),"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx?truncated=true",50328],"0b2567db":[()=>n.e(3578).then(n.bind(n,92141)),"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",92141],"0c071de2":[()=>n.e(321).then(n.t.bind(n,23125,19)),"~blog/default/page-2-b45.json",23125],"0cb009d1":[()=>n.e(116).then(n.t.bind(n,66643,19)),"~blog/default/tags-event-f04.json",66643],"0cb2f220":[()=>n.e(8188).then(n.bind(n,91149)),"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx?truncated=true",91149],"0d47646f":[()=>n.e(2342).then(n.bind(n,27019)),"@site/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131.mdx",27019],"0e9b73e4":[()=>n.e(9823).then(n.bind(n,68513)),"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx?truncated=true",68513],"0ecaa6ec":[()=>n.e(6304).then(n.bind(n,78906)),"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",78906],"0f9a8782":[()=>n.e(782).then(n.bind(n,83923)),"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",83923],"12cbeba7":[()=>n.e(6508).then(n.t.bind(n,16134,19)),"~blog/default/page-29-e3c.json",16134],14164549:[()=>n.e(7268).then(n.t.bind(n,11279,19)),"~blog/default/tags-book-baf-list.json",11279],"1563fc8b":[()=>n.e(9690).then(n.bind(n,11295)),"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",11295],"16cc6f3a":[()=>n.e(425).then(n.t.bind(n,12946,19)),"~blog/default/tags-retrospective-page-15-26b.json",12946],17896441:[()=>Promise.all([n.e(532),n.e(8126),n.e(7918)]).then(n.bind(n,78945)),"@theme/DocItem",78945],"1893cb59":[()=>n.e(286).then(n.t.bind(n,16269,19)),"~blog/default/tags-java-page-2-8c6.json",16269],"18c69d70":[()=>n.e(9171).then(n.t.bind(n,7085,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"198f8d8a":[()=>n.e(9059).then(n.t.bind(n,17238,19)),"~blog/default/tags-java-page-3-b02-list.json",17238],"19f4ae8e":[()=>n.e(8161).then(n.t.bind(n,25680,19)),"~blog/default/tags-log-5ad.json",25680],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,39172)),"@theme/SearchPage",39172],"1a665c6f":[()=>n.e(454).then(n.t.bind(n,28767,19)),"~blog/default/tags-test-435-list.json",28767],"1a6b9123":[()=>n.e(9874).then(n.t.bind(n,14343,19)),"~blog/default/tags-teco-chat-page-3-007.json",14343],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,19963)),"@theme/DocPage",19963],"1c5d8736":[()=>n.e(7011).then(n.bind(n,65631)),"@site/blog/2023/2023-01-08-JSR-310.mdx",65631],"1c74a8fd":[()=>n.e(2007).then(n.bind(n,97339)),"@site/blog/2023/2023-03-30-GRASP.mdx",97339],"1c93669b":[()=>n.e(6526).then(n.t.bind(n,37579,19)),"~docs/default/tag-docs-tags-monitoring-149.json",37579],"1d81daa1":[()=>n.e(7681).then(n.t.bind(n,76725,19)),"~blog/default/tags-mock-330.json",76725],"1e4ebcd5":[()=>Promise.all([n.e(532),n.e(311)]).then(n.bind(n,20692)),"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",20692],"1fbde614":[()=>n.e(8243).then(n.t.bind(n,87304,19)),"~blog/default/tags-monitoring-a8a-list.json",87304],"20e99c2a":[()=>n.e(3530).then(n.t.bind(n,19507,19)),"~blog/default/tags-documentation-ee3-list.json",19507],"21d253a0":[()=>n.e(1853).then(n.t.bind(n,63986,19)),"~blog/default/tags-woowahan-techcourse-page-10-f03-list.json",63986],"21e890b0":[()=>n.e(8288).then(n.t.bind(n,551,19)),"~blog/default/tags-retrospective-page-14-99d-list.json",551],"226700de":[()=>n.e(6035).then(n.t.bind(n,41961,19)),"~blog/default/page-25-52d.json",41961],24214711:[()=>n.e(4041).then(n.bind(n,87164)),"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",87164],"255134d9":[()=>n.e(8151).then(n.t.bind(n,30753,19)),"~blog/default/tags-composite-240.json",30753],"268e20d0":[()=>n.e(5164).then(n.bind(n,44615)),"@site/blog/2023/2023-06-26-WebSocket.mdx?truncated=true",44615],"269a2f75":[()=>n.e(1994).then(n.t.bind(n,52358,19)),"~blog/default/tags-static-b68.json",52358],"270346fa":[()=>n.e(7975).then(n.t.bind(n,89424,19)),"~blog/default/page-28-907.json",89424],"274c9143":[()=>n.e(6984).then(n.t.bind(n,90058,19)),"~blog/default/tags-java-a6e.json",90058],"2832e534":[()=>n.e(2476).then(n.t.bind(n,69870,19)),"~blog/default/page-13-99f.json",69870],"28a1570f":[()=>n.e(448).then(n.t.bind(n,92252,19)),"~blog/default/tags-elastic-beanstalk-119.json",92252],29476979:[()=>n.e(4030).then(n.bind(n,68804)),"@site/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815.md",68804],"2a8faff0":[()=>n.e(7901).then(n.t.bind(n,1150,19)),"~blog/default/tags-test-435.json",1150],"2b22d492":[()=>n.e(7652).then(n.t.bind(n,56986,19)),"~blog/default/tags-retrospective-page-3-ee4-list.json",56986],"2b479afe":[()=>n.e(9591).then(n.t.bind(n,16973,19)),"~blog/default/tags-mockito-3c0-list.json",16973],"2bfe7c0b":[()=>n.e(1762).then(n.t.bind(n,82670,19)),"~blog/default/tags-book-page-2-bc6.json",82670],"2d3b202f":[()=>n.e(1196).then(n.t.bind(n,42524,19)),"~blog/default/tags-book-baf.json",42524],"2d9296e4":[()=>n.e(3483).then(n.t.bind(n,89429,19)),"~blog/default/tags-pattern-b4e.json",89429],"2e10a69c":[()=>n.e(7581).then(n.t.bind(n,9981,19)),"~blog/default/page-38-d34.json",9981],"2e892090":[()=>n.e(1560).then(n.bind(n,79544)),"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",79544],"2f43e44a":[()=>n.e(6743).then(n.t.bind(n,52396,19)),"~blog/default/tags-grasp-418-list.json",52396],"2f7a5a88":[()=>n.e(8927).then(n.bind(n,27879)),"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx?truncated=true",27879],"3028ca57":[()=>n.e(3211).then(n.bind(n,36733)),"@site/blog/2023/2023-06-26-WebSocket.mdx",36733],"303c1e60":[()=>n.e(2656).then(n.t.bind(n,39529,19)),"~blog/default/tags-retrospective-page-4-3a3.json",39529],"309173fa":[()=>n.e(1793).then(n.t.bind(n,22684,19)),"~blog/default/tags-data-base-4e8-list.json",22684],"3216290d":[()=>n.e(6799).then(n.bind(n,630)),"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",630],"32397cb2":[()=>n.e(548).then(n.t.bind(n,22050,19)),"~blog/default/tags-awt-page-2-eb4-list.json",22050],"32b2299c":[()=>n.e(970).then(n.t.bind(n,5280,19)),"~blog/default/page-41-fe1.json",5280],33736670:[()=>n.e(2742).then(n.t.bind(n,80700,19)),"~blog/default/tags-class-eca.json",80700],"33ae6a7e":[()=>n.e(5005).then(n.bind(n,38760)),"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",38760],"34a9e1b6":[()=>n.e(7381).then(n.bind(n,85382)),"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",85382],"35293ec4":[()=>n.e(7697).then(n.t.bind(n,14,19)),"~blog/default/page-20-038.json",14],"35b2eb5a":[()=>n.e(372).then(n.t.bind(n,97815,19)),"~blog/default/tags-java-page-5-b71-list.json",97815],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,10727)),"@theme/DocTagsListPage",10727],"38d8699e":[()=>n.e(471).then(n.t.bind(n,97481,19)),"~blog/default/page-15-208.json",97481],"3972c49f":[()=>n.e(6629).then(n.t.bind(n,91782,19)),"~blog/default/tags-web-socket-c6e-list.json",91782],"397e7345":[()=>n.e(1892).then(n.bind(n,89142)),"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",89142],"39ee6679":[()=>n.e(5717).then(n.t.bind(n,83636,19)),"~blog/default/tags-woowahan-techcourse-b50.json",83636],"3b0d95bc":[()=>n.e(5140).then(n.bind(n,38973)),"@site/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551.mdx",38973],"3b0f99e8":[()=>n.e(3553).then(n.t.bind(n,20034,19)),"~blog/default/tags-jenkins-2e5.json",20034],"3b18521e":[()=>n.e(2773).then(n.t.bind(n,8086,19)),"~blog/default/tags-mockito-3c0.json",8086],"3c5aea38":[()=>n.e(6250).then(n.t.bind(n,56516,19)),"~blog/default/tags-retrospective-page-12-8cf.json",56516],"3cc6ebf8":[()=>n.e(8405).then(n.bind(n,84740)),"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx?truncated=true",84740],"3d6c40c1":[()=>n.e(8509).then(n.t.bind(n,3440,19)),"~blog/default/tags-monitoring-a8a.json",3440],"3ed04b60":[()=>n.e(7157).then(n.t.bind(n,84792,19)),"~blog/default/tags-spring-de1.json",84792],"3f4fb381":[()=>n.e(5356).then(n.bind(n,90057)),"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",90057],"3fc16fd0":[()=>n.e(3886).then(n.bind(n,42929)),"@site/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30.mdx",42929],"4177cd87":[()=>n.e(7450).then(n.bind(n,32169)),"@site/blog/2023/2023-02-12-Parameterized Tests.mdx",32169],"41b4728f":[()=>n.e(8628).then(n.t.bind(n,30171,19)),"~blog/default/tags-spring-boot-889-list.json",30171],"43a97218":[()=>n.e(4815).then(n.t.bind(n,65215,19)),"~blog/default/tags-retrospective-page-5-22d-list.json",65215],"43f49b9e":[()=>n.e(4670).then(n.bind(n,82414)),"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",82414],"43fcf0e9":[()=>n.e(6468).then(n.t.bind(n,94822,19)),"~blog/default/tags-woowahan-techcourse-page-9-065.json",94822],"4413b451":[()=>n.e(2048).then(n.bind(n,48617)),"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",48617],"456b5fae":[()=>n.e(1865).then(n.bind(n,92790)),"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx?truncated=true",92790],"459bd227":[()=>n.e(9094).then(n.bind(n,6693)),"@site/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30.mdx",6693],"489347ff":[()=>n.e(2793).then(n.t.bind(n,40526,19)),"~blog/default/tags-web-socket-c6e.json",40526],"48bd1d32":[()=>n.e(9563).then(n.bind(n,1683)),"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59.mdx",1683],"492a6565":[()=>n.e(4212).then(n.t.bind(n,44929,19)),"~blog/default/tags-lock-page-2-819-list.json",44929],"494882d1":[()=>n.e(4471).then(n.t.bind(n,2098,19)),"~blog/default/page-37-cb2.json",2098],"4959fc42":[()=>n.e(240).then(n.t.bind(n,80897,19)),"~blog/default/page-14-0a2.json",80897],"49b8d9dd":[()=>n.e(1103).then(n.t.bind(n,64420,19)),"~blog/default/tags-inno-db-59e.json",64420],"49c232d6":[()=>n.e(7176).then(n.bind(n,41574)),"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",41574],"4aa09797":[()=>n.e(3306).then(n.bind(n,14369)),"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx?truncated=true",14369],"4b2fba3e":[()=>n.e(328).then(n.t.bind(n,98234,19)),"~blog/default/tags-image-page-3-942-list.json",98234],"4f3c73fd":[()=>n.e(8876).then(n.bind(n,29978)),"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",29978],"5088fe06":[()=>n.e(80).then(n.t.bind(n,86819,19)),"~blog/default/tags-log-5ad-list.json",86819],"509d519c":[()=>n.e(743).then(n.t.bind(n,24469,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",24469],"533bfc57":[()=>n.e(5100).then(n.t.bind(n,4371,19)),"~blog/default/tags-retrospective-page-2-e2b-list.json",4371],"54150be7":[()=>n.e(5088).then(n.t.bind(n,98707,19)),"~blog/default/tags-java-page-2-8c6-list.json",98707],"54cb095e":[()=>n.e(7009).then(n.t.bind(n,95159,19)),"~blog/default/page-26-a44.json",95159],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,88070,19)),"~docs/default/tags-list-current-prop-15a.json",88070],"562496aa":[()=>n.e(6161).then(n.t.bind(n,68146,19)),"~blog/default/tags-image-page-2-cc3.json",68146],"564337ec":[()=>n.e(5649).then(n.t.bind(n,8563,19)),"~blog/default/tags-retrospective-page-7-3e2-list.json",8563],"5a29fbab":[()=>n.e(7857).then(n.t.bind(n,25381,19)),"~blog/default/tags-woowahan-techcourse-b50-list.json",25381],"5a6c6934":[()=>n.e(5953).then(n.t.bind(n,48630,19)),"~blog/default/tags-dto-cb6.json",48630],"5c38e66e":[()=>n.e(5521).then(n.t.bind(n,28638,19)),"~blog/default/tags-woowahan-techcourse-page-10-f03.json",28638],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"5eed1665":[()=>n.e(8142).then(n.t.bind(n,19729,19)),"~blog/default/tags-lock-529-list.json",19729],"5f785aa3":[()=>n.e(497).then(n.bind(n,9679)),"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",9679],"5f81b25c":[()=>n.e(4889).then(n.t.bind(n,29492,19)),"~blog/default/page-27-eb3.json",29492],"5ffd2c10":[()=>n.e(2100).then(n.t.bind(n,86515,19)),"~docs/default/tag-docs-tags-jpa-c8c.json",86515],"6093f82b":[()=>n.e(6017).then(n.t.bind(n,30708,19)),"~blog/default/page-9-361.json",30708],"633582b9":[()=>n.e(2448).then(n.t.bind(n,32401,19)),"~blog/default/tags-kotlin-6ac.json",32401],"635a92d5":[()=>n.e(7891).then(n.t.bind(n,72126,19)),"~blog/default/page-24-fbb.json",72126],"6425a984":[()=>n.e(5467).then(n.t.bind(n,95377,19)),"~blog/default/tags-woowahan-techcourse-page-4-bcd-list.json",95377],"64868a43":[()=>n.e(1501).then(n.t.bind(n,33159,19)),"~blog/default/page-39-76c.json",33159],"64f377d6":[()=>n.e(732).then(n.t.bind(n,62898,19)),"~blog/default/tags-woowahan-techcourse-page-11-6c9-list.json",62898],"6600e5b0":[()=>n.e(9572).then(n.bind(n,73437)),"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",73437],"66d1c769":[()=>n.e(7476).then(n.t.bind(n,80122,19)),"~blog/default/tags-data-base-page-2-3a7-list.json",80122],"672a376b":[()=>n.e(5753).then(n.t.bind(n,41690,19)),"~blog/default/tags-woowahan-techcourse-page-8-93a.json",41690],"686688fd":[()=>n.e(8193).then(n.bind(n,5879)),"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx?truncated=true",5879],"6875c492":[()=>Promise.all([n.e(532),n.e(8126),n.e(6048),n.e(8610)]).then(n.bind(n,41714)),"@theme/BlogTagsPostsPage",41714],"69c28c32":[()=>n.e(1065).then(n.t.bind(n,99263,19)),"~blog/default/page-36-1da.json",99263],"6a19354d":[()=>n.e(693).then(n.t.bind(n,36232,19)),"~blog/default/tags-lock-529.json",36232],"6b90f600":[()=>n.e(4659).then(n.bind(n,10407)),"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",10407],"6bc709ad":[()=>n.e(9393).then(n.t.bind(n,81399,19)),"~blog/default/tags-retrospective-page-6-594-list.json",81399],"6c60e25f":[()=>n.e(2756).then(n.bind(n,66949)),"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx?truncated=true",66949],"6cfe3a99":[()=>n.e(5319).then(n.t.bind(n,91227,19)),"~blog/default/tags-cloudwatch-6c7-list.json",91227],"6dd1c948":[()=>n.e(7064).then(n.t.bind(n,76376,19)),"~blog/default/page-34-16c.json",76376],"70a12cc4":[()=>n.e(5682).then(n.t.bind(n,17085,19)),"~blog/default/tags-static-b68-list.json",17085],72367227:[()=>n.e(795).then(n.bind(n,81799)),"@site/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md",81799],"7405ea58":[()=>n.e(2345).then(n.t.bind(n,40702,19)),"~blog/default/tags-retrospective-page-11-e3c-list.json",40702],"741df4e1":[()=>n.e(280).then(n.bind(n,31601)),"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx?truncated=true",31601],"75121fd5":[()=>n.e(5335).then(n.t.bind(n,30674,19)),"~blog/default/tags-image-97d.json",30674],"754fb852":[()=>n.e(988).then(n.t.bind(n,38242,19)),"~blog/default/page-32-596.json",38242],"76603d6f":[()=>n.e(4560).then(n.bind(n,62182)),"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx?truncated=true",62182],"7762a24e":[()=>n.e(2753).then(n.t.bind(n,55095,19)),"~blog/default/page-4-365.json",55095],"7af1d52f":[()=>n.e(2334).then(n.t.bind(n,59565,19)),"~blog/default/page-6-d10.json",59565],"7bbc420e":[()=>n.e(4311).then(n.t.bind(n,41691,19)),"~blog/default/tags-documentation-ee3.json",41691],"7c660760":[()=>n.e(2087).then(n.t.bind(n,91870,19)),"~blog/default/tags-woowahan-techcourse-page-9-065-list.json",91870],"7e4c1ed7":[()=>n.e(1653).then(n.t.bind(n,83297,19)),"~docs/default/tag-docs-tags-postmortem-ede.json",83297],"7e59392d":[()=>n.e(7281).then(n.t.bind(n,33202,19)),"~blog/default/tags-retrospective-page-9-473-list.json",33202],"7fbacf84":[()=>n.e(5797).then(n.t.bind(n,58701,19)),"~blog/default/tags-spring-de1-list.json",58701],"7fd9a574":[()=>n.e(2889).then(n.t.bind(n,5863,19)),"~blog/default/tags-retrospective-page-14-99d.json",5863],"804ef369":[()=>n.e(4044).then(n.bind(n,70)),"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx?truncated=true",70],"80960b4b":[()=>n.e(7599).then(n.t.bind(n,28386,19)),"~blog/default/page-21-7a8.json",28386],"814f3328":[()=>n.e(2535).then(n.t.bind(n,45641,19)),"~blog/default/blog-post-list-prop-default.json",45641],"86863b3d":[()=>Promise.all([n.e(532),n.e(3359)]).then(n.bind(n,35838)),"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",35838],"86b4da3d":[()=>n.e(952).then(n.t.bind(n,44149,19)),"~blog/default/tags-woowahan-techcourse-page-2-567.json",44149],"871c1e5a":[()=>n.e(5966).then(n.t.bind(n,71247,19)),"~blog/default/page-23-651.json",71247],"87a22936":[()=>n.e(418).then(n.bind(n,1637)),"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx?truncated=true",1637],"882ffb20":[()=>n.e(3910).then(n.bind(n,91645)),"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",91645],"899da081":[()=>n.e(7528).then(n.bind(n,36539)),"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",36539],"8b79a48d":[()=>n.e(9287).then(n.t.bind(n,59070,19)),"~blog/default/tags-retrospective-page-9-473.json",59070],"8c6c0796":[()=>n.e(2816).then(n.t.bind(n,59123,19)),"~blog/default/tags-retrospective-2fb.json",59123],"8d05b77c":[()=>n.e(4149).then(n.t.bind(n,22801,19)),"~blog/default/page-5-264.json",22801],"8d7288fe":[()=>n.e(4801).then(n.t.bind(n,71830,19)),"~blog/default/tags-class-eca-list.json",71830],"8da65e83":[()=>n.e(9427).then(n.t.bind(n,1341,19)),"~blog/default/tags-woowahan-techcourse-page-4-bcd.json",1341],"8dc09bac":[()=>n.e(8338).then(n.t.bind(n,28881,19)),"~blog/default/tags-event-f04-list.json",28881],"8e3d08a4":[()=>n.e(2727).then(n.bind(n,7553)),"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",7553],"8e498bb6":[()=>n.e(1436).then(n.t.bind(n,50257,19)),"~blog/default/tags-java-page-3-b02.json",50257],"8e9056ec":[()=>n.e(893).then(n.bind(n,65346)),"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx?truncated=true",65346],"8fbd512b":[()=>n.e(5873).then(n.t.bind(n,15,19)),"~blog/default/tags-async-326.json",15],92926477:[()=>n.e(6080).then(n.bind(n,26133)),"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",26133],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"95c5de0b":[()=>n.e(5686).then(n.bind(n,53444)),"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx?truncated=true",53444],"95dc859f":[()=>Promise.all([n.e(532),n.e(3307)]).then(n.bind(n,86986)),"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx?truncated=true",86986],"96adae60":[()=>n.e(172).then(n.t.bind(n,54217,19)),"~blog/default/page-19-21b.json",54217],"96b08d81":[()=>n.e(4435).then(n.bind(n,1626)),"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx?truncated=true",1626],"981f7647":[()=>n.e(2947).then(n.bind(n,51077)),"@site/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0.mdx",51077],"9a859616":[()=>n.e(8492).then(n.bind(n,14553)),"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx?truncated=true",14553],"9b56b618":[()=>n.e(9538).then(n.t.bind(n,37e3,19)),"~blog/default/tags-awt-0e2-list.json",37e3],"9bbc65ac":[()=>n.e(7210).then(n.t.bind(n,51020,19)),"~docs/default/tag-docs-tags-test-8ab.json",51020],"9ca52986":[()=>n.e(3490).then(n.t.bind(n,92016,19)),"~blog/default/tags-lock-page-2-819.json",92016],"9cfe8fd1":[()=>n.e(7725).then(n.t.bind(n,97113,19)),"~blog/default/page-18-46d.json",97113],"9d8ee3a8":[()=>n.e(5962).then(n.t.bind(n,71297,19)),"~blog/default/tags-oop-03c.json",71297],"9dc4119a":[()=>n.e(6490).then(n.t.bind(n,4408,19)),"~blog/default/tags-retrospective-page-10-4a6-list.json",4408],"9dec6b67":[()=>n.e(8524).then(n.t.bind(n,88221,19)),"~blog/default/tags-data-base-page-2-3a7.json",88221],"9e4087bc":[()=>n.e(3608).then(n.bind(n,63169)),"@theme/BlogArchivePage",63169],"9e477a5e":[()=>n.e(8312).then(n.bind(n,54686)),"@site/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c.mdx",54686],"9f324683":[()=>n.e(7974).then(n.bind(n,87998)),"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",87998],"9fae68e2":[()=>n.e(297).then(n.t.bind(n,77536,19)),"~blog/default/tags-kotlin-6ac-list.json",77536],a0333b7c:[()=>n.e(7306).then(n.bind(n,61702)),"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",61702],a0410ab5:[()=>n.e(7843).then(n.t.bind(n,76970,19)),"~blog/default/tags-retrospective-page-7-3e2.json",76970],a1877440:[()=>n.e(7648).then(n.t.bind(n,23235,19)),"~blog/default/tags-async-326-list.json",23235],a1cea306:[()=>Promise.all([n.e(532),n.e(9537)]).then(n.bind(n,53179)),"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx?truncated=true",53179],a3dddb77:[()=>n.e(475).then(n.t.bind(n,5479,19)),"~blog/default/tags-java-page-4-c22.json",5479],a413785b:[()=>n.e(5142).then(n.bind(n,74236)),"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx?truncated=true",74236],a43f2942:[()=>n.e(104).then(n.bind(n,7894)),"@site/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8.mdx",7894],a4a1e915:[()=>n.e(3671).then(n.t.bind(n,60166,19)),"~blog/default/tags-retrospective-2fb-list.json",60166],a5557bb9:[()=>n.e(5991).then(n.t.bind(n,93885,19)),"~blog/default/index.json",93885],a571ae8c:[()=>n.e(1329).then(n.bind(n,7999)),"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",7999],a5b179f0:[()=>n.e(9761).then(n.bind(n,77971)),"@site/blog/2023/2023-03-30-GRASP.mdx?truncated=true",77971],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(8126),n.e(6048),n.e(3089)]).then(n.bind(n,80046)),"@theme/BlogListPage",80046],a85e626a:[()=>n.e(9092).then(n.t.bind(n,48458,19)),"~blog/default/tags-jdbc-4bd.json",48458],a896be03:[()=>n.e(2526).then(n.t.bind(n,64030,19)),"~blog/default/tags-woowahan-techcourse-page-6-429.json",64030],a9221bd5:[()=>n.e(5507).then(n.t.bind(n,40319,19)),"~blog/default/tags-inno-db-59e-list.json",40319],ab2128e5:[()=>n.e(7921).then(n.bind(n,55914)),"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx?truncated=true",55914],abb0816f:[()=>n.e(4174).then(n.t.bind(n,82969,19)),"~blog/default/tags-woowahan-techcourse-page-7-5bd-list.json",82969],abc83b7f:[()=>n.e(2215).then(n.t.bind(n,8412,19)),"~blog/default/tags-retrospective-page-2-e2b.json",8412],ac23d7ee:[()=>n.e(3213).then(n.t.bind(n,43943,19)),"~blog/default/tags-woowahan-techcourse-page-3-9a8-list.json",43943],ae1d6508:[()=>n.e(2181).then(n.t.bind(n,83486,19)),"~blog/default/tags-composite-240-list.json",83486],ae3384b2:[()=>n.e(2965).then(n.t.bind(n,15745,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],ae6a2dc6:[()=>n.e(7374).then(n.bind(n,98532)),"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",98532],af81a133:[()=>n.e(7787).then(n.t.bind(n,13800,19)),"~blog/default/tags-teco-chat-d21.json",13800],b1d2ea98:[()=>n.e(8533).then(n.bind(n,8767)),"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx?truncated=true",8767],b2b675dd:[()=>n.e(533).then(n.t.bind(n,28017,19)),"~blog/default/blog-c06.json",28017],b2e443b6:[()=>n.e(2901).then(n.bind(n,591)),"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",591],b393c858:[()=>n.e(9922).then(n.bind(n,47084)),"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",47084],b474adfe:[()=>n.e(573).then(n.t.bind(n,85419,19)),"~blog/default/tags-image-page-2-cc3-list.json",85419],b5f3dcc5:[()=>n.e(7723).then(n.t.bind(n,23005,19)),"~blog/default/tags-retrospective-page-15-26b-list.json",23005],b73048db:[()=>n.e(5912).then(n.bind(n,98838)),"@site/blog/2023/2023-02-12-Parameterized Tests.mdx?truncated=true",98838],b7811d78:[()=>n.e(7008).then(n.bind(n,46111)),"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",46111],b7d33121:[()=>n.e(7153).then(n.t.bind(n,72005,19)),"~blog/default/tags-cloudwatch-6c7.json",72005],b8de016f:[()=>n.e(7340).then(n.bind(n,5055)),"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx?truncated=true",5055],b9bcab37:[()=>n.e(7688).then(n.t.bind(n,43632,19)),"~blog/default/tags-grasp-418.json",43632],bbc01ba0:[()=>n.e(3009).then(n.t.bind(n,12333,19)),"~blog/default/tags-retrospective-page-10-4a6.json",12333],bbceb8f1:[()=>n.e(653).then(n.t.bind(n,26529,19)),"~blog/default/tags-woowahan-techcourse-page-5-ac5-list.json",26529],bd2d06b5:[()=>n.e(9763).then(n.t.bind(n,93081,19)),"~blog/default/tags-retrospective-page-3-ee4.json",93081],bf933b37:[()=>n.e(3095).then(n.t.bind(n,52954,19)),"~blog/default/tags-my-sql-46a-list.json",52954],c037d168:[()=>n.e(6587).then(n.t.bind(n,41235,19)),"~blog/default/tags-transaction-ea3-list.json",41235],c0a61fca:[()=>n.e(344).then(n.bind(n,95086)),"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",95086],c0cb7215:[()=>n.e(7966).then(n.t.bind(n,66109,19)),"~blog/default/tags-book-page-2-bc6-list.json",66109],c189d18f:[()=>n.e(4962).then(n.t.bind(n,3470,19)),"~docs/default/tag-docs-tags-etc-c52.json",3470],c29bedb9:[()=>n.e(9242).then(n.t.bind(n,44025,19)),"~blog/default/page-35-8fd.json",44025],c33ca104:[()=>n.e(5696).then(n.t.bind(n,88872,19)),"~docs/default/tag-docs-tags-pacakge-040.json",88872],c3ea66fe:[()=>n.e(6698).then(n.t.bind(n,63504,19)),"~blog/default/tags-isolation-79d.json",63504],c4f5d8e4:[()=>n.e(4195).then(n.bind(n,62841)),"@site/src/pages/index.js",62841],c55d205b:[()=>n.e(3438).then(n.bind(n,83859)),"@site/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4.mdx",83859],c573638f:[()=>n.e(964).then(n.t.bind(n,28866,19)),"~blog/default/tags-tags-c2b.json",28866],c6004f62:[()=>n.e(5892).then(n.t.bind(n,37567,19)),"~blog/default/tags-mock-330-list.json",37567],c60995f6:[()=>n.e(6199).then(n.t.bind(n,62474,19)),"~docs/default/tag-docs-tags-nginx-3b7.json",62474],c60ea0ff:[()=>n.e(3085).then(n.t.bind(n,14072,19)),"~blog/default/tags-teco-chat-page-2-d4f.json",14072],c7015929:[()=>n.e(4185).then(n.t.bind(n,910,19)),"~blog/default/tags-python-687.json",910],ccc49370:[()=>Promise.all([n.e(532),n.e(8126),n.e(6048),n.e(6103)]).then(n.bind(n,65203)),"@theme/BlogPostPage",65203],cf8e491a:[()=>n.e(5870).then(n.t.bind(n,19799,19)),"~blog/default/tags-awt-0e2.json",19799],d0277431:[()=>n.e(846).then(n.t.bind(n,4838,19)),"~blog/default/tags-dto-cb6-list.json",4838],d0840b01:[()=>n.e(8037).then(n.t.bind(n,20317,19)),"~blog/default/tags-transaction-ea3.json",20317],d09f7e4b:[()=>n.e(3098).then(n.t.bind(n,84057,19)),"~blog/default/tags-teco-chat-page-3-007-list.json",84057],d0e4cdf1:[()=>n.e(5465).then(n.t.bind(n,64020,19)),"~blog/default/page-7-3c3.json",64020],d126aabd:[()=>n.e(1675).then(n.t.bind(n,7220,19)),"~blog/default/tags-retrospective-page-4-3a3-list.json",7220],d1cef389:[()=>n.e(9310).then(n.t.bind(n,40836,19)),"~blog/default/page-17-62c.json",40836],d202e2c5:[()=>n.e(7175).then(n.t.bind(n,3395,19)),"~blog/default/tags-oop-03c-list.json",3395],d2770bf7:[()=>n.e(843).then(n.t.bind(n,41156,19)),"~blog/default/tags-woowahan-techcourse-page-11-6c9.json",41156],d2935d14:[()=>n.e(3259).then(n.t.bind(n,92158,19)),"~blog/default/tags-isolation-79d-list.json",92158],d297da14:[()=>Promise.all([n.e(532),n.e(7704)]).then(n.bind(n,44269)),"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",44269],d368e73e:[()=>n.e(7954).then(n.t.bind(n,71965,19)),"~blog/default/tags-image-97d-list.json",71965],d3752f11:[()=>n.e(4819).then(n.bind(n,78185)),"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",78185],d40f51e1:[()=>n.e(9633).then(n.t.bind(n,9415,19)),"~blog/default/tags-jdbc-4bd-list.json",9415],d50fd269:[()=>n.e(100).then(n.t.bind(n,38132,19)),"~blog/default/page-31-308.json",38132],d5dfecc2:[()=>n.e(1677).then(n.t.bind(n,83335,19)),"~blog/default/tags-teco-chat-page-2-d4f-list.json",83335],d693e23c:[()=>n.e(6697).then(n.bind(n,25397)),"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",25397],d6a3d698:[()=>n.e(2890).then(n.t.bind(n,39477,19)),"~blog/default/tags-image-page-3-942.json",39477],d6c08822:[()=>n.e(2678).then(n.bind(n,12099)),"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",12099],d86f7a37:[()=>n.e(3392).then(n.bind(n,10823)),"@site/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5.mdx",10823],d88bdb28:[()=>n.e(9788).then(n.t.bind(n,29417,19)),"~blog/default/tags-retrospective-page-13-49c.json",29417],dab4c683:[()=>n.e(6058).then(n.t.bind(n,67315,19)),"~blog/default/tags-woowahan-techcourse-page-3-9a8.json",67315],db7928b3:[()=>n.e(5046).then(n.t.bind(n,11478,19)),"~blog/default/tags-intelli-j-2bf-list.json",11478],dcf70953:[()=>n.e(1761).then(n.t.bind(n,83769,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],dcfccecb:[()=>n.e(5841).then(n.bind(n,22789)),"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",22789],ddf9e0bd:[()=>n.e(2542).then(n.t.bind(n,84039,19)),"~blog/default/tags-woowahan-techcourse-page-8-93a-list.json",84039],df203c0f:[()=>n.e(9924).then(n.bind(n,40491)),"@theme/DocTagDocListPage",40491],df862072:[()=>n.e(7474).then(n.t.bind(n,24827,19)),"~blog/default/tags-book-page-3-a93.json",24827],dfa84138:[()=>n.e(1434).then(n.t.bind(n,22483,19)),"~blog/default/tags-data-base-page-3-9db-list.json",22483],e073eb07:[()=>n.e(5819).then(n.t.bind(n,57743,19)),"~blog/default/tags-retrospective-page-11-e3c.json",57743],e0d68441:[()=>n.e(628).then(n.t.bind(n,75301,19)),"~blog/default/tags-retrospective-page-12-8cf-list.json",75301],e0e4666e:[()=>n.e(4665).then(n.t.bind(n,16482,19)),"~blog/default/tags-my-sql-46a.json",16482],e21c8cc4:[()=>n.e(6049).then(n.t.bind(n,48765,19)),"~blog/default/tags-retrospective-page-8-5ab.json",48765],e2de2dbb:[()=>n.e(6710).then(n.t.bind(n,47023,19)),"~blog/default/tags-java-page-5-b71.json",47023],e3a9c3a3:[()=>n.e(8855).then(n.bind(n,78729)),"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx?truncated=true",78729],e4ebfe18:[()=>n.e(9940).then(n.t.bind(n,57954,19)),"~blog/default/page-3-02e.json",57954],e5f297b0:[()=>n.e(4109).then(n.bind(n,55769)),"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx?truncated=true",55769],e7d2a655:[()=>n.e(8652).then(n.t.bind(n,71501,19)),"~blog/default/tags-woowahan-techcourse-page-2-567-list.json",71501],e8d6e7ce:[()=>n.e(3912).then(n.t.bind(n,65245,19)),"~blog/default/tags-retrospective-page-6-594.json",65245],e9624b4f:[()=>n.e(4564).then(n.t.bind(n,11780,19)),"~blog/default/tags-retrospective-page-13-49c-list.json",11780],e9ff60ad:[()=>n.e(2530).then(n.t.bind(n,10242,19)),"~blog/default/tags-pattern-b4e-list.json",10242],ee00b37a:[()=>n.e(63).then(n.bind(n,62860)),"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",62860],ee92877e:[()=>n.e(8716).then(n.t.bind(n,41106,19)),"~blog/default/tags-retrospective-page-5-22d.json",41106],eec33099:[()=>n.e(4953).then(n.t.bind(n,80133,19)),"~blog/default/page-40-397.json",80133],ef5b2427:[()=>n.e(9606).then(n.t.bind(n,50195,19)),"~blog/default/page-22-f33.json",50195],f042b56c:[()=>n.e(8919).then(n.t.bind(n,27490,19)),"~blog/default/tags-teco-chat-d21-list.json",27490],f078e301:[()=>n.e(1926).then(n.t.bind(n,18385,19)),"~blog/default/tags-woowahan-techcourse-page-6-429-list.json",18385],f0978ee1:[()=>n.e(7740).then(n.t.bind(n,69366,19)),"~blog/default/tags-awt-page-2-eb4.json",69366],f105176d:[()=>n.e(5094).then(n.bind(n,50861)),"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx?truncated=true",50861],f14eea08:[()=>n.e(9607).then(n.bind(n,20090)),"@site/blog/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131/2023-08-17-CloudWatch\ub97c \uc774\uc6a9\ud55c \ub85c\uae45, \uba54\ud2b8\ub9ad \ubaa8\ub2c8\ud130\ub9c1 \ud658\uacbd \uad6c\uc131.md?truncated=true",20090],f156dfb9:[()=>n.e(5602).then(n.t.bind(n,83311,19)),"~blog/default/tags-time-471.json",83311],f1783c84:[()=>n.e(7465).then(n.bind(n,28719)),"@site/blog/2023/2023-01-08-JSR-310.mdx?truncated=true",28719],f20d36f2:[()=>n.e(7689).then(n.bind(n,48036)),"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",48036],f2b7d1a9:[()=>n.e(2382).then(n.bind(n,56030)),"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",56030],f332d221:[()=>n.e(2717).then(n.t.bind(n,99371,19)),"~blog/default/page-10-857.json",99371],f3e308ad:[()=>n.e(6123).then(n.t.bind(n,16240,19)),"~blog/default/page-33-758.json",16240],f4c6e7e6:[()=>n.e(31).then(n.t.bind(n,77922,19)),"~docs/default/tag-docs-tags-book-8e4.json",77922],f4f49e13:[()=>n.e(6887).then(n.t.bind(n,26329,19)),"~blog/default/page-12-b6a.json",26329],f580a9d0:[()=>n.e(9887).then(n.t.bind(n,78989,19)),"~blog/default/tags-python-687-list.json",78989],f619e31e:[()=>n.e(5888).then(n.bind(n,55069)),"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",55069],f63a747b:[()=>n.e(5131).then(n.t.bind(n,81723,19)),"~blog/default/tags-woowahan-techcourse-page-7-5bd.json",81723],f75a8651:[()=>n.e(8882).then(n.t.bind(n,44633,19)),"~blog/default/page-8-8c2.json",44633],f8409a7e:[()=>n.e(3206).then(n.bind(n,69568)),"@site/docs/intro.mdx",69568],fbd57548:[()=>n.e(6837).then(n.t.bind(n,30990,19)),"~blog/default/page-11-f65.json",30990],fcb446a5:[()=>n.e(3440).then(n.bind(n,84425)),"@site/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815.md",84425],fd5d2408:[()=>n.e(3614).then(n.t.bind(n,64631,19)),"~blog/default/tags-time-471-list.json",64631],fd60e617:[()=>n.e(16).then(n.bind(n,80844)),"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",80844],fe273484:[()=>n.e(8355).then(n.t.bind(n,53034,19)),"~blog/default/tags-java-a6e-list.json",53034],fe8cce0a:[()=>n.e(955).then(n.t.bind(n,78535,19)),"~blog/default/tags-intelli-j-2bf.json",78535],fed8bc04:[()=>n.e(8110).then(n.t.bind(n,96375,19)),"~blog/default/tags-woowahan-techcourse-page-5-ac5.json",96375],ffb0fa11:[()=>n.e(7400).then(n.t.bind(n,58214,19)),"~blog/default/tags-book-page-3-a93-list.json",58214]};function c(e){let{error:t,retry:n,pastDelay:r}=e;return t?a.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},a.createElement("p",null,String(t)),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},"Retry"))):r?a.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},a.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},a.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"8"},a.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(99670),d=n(30226);function f(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return a.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},a.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],g=[],m=(0,u.Z)(o);return Object.entries(m).forEach((e=>{let[t,n]=e;const a=s[n];a&&(f[t]=a[0],p.push(a[1]),g.push(a[2]))})),i().Map({loading:c,loader:f,modules:p,webpack:()=>g,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,a]=t;const r=a.default;if(!r)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof r&&"function"!=typeof r||Object.keys(a).filter((e=>"default"!==e)).forEach((e=>{r[e]=a[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=r}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,a.createElement(d.z,{value:s},a.createElement(l,(0,r.Z)({},i,n)))}})}const p=[{path:"/1",component:f("/1","fe7"),exact:!0},{path:"/10",component:f("/10","440"),exact:!0},{path:"/11",component:f("/11","74a"),exact:!0},{path:"/12",component:f("/12","0c3"),exact:!0},{path:"/13",component:f("/13","bf5"),exact:!0},{path:"/14",component:f("/14","f02"),exact:!0},{path:"/15",component:f("/15","e52"),exact:!0},{path:"/16",component:f("/16","b3b"),exact:!0},{path:"/17",component:f("/17","cc2"),exact:!0},{path:"/18",component:f("/18","a45"),exact:!0},{path:"/19",component:f("/19","e8b"),exact:!0},{path:"/2",component:f("/2","4be"),exact:!0},{path:"/20",component:f("/20","2a7"),exact:!0},{path:"/21",component:f("/21","794"),exact:!0},{path:"/22",component:f("/22","8d6"),exact:!0},{path:"/23",component:f("/23","8a8"),exact:!0},{path:"/24",component:f("/24","312"),exact:!0},{path:"/25",component:f("/25","922"),exact:!0},{path:"/26",component:f("/26","5fd"),exact:!0},{path:"/27",component:f("/27","a34"),exact:!0},{path:"/28",component:f("/28","203"),exact:!0},{path:"/29",component:f("/29","784"),exact:!0},{path:"/3",component:f("/3","cf7"),exact:!0},{path:"/30",component:f("/30","9f7"),exact:!0},{path:"/31",component:f("/31","20a"),exact:!0},{path:"/32",component:f("/32","fa9"),exact:!0},{path:"/33",component:f("/33","e77"),exact:!0},{path:"/34",component:f("/34","58f"),exact:!0},{path:"/35",component:f("/35","481"),exact:!0},{path:"/36",component:f("/36","827"),exact:!0},{path:"/37",component:f("/37","559"),exact:!0},{path:"/38",component:f("/38","068"),exact:!0},{path:"/39",component:f("/39","820"),exact:!0},{path:"/4",component:f("/4","dd9"),exact:!0},{path:"/40",component:f("/40","b09"),exact:!0},{path:"/41",component:f("/41","e92"),exact:!0},{path:"/5",component:f("/5","b35"),exact:!0},{path:"/6",component:f("/6","5d9"),exact:!0},{path:"/7",component:f("/7","374"),exact:!0},{path:"/8",component:f("/8","274"),exact:!0},{path:"/9",component:f("/9","2e9"),exact:!0},{path:"/blog",component:f("/blog","3d8"),exact:!0},{path:"/docs/tags",component:f("/docs/tags","820"),exact:!0},{path:"/docs/tags/book",component:f("/docs/tags/book","c20"),exact:!0},{path:"/docs/tags/etc",component:f("/docs/tags/etc","338"),exact:!0},{path:"/docs/tags/jpa",component:f("/docs/tags/jpa","f95"),exact:!0},{path:"/docs/tags/monitoring",component:f("/docs/tags/monitoring","50f"),exact:!0},{path:"/docs/tags/nginx",component:f("/docs/tags/nginx","ecc"),exact:!0},{path:"/docs/tags/pacakge",component:f("/docs/tags/pacakge","c10"),exact:!0},{path:"/docs/tags/postmortem",component:f("/docs/tags/postmortem","4b0"),exact:!0},{path:"/docs/tags/test",component:f("/docs/tags/test","b58"),exact:!0},{path:"/page/10",component:f("/page/10","df1"),exact:!0},{path:"/page/11",component:f("/page/11","6d9"),exact:!0},{path:"/page/12",component:f("/page/12","4e5"),exact:!0},{path:"/page/13",component:f("/page/13","80b"),exact:!0},{path:"/page/14",component:f("/page/14","684"),exact:!0},{path:"/page/15",component:f("/page/15","902"),exact:!0},{path:"/page/16",component:f("/page/16","528"),exact:!0},{path:"/page/17",component:f("/page/17","e48"),exact:!0},{path:"/page/18",component:f("/page/18","324"),exact:!0},{path:"/page/19",component:f("/page/19","b8e"),exact:!0},{path:"/page/2",component:f("/page/2","2ae"),exact:!0},{path:"/page/20",component:f("/page/20","502"),exact:!0},{path:"/page/21",component:f("/page/21","a21"),exact:!0},{path:"/page/22",component:f("/page/22","d46"),exact:!0},{path:"/page/23",component:f("/page/23","48f"),exact:!0},{path:"/page/24",component:f("/page/24","01f"),exact:!0},{path:"/page/25",component:f("/page/25","b54"),exact:!0},{path:"/page/26",component:f("/page/26","c6a"),exact:!0},{path:"/page/27",component:f("/page/27","2d5"),exact:!0},{path:"/page/28",component:f("/page/28","62f"),exact:!0},{path:"/page/29",component:f("/page/29","bbe"),exact:!0},{path:"/page/3",component:f("/page/3","11c"),exact:!0},{path:"/page/30",component:f("/page/30","d73"),exact:!0},{path:"/page/31",component:f("/page/31","b8d"),exact:!0},{path:"/page/32",component:f("/page/32","140"),exact:!0},{path:"/page/33",component:f("/page/33","d53"),exact:!0},{path:"/page/34",component:f("/page/34","03f"),exact:!0},{path:"/page/35",component:f("/page/35","53e"),exact:!0},{path:"/page/36",component:f("/page/36","485"),exact:!0},{path:"/page/37",component:f("/page/37","6c4"),exact:!0},{path:"/page/38",component:f("/page/38","dd7"),exact:!0},{path:"/page/39",component:f("/page/39","32f"),exact:!0},{path:"/page/4",component:f("/page/4","2d9"),exact:!0},{path:"/page/40",component:f("/page/40","5c4"),exact:!0},{path:"/page/41",component:f("/page/41","ee3"),exact:!0},{path:"/page/5",component:f("/page/5","0b6"),exact:!0},{path:"/page/6",component:f("/page/6","2f0"),exact:!0},{path:"/page/7",component:f("/page/7","0b3"),exact:!0},{path:"/page/8",component:f("/page/8","ab4"),exact:!0},{path:"/page/9",component:f("/page/9","94f"),exact:!0},{path:"/search",component:f("/search","c1e"),exact:!0},{path:"/tags",component:f("/tags","4bf"),exact:!0},{path:"/tags/async",component:f("/tags/async","1a2"),exact:!0},{path:"/tags/awt",component:f("/tags/awt","f0a"),exact:!0},{path:"/tags/awt/page/2",component:f("/tags/awt/page/2","284"),exact:!0},{path:"/tags/book",component:f("/tags/book","909"),exact:!0},{path:"/tags/book/page/2",component:f("/tags/book/page/2","989"),exact:!0},{path:"/tags/book/page/3",component:f("/tags/book/page/3","a75"),exact:!0},{path:"/tags/class",component:f("/tags/class","3ca"),exact:!0},{path:"/tags/cloudwatch",component:f("/tags/cloudwatch","4e0"),exact:!0},{path:"/tags/composite",component:f("/tags/composite","737"),exact:!0},{path:"/tags/data-base",component:f("/tags/data-base","ab7"),exact:!0},{path:"/tags/data-base/page/2",component:f("/tags/data-base/page/2","f0a"),exact:!0},{path:"/tags/data-base/page/3",component:f("/tags/data-base/page/3","f63"),exact:!0},{path:"/tags/documentation",component:f("/tags/documentation","989"),exact:!0},{path:"/tags/dto",component:f("/tags/dto","a68"),exact:!0},{path:"/tags/elastic-beanstalk",component:f("/tags/elastic-beanstalk","a4b"),exact:!0},{path:"/tags/event",component:f("/tags/event","6b5"),exact:!0},{path:"/tags/grasp",component:f("/tags/grasp","efe"),exact:!0},{path:"/tags/image",component:f("/tags/image","7cc"),exact:!0},{path:"/tags/image/page/2",component:f("/tags/image/page/2","3e2"),exact:!0},{path:"/tags/image/page/3",component:f("/tags/image/page/3","bcb"),exact:!0},{path:"/tags/inno-db",component:f("/tags/inno-db","ea2"),exact:!0},{path:"/tags/intelli-j",component:f("/tags/intelli-j","0f1"),exact:!0},{path:"/tags/isolation",component:f("/tags/isolation","869"),exact:!0},{path:"/tags/java",component:f("/tags/java","75d"),exact:!0},{path:"/tags/java/page/2",component:f("/tags/java/page/2","e04"),exact:!0},{path:"/tags/java/page/3",component:f("/tags/java/page/3","fb9"),exact:!0},{path:"/tags/java/page/4",component:f("/tags/java/page/4","de0"),exact:!0},{path:"/tags/java/page/5",component:f("/tags/java/page/5","6c2"),exact:!0},{path:"/tags/jdbc",component:f("/tags/jdbc","c84"),exact:!0},{path:"/tags/jenkins",component:f("/tags/jenkins","9e9"),exact:!0},{path:"/tags/kotlin",component:f("/tags/kotlin","27e"),exact:!0},{path:"/tags/lock",component:f("/tags/lock","092"),exact:!0},{path:"/tags/lock/page/2",component:f("/tags/lock/page/2","cc1"),exact:!0},{path:"/tags/log",component:f("/tags/log","e50"),exact:!0},{path:"/tags/mock",component:f("/tags/mock","31b"),exact:!0},{path:"/tags/mockito",component:f("/tags/mockito","60c"),exact:!0},{path:"/tags/monitoring",component:f("/tags/monitoring","32c"),exact:!0},{path:"/tags/my-sql",component:f("/tags/my-sql","c5a"),exact:!0},{path:"/tags/oop",component:f("/tags/oop","544"),exact:!0},{path:"/tags/pattern",component:f("/tags/pattern","433"),exact:!0},{path:"/tags/python",component:f("/tags/python","5b4"),exact:!0},{path:"/tags/retrospective",component:f("/tags/retrospective","5d6"),exact:!0},{path:"/tags/retrospective/page/10",component:f("/tags/retrospective/page/10","581"),exact:!0},{path:"/tags/retrospective/page/11",component:f("/tags/retrospective/page/11","be6"),exact:!0},{path:"/tags/retrospective/page/12",component:f("/tags/retrospective/page/12","2c3"),exact:!0},{path:"/tags/retrospective/page/13",component:f("/tags/retrospective/page/13","5eb"),exact:!0},{path:"/tags/retrospective/page/14",component:f("/tags/retrospective/page/14","d3f"),exact:!0},{path:"/tags/retrospective/page/15",component:f("/tags/retrospective/page/15","4e0"),exact:!0},{path:"/tags/retrospective/page/2",component:f("/tags/retrospective/page/2","120"),exact:!0},{path:"/tags/retrospective/page/3",component:f("/tags/retrospective/page/3","ac5"),exact:!0},{path:"/tags/retrospective/page/4",component:f("/tags/retrospective/page/4","ae9"),exact:!0},{path:"/tags/retrospective/page/5",component:f("/tags/retrospective/page/5","57b"),exact:!0},{path:"/tags/retrospective/page/6",component:f("/tags/retrospective/page/6","080"),exact:!0},{path:"/tags/retrospective/page/7",component:f("/tags/retrospective/page/7","a0b"),exact:!0},{path:"/tags/retrospective/page/8",component:f("/tags/retrospective/page/8","8f0"),exact:!0},{path:"/tags/retrospective/page/9",component:f("/tags/retrospective/page/9","e54"),exact:!0},{path:"/tags/spring",component:f("/tags/spring","5ac"),exact:!0},{path:"/tags/spring-boot",component:f("/tags/spring-boot","9b9"),exact:!0},{path:"/tags/static",component:f("/tags/static","0f7"),exact:!0},{path:"/tags/teco-chat",component:f("/tags/teco-chat","789"),exact:!0},{path:"/tags/teco-chat/page/2",component:f("/tags/teco-chat/page/2","bb6"),exact:!0},{path:"/tags/teco-chat/page/3",component:f("/tags/teco-chat/page/3","c60"),exact:!0},{path:"/tags/test",component:f("/tags/test","900"),exact:!0},{path:"/tags/time",component:f("/tags/time","667"),exact:!0},{path:"/tags/transaction",component:f("/tags/transaction","a90"),exact:!0},{path:"/tags/web-socket",component:f("/tags/web-socket","852"),exact:!0},{path:"/tags/woowahan-techcourse",component:f("/tags/woowahan-techcourse","83c"),exact:!0},{path:"/tags/woowahan-techcourse/page/10",component:f("/tags/woowahan-techcourse/page/10","d7f"),exact:!0},{path:"/tags/woowahan-techcourse/page/11",component:f("/tags/woowahan-techcourse/page/11","6ea"),exact:!0},{path:"/tags/woowahan-techcourse/page/2",component:f("/tags/woowahan-techcourse/page/2","ae2"),exact:!0},{path:"/tags/woowahan-techcourse/page/3",component:f("/tags/woowahan-techcourse/page/3","a3b"),exact:!0},{path:"/tags/woowahan-techcourse/page/4",component:f("/tags/woowahan-techcourse/page/4","2ef"),exact:!0},{path:"/tags/woowahan-techcourse/page/5",component:f("/tags/woowahan-techcourse/page/5","06b"),exact:!0},{path:"/tags/woowahan-techcourse/page/6",component:f("/tags/woowahan-techcourse/page/6","046"),exact:!0},{path:"/tags/woowahan-techcourse/page/7",component:f("/tags/woowahan-techcourse/page/7","7e9"),exact:!0},{path:"/tags/woowahan-techcourse/page/8",component:f("/tags/woowahan-techcourse/page/8","c0b"),exact:!0},{path:"/tags/woowahan-techcourse/page/9",component:f("/tags/woowahan-techcourse/page/9","d99"),exact:!0},{path:"/docs",component:f("/docs","71c"),routes:[{path:"/docs",component:f("/docs","818"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",component:f("/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","8a6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",component:f("/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","594"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",component:f("/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","90a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",component:f("/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30","ec3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",component:f("/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","1b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",component:f("/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815","c04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",component:f("/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815","9d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",component:f("/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","94d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",component:f("/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","644"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0",component:f("/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0","f6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",component:f("/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","bef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",component:f("/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","06a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",component:f("/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","c2c"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/",component:f("/","3ce"),exact:!0},{path:"/",component:f("/","adc"),exact:!0},{path:"*",component:f("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,t:()=>o});var a=n(67294);const r=a.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{o(!0)}),[]),a.createElement(r.Provider,{value:n},t)}},49383:(e,t,n)=>{"use strict";var a=n(67294),r=n(73935),o=n(73727),i=n(70405),l=n(10412);const s=[n(56657),n(32497),n(3310),n(18320),n(52295)];var c=n(723),u=n(16550),d=n(18790);function f(e){let{children:t}=e;return a.createElement(a.Fragment,null,t)}var p=n(87462),g=n(35742),m=n(52263),h=n(44996),b=n(86668),v=n(10833),y=n(94711),_=n(19727),w=n(43320),k=n(90197);function x(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,m.Z)(),n=(0,y.l)();return a.createElement(g.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:r}]=e;return a.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:r})})),a.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),r=function(){const{siteConfig:{url:e}}=(0,m.Z)(),{pathname:t}=(0,u.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:r;return a.createElement(g.Z,null,a.createElement("meta",{property:"og:url",content:o}),a.createElement("link",{rel:"canonical",href:o}))}function S(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return a.createElement(a.Fragment,null,a.createElement(g.Z,null,a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("body",{className:_.h})),n&&a.createElement(v.d,{image:n}),a.createElement(E,null),a.createElement(x,null),a.createElement(k.Z,{tag:w.HX,locale:e}),a.createElement(g.Z,null,t.map(((e,t)=>a.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function C(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(98934),L=n(58940);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];const r=s.map((t=>(t.default?.[e]??t[e])?.(...n)));return()=>r.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,a.useLayoutEffect)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const a=t.pathname===n.pathname,r=t.hash===n.hash,o=t.search===n.search;if(a&&r&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1));document.getElementById(e)?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends a.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return a.createElement(N,{previousLocation:this.previousLocation,location:t},a.createElement(u.AW,{location:t,render:()=>e}))}}const I=R,M="docusaurus-base-url-issue-banner-container",j="docusaurus-base-url-issue-banner-suggestion-container",D="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${D}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${D}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseurl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${j}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${j}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function F(){const{siteConfig:{baseUrl:e}}=(0,m.Z)();return(0,a.useLayoutEffect)((()=>{window[D]=!1}),[]),a.createElement(a.Fragment,null,!l.Z.canUseDOM&&a.createElement(g.Z,null,a.createElement("script",null,B(e))),a.createElement("div",{id:M}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?a.createElement(F,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,m.Z)(),i=(0,h.Z)(e),{htmlLang:l,direction:s}=o[r];return a.createElement(g.Z,null,a.createElement("html",{lang:l,dir:s}),a.createElement("title",null,t),a.createElement("meta",{property:"og:title",content:t}),a.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&a.createElement("link",{rel:"icon",href:i}))}var z=n(44763);function Z(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return a.createElement(z.Z,null,a.createElement(L.M,null,a.createElement(A.t,null,a.createElement(f,null,a.createElement(U,null),a.createElement(S,null),a.createElement($,null),a.createElement(I,{location:C(t)},e)))))}var H=n(16887);const V=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();(document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode)?.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const a=new XMLHttpRequest;a.open("GET",e,!0),a.withCredentials=!0,a.onload=()=>{200===a.status?t():n()},a.send(null)}))};var W=n(99670);const G=new Set,q=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Y={prefetch(e){if(!(e=>!K()&&!q.has(e)&&!G.has(e))(e))return!1;G.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(H).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,W.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?V(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!q.has(e))(e)&&(q.add(e),O(e))},Q=Object.freeze(Y);if(l.Z.canUseDOM){window.docusaurus=Q;const e=r.hydrate;O(window.location.pathname).then((()=>{e(a.createElement(i.B6,null,a.createElement(o.VK,null,a.createElement(Z,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var a=n(67294),r=n(36809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":"G-17TREGCW4H","anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"intro","docs":[{"id":"intro","path":"/docs/","sidebar":"tutorialSidebar"},{"id":"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","path":"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","sidebar":"tutorialSidebar"},{"id":"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","path":"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","sidebar":"tutorialSidebar"},{"id":"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","path":"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","sidebar":"tutorialSidebar"},{"id":"\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30","path":"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30","sidebar":"tutorialSidebar"},{"id":"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","path":"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","sidebar":"tutorialSidebar"},{"id":"\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815","path":"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815","sidebar":"tutorialSidebar"},{"id":"\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815","path":"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815","sidebar":"tutorialSidebar"},{"id":"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","path":"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","sidebar":"tutorialSidebar"},{"id":"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","path":"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","sidebar":"tutorialSidebar"},{"id":"\uc124\uacc4/\ud328\ud0a4\uc9c0","path":"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0","sidebar":"tutorialSidebar"},{"id":"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","path":"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","sidebar":"tutorialSidebar"},{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","path":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","sidebar":"tutorialSidebar"},{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","path":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","label":"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"ko","locales":["ko"],"path":"i18n","currentLocale":"ko","localeConfigs":{"ko":{"label":"\ud55c\uad6d\uc5b4","direction":"ltr","htmlLang":"ko","calendar":"gregory","path":"ko"}}}');var l=n(57529);const s=JSON.parse('{"docusaurusVersion":"2.3.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.3.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.3.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.3.0"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.3.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.3.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.3.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.3.0"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.3.0"}}}'),c={siteConfig:r.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=a.createContext(c);function d(e){let{children:t}=e;return a.createElement(u.Provider,{value:c},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(67294),r=n(10412),o=n(35742),i=n(54774);function l(e){let{error:t,tryAgain:n}=e;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},a.createElement("h1",null,"This page crashed."),a.createElement("p",null,t.message),a.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return a.createElement(u,{fallback:()=>a.createElement(l,{error:t,tryAgain:n})},a.createElement(o.Z,null,a.createElement("title",null,"Page Error")),a.createElement(i.Z,null,a.createElement(l,{error:t,tryAgain:n})))}const c=e=>a.createElement(s,e);class u extends a.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){r.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??c)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const a="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,r={canUseDOM:a,canUseEventListeners:a&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:a&&"IntersectionObserver"in window,canUseViewport:a&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(70405);function o(e){return a.createElement(r.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(87462),r=n(67294),o=n(73727),i=n(18780),l=n(52263),s=n(13919),c=n(10412);const u=r.createContext({collectLink:()=>{}});var d=n(44996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:_}}=(0,l.Z)(),{withBaseUrl:w}=(0,d.C)(),k=(0,r.useContext)(u),x=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>x.current));const E=f||p;const S=(0,s.Z)(E),T=E?.replace("pathname://","");let C=void 0!==T?(A=T,b&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;C&&S&&(C=(0,i.applyTrailingSlash)(C,{trailingSlash:y,baseUrl:_}));const L=(0,r.useRef)(!1),P=n?o.OL:o.rU,N=c.Z.canUseIntersectionObserver,O=(0,r.useRef)(),R=()=>{L.current||null==C||(window.docusaurus.preload(C),L.current=!0)};(0,r.useEffect)((()=>(!N&&S&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&O.current&&O.current.disconnect()})),[O,C,N,S]);const I=C?.startsWith("#")??!1,M=!C||!S||I;return M||h||k.collectLink(C),M?r.createElement("a",(0,a.Z)({ref:x,href:C},E&&!S&&{target:"_blank",rel:"noopener noreferrer"},v)):r.createElement(P,(0,a.Z)({},v,{onMouseEnter:R,onTouchStart:R,innerRef:e=>{x.current=e,N&&e&&S&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),O.current.observe(e))},to:C},n&&{isActive:m,activeClassName:g}))}const p=r.forwardRef(f)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var a=n(67294);function r(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,a.isValidElement)(e)))?n.map(((e,t)=>(0,a.isValidElement)(e)?a.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(57529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:a}=e;return r(i({message:n,id:a}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const l=i({message:t,id:n});return a.createElement(a.Fragment,null,r(l,o))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>a});const a="default"},13919:(e,t,n)=>{"use strict";function a(e){return/^(?:\w*:|\/\/)/.test(e)}function r(e){return void 0!==e&&!a(e)}n.d(t,{Z:()=>r,b:()=>a})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var a=n(67294),r=n(52263),o=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)(),n=(0,a.useCallback)(((n,a)=>function(e,t,n,a){let{forcePrependBaseUrl:r=!1,absolute:i=!1}=void 0===a?{}:a;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,a)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(58940);function o(){return(0,a.useContext)(r._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(98934);function o(){return(0,a.useContext)(r._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[r,o]=n;const i=a?`${a}.${r}`:r;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,z:()=>o});var a=n(67294);const r=a.createContext(null);function o(e){let{children:t,value:n}=e;const o=a.useContext(r),i=(0,a.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const a={...t.data,...n?.data};return{plugin:t.plugin,data:a}}({parent:o,value:n})),[o,n]);return a.createElement(r.Provider,{value:i},t)}},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>g,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>h,gB:()=>m});var a=n(16550),r=n(52263),o=n(29935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,a.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),r=n?.docs.find((e=>!!(0,a.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:r,alternateDocVersions:r?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((a=>{a.id===t&&(n[e.name]=a)}))})),n}(r.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const a=i(e)?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,a.TH)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,a.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function g(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,a.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function m(e){return f(e).versions}function h(e){const t=f(e);return l(t)}function b(e){const t=f(e),{pathname:n}=(0,a.TH)();return c(t,n)}function v(e){const t=f(e),{pathname:n}=(0,a.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},56657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});const a={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var a=n(74865),r=n.n(a);r().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{r().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){r().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var a=n(87410),r=n(36809);!function(e){const{themeConfig:{prism:t}}=r.default,{additionalLanguages:a}=t;globalThis.Prism=e,a.forEach((e=>{n(52811)(`./prism-${e}`)})),delete globalThis.Prism}(a.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294);const r="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return a.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r},a.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},54774:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ct});var a=n(67294),r=n(86010),o=n(44763),i=n(10833),l=n(87462),s=n(16550),c=n(95999),u=n(85936);const d="docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,a.useRef)(null),{action:t}=(0,s.k6)(),n=(0,a.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.S)((n=>{let{location:a}=n;e.current&&!a.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=p();return a.createElement("div",{ref:n,role:"region","aria-label":g},a.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:r}),t))}var h=n(35281),b=n(19727);const v="skipToContent_fXgn";function y(){return a.createElement(m,{className:v})}var _=n(86668),w=n(59689);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return a.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),a.createElement("g",{stroke:r,strokeWidth:o},a.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const x="closeButton_CVFx";function E(e){return a.createElement("button",(0,l.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,r.Z)("clean-btn close",x,e.className)}),a.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const S="content_knG7";function T(e){const{announcementBar:t}=(0,_.L)(),{content:n}=t;return a.createElement("div",(0,l.Z)({},e,{className:(0,r.Z)(S,e.className),dangerouslySetInnerHTML:{__html:n}}))}const C="announcementBar_mb4j",A="announcementBarPlaceholder_vyr4",L="announcementBarClose_gvF7",P="announcementBarContent_xLdY";function N(){const{announcementBar:e}=(0,_.L)(),{isActive:t,close:n}=(0,w.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:i}=e;return a.createElement("div",{className:C,style:{backgroundColor:r,color:o},role:"banner"},i&&a.createElement("div",{className:A}),a.createElement(T,{className:P}),i&&a.createElement(E,{onClick:n,className:L}))}var O=n(93163),R=n(12466);var I=n(902),M=n(13102);const j=a.createContext(null);function D(e){let{children:t}=e;const n=function(){const e=(0,O.e)(),t=(0,M.HY)(),[n,r]=(0,a.useState)(!1),o=null!==t.component,i=(0,I.D9)(o);return(0,a.useEffect)((()=>{o&&!i&&r(!0)}),[o,i]),(0,a.useEffect)((()=>{o?e.shown||r(!0):r(!1)}),[e.shown,o]),(0,a.useMemo)((()=>[n,r]),[n])}();return a.createElement(j.Provider,{value:n},t)}function B(e){if(e.component){const t=e.component;return a.createElement(t,e.props)}}function F(){const e=(0,a.useContext)(j);if(!e)throw new I.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,r=(0,a.useCallback)((()=>n(!1)),[n]),o=(0,M.HY)();return(0,a.useMemo)((()=>({shown:t,hide:r,content:B(o)})),[r,o,t])}function $(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=F();return a.createElement("div",{className:"navbar-sidebar"},t,a.createElement("div",{className:(0,r.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},a.createElement("div",{className:"navbar-sidebar__item menu"},n),a.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var U=n(92949),z=n(72389);function Z(e){return a.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function H(e){return a.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const V={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function W(e){let{className:t,value:n,onChange:o}=e;const i=(0,z.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return a.createElement("div",{className:(0,r.Z)(V.toggle,t)},a.createElement("button",{className:(0,r.Z)("clean-btn",V.toggleButton,!i&&V.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},a.createElement(Z,{className:(0,r.Z)(V.toggleIcon,V.lightToggleIcon)}),a.createElement(H,{className:(0,r.Z)(V.toggleIcon,V.darkToggleIcon)})))}const G=a.memo(W);function q(e){let{className:t}=e;const n=(0,_.L)().colorMode.disableSwitch,{colorMode:r,setColorMode:o}=(0,U.I)();return n?null:a.createElement(G,{className:t,value:r,onChange:o})}var K=n(21327);function Y(){return a.createElement(K.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,O.e)();return a.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},a.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function X(){return a.createElement("div",{className:"navbar-sidebar__brand"},a.createElement(Y,null),a.createElement(q,{className:"margin-right--md"}),a.createElement(Q,null))}var J=n(39960),ee=n(44996),te=n(13919),ne=n(98022),ae=n(39471);function re(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:i,html:s,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const f=(0,ee.Z)(r),p=(0,ee.Z)(t),g=(0,ee.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,te.Z)(o),h=s?{dangerouslySetInnerHTML:{__html:s}}:{children:a.createElement(a.Fragment,null,i,m&&a.createElement(ae.Z,c&&{width:12,height:12}))};return o?a.createElement(J.Z,(0,l.Z)({href:u?g:o},d,h)):a.createElement(J.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ne.F)(n,t.pathname):t.pathname.startsWith(p)},d,h))}function oe(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=a.createElement(re,(0,l.Z)({className:(0,r.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?a.createElement("li",null,i):i}function ie(e){let{className:t,isDropdownItem:n,...o}=e;return a.createElement("li",{className:"menu__list-item"},a.createElement(re,(0,l.Z)({className:(0,r.Z)("menu__link",t)},o)))}function le(e){let{mobile:t=!1,position:n,...r}=e;const o=t?ie:oe;return a.createElement(o,(0,l.Z)({},r,{activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var se=n(86043),ce=n(48596),ue=n(52263);function de(e,t){return e.some((e=>function(e,t){return!!(0,ce.Mg)(e.to,t)||!!(0,ne.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function fe(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const c=(0,a.useRef)(null),[u,d]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[c]),a.createElement("div",{ref:c,className:(0,r.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},a.createElement(re,(0,l.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,r.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),s.children??s.label),a.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>a.createElement(Ve,(0,l.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=c.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function pe(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,ue.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=de(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,se.u)({initialState:()=>!d});return(0,a.useEffect)((()=>{d&&g(!d)}),[u,d,g]),a.createElement("li",{className:(0,r.Z)("menu__list-item",{"menu__list-item--collapsed":f})},a.createElement(re,(0,l.Z)({role:"button",className:(0,r.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),p()}}),c.children??c.label),a.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>a.createElement(Ve,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function ge(e){let{mobile:t=!1,...n}=e;const r=t?pe:fe;return a.createElement(r,n)}var me=n(94711);function he(e){let{width:t=20,height:n=20,...r}=e;return a.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},r),a.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const be="iconLanguage_nlXk";function ve(){return a.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},a.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ye=n(20830),_e=["translations"];function we(){return we=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},we.apply(this,arguments)}function ke(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var a,r,o=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(a=n.next()).done)&&(o.push(a.value),!t||o.length!==t);i=!0);}catch(s){l=!0,r=s}finally{try{i||null==n.return||n.return()}finally{if(l)throw r}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return xe(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return xe(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function xe(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n<t;n++)a[n]=e[n];return a}function Ee(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var Se="Ctrl";var Te=a.forwardRef((function(e,t){var n=e.translations,r=void 0===n?{}:n,o=Ee(e,_e),i=r.buttonText,l=void 0===i?"Search":i,s=r.buttonAriaLabel,c=void 0===s?"Search":s,u=ke((0,a.useState)(null),2),d=u[0],f=u[1];return(0,a.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Se))}),[]),a.createElement("button",we({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),a.createElement("span",{className:"DocSearch-Button-Container"},a.createElement(ye.W,null),a.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),a.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&a.createElement(a.Fragment,null,a.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?a.createElement(ve,null):d),a.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Ce=n(35742),Ae=n(66177),Le=n(239),Pe=n(43320);var Ne=n(73935);const Oe={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Re=null;function Ie(e){let{hit:t,children:n}=e;return a.createElement(J.Z,{to:t.url},n)}function Me(e){let{state:t,onClose:n}=e;const{generateSearchPageLink:r}=(0,Ae.O)();return a.createElement(J.Z,{to:r(t.query),onClick:n},a.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function je(e){let{contextualSearch:t,externalUrlRegex:r,...o}=e;const{siteMetadata:i}=(0,ue.Z)(),c=(0,Le.l)(),u=function(){const{locale:e,tags:t}=(0,Pe._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,p={...o.searchParameters,facetFilters:f},g=(0,s.k6)(),m=(0,a.useRef)(null),h=(0,a.useRef)(null),[b,v]=(0,a.useState)(!1),[y,_]=(0,a.useState)(void 0),w=(0,a.useCallback)((()=>Re?Promise.resolve():Promise.all([n.e(6780).then(n.bind(n,76780)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,46945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,18894))]).then((e=>{let[{DocSearchModal:t}]=e;Re=t}))),[]),k=(0,a.useCallback)((()=>{w().then((()=>{m.current=document.createElement("div"),document.body.insertBefore(m.current,document.body.firstChild),v(!0)}))}),[w,v]),x=(0,a.useCallback)((()=>{v(!1),m.current?.remove()}),[v]),E=(0,a.useCallback)((e=>{w().then((()=>{v(!0),_(e.key)}))}),[w,v,_]),S=(0,a.useRef)({navigate(e){let{itemUrl:t}=e;(0,ne.F)(r,t)?window.location.href=t:g.push(t)}}).current,T=(0,a.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:c(e.url)}))))).current,C=(0,a.useMemo)((()=>e=>a.createElement(Me,(0,l.Z)({},e,{onClose:x}))),[x]),A=(0,a.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,r=e.onClose,o=e.onInput,i=e.searchButtonRef;a.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?r():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,r,o,i])}({isOpen:b,onOpen:k,onClose:x,onInput:E,searchButtonRef:h}),a.createElement(a.Fragment,null,a.createElement(Ce.Z,null,a.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),a.createElement(Te,{onTouchStart:w,onFocus:w,onMouseOver:w,onClick:k,ref:h,translations:Oe.button}),b&&Re&&m.current&&(0,Ne.createPortal)(a.createElement(Re,(0,l.Z)({onClose:x,initialScrollY:window.scrollY,initialQuery:y,navigator:S,transformItems:T,hitComponent:Ie,transformSearchClient:A},o.searchPagePath&&{resultsFooterComponent:C},o,{searchParameters:p,placeholder:Oe.placeholder,translations:Oe.modal})),m.current))}function De(){const{siteConfig:e}=(0,ue.Z)();return a.createElement(je,e.themeConfig.algolia)}const Be="searchBox_ZlJk";function Fe(e){let{children:t,className:n}=e;return a.createElement("div",{className:(0,r.Z)(n,Be)},t)}var $e=n(80143),Ue=n(53438);var ze=n(60373);const Ze=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:le,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,ue.Z)(),f=(0,me.l)(),{search:p,hash:g}=(0,s.TH)(),m=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return a.createElement(ge,(0,l.Z)({},o,{mobile:t,label:a.createElement(a.Fragment,null,a.createElement(he,{className:be}),h),items:m}))},search:function(e){let{mobile:t,className:n}=e;return t?null:a.createElement(Fe,{className:n},a.createElement(De,null))},dropdown:ge,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return a.createElement(l,{className:(0,r.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:i}=(0,$e.Iw)(r),s=(0,Ue.vY)(t,r);return null===s?null:a.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:i}=(0,$e.Iw)(r),s=(0,Ue.oz)(t,r).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return a.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const i=(0,Ue.lO)(r)[0],s=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return a.createElement(le,(0,l.Z)({},o,{label:s,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,$e.Iw)(n),g=(0,$e.gB)(n),{savePreferredVersionName:m}=(0,ze.J)(n),h=[...o,...g.map((e=>{const t=p.alternateDocVersions[e.name]??Ze(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...i],b=(0,Ue.lO)(n)[0],v=t&&h.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:Ze(b).path;return h.length<=1?a.createElement(le,(0,l.Z)({},u,{mobile:t,label:v,to:y,isActive:r?()=>!1:void 0})):a.createElement(ge,(0,l.Z)({},u,{mobile:t,label:v,to:y,items:h,isActive:r?()=>!1:void 0}))}};function Ve(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return a.createElement(o,n)}function We(){const e=(0,O.e)(),t=(0,_.L)().navbar.items;return a.createElement("ul",{className:"menu__list"},t.map(((t,n)=>a.createElement(Ve,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ge(e){return a.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),a.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function qe(){const e=0===(0,_.L)().navbar.items.length,t=F();return a.createElement(a.Fragment,null,!e&&a.createElement(Ge,{onClick:()=>t.hide()}),t.content)}function Ke(){const e=(0,O.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,a.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?a.createElement($,{header:a.createElement(X,null),primaryMenu:a.createElement(We,null),secondaryMenu:a.createElement(qe,null)}):null}const Ye="navbarHideable_m1mJ",Qe="navbarHidden_jGov";function Xe(e){return a.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,r.Z)("navbar-sidebar__backdrop",e.className)}))}function Je(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,_.L)(),i=(0,O.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,a.useState)(e),r=(0,a.useRef)(!1),o=(0,a.useRef)(0),i=(0,a.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,a)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(r.current)return void(r.current=!1);const l=a?.scrollY,s=document.documentElement.scrollHeight-o.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,u.S)((t=>{if(!e)return;const a=t.location.hash;if(a?document.getElementById(a.substring(1)):void 0)return r.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return a.createElement("nav",{ref:l,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,r.Z)("navbar","navbar--fixed-top",n&&[Ye,!s&&Qe],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,a.createElement(Xe,{onClick:i.toggle}),a.createElement(Ke,null))}function et(e){let{width:t=30,height:n=30,className:r,...o}=e;return a.createElement("svg",(0,l.Z)({className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function tt(){const{toggle:e,shown:t}=(0,O.e)();return a.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},a.createElement(et,null))}const nt="colorModeToggle_DEke";function at(e){let{items:t}=e;return a.createElement(a.Fragment,null,t.map(((e,t)=>a.createElement(Ve,(0,l.Z)({},e,{key:t})))))}function rt(e){let{left:t,right:n}=e;return a.createElement("div",{className:"navbar__inner"},a.createElement("div",{className:"navbar__items"},t),a.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ot(){const e=(0,O.e)(),t=(0,_.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return a.createElement(rt,{left:a.createElement(a.Fragment,null,!e.disabled&&a.createElement(tt,null),a.createElement(Y,null),a.createElement(at,{items:n})),right:a.createElement(a.Fragment,null,a.createElement(at,{items:r}),a.createElement(q,{className:nt}),!o&&a.createElement(Fe,null,a.createElement(De,null)))})}function it(){return a.createElement(Je,null,a.createElement(ot,null))}function lt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:i,...s}=t,c=(0,ee.Z)(n),u=(0,ee.Z)(r,{forcePrependBaseUrl:!0});return a.createElement(J.Z,(0,l.Z)({className:"footer__link-item"},r?{href:i?u:r}:{to:c},s),o,r&&!(0,te.Z)(r)&&a.createElement(ae.Z,null))}function st(e){let{item:t}=e;return t.html?a.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement("li",{key:t.href??t.to,className:"footer__item"},a.createElement(lt,{item:t}))}function ct(e){let{column:t}=e;return a.createElement("div",{className:"col footer__col"},a.createElement("div",{className:"footer__title"},t.title),a.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>a.createElement(st,{key:t,item:e})))))}function ut(e){let{columns:t}=e;return a.createElement("div",{className:"row footer__links"},t.map(((e,t)=>a.createElement(ct,{key:t,column:e}))))}function dt(){return a.createElement("span",{className:"footer__link-separator"},"\xb7")}function ft(e){let{item:t}=e;return t.html?a.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement(lt,{item:t})}function pt(e){let{links:t}=e;return a.createElement("div",{className:"footer__links text--center"},a.createElement("div",{className:"footer__links"},t.map(((e,n)=>a.createElement(a.Fragment,{key:n},a.createElement(ft,{item:e}),t.length!==n+1&&a.createElement(dt,null))))))}function gt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?a.createElement(ut,{columns:t}):a.createElement(pt,{links:t})}var mt=n(50941);const ht="footerLogoLink_BH7S";function bt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,ee.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return a.createElement(mt.Z,{className:(0,r.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function vt(e){let{logo:t}=e;return t.href?a.createElement(J.Z,{href:t.href,className:ht,target:t.target},a.createElement(bt,{logo:t})):a.createElement(bt,{logo:t})}function yt(e){let{copyright:t}=e;return a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(e){let{style:t,links:n,logo:o,copyright:i}=e;return a.createElement("footer",{className:(0,r.Z)("footer",{"footer--dark":"dark"===t})},a.createElement("div",{className:"container container-fluid"},n,(o||i)&&a.createElement("div",{className:"footer__bottom text--center"},o&&a.createElement("div",{className:"margin-bottom--sm"},o),i)))}function wt(){const{footer:e}=(0,_.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return a.createElement(_t,{style:o,links:n&&n.length>0&&a.createElement(gt,{links:n}),logo:r&&a.createElement(vt,{logo:r}),copyright:t&&a.createElement(yt,{copyright:t})})}const kt=a.memo(wt),xt=(0,I.Qc)([U.S,w.pl,R.OC,ze.L5,i.VC,function(e){let{children:t}=e;return a.createElement(M.n2,null,a.createElement(O.M,null,a.createElement(D,null,t)))}]);function Et(e){let{children:t}=e;return a.createElement(xt,null,t)}function St(e){let{error:t,tryAgain:n}=e;return a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),a.createElement("p",null,t.message),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},a.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const Tt="mainWrapper_z2l0";function Ct(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:c}=e;return(0,b.t)(),a.createElement(Et,null,a.createElement(i.d,{title:s,description:c}),a.createElement(y,null),a.createElement(N,null),a.createElement(it,null),a.createElement("div",{id:d,className:(0,r.Z)(h.k.wrapper.main,Tt,l)},a.createElement(o.Z,{fallback:e=>a.createElement(St,e)},t)),!n&&a.createElement(kt,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(87462),r=n(67294),o=n(39960),i=n(44996),l=n(52263),s=n(86668),c=n(50941);function u(e){let{logo:t,alt:n,imageClassName:a}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=r.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return a?r.createElement("div",{className:a},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:c}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,g=(0,i.Z)(c?.href||"/"),m=n?"":t,h=c?.alt??m;return r.createElement(o.Z,(0,a.Z)({to:g},p,c?.target&&{target:c.target}),c&&r.createElement(u,{logo:c,alt:h,imageClassName:d}),null!=n&&r.createElement("b",{className:f},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(35742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return a.createElement(r.Z,null,t&&a.createElement("meta",{name:"docusaurus_locale",content:t}),n&&a.createElement("meta",{name:"docusaurus_version",content:n}),o&&a.createElement("meta",{name:"docusaurus_tag",content:o}),i&&a.createElement("meta",{name:"docsearch:language",content:i}),n&&a.createElement("meta",{name:"docsearch:version",content:n}),o&&a.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(87462),r=n(67294),o=n(86010),i=n(72389),l=n(92949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return r.createElement(r.Fragment,null,p.map((e=>r.createElement("img",(0,a.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],u)},f)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>g});var a=n(87462),r=n(67294),o=n(10412);function i(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??"ease-in-out"}`,height:`${t}px`}}function i(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,r.useRef)(null);return u({collapsibleRef:f,collapsed:n,animation:o}),r.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(f.current,n),i?.(n))},className:l},a)}function p(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,s]=(0,r.useState)(t);return(0,r.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,r.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?r.createElement(f,(0,a.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const a=t?p:f;return r.createElement(a,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>p});var a=n(67294),r=n(72389),o=n(50012),i=n(902),l=n(86668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),f=a.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,r.Z)(),[n,o]=(0,a.useState)((()=>!!t&&u()));(0,a.useEffect)((()=>{o(u())}),[]);const i=(0,a.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,a.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const a=t!==n;c.set(t),a&&d(!1),!a&&u()||o(!1)}),[e]),(0,a.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return a.createElement(f.Provider,{value:n},t)}function g(){const e=(0,a.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>m});var a=n(67294),r=n(10412),o=n(902),i=n(50012),l=n(86668);const s=a.createContext(void 0),c="theme",u=(0,i.WA)(c),d="light",f="dark",p=e=>e===f?f:d;function g(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,a.useState)((e=>r.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,a.useEffect)((()=>{t&&u.del()}),[t]);const s=(0,a.useCallback)((function(t,a){void 0===a&&(a={});const{persist:r=!0}=a;t?(i(t),r&&(e=>{u.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),u.del())}),[n,e]);(0,a.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,a.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const g=(0,a.useRef)(!1);return(0,a.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),a=()=>{window.matchMedia("print").matches||g.current?g.current=window.matchMedia("print").matches:s(null)};return e.addListener(a),()=>e.removeListener(a)}),[s,t,n]),(0,a.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[o,s])}function m(e){let{children:t}=e;const n=g();return a.createElement(s.Provider,{value:n},t)}function h(){const e=(0,a.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b,Oh:()=>_});var a=n(67294),r=n(80143),o=n(29935),i=n(86668),l=n(53438),s=n(902),c=n(50012);const u=e=>`docs-preferred-version-${e}`,d=(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},f=(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),p=(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()};const g=a.createContext(null);function m(){const e=(0,r._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,a.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,a.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,a.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:a}=e;function r(e){const t=f(e,n);return a[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,r(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,a.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return a.createElement(g.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?a.createElement(h,null,t):a.createElement(a.Fragment,null,t)}function v(){const e=(0,a.useContext)(g);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.m);const t=(0,r.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,a.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function _(){const e=(0,r._r)(),[t]=v();function n(n){const a=e[n],{preferredVersionName:r}=t[n];return a.versions.find((e=>e.name===r))??null}const a=Object.keys(e);return Object.fromEntries(a.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var a=n(67294),r=n(902);const o=Symbol("EmptyContext"),i=a.createContext(o);function l(e){let{children:t,name:n,items:r}=e;const o=(0,a.useMemo)((()=>n&&r?{name:n,items:r}:null),[n,r]);return a.createElement(i.Provider,{value:o},t)}function s(){const e=(0,a.useContext)(i);if(e===o)throw new r.i6("DocsSidebarProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var a=n(67294),r=n(13102),o=n(87524),i=n(91980),l=n(86668),s=n(902);const c=a.createContext(void 0);function u(){const e=function(){const e=(0,r.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[s,c]=(0,a.useState)(!1);(0,i.Rb)((()=>{if(s)return c(!1),!1}));const u=(0,a.useCallback)((()=>{c((e=>!e))}),[]);return(0,a.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,a.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:s})),[e,n,u,s])}function d(e){let{children:t}=e;const n=u();return a.createElement(c.Provider,{value:n},t)}function f(){const e=a.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var a=n(67294),r=n(902);const o=a.createContext(null);function i(e){let{children:t}=e;const n=(0,a.useState)({component:null,props:null});return a.createElement(o.Provider,{value:n},t)}function l(){const e=(0,a.useContext)(o);if(!e)throw new r.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,a.useContext)(o);if(!i)throw new r.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,r.Ql)(n);return(0,a.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,a.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>r,t:()=>o});var a=n(67294);const r="navigation-with-keyboard";function o(){(0,a.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(r),"mousedown"===e.type&&document.body.classList.remove(r)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(r),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},66177:(e,t,n)=>{"use strict";n.d(t,{O:()=>l});var a=n(67294),r=n(16550),o=n(52263);const i="q";function l(){const e=(0,r.k6)(),{siteConfig:{baseUrl:t,themeConfig:n}}=(0,o.Z)(),{algolia:{searchPagePath:l}}=n,[s,c]=(0,a.useState)("");(0,a.useEffect)((()=>{const e=new URLSearchParams(window.location.search).get(i)??"";c(e)}),[]);return{searchQuery:s,setSearchQuery:(0,a.useCallback)((t=>{const n=new URLSearchParams(window.location.search);t?n.set(i,t):n.delete(i),e.replace({search:n.toString()}),c(t)}),[e]),generateSearchPageLink:(0,a.useCallback)((e=>`${t}${l}?q=${encodeURIComponent(e)}`),[t,l])}}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var a=n(67294),r=n(10412);const o="desktop",i="mobile",l="ssr";function s(){return r.Z.canUseDOM?window.innerWidth>996?o:i:l}function c(){const[e,t]=(0,a.useState)((()=>s()));return(0,a.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>a});const a={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},53438:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>g,cE:()=>d,hI:()=>_,lO:()=>b,oz:()=>v,s1:()=>h,vY:()=>y});var a=n(67294),r=n(16550),o=n(18790),i=n(80143),l=n(60373),s=n(1116),c=n(67392),u=n(48596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,u.Mg)(e,t);function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||((e,t)=>e.some((e=>g(e,t))))(e.items,t))}function m(e){let{sidebarItems:t,pathname:n,onlyCategories:a=!1}=e;const r=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return a&&"category"!==o.type||r.unshift(o),!0}return!1}(t),r}function h(){const e=(0,s.V)(),{pathname:t}=(0,r.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?m({sidebarItems:e.items,pathname:t}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),r=(0,i.yW)(e);return(0,a.useMemo)((()=>(0,c.j)([t,n,r].filter(Boolean))),[t,n,r])}function v(e,t){const n=b(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),a=t.find((t=>t[0]===e));if(!a)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return a[1]}),[e,n])}function y(e,t){const n=b(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),a=t.find((t=>t.id===e));if(!a){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return a}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const a=(0,r.TH)(),i=t.routes,l=i.find((e=>(0,r.LX)(a.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}},82128:(e,t,n)=>{"use strict";n.d(t,{p:()=>r});var a=n(52263);function r(e){const{siteConfig:t}=(0,a.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}},91980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>l,_X:()=>s});var a=n(67294),r=n(16550),o=n(61688),i=n(902);function l(e){!function(e){const t=(0,r.k6)(),n=(0,i.zX)(e);(0,a.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,r.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},67392:(e,t,n)=>{"use strict";function a(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,a)=>e.findIndex((e=>t(e,n)))!==a))}function r(e){return Array.from(new Set(e))}n.d(t,{j:()=>r,l:()=>a})},10833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var a=n(67294),r=n(86010),o=n(35742),i=n(30226);function l(){const e=a.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(44996),c=n(82128);function u(e){let{title:t,description:n,keywords:r,image:i,children:l}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return a.createElement(o.Z,null,t&&a.createElement("title",null,u),t&&a.createElement("meta",{property:"og:title",content:u}),n&&a.createElement("meta",{name:"description",content:n}),n&&a.createElement("meta",{property:"og:description",content:n}),r&&a.createElement("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&a.createElement("meta",{property:"og:image",content:f}),f&&a.createElement("meta",{name:"twitter:image",content:f}),l)}const d=a.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=a.useContext(d),l=(0,r.Z)(i,t);return a.createElement(d.Provider,{value:l},a.createElement(o.Z,null,a.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return a.createElement(f,{className:(0,r.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var a=n(67294);const r=n(10412).Z.canUseDOM?a.useLayoutEffect:a.useEffect;function o(e){const t=(0,a.useRef)(e);return r((()=>{t.current=e}),[e]),(0,a.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,a.useRef)();return r((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,a.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return a.createElement(a.Fragment,null,e.reduceRight(((e,t)=>a.createElement(t,null,e)),n))}}},98022:(e,t,n)=>{"use strict";function a(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>a})},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var a=n(67294),r=n(723),o=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,a.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function a(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(a)||e(t.filter(r).flatMap((e=>e.routes??[])))}(n)}({routes:r.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>s,RF:()=>d,o5:()=>f});var a=n(67294),r=n(10412),o=n(72389),i=n(902);const l=a.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,a.useRef)(!0);return(0,a.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return a.createElement(l.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>r.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),r=(0,a.useRef)(u()),o=(0,i.zX)(e);(0,a.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,r.current),r.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=c(),t=function(){const e=(0,a.useRef)({elem:null,top:0}),t=(0,a.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,a.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const a=t.getBoundingClientRect().top-n;return a&&window.scrollBy({left:0,top:a}),e.current={elem:null,top:0},{restored:0!==a}}),[]);return(0,a.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,a.useRef)(void 0),r=(0,a.useCallback)((a=>{t.save(a),e.disableScrollEvents(),n.current=()=>{const{restored:a}=t.restore();if(n.current=void 0,a){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,a.useLayoutEffect)((()=>{n.current?.()})),{blockElementScrollPositionUntilNextRender:r}}function p(){const e=(0,a.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function a(){const r=document.documentElement.scrollTop;(n&&r>e||!n&&r<e)&&(t=requestAnimationFrame(a),window.scrollTo(0,Math.floor(.85*(r-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var a=n(80143),r=n(52263),o=n(60373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,r.Z)(),t=(0,a._r)(),n=(0,a.WS)(),s=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const a=n?.activePlugin.pluginId===e?n.activeVersion:void 0,r=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(a??r??o).name)}))];return{locale:e.currentLocale,tags:c}}},50012:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var a=n(67294),r=n(61688);const o="localStorage";function i(e){let{key:t,oldValue:n,newValue:a,storage:r}=e;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,a,window.location.href,r),window.dispatchEvent(o)}function l(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=l(t?.persistence);return null===n?c:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const a=n.getItem(e);n.setItem(e,t),i({key:e,oldValue:a,newValue:t,storage:n})}catch(a){console.error(`Docusaurus storage error, can't set ${e}=${t}`,a)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),i({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const a=a=>{a.storageArea===n&&a.key===e&&t(a)};return window.addEventListener("storage",a),()=>window.removeEventListener("storage",a)}catch(a){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,a),()=>{}}}}}function d(e,t){const n=(0,a.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,a.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var a=n(52263),r=n(16550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,a.Z)(),{pathname:i}=(0,r.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:a,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(a)}${s}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var a=n(67294),r=n(16550),o=n(902);function i(e){const t=(0,r.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,a.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var a=n(52263);function r(){return(0,a.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var a=n(52263);function r(){const{siteConfig:{themeConfig:e}}=(0,a.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var a=n(67294),r=n(98022),o=n(44996),i=n(6278);function l(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,a.useCallback)((a=>{const o=new URL(a);if((0,r.F)(t,o.href))return a;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:a}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[r]=e.split(/[#?]/),o="/"===r||r===a?r:(i=r,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(r,o)}},18780:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var r=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return a(r).default}})},86010:(e,t,n)=>{"use strict";function a(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=a(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}n.d(t,{Z:()=>r});const r=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=a(e))&&(r&&(r+=" "),r+=t);return r}},42358:(e,t,n)=>{"use strict";n.d(t,{lX:()=>x,q_:()=>L,ob:()=>m,PP:()=>N,Ep:()=>g,Hp:()=>h});var a=n(87462);function r(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,a=n+1,r=e.length;a<r;n+=1,a+=1)e[n]=e[a];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,a=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&r(e),s=t&&r(t),c=l||s;if(e&&r(e)?i=a:a.length&&(i.pop(),i=i.concat(a)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&r(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,a){return e(t,n[a])}));if("object"==typeof t||"object"==typeof n){var a=l(t),r=l(n);return a!==t||r!==n?e(a,r):Object.keys(Object.assign({},t,n)).every((function(a){return e(t[a],n[a])}))}return!1};var c=n(38776);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function g(e){var t=e.pathname,n=e.search,a=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),a&&"#"!==a&&(r+="#"===a.charAt(0)?a:"#"+a),r}function m(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",a="",r=t.indexOf("#");-1!==r&&(a=t.substr(r),t=t.substr(0,r));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===a?"":a}}(e),o.state=t):(void 0===(o=(0,a.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function h(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,a,r){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof a?a(o,r):r(!0):r(!1!==o)}else r(!0)},appendListener:function(e){var n=!0;function a(){n&&e.apply(void 0,arguments)}return t.push(a),function(){n=!1,t=t.filter((function(e){return e!==a}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];t.forEach((function(e){return e.apply(void 0,n)}))}}}var v=!("undefined"==typeof window||!window.document||!window.document.createElement);function y(e,t){t(window.confirm(e))}var _="popstate",w="hashchange";function k(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),v||(0,c.Z)(!1);var t,n=window.history,r=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,l=i.forceRefresh,s=void 0!==l&&l,d=i.getUserConfirmation,h=void 0===d?y:d,x=i.keyLength,E=void 0===x?6:x,S=e.basename?p(u(e.basename)):"";function T(e){var t=e||{},n=t.key,a=t.state,r=window.location,o=r.pathname+r.search+r.hash;return S&&(o=f(o,S)),m(o,a,n)}function C(){return Math.random().toString(36).substr(2,E)}var A=b();function L(e){(0,a.Z)(U,e),U.length=n.length,A.notifyListeners(U.location,U.action)}function P(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||R(T(e.state))}function N(){R(T(k()))}var O=!1;function R(e){if(O)O=!1,L();else{A.confirmTransitionTo(e,"POP",h,(function(t){t?L({action:"POP",location:e}):function(e){var t=U.location,n=M.indexOf(t.key);-1===n&&(n=0);var a=M.indexOf(e.key);-1===a&&(a=0);var r=n-a;r&&(O=!0,D(r))}(e)}))}}var I=T(k()),M=[I.key];function j(e){return S+g(e)}function D(e){n.go(e)}var B=0;function F(e){1===(B+=e)&&1===e?(window.addEventListener(_,P),o&&window.addEventListener(w,N)):0===B&&(window.removeEventListener(_,P),o&&window.removeEventListener(w,N))}var $=!1;var U={length:n.length,action:"POP",location:I,createHref:j,push:function(e,t){var a="PUSH",o=m(e,t,C(),U.location);A.confirmTransitionTo(o,a,h,(function(e){if(e){var t=j(o),i=o.key,l=o.state;if(r)if(n.pushState({key:i,state:l},null,t),s)window.location.href=t;else{var c=M.indexOf(U.location.key),u=M.slice(0,c+1);u.push(o.key),M=u,L({action:a,location:o})}else window.location.href=t}}))},replace:function(e,t){var a="REPLACE",o=m(e,t,C(),U.location);A.confirmTransitionTo(o,a,h,(function(e){if(e){var t=j(o),i=o.key,l=o.state;if(r)if(n.replaceState({key:i,state:l},null,t),s)window.location.replace(t);else{var c=M.indexOf(U.location.key);-1!==c&&(M[c]=o.key),L({action:a,location:o})}else window.location.replace(t)}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return $||(F(1),$=!0),function(){return $&&($=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return U}var E="hashchange",S={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:u},slash:{encodePath:u,decodePath:u}};function T(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function C(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function A(e){window.location.replace(T(window.location.href)+"#"+e)}function L(e){void 0===e&&(e={}),v||(0,c.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),r=n.getUserConfirmation,o=void 0===r?y:r,i=n.hashType,l=void 0===i?"slash":i,s=e.basename?p(u(e.basename)):"",d=S[l],h=d.encodePath,_=d.decodePath;function w(){var e=_(C());return s&&(e=f(e,s)),m(e)}var k=b();function x(e){(0,a.Z)($,e),$.length=t.length,k.notifyListeners($.location,$.action)}var L=!1,P=null;function N(){var e,t,n=C(),a=h(n);if(n!==a)A(a);else{var r=w(),i=$.location;if(!L&&(t=r,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(P===g(r))return;P=null,function(e){if(L)L=!1,x();else{var t="POP";k.confirmTransitionTo(e,t,o,(function(n){n?x({action:t,location:e}):function(e){var t=$.location,n=M.lastIndexOf(g(t));-1===n&&(n=0);var a=M.lastIndexOf(g(e));-1===a&&(a=0);var r=n-a;r&&(L=!0,j(r))}(e)}))}}(r)}}var O=C(),R=h(O);O!==R&&A(R);var I=w(),M=[g(I)];function j(e){t.go(e)}var D=0;function B(e){1===(D+=e)&&1===e?window.addEventListener(E,N):0===D&&window.removeEventListener(E,N)}var F=!1;var $={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=T(window.location.href)),n+"#"+h(s+g(e))},push:function(e,t){var n="PUSH",a=m(e,void 0,void 0,$.location);k.confirmTransitionTo(a,n,o,(function(e){if(e){var t=g(a),r=h(s+t);if(C()!==r){P=t,function(e){window.location.hash=e}(r);var o=M.lastIndexOf(g($.location)),i=M.slice(0,o+1);i.push(t),M=i,x({action:n,location:a})}else x()}}))},replace:function(e,t){var n="REPLACE",a=m(e,void 0,void 0,$.location);k.confirmTransitionTo(a,n,o,(function(e){if(e){var t=g(a),r=h(s+t);C()!==r&&(P=t,A(r));var o=M.indexOf(g($.location));-1!==o&&(M[o]=t),x({action:n,location:a})}}))},go:j,goBack:function(){j(-1)},goForward:function(){j(1)},block:function(e){void 0===e&&(e=!1);var t=k.setPrompt(e);return F||(B(1),F=!0),function(){return F&&(F=!1,B(-1)),t()}},listen:function(e){var t=k.appendListener(e);return B(1),function(){B(-1),t()}}};return $}function P(e,t,n){return Math.min(Math.max(e,t),n)}function N(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,r=t.initialEntries,o=void 0===r?["/"]:r,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,c=void 0===s?6:s,u=b();function d(e){(0,a.Z)(_,e),_.length=_.entries.length,u.notifyListeners(_.location,_.action)}function f(){return Math.random().toString(36).substr(2,c)}var p=P(l,0,o.length-1),h=o.map((function(e){return m(e,void 0,"string"==typeof e?f():e.key||f())})),v=g;function y(e){var t=P(_.index+e,0,_.entries.length-1),a=_.entries[t];u.confirmTransitionTo(a,"POP",n,(function(e){e?d({action:"POP",location:a,index:t}):d()}))}var _={length:h.length,action:"POP",location:h[p],index:p,entries:h,createHref:v,push:function(e,t){var a="PUSH",r=m(e,t,f(),_.location);u.confirmTransitionTo(r,a,n,(function(e){if(e){var t=_.index+1,n=_.entries.slice(0);n.length>t?n.splice(t,n.length-t,r):n.push(r),d({action:a,location:r,index:t,entries:n})}}))},replace:function(e,t){var a="REPLACE",r=m(e,t,f(),_.location);u.confirmTransitionTo(r,a,n,(function(e){e&&(_.entries[_.index]=r,d({action:a,location:r}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=_.index+e;return t>=0&&t<_.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return _}},8679:(e,t,n)=>{"use strict";var a=n(59864),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return a.isMemo(e)?i:l[e.$$typeof]||r}l[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[a.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,a){if("string"!=typeof n){if(g){var r=p(n);r&&r!==g&&e(t,r,a)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),m=s(n),h=0;h<i.length;++h){var b=i[h];if(!(o[b]||a&&a[b]||m&&m[b]||l&&l[b])){var v=f(n,b);try{c(t,b,v)}catch(y){}}}}return t}},41143:e=>{"use strict";e.exports=function(e,t,n,a,r,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,a,r,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},32497:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var a,r;a=function(){var e,t,n={version:"0.2.0"},a=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function r(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var r;return(r="translate3d"===a.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,r}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,a.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(a.barSelector),u=a.speed,d=a.easing;return o.offsetWidth,l((function(t){""===a.positionUsing&&(a.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),a.trickleSpeed)};return a.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*a.trickleRate)},e=0,t=0,n.promise=function(a){return a&&"resolved"!==a.state()?(0===t&&n.start(),e++,t++,a.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var r,i=t.querySelector(a.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(a.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),a.showSpinner||(r=t.querySelector(a.spinnerSelector))&&p(r),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function a(t){var n=document.body.style;if(t in n)return t;for(var a,r=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((a=e[r]+o)in n)return a;return t}function r(e){return e=n(e),t[e]||(t[e]=a(e))}function o(e,t,n){t=r(t),e.style[t]=n}return function(e,t){var n,a,r=arguments;if(2==r.length)for(n in t)void 0!==(a=t[n])&&t.hasOwnProperty(n)&&o(e,n,a);else o(e,r[1],r[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),a=n+t;c(n,t)||(e.className=a.substring(1))}function d(e,t){var n,a=f(e);c(e,t)&&(n=a.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(r="function"==typeof a?a.call(t,n,t,e):a)||(e.exports=r)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function r(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach((function(e){a[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(r){return!1}}()?Object.assign:function(e,o){for(var i,l,s=r(e),c=1;c<arguments.length;c++){for(var u in i=Object(arguments[c]))n.call(i,u)&&(s[u]=i[u]);if(t){l=t(i);for(var d=0;d<l.length;d++)a.call(i,l[d])&&(s[l[d]]=i[l[d]])}}return s}},87410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},a={util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var r,o;switch(n=n||{},a.util.type(t)){case"Object":if(o=a.util.objId(t),n[o])return n[o];for(var i in r={},n[o]=r,t)t.hasOwnProperty(i)&&(r[i]=e(t[i],n));return r;case"Array":return o=a.util.objId(t),n[o]?n[o]:(r=[],n[o]=r,t.forEach((function(t,a){r[a]=e(t,n)})),r);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var a="no-"+t;e;){var r=e.classList;if(r.contains(t))return!0;if(r.contains(a))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=a.util.clone(a.languages[e]);for(var r in t)n[r]=t[r];return n},insertBefore:function(e,t,n,r){var o=(r=r||a.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var c=r[e];return r[e]=i,a.languages.DFS(a.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,r,o){o=o||{};var i=a.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],r||l);var s=t[l],c=a.util.type(s);"Object"!==c||o[i(s)]?"Array"!==c||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return a.hooks.run("before-tokenize",o),o.tokens=a.tokenize(o.code,o.grammar),a.hooks.run("after-tokenize",o),r.stringify(a.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest}var r=new l;return s(r,r.head,e),i(e,r,t,r.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(r)},hooks:{all:{},add:function(e,t){var n=a.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=a.hooks.all[e];if(n&&n.length)for(var r,o=0;r=n[o++];)r(t)}},Token:r};function r(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function o(e,t,n,a){e.lastIndex=t;var r=e.exec(n);if(r&&a&&r[1]){var o=r[1].length;r.index+=o,r[0]=r[0].slice(o)}return r}function i(e,t,n,l,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var g=0;g<p.length;++g){if(d&&d.cause==f+","+g)return;var m=p[g],h=m.inside,b=!!m.lookbehind,v=!!m.greedy,y=m.alias;if(v&&!m.pattern.global){var _=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,_+"g")}for(var w=m.pattern||m,k=l.next,x=u;k!==t.tail&&!(d&&x>=d.reach);x+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof r)){var S,T=1;if(v){if(!(S=o(w,x,e,b))||S.index>=e.length)break;var C=S.index,A=S.index+S[0].length,L=x;for(L+=k.value.length;C>=L;)L+=(k=k.next).value.length;if(x=L-=k.value.length,k.value instanceof r)continue;for(var P=k;P!==t.tail&&(L<A||"string"==typeof P.value);P=P.next)T++,L+=P.value.length;T--,E=e.slice(x,L),S.index-=x}else if(!(S=o(w,0,E,b)))continue;C=S.index;var N=S[0],O=E.slice(0,C),R=E.slice(C+N.length),I=x+E.length;d&&I>d.reach&&(d.reach=I);var M=k.prev;if(O&&(M=s(t,M,O),x+=O.length),c(t,M,T),k=s(t,M,new r(f,h?a.tokenize(N,h):N,y,N)),R&&s(t,k,R),T>1){var j={cause:f+","+g,reach:I};i(e,t,n,k.prev,x,j),d&&j.reach>d.reach&&(d.reach=j.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function c(e,t,n){for(var a=t.next,r=0;r<n&&a!==e.tail;r++)a=a.next;t.next=a,a.prev=t,e.length-=r}return r.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var r="";return t.forEach((function(t){r+=e(t,n)})),r}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),a.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},a}(),r=a;a.default=a,r.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},r.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=a.variable[1].inside,i=0;i<r.length;i++)o[r[i]]=e.languages.bash[r[i]];e.languages.shell=e.languages.bash}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.c=r.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),r.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),r.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},r.languages.c.string],char:r.languages.c.char,comment:r.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:r.languages.c}}}}),r.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete r.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(r),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var a={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:r})}(r),r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(r),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<key>>/g,(function(){return"(?:"+r+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(r),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return a})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+o+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+o+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,a=t.length;n<a;n++){var r=t[n];if("code"===r.type){var o=r.content[1],i=r.content[3];if(o&&i&&"code-language"===o.type&&"code-block"===i.type&&"string"==typeof o.content){var l=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),s="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,s]:i.alias.push(s):i.alias=[s]}}else e(r.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",a=0,r=t.classes.length;a<r;a++){var o=t.classes[a],c=/language-(.+)/.exec(o);if(c){n=c[1];break}}var u,d=e.languages[n];if(d)t.content=e.highlight((u=t.content,u.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n);var a=l[t];return a||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var f="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=f,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(f);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(r),r.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:r.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},r.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var a=t[n++];if("keyword"===a.type&&"mutation"===a.content){var r=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),r.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),r.length>0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&r.indexOf(c.content)>=0&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var a=u(n+t);if(!a||a.type!==e[n])return!1}return!0}function f(e,a){for(var r=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))r++;else if(a.test(l)&&0===--r)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),r.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,a=t.inside.interpolation,r=a.inside["interpolation-punctuation"],o=a.pattern.source;function i(t,a){if(e.languages[t])return{pattern:RegExp("((?:"+a+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,a){var r={code:t,grammar:n,language:a};return e.hooks.run("before-tokenize",r),r.tokens=e.tokenize(r.code,r.grammar),e.hooks.run("after-tokenize",r),r.tokens}function c(t){var n={};n["interpolation-punctuation"]=r;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,a.alias,t)}function u(t,n,a){var r=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(r.map((function(e){if("string"==typeof e)return e;for(var n,r=e.content;-1!==t.indexOf(n=l(i++,a)););return u[n]=r,n})).join(""),n,a),f=Object.keys(u);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=f.length)return;var a=t[n];if("string"==typeof a||"string"==typeof a.content){var r=f[i],o="string"==typeof a?a:a.content,l=o.indexOf(r);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[r]),p=o.substring(l+r.length),g=[];if(s&&g.push(s),g.push(d),p){var m=[p];e(m),g.push.apply(g,m)}"string"==typeof a?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):a.content=g}}else{var h=a.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(a,d,"language-"+a,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var a=0,r=n.length;a<r;a++){var o=n[a];if("string"!=typeof o){var i=o.content;if(Array.isArray(i))if("template-string"===o.type){var l=i[1];if(3===i.length&&"string"!=typeof l&&"embedded-code"===l.type){var s=f(l),c=l.alias,d=Array.isArray(c)?c[0]:c,p=e.languages[d];if(!p)continue;i[1]=u(s,p,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(r),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(r),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],a=0;a<n.length;a++){var r=n[a],o=e.languages.javascript[r];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[r]={pattern:o});var i=o.inside||{};o.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(r),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,a=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,r=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return a})).replace(/<SPREAD>/g,(function(){return r})),RegExp(e,t)}r=o(r).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],a=0;a<t.length;a++){var r=t[a],o=!1;if("string"!=typeof r&&("tag"===r.type&&r.content[0]&&"tag"===r.content[0].type?"</"===r.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(r.content[0].content[1])&&n.pop():"/>"===r.content[r.content.length-1].content||n.push({tagName:i(r.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===r.type&&"{"===r.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof r)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(r);a<t.length-1&&("string"==typeof t[a+1]||"plain-text"===t[a+1].type)&&(s+=i(t[a+1]),t.splice(a+1,1)),a>0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(s=i(t[a-1])+s,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",s,null,s)}r.content&&"string"!=typeof r.content&&l(r.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(r),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var a=t[n],r=[];/^\w+$/.test(n)||r.push(/\w+/.exec(n)[0]),"diff"===n&&r.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+a+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(r),r.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},r.languages.go=r.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),r.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete r.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,r,o){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,l=i.length;-1!==n.code.indexOf(r=t(a,l));)++l;return i[l]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var r=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(r>=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[r],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(a,u),g=f.indexOf(p);if(g>-1){++r;var m=f.substring(0,g),h=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),b=f.substring(g+p.length),v=[];m&&v.push.apply(v,i([m])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(r),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(r),r.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},r.languages.webmanifest=r.languages.json,r.languages.less=r.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),r.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),r.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},r.languages.objectivec=r.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete r.languages.objectivec["class-name"],r.languages.objc=r.languages.objectivec,r.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},r.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},r.languages.python["string-interpolation"].inside.interpolation.inside.rest=r.languages.python,r.languages.py=r.languages.python,r.languages.reason=r.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),r.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete r.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(r),r.languages.scss=r.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),r.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),r.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),r.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),r.languages.scss.atrule.inside.rest=r.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},a={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};a.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:a}},a.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:a}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:a}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:a}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:a}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:a.interpolation}},rest:a}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:a.interpolation,comment:a.comment,punctuation:/[{},]/}},func:a.func,string:a.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:a.interpolation,punctuation:/[{}()\[\];:.]/}}(r),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(r),r.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=r},40485:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},52503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},32334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},52811:(e,t,n)=>{var a={"./prism-groovy":40485,"./prism-java":52503,"./prism-kotlin":32334};function r(e){var t=o(e);return n(t)}function o(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=o,e.exports=r,r.id=52811},92703:(e,t,n)=>{"use strict";var a=n(50414);function r(){}function o(){}o.resetWarningCache=r,e.exports=function(){function e(e,t,n,r,o,i){if(i!==a){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:r};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var a=n(67294),r=n(27418),o=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!a)throw Error(i(227));var l=new Set,s={};function c(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(s[e]=t,e=0;e<t.length;e++)l.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p=Object.prototype.hasOwnProperty,g={},m={};function h(e,t,n,a,r,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=a,this.attributeNamespace=r,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function _(e,t,n,a){var r=b.hasOwnProperty(t)?b[t]:null;(null!==r?0===r.type:!a&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,a){if(null==t||function(e,t,n,a){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!a&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,a))return!0;if(a)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,r,a)&&(n=null),a||null===r?function(e){return!!p.call(m,e)||!p.call(g,e)&&(f.test(e)?m[e]=!0:(g[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):r.mustUseProperty?e[r.propertyName]=null===n?3!==r.type&&"":n:(t=r.attributeName,a=r.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(r=r.type)||4===r&&!0===n?"":""+n,a?e.setAttributeNS(a,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,x=60106,E=60107,S=60108,T=60114,C=60109,A=60110,L=60112,P=60113,N=60120,O=60115,R=60116,I=60121,M=60128,j=60129,D=60130,B=60131;if("function"==typeof Symbol&&Symbol.for){var F=Symbol.for;k=F("react.element"),x=F("react.portal"),E=F("react.fragment"),S=F("react.strict_mode"),T=F("react.profiler"),C=F("react.provider"),A=F("react.context"),L=F("react.forward_ref"),P=F("react.suspense"),N=F("react.suspense_list"),O=F("react.memo"),R=F("react.lazy"),I=F("react.block"),F("react.scope"),M=F("react.opaque.id"),j=F("react.debug_trace_mode"),D=F("react.offscreen"),B=F("react.legacy_hidden")}var $,U="function"==typeof Symbol&&Symbol.iterator;function z(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=U&&e[U]||e["@@iterator"])?e:null}function Z(e){if(void 0===$)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);$=t&&t[1]||""}return"\n"+$+e}var H=!1;function V(e,t){if(!e||H)return"";H=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(s){var a=s}Reflect.construct(e,[],t)}else{try{t.call()}catch(s){a=s}e.call(t.prototype)}else{try{throw Error()}catch(s){a=s}e()}}catch(s){if(s&&a&&"string"==typeof s.stack){for(var r=s.stack.split("\n"),o=a.stack.split("\n"),i=r.length-1,l=o.length-1;1<=i&&0<=l&&r[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(r[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||r[i]!==o[l])return"\n"+r[i].replace(" at new "," at ")}while(1<=i&&0<=l);break}}}finally{H=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Z(e):""}function W(e){switch(e.tag){case 5:return Z(e.type);case 16:return Z("Lazy");case 13:return Z("Suspense");case 19:return Z("SuspenseList");case 0:case 2:case 15:return e=V(e.type,!1);case 11:return e=V(e.type.render,!1);case 22:return e=V(e.type._render,!1);case 1:return e=V(e.type,!0);default:return""}}function G(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case E:return"Fragment";case x:return"Portal";case T:return"Profiler";case S:return"StrictMode";case P:return"Suspense";case N:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case L:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case O:return G(e.type);case I:return G(e._render);case R:t=e._payload,e=e._init;try{return G(e(t))}catch(n){}}return null}function q(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function K(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var t=K(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var r=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(e){a=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(e){a=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=K(e)?e.checked?"true":"false":e.value),(e=a)!==n&&(t.setValue(e),!0)}function X(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return r({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,a=null!=t.checked?t.checked:t.defaultChecked;n=q(null!=t.value?t.value:n),e._wrapperState={initialChecked:a,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&_(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=q(t.value),a=t.type;if(null!=n)"number"===a?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===a||"reset"===a)return void e.removeAttribute("value");t.hasOwnProperty("value")?re(e,t.type,n):t.hasOwnProperty("defaultValue")&&re(e,t.type,q(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function ae(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!("submit"!==a&&"reset"!==a||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function re(e,t,n){"number"===t&&X(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=r({children:void 0},t),(t=function(e){var t="";return a.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,a){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t["$"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty("$"+e[n].value),e[n].selected!==r&&(e[n].selected=r),r&&a&&(e[n].defaultSelected=!0)}else{for(n=""+q(n),t=null,r=0;r<e.length;r++){if(e[r].value===n)return e[r].selected=!0,void(a&&(e[r].defaultSelected=!0));null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function le(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return r({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function se(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:q(n)}}function ce(e,t){var n=q(t.value),a=q(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=a&&(e.defaultValue=""+a)}function ue(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de="http://www.w3.org/1999/xhtml",fe="http://www.w3.org/2000/svg";function pe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function ge(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?pe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var me,he,be=(he=function(e,t){if(e.namespaceURI!==fe||"innerHTML"in e)e.innerHTML=t;else{for((me=me||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=me.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,a){MSApp.execUnsafeLocalFunction((function(){return he(e,t)}))}:he);function ve(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ye={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},_e=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ye.hasOwnProperty(e)&&ye[e]?(""+t).trim():t+"px"}function ke(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var a=0===n.indexOf("--"),r=we(n,t[n],a);"float"===n&&(n="cssFloat"),a?e.setProperty(n,r):e[n]=r}}Object.keys(ye).forEach((function(e){_e.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ye[t]=ye[e]}))}));var xe=r({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ee(e,t){if(t){if(xe[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function Se(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Te(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ce=null,Ae=null,Le=null;function Pe(e){if(e=ar(e)){if("function"!=typeof Ce)throw Error(i(280));var t=e.stateNode;t&&(t=or(t),Ce(e.stateNode,e.type,t))}}function Ne(e){Ae?Le?Le.push(e):Le=[e]:Ae=e}function Oe(){if(Ae){var e=Ae,t=Le;if(Le=Ae=null,Pe(e),t)for(e=0;e<t.length;e++)Pe(t[e])}}function Re(e,t){return e(t)}function Ie(e,t,n,a,r){return e(t,n,a,r)}function Me(){}var je=Re,De=!1,Be=!1;function Fe(){null===Ae&&null===Le||(Me(),Oe())}function $e(e,t){var n=e.stateNode;if(null===n)return null;var a=or(n);if(null===a)return null;n=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(a=!a.disabled)||(a=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!a;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var Ue=!1;if(d)try{var ze={};Object.defineProperty(ze,"passive",{get:function(){Ue=!0}}),window.addEventListener("test",ze,ze),window.removeEventListener("test",ze,ze)}catch(he){Ue=!1}function Ze(e,t,n,a,r,o,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var He=!1,Ve=null,We=!1,Ge=null,qe={onError:function(e){He=!0,Ve=e}};function Ke(e,t,n,a,r,o,i,l,s){He=!1,Ve=null,Ze.apply(qe,arguments)}function Ye(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ye(e)!==e)throw Error(i(188))}function Je(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,a=t;;){var r=n.return;if(null===r)break;var o=r.alternate;if(null===o){if(null!==(a=r.return)){n=a;continue}break}if(r.child===o.child){for(o=r.child;o;){if(o===n)return Xe(r),e;if(o===a)return Xe(r),t;o=o.sibling}throw Error(i(188))}if(n.return!==a.return)n=r,a=o;else{for(var l=!1,s=r.child;s;){if(s===n){l=!0,n=r,a=o;break}if(s===a){l=!0,a=r,n=o;break}s=s.sibling}if(!l){for(s=o.child;s;){if(s===n){l=!0,n=o,a=r;break}if(s===a){l=!0,a=o,n=r;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==a)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function et(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var tt,nt,at,rt,ot=!1,it=[],lt=null,st=null,ct=null,ut=new Map,dt=new Map,ft=[],pt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function gt(e,t,n,a,r){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:r,targetContainers:[a]}}function mt(e,t){switch(e){case"focusin":case"focusout":lt=null;break;case"dragenter":case"dragleave":st=null;break;case"mouseover":case"mouseout":ct=null;break;case"pointerover":case"pointerout":ut.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":dt.delete(t.pointerId)}}function ht(e,t,n,a,r,o){return null===e||e.nativeEvent!==o?(e=gt(t,n,a,r,o),null!==t&&(null!==(t=ar(t))&&nt(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,null!==r&&-1===t.indexOf(r)&&t.push(r),e)}function bt(e){var t=nr(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Qe(n)))return e.blockedOn=t,void rt(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){at(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function vt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Jt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=ar(n))&&nt(t),e.blockedOn=n,!1;t.shift()}return!0}function yt(e,t,n){vt(e)&&n.delete(t)}function _t(){for(ot=!1;0<it.length;){var e=it[0];if(null!==e.blockedOn){null!==(e=ar(e.blockedOn))&&tt(e);break}for(var t=e.targetContainers;0<t.length;){var n=Jt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&it.shift()}null!==lt&&vt(lt)&&(lt=null),null!==st&&vt(st)&&(st=null),null!==ct&&vt(ct)&&(ct=null),ut.forEach(yt),dt.forEach(yt)}function wt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,_t)))}function kt(e){function t(t){return wt(t,e)}if(0<it.length){wt(it[0],e);for(var n=1;n<it.length;n++){var a=it[n];a.blockedOn===e&&(a.blockedOn=null)}}for(null!==lt&&wt(lt,e),null!==st&&wt(st,e),null!==ct&&wt(ct,e),ut.forEach(t),dt.forEach(t),n=0;n<ft.length;n++)(a=ft[n]).blockedOn===e&&(a.blockedOn=null);for(;0<ft.length&&null===(n=ft[0]).blockedOn;)bt(n),null===n.blockedOn&&ft.shift()}function xt(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Et={animationend:xt("Animation","AnimationEnd"),animationiteration:xt("Animation","AnimationIteration"),animationstart:xt("Animation","AnimationStart"),transitionend:xt("Transition","TransitionEnd")},St={},Tt={};function Ct(e){if(St[e])return St[e];if(!Et[e])return e;var t,n=Et[e];for(t in n)if(n.hasOwnProperty(t)&&t in Tt)return St[e]=n[t];return e}d&&(Tt=document.createElement("div").style,"AnimationEvent"in window||(delete Et.animationend.animation,delete Et.animationiteration.animation,delete Et.animationstart.animation),"TransitionEvent"in window||delete Et.transitionend.transition);var At=Ct("animationend"),Lt=Ct("animationiteration"),Pt=Ct("animationstart"),Nt=Ct("transitionend"),Ot=new Map,Rt=new Map,It=["abort","abort",At,"animationEnd",Lt,"animationIteration",Pt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Nt,"transitionEnd","waiting","waiting"];function Mt(e,t){for(var n=0;n<e.length;n+=2){var a=e[n],r=e[n+1];r="on"+(r[0].toUpperCase()+r.slice(1)),Rt.set(a,t),Ot.set(a,r),c(r,[a])}}(0,o.unstable_now)();var jt=8;function Dt(e){if(0!=(1&e))return jt=15,1;if(0!=(2&e))return jt=14,2;if(0!=(4&e))return jt=13,4;var t=24&e;return 0!==t?(jt=12,t):0!=(32&e)?(jt=11,32):0!==(t=192&e)?(jt=10,t):0!=(256&e)?(jt=9,256):0!==(t=3584&e)?(jt=8,t):0!=(4096&e)?(jt=7,4096):0!==(t=4186112&e)?(jt=6,t):0!==(t=62914560&e)?(jt=5,t):67108864&e?(jt=4,67108864):0!=(134217728&e)?(jt=3,134217728):0!==(t=805306368&e)?(jt=2,t):0!=(1073741824&e)?(jt=1,1073741824):(jt=8,e)}function Bt(e,t){var n=e.pendingLanes;if(0===n)return jt=0;var a=0,r=0,o=e.expiredLanes,i=e.suspendedLanes,l=e.pingedLanes;if(0!==o)a=o,r=jt=15;else if(0!==(o=134217727&n)){var s=o&~i;0!==s?(a=Dt(s),r=jt):0!==(l&=o)&&(a=Dt(l),r=jt)}else 0!==(o=n&~i)?(a=Dt(o),r=jt):0!==l&&(a=Dt(l),r=jt);if(0===a)return 0;if(a=n&((0>(a=31-Ht(a))?0:1<<a)<<1)-1,0!==t&&t!==a&&0==(t&i)){if(Dt(t),r<=jt)return t;jt=r}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=a;0<t;)r=1<<(n=31-Ht(t)),a|=e[n],t&=~r;return a}function Ft(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function $t(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Ut(24&~t))?$t(10,t):e;case 10:return 0===(e=Ut(192&~t))?$t(8,t):e;case 8:return 0===(e=Ut(3584&~t))&&(0===(e=Ut(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Ut(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function Ut(e){return e&-e}function zt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Zt(e,t,n){e.pendingLanes|=t;var a=t-1;e.suspendedLanes&=a,e.pingedLanes&=a,(e=e.eventTimes)[t=31-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Vt(e)/Wt|0)|0},Vt=Math.log,Wt=Math.LN2;var Gt=o.unstable_UserBlockingPriority,qt=o.unstable_runWithPriority,Kt=!0;function Yt(e,t,n,a){De||Me();var r=Xt,o=De;De=!0;try{Ie(r,e,t,n,a)}finally{(De=o)||Fe()}}function Qt(e,t,n,a){qt(Gt,Xt.bind(null,e,t,n,a))}function Xt(e,t,n,a){var r;if(Kt)if((r=0==(4&t))&&0<it.length&&-1<pt.indexOf(e))e=gt(null,e,t,n,a),it.push(e);else{var o=Jt(e,t,n,a);if(null===o)r&&mt(e,a);else{if(r){if(-1<pt.indexOf(e))return e=gt(o,e,t,n,a),void it.push(e);if(function(e,t,n,a,r){switch(t){case"focusin":return lt=ht(lt,e,t,n,a,r),!0;case"dragenter":return st=ht(st,e,t,n,a,r),!0;case"mouseover":return ct=ht(ct,e,t,n,a,r),!0;case"pointerover":var o=r.pointerId;return ut.set(o,ht(ut.get(o)||null,e,t,n,a,r)),!0;case"gotpointercapture":return o=r.pointerId,dt.set(o,ht(dt.get(o)||null,e,t,n,a,r)),!0}return!1}(o,e,t,n,a))return;mt(e,a)}Ma(e,t,a,null,n)}}}function Jt(e,t,n,a){var r=Te(a);if(null!==(r=nr(r))){var o=Ye(r);if(null===o)r=null;else{var i=o.tag;if(13===i){if(null!==(r=Qe(o)))return r;r=null}else if(3===i){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;r=null}else o!==r&&(r=null)}}return Ma(e,t,a,r,n),null}var en=null,tn=null,nn=null;function an(){if(nn)return nn;var e,t,n=tn,a=n.length,r="value"in en?en.value:en.textContent,o=r.length;for(e=0;e<a&&n[e]===r[e];e++);var i=a-e;for(t=1;t<=i&&n[a-t]===r[o-t];t++);return nn=r.slice(e,1<t?1-t:void 0)}function rn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function on(){return!0}function ln(){return!1}function sn(e){function t(t,n,a,r,o){for(var i in this._reactName=t,this._targetInst=a,this.type=n,this.nativeEvent=r,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(r):r[i]);return this.isDefaultPrevented=(null!=r.defaultPrevented?r.defaultPrevented:!1===r.returnValue)?on:ln,this.isPropagationStopped=ln,this}return r(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=on)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=on)},persist:function(){},isPersistent:on}),t}var cn,un,dn,fn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=sn(fn),gn=r({},fn,{view:0,detail:0}),mn=sn(gn),hn=r({},gn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:An,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==dn&&(dn&&"mousemove"===e.type?(cn=e.screenX-dn.screenX,un=e.screenY-dn.screenY):un=cn=0,dn=e),cn)},movementY:function(e){return"movementY"in e?e.movementY:un}}),bn=sn(hn),vn=sn(r({},hn,{dataTransfer:0})),yn=sn(r({},gn,{relatedTarget:0})),_n=sn(r({},fn,{animationName:0,elapsedTime:0,pseudoElement:0})),wn=r({},fn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),kn=sn(wn),xn=sn(r({},fn,{data:0})),En={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Sn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Tn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Tn[e])&&!!t[e]}function An(){return Cn}var Ln=r({},gn,{key:function(e){if(e.key){var t=En[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=rn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Sn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:An,charCode:function(e){return"keypress"===e.type?rn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?rn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Pn=sn(Ln),Nn=sn(r({},hn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),On=sn(r({},gn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:An})),Rn=sn(r({},fn,{propertyName:0,elapsedTime:0,pseudoElement:0})),In=r({},hn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Mn=sn(In),jn=[9,13,27,32],Dn=d&&"CompositionEvent"in window,Bn=null;d&&"documentMode"in document&&(Bn=document.documentMode);var Fn=d&&"TextEvent"in window&&!Bn,$n=d&&(!Dn||Bn&&8<Bn&&11>=Bn),Un=String.fromCharCode(32),zn=!1;function Zn(e,t){switch(e){case"keyup":return-1!==jn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Vn=!1;var Wn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Gn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Wn[e.type]:"textarea"===t}function qn(e,t,n,a){Ne(a),0<(t=Da(t,"onChange")).length&&(n=new pn("onChange","change",null,n,a),e.push({event:n,listeners:t}))}var Kn=null,Yn=null;function Qn(e){La(e,0)}function Xn(e){if(Q(rr(e)))return e}function Jn(e,t){if("change"===e)return t}var ea=!1;if(d){var ta;if(d){var na="oninput"in document;if(!na){var aa=document.createElement("div");aa.setAttribute("oninput","return;"),na="function"==typeof aa.oninput}ta=na}else ta=!1;ea=ta&&(!document.documentMode||9<document.documentMode)}function ra(){Kn&&(Kn.detachEvent("onpropertychange",oa),Yn=Kn=null)}function oa(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(qn(t,Yn,e,Te(e)),e=Qn,De)e(t);else{De=!0;try{Re(e,t)}finally{De=!1,Fe()}}}}function ia(e,t,n){"focusin"===e?(ra(),Yn=n,(Kn=t).attachEvent("onpropertychange",oa)):"focusout"===e&&ra()}function la(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function sa(e,t){if("click"===e)return Xn(t)}function ca(e,t){if("input"===e||"change"===e)return Xn(t)}var ua="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},da=Object.prototype.hasOwnProperty;function fa(e,t){if(ua(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(a=0;a<n.length;a++)if(!da.call(t,n[a])||!ua(e[n[a]],t[n[a]]))return!1;return!0}function pa(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ga(e,t){var n,a=pa(e);for(e=0;a;){if(3===a.nodeType){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=pa(a)}}function ma(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?ma(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function ha(){for(var e=window,t=X();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(a){n=!1}if(!n)break;t=X((e=t.contentWindow).document)}return t}function ba(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var va=d&&"documentMode"in document&&11>=document.documentMode,ya=null,_a=null,wa=null,ka=!1;function xa(e,t,n){var a=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;ka||null==ya||ya!==X(a)||("selectionStart"in(a=ya)&&ba(a)?a={start:a.selectionStart,end:a.selectionEnd}:a={anchorNode:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset},wa&&fa(wa,a)||(wa=a,0<(a=Da(_a,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:a}),t.target=ya)))}Mt("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),Mt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),Mt(It,2);for(var Ea="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Sa=0;Sa<Ea.length;Sa++)Rt.set(Ea[Sa],0);u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),c("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),c("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),c("onBeforeInput",["compositionend","keypress","textInput","paste"]),c("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ta="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ca=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ta));function Aa(e,t,n){var a=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,a,r,o,l,s,c){if(Ke.apply(this,arguments),He){if(!He)throw Error(i(198));var u=Ve;He=!1,Ve=null,We||(We=!0,Ge=u)}}(a,t,void 0,e),e.currentTarget=null}function La(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var a=e[n],r=a.event;a=a.listeners;e:{var o=void 0;if(t)for(var i=a.length-1;0<=i;i--){var l=a[i],s=l.instance,c=l.currentTarget;if(l=l.listener,s!==o&&r.isPropagationStopped())break e;Aa(r,l,c),o=s}else for(i=0;i<a.length;i++){if(s=(l=a[i]).instance,c=l.currentTarget,l=l.listener,s!==o&&r.isPropagationStopped())break e;Aa(r,l,c),o=s}}}if(We)throw e=Ge,We=!1,Ge=null,e}function Pa(e,t){var n=ir(t),a=e+"__bubble";n.has(a)||(Ia(t,e,2,!1),n.add(a))}var Na="_reactListening"+Math.random().toString(36).slice(2);function Oa(e){e[Na]||(e[Na]=!0,l.forEach((function(t){Ca.has(t)||Ra(t,!1,e,null),Ra(t,!0,e,null)})))}function Ra(e,t,n,a){var r=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==a&&!t&&Ca.has(e)){if("scroll"!==e)return;r|=2,o=a}var i=ir(o),l=e+"__"+(t?"capture":"bubble");i.has(l)||(t&&(r|=4),Ia(o,e,r,t),i.add(l))}function Ia(e,t,n,a){var r=Rt.get(t);switch(void 0===r?2:r){case 0:r=Yt;break;case 1:r=Qt;break;default:r=Xt}n=r.bind(null,t,n,e),r=void 0,!Ue||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(r=!0),a?void 0!==r?e.addEventListener(t,n,{capture:!0,passive:r}):e.addEventListener(t,n,!0):void 0!==r?e.addEventListener(t,n,{passive:r}):e.addEventListener(t,n,!1)}function Ma(e,t,n,a,r){var o=a;if(0==(1&t)&&0==(2&t)&&null!==a)e:for(;;){if(null===a)return;var i=a.tag;if(3===i||4===i){var l=a.stateNode.containerInfo;if(l===r||8===l.nodeType&&l.parentNode===r)break;if(4===i)for(i=a.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===r||8===s.nodeType&&s.parentNode===r))return;i=i.return}for(;null!==l;){if(null===(i=nr(l)))return;if(5===(s=i.tag)||6===s){a=o=i;continue e}l=l.parentNode}}a=a.return}!function(e,t,n){if(Be)return e(t,n);Be=!0;try{je(e,t,n)}finally{Be=!1,Fe()}}((function(){var a=o,r=Te(n),i=[];e:{var l=Ot.get(e);if(void 0!==l){var s=pn,c=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":s=Pn;break;case"focusin":c="focus",s=yn;break;case"focusout":c="blur",s=yn;break;case"beforeblur":case"afterblur":s=yn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=bn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=vn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=On;break;case At:case Lt:case Pt:s=_n;break;case Nt:s=Rn;break;case"scroll":s=mn;break;case"wheel":s=Mn;break;case"copy":case"cut":case"paste":s=kn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Nn}var u=0!=(4&t),d=!u&&"scroll"===e,f=u?null!==l?l+"Capture":null:l;u=[];for(var p,g=a;null!==g;){var m=(p=g).stateNode;if(5===p.tag&&null!==m&&(p=m,null!==f&&(null!=(m=$e(g,f))&&u.push(ja(g,m,p)))),d)break;g=g.return}0<u.length&&(l=new s(l,c,null,n,r),i.push({event:l,listeners:u}))}}if(0==(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(c=n.relatedTarget||n.fromElement)||!nr(c)&&!c[er])&&(s||l)&&(l=r.window===r?r:(l=r.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=a,null!==(c=(c=n.relatedTarget||n.toElement)?nr(c):null)&&(c!==(d=Ye(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=a),s!==c)){if(u=bn,m="onMouseLeave",f="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(u=Nn,m="onPointerLeave",f="onPointerEnter",g="pointer"),d=null==s?l:rr(s),p=null==c?l:rr(c),(l=new u(m,g+"leave",s,n,r)).target=d,l.relatedTarget=p,m=null,nr(r)===a&&((u=new u(f,g+"enter",c,n,r)).target=p,u.relatedTarget=d,m=u),d=m,s&&c)e:{for(f=c,g=0,p=u=s;p;p=Ba(p))g++;for(p=0,m=f;m;m=Ba(m))p++;for(;0<g-p;)u=Ba(u),g--;for(;0<p-g;)f=Ba(f),p--;for(;g--;){if(u===f||null!==f&&u===f.alternate)break e;u=Ba(u),f=Ba(f)}u=null}else u=null;null!==s&&Fa(i,l,s,u,!1),null!==c&&null!==d&&Fa(i,d,c,u,!0)}if("select"===(s=(l=a?rr(a):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Jn;else if(Gn(l))if(ea)h=ca;else{h=la;var b=ia}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=sa);switch(h&&(h=h(e,a))?qn(i,h,n,r):(b&&b(e,l,a),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&re(l,"number",l.value)),b=a?rr(a):window,e){case"focusin":(Gn(b)||"true"===b.contentEditable)&&(ya=b,_a=a,wa=null);break;case"focusout":wa=_a=ya=null;break;case"mousedown":ka=!0;break;case"contextmenu":case"mouseup":case"dragend":ka=!1,xa(i,n,r);break;case"selectionchange":if(va)break;case"keydown":case"keyup":xa(i,n,r)}var v;if(Dn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Vn?Zn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&($n&&"ko"!==n.locale&&(Vn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Vn&&(v=an()):(tn="value"in(en=r)?en.value:en.textContent,Vn=!0)),0<(b=Da(a,y)).length&&(y=new xn(y,e,null,n,r),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=Hn(n))&&(y.data=v))),(v=Fn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:(zn=!0,Un);case"textInput":return(e=t.data)===Un&&zn?null:e;default:return null}}(e,n):function(e,t){if(Vn)return"compositionend"===e||!Dn&&Zn(e,t)?(e=an(),nn=tn=en=null,Vn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return $n&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(a=Da(a,"onBeforeInput")).length&&(r=new xn("onBeforeInput","beforeinput",null,n,r),i.push({event:r,listeners:a}),r.data=v))}La(i,t)}))}function ja(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Da(e,t){for(var n=t+"Capture",a=[];null!==e;){var r=e,o=r.stateNode;5===r.tag&&null!==o&&(r=o,null!=(o=$e(e,n))&&a.unshift(ja(e,o,r)),null!=(o=$e(e,t))&&a.push(ja(e,o,r))),e=e.return}return a}function Ba(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Fa(e,t,n,a,r){for(var o=t._reactName,i=[];null!==n&&n!==a;){var l=n,s=l.alternate,c=l.stateNode;if(null!==s&&s===a)break;5===l.tag&&null!==c&&(l=c,r?null!=(s=$e(n,o))&&i.unshift(ja(n,s,l)):r||null!=(s=$e(n,o))&&i.push(ja(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function $a(){}var Ua=null,za=null;function Za(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Ha(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Va="function"==typeof setTimeout?setTimeout:void 0,Wa="function"==typeof clearTimeout?clearTimeout:void 0;function Ga(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qa(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Ka(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Ya=0;var Qa=Math.random().toString(36).slice(2),Xa="__reactFiber$"+Qa,Ja="__reactProps$"+Qa,er="__reactContainer$"+Qa,tr="__reactEvents$"+Qa;function nr(e){var t=e[Xa];if(t)return t;for(var n=e.parentNode;n;){if(t=n[er]||n[Xa]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Ka(e);null!==e;){if(n=e[Xa])return n;e=Ka(e)}return t}n=(e=n).parentNode}return null}function ar(e){return!(e=e[Xa]||e[er])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function rr(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function or(e){return e[Ja]||null}function ir(e){var t=e[tr];return void 0===t&&(t=e[tr]=new Set),t}var lr=[],sr=-1;function cr(e){return{current:e}}function ur(e){0>sr||(e.current=lr[sr],lr[sr]=null,sr--)}function dr(e,t){sr++,lr[sr]=e.current,e.current=t}var fr={},pr=cr(fr),gr=cr(!1),mr=fr;function hr(e,t){var n=e.type.contextTypes;if(!n)return fr;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var r,o={};for(r in n)o[r]=t[r];return a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function br(e){return null!=(e=e.childContextTypes)}function vr(){ur(gr),ur(pr)}function yr(e,t,n){if(pr.current!==fr)throw Error(i(168));dr(pr,t),dr(gr,n)}function _r(e,t,n){var a=e.stateNode;if(e=t.childContextTypes,"function"!=typeof a.getChildContext)return n;for(var o in a=a.getChildContext())if(!(o in e))throw Error(i(108,G(t)||"Unknown",o));return r({},n,a)}function wr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||fr,mr=pr.current,dr(pr,e),dr(gr,gr.current),!0}function kr(e,t,n){var a=e.stateNode;if(!a)throw Error(i(169));n?(e=_r(e,t,mr),a.__reactInternalMemoizedMergedChildContext=e,ur(gr),ur(pr),dr(pr,e)):ur(gr),dr(gr,n)}var xr=null,Er=null,Sr=o.unstable_runWithPriority,Tr=o.unstable_scheduleCallback,Cr=o.unstable_cancelCallback,Ar=o.unstable_shouldYield,Lr=o.unstable_requestPaint,Pr=o.unstable_now,Nr=o.unstable_getCurrentPriorityLevel,Or=o.unstable_ImmediatePriority,Rr=o.unstable_UserBlockingPriority,Ir=o.unstable_NormalPriority,Mr=o.unstable_LowPriority,jr=o.unstable_IdlePriority,Dr={},Br=void 0!==Lr?Lr:function(){},Fr=null,$r=null,Ur=!1,zr=Pr(),Zr=1e4>zr?Pr:function(){return Pr()-zr};function Hr(){switch(Nr()){case Or:return 99;case Rr:return 98;case Ir:return 97;case Mr:return 96;case jr:return 95;default:throw Error(i(332))}}function Vr(e){switch(e){case 99:return Or;case 98:return Rr;case 97:return Ir;case 96:return Mr;case 95:return jr;default:throw Error(i(332))}}function Wr(e,t){return e=Vr(e),Sr(e,t)}function Gr(e,t,n){return e=Vr(e),Tr(e,t,n)}function qr(){if(null!==$r){var e=$r;$r=null,Cr(e)}Kr()}function Kr(){if(!Ur&&null!==Fr){Ur=!0;var e=0;try{var t=Fr;Wr(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fr=null}catch(n){throw null!==Fr&&(Fr=Fr.slice(e+1)),Tr(Or,qr),n}finally{Ur=!1}}}var Yr=w.ReactCurrentBatchConfig;function Qr(e,t){if(e&&e.defaultProps){for(var n in t=r({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Xr=cr(null),Jr=null,eo=null,to=null;function no(){to=eo=Jr=null}function ao(e){var t=Xr.current;ur(Xr),e.type._context._currentValue=t}function ro(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function oo(e,t){Jr=e,to=eo=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Di=!0),e.firstContext=null)}function io(e,t){if(to!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(to=e,t=1073741823),t={context:e,observedBits:t,next:null},null===eo){if(null===Jr)throw Error(i(308));eo=t,Jr.dependencies={lanes:0,firstContext:t,responders:null}}else eo=eo.next=t;return e._currentValue}var lo=!1;function so(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function co(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function uo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function fo(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function po(e,t){var n=e.updateQueue,a=e.alternate;if(null!==a&&n===(a=a.updateQueue)){var r=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?r=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?r=o=t:o=o.next=t}else r=o=t;return n={baseState:a.baseState,firstBaseUpdate:r,lastBaseUpdate:o,shared:a.shared,effects:a.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function go(e,t,n,a){var o=e.updateQueue;lo=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var c=s,u=c.next;c.next=null,null===l?i=u:l.next=u,l=c;var d=e.alternate;if(null!==d){var f=(d=d.updateQueue).lastBaseUpdate;f!==l&&(null===f?d.firstBaseUpdate=u:f.next=u,d.lastBaseUpdate=c)}}if(null!==i){for(f=o.baseState,l=0,d=u=c=null;;){s=i.lane;var p=i.eventTime;if((a&s)===s){null!==d&&(d=d.next={eventTime:p,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var g=e,m=i;switch(s=t,p=n,m.tag){case 1:if("function"==typeof(g=m.payload)){f=g.call(p,f,s);break e}f=g;break e;case 3:g.flags=-4097&g.flags|64;case 0:if(null==(s="function"==typeof(g=m.payload)?g.call(p,f,s):g))break e;f=r({},f,s);break e;case 2:lo=!0}}null!==i.callback&&(e.flags|=32,null===(s=o.effects)?o.effects=[i]:s.push(i))}else p={eventTime:p,lane:s,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(u=d=p,c=f):d=d.next=p,l|=s;if(null===(i=i.next)){if(null===(s=o.shared.pending))break;i=s.next,s.next=null,o.lastBaseUpdate=s,o.shared.pending=null}}null===d&&(c=f),o.baseState=c,o.firstBaseUpdate=u,o.lastBaseUpdate=d,Ul|=l,e.lanes=l,e.memoizedState=f}}function mo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var a=e[t],r=a.callback;if(null!==r){if(a.callback=null,a=n,"function"!=typeof r)throw Error(i(191,r));r.call(a)}}}var ho=(new a.Component).refs;function bo(e,t,n,a){n=null==(n=n(a,t=e.memoizedState))?t:r({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var vo={isMounted:function(e){return!!(e=e._reactInternals)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var a=fs(),r=ps(e),o=uo(a,r);o.payload=t,null!=n&&(o.callback=n),fo(e,o),gs(e,r,a)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var a=fs(),r=ps(e),o=uo(a,r);o.tag=1,o.payload=t,null!=n&&(o.callback=n),fo(e,o),gs(e,r,a)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=fs(),a=ps(e),r=uo(n,a);r.tag=2,null!=t&&(r.callback=t),fo(e,r),gs(e,a,n)}};function yo(e,t,n,a,r,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(a,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!fa(n,a)||!fa(r,o))}function _o(e,t,n){var a=!1,r=fr,o=t.contextType;return"object"==typeof o&&null!==o?o=io(o):(r=br(t)?mr:pr.current,o=(a=null!=(a=t.contextTypes))?hr(e,r):fr),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=vo,e.stateNode=t,t._reactInternals=e,a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=o),t}function wo(e,t,n,a){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,a),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,a),t.state!==e&&vo.enqueueReplaceState(t,t.state,null)}function ko(e,t,n,a){var r=e.stateNode;r.props=n,r.state=e.memoizedState,r.refs=ho,so(e);var o=t.contextType;"object"==typeof o&&null!==o?r.context=io(o):(o=br(t)?mr:pr.current,r.context=hr(e,o)),go(e,n,r,a),r.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(bo(e,t,o,n),r.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof r.getSnapshotBeforeUpdate||"function"!=typeof r.UNSAFE_componentWillMount&&"function"!=typeof r.componentWillMount||(t=r.state,"function"==typeof r.componentWillMount&&r.componentWillMount(),"function"==typeof r.UNSAFE_componentWillMount&&r.UNSAFE_componentWillMount(),t!==r.state&&vo.enqueueReplaceState(r,r.state,null),go(e,n,r,a),r.state=e.memoizedState),"function"==typeof r.componentDidMount&&(e.flags|=4)}var xo=Array.isArray;function Eo(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var a=n.stateNode}if(!a)throw Error(i(147,e));var r=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===r?t.ref:(t=function(e){var t=a.refs;t===ho&&(t=a.refs={}),null===e?delete t[r]:t[r]=e},t._stringRef=r,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function So(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function To(e){function t(t,n){if(e){var a=t.lastEffect;null!==a?(a.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,a){if(!e)return null;for(;null!==a;)t(n,a),a=a.sibling;return null}function a(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function r(e,t){return(e=Ws(e,t)).index=0,e.sibling=null,e}function o(t,n,a){return t.index=a,e?null!==(a=t.alternate)?(a=a.index)<n?(t.flags=2,n):a:(t.flags=2,n):n}function l(t){return e&&null===t.alternate&&(t.flags=2),t}function s(e,t,n,a){return null===t||6!==t.tag?((t=Ys(n,e.mode,a)).return=e,t):((t=r(t,n)).return=e,t)}function c(e,t,n,a){return null!==t&&t.elementType===n.type?((a=r(t,n.props)).ref=Eo(e,t,n),a.return=e,a):((a=Gs(n.type,n.key,n.props,null,e.mode,a)).ref=Eo(e,t,n),a.return=e,a)}function u(e,t,n,a){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Qs(n,e.mode,a)).return=e,t):((t=r(t,n.children||[])).return=e,t)}function d(e,t,n,a,o){return null===t||7!==t.tag?((t=qs(n,e.mode,a,o)).return=e,t):((t=r(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Ys(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Gs(t.type,t.key,t.props,null,e.mode,n)).ref=Eo(e,null,t),n.return=e,n;case x:return(t=Qs(t,e.mode,n)).return=e,t}if(xo(t)||z(t))return(t=qs(t,e.mode,n,null)).return=e,t;So(e,t)}return null}function p(e,t,n,a){var r=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==r?null:s(e,t,""+n,a);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===r?n.type===E?d(e,t,n.props.children,a,r):c(e,t,n,a):null;case x:return n.key===r?u(e,t,n,a):null}if(xo(n)||z(n))return null!==r?null:d(e,t,n,a,null);So(e,n)}return null}function g(e,t,n,a,r){if("string"==typeof a||"number"==typeof a)return s(t,e=e.get(n)||null,""+a,r);if("object"==typeof a&&null!==a){switch(a.$$typeof){case k:return e=e.get(null===a.key?n:a.key)||null,a.type===E?d(t,e,a.props.children,r,a.key):c(t,e,a,r);case x:return u(t,e=e.get(null===a.key?n:a.key)||null,a,r)}if(xo(a)||z(a))return d(t,e=e.get(n)||null,a,r,null);So(t,a)}return null}function m(r,i,l,s){for(var c=null,u=null,d=i,m=i=0,h=null;null!==d&&m<l.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var b=p(r,d,l[m],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(r,d),i=o(b,i,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===l.length)return n(r,d),c;if(null===d){for(;m<l.length;m++)null!==(d=f(r,l[m],s))&&(i=o(d,i,m),null===u?c=d:u.sibling=d,u=d);return c}for(d=a(r,d);m<l.length;m++)null!==(h=g(d,r,m,l[m],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),i=o(h,i,m),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(r,e)})),c}function h(r,l,s,c){var u=z(s);if("function"!=typeof u)throw Error(i(150));if(null==(s=u.call(s)))throw Error(i(151));for(var d=u=null,m=l,h=l=0,b=null,v=s.next();null!==m&&!v.done;h++,v=s.next()){m.index>h?(b=m,m=null):b=m.sibling;var y=p(r,m,v.value,c);if(null===y){null===m&&(m=b);break}e&&m&&null===y.alternate&&t(r,m),l=o(y,l,h),null===d?u=y:d.sibling=y,d=y,m=b}if(v.done)return n(r,m),u;if(null===m){for(;!v.done;h++,v=s.next())null!==(v=f(r,v.value,c))&&(l=o(v,l,h),null===d?u=v:d.sibling=v,d=v);return u}for(m=a(r,m);!v.done;h++,v=s.next())null!==(v=g(m,r,h,v.value,c))&&(e&&null!==v.alternate&&m.delete(null===v.key?h:v.key),l=o(v,l,h),null===d?u=v:d.sibling=v,d=v);return e&&m.forEach((function(e){return t(r,e)})),u}return function(e,a,o,s){var c="object"==typeof o&&null!==o&&o.type===E&&null===o.key;c&&(o=o.props.children);var u="object"==typeof o&&null!==o;if(u)switch(o.$$typeof){case k:e:{for(u=o.key,c=a;null!==c;){if(c.key===u){if(7===c.tag){if(o.type===E){n(e,c.sibling),(a=r(c,o.props.children)).return=e,e=a;break e}}else if(c.elementType===o.type){n(e,c.sibling),(a=r(c,o.props)).ref=Eo(e,c,o),a.return=e,e=a;break e}n(e,c);break}t(e,c),c=c.sibling}o.type===E?((a=qs(o.props.children,e.mode,s,o.key)).return=e,e=a):((s=Gs(o.type,o.key,o.props,null,e.mode,s)).ref=Eo(e,a,o),s.return=e,e=s)}return l(e);case x:e:{for(c=o.key;null!==a;){if(a.key===c){if(4===a.tag&&a.stateNode.containerInfo===o.containerInfo&&a.stateNode.implementation===o.implementation){n(e,a.sibling),(a=r(a,o.children||[])).return=e,e=a;break e}n(e,a);break}t(e,a),a=a.sibling}(a=Qs(o,e.mode,s)).return=e,e=a}return l(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==a&&6===a.tag?(n(e,a.sibling),(a=r(a,o)).return=e,e=a):(n(e,a),(a=Ys(o,e.mode,s)).return=e,e=a),l(e);if(xo(o))return m(e,a,o,s);if(z(o))return h(e,a,o,s);if(u&&So(e,o),void 0===o&&!c)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,G(e.type)||"Component"))}return n(e,a)}}var Co=To(!0),Ao=To(!1),Lo={},Po=cr(Lo),No=cr(Lo),Oo=cr(Lo);function Ro(e){if(e===Lo)throw Error(i(174));return e}function Io(e,t){switch(dr(Oo,t),dr(No,e),dr(Po,Lo),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:ge(null,"");break;default:t=ge(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ur(Po),dr(Po,t)}function Mo(){ur(Po),ur(No),ur(Oo)}function jo(e){Ro(Oo.current);var t=Ro(Po.current),n=ge(t,e.type);t!==n&&(dr(No,e),dr(Po,n))}function Do(e){No.current===e&&(ur(Po),ur(No))}var Bo=cr(0);function Fo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var $o=null,Uo=null,zo=!1;function Zo(e,t){var n=Hs(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ho(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Vo(e){if(zo){var t=Uo;if(t){var n=t;if(!Ho(e,t)){if(!(t=qa(n.nextSibling))||!Ho(e,t))return e.flags=-1025&e.flags|2,zo=!1,void($o=e);Zo($o,n)}$o=e,Uo=qa(t.firstChild)}else e.flags=-1025&e.flags|2,zo=!1,$o=e}}function Wo(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;$o=e}function Go(e){if(e!==$o)return!1;if(!zo)return Wo(e),zo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Ha(t,e.memoizedProps))for(t=Uo;t;)Zo(e,t),t=qa(t.nextSibling);if(Wo(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){Uo=qa(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Uo=null}}else Uo=$o?qa(e.stateNode.nextSibling):null;return!0}function qo(){Uo=$o=null,zo=!1}var Ko=[];function Yo(){for(var e=0;e<Ko.length;e++)Ko[e]._workInProgressVersionPrimary=null;Ko.length=0}var Qo=w.ReactCurrentDispatcher,Xo=w.ReactCurrentBatchConfig,Jo=0,ei=null,ti=null,ni=null,ai=!1,ri=!1;function oi(){throw Error(i(321))}function ii(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ua(e[n],t[n]))return!1;return!0}function li(e,t,n,a,r,o){if(Jo=o,ei=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Qo.current=null===e||null===e.memoizedState?Ri:Ii,e=n(a,r),ri){o=0;do{if(ri=!1,!(25>o))throw Error(i(301));o+=1,ni=ti=null,t.updateQueue=null,Qo.current=Mi,e=n(a,r)}while(ri)}if(Qo.current=Oi,t=null!==ti&&null!==ti.next,Jo=0,ni=ti=ei=null,ai=!1,t)throw Error(i(300));return e}function si(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ni?ei.memoizedState=ni=e:ni=ni.next=e,ni}function ci(){if(null===ti){var e=ei.alternate;e=null!==e?e.memoizedState:null}else e=ti.next;var t=null===ni?ei.memoizedState:ni.next;if(null!==t)ni=t,ti=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ti=e).memoizedState,baseState:ti.baseState,baseQueue:ti.baseQueue,queue:ti.queue,next:null},null===ni?ei.memoizedState=ni=e:ni=ni.next=e}return ni}function ui(e,t){return"function"==typeof t?t(e):t}function di(e){var t=ci(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var a=ti,r=a.baseQueue,o=n.pending;if(null!==o){if(null!==r){var l=r.next;r.next=o.next,o.next=l}a.baseQueue=r=o,n.pending=null}if(null!==r){r=r.next,a=a.baseState;var s=l=o=null,c=r;do{var u=c.lane;if((Jo&u)===u)null!==s&&(s=s.next={lane:0,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null}),a=c.eagerReducer===e?c.eagerState:e(a,c.action);else{var d={lane:u,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null};null===s?(l=s=d,o=a):s=s.next=d,ei.lanes|=u,Ul|=u}c=c.next}while(null!==c&&c!==r);null===s?o=a:s.next=l,ua(a,t.memoizedState)||(Di=!0),t.memoizedState=a,t.baseState=o,t.baseQueue=s,n.lastRenderedState=a}return[t.memoizedState,n.dispatch]}function fi(e){var t=ci(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var a=n.dispatch,r=n.pending,o=t.memoizedState;if(null!==r){n.pending=null;var l=r=r.next;do{o=e(o,l.action),l=l.next}while(l!==r);ua(o,t.memoizedState)||(Di=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,a]}function pi(e,t,n){var a=t._getVersion;a=a(t._source);var r=t._workInProgressVersionPrimary;if(null!==r?e=r===a:(e=e.mutableReadLanes,(e=(Jo&e)===e)&&(t._workInProgressVersionPrimary=a,Ko.push(t))),e)return n(t._source);throw Ko.push(t),Error(i(350))}function gi(e,t,n,a){var r=Rl;if(null===r)throw Error(i(349));var o=t._getVersion,l=o(t._source),s=Qo.current,c=s.useState((function(){return pi(r,t,n)})),u=c[1],d=c[0];c=ni;var f=e.memoizedState,p=f.refs,g=p.getSnapshot,m=f.source;f=f.subscribe;var h=ei;return e.memoizedState={refs:p,source:t,subscribe:a},s.useEffect((function(){p.getSnapshot=n,p.setSnapshot=u;var e=o(t._source);if(!ua(l,e)){e=n(t._source),ua(d,e)||(u(e),e=ps(h),r.mutableReadLanes|=e&r.pendingLanes),e=r.mutableReadLanes,r.entangledLanes|=e;for(var a=r.entanglements,i=e;0<i;){var s=31-Ht(i),c=1<<s;a[s]|=e,i&=~c}}}),[n,t,a]),s.useEffect((function(){return a(t._source,(function(){var e=p.getSnapshot,n=p.setSnapshot;try{n(e(t._source));var a=ps(h);r.mutableReadLanes|=a&r.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,a]),ua(g,n)&&ua(m,t)&&ua(f,a)||((e={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:d}).dispatch=u=Ni.bind(null,ei,e),c.queue=e,c.baseQueue=null,d=pi(r,t,n),c.memoizedState=c.baseState=d),d}function mi(e,t,n){return gi(ci(),e,t,n)}function hi(e){var t=si();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:e}).dispatch=Ni.bind(null,ei,e),[t.memoizedState,e]}function bi(e,t,n,a){return e={tag:e,create:t,destroy:n,deps:a,next:null},null===(t=ei.updateQueue)?(t={lastEffect:null},ei.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(a=n.next,n.next=e,e.next=a,t.lastEffect=e),e}function vi(e){return e={current:e},si().memoizedState=e}function yi(){return ci().memoizedState}function _i(e,t,n,a){var r=si();ei.flags|=e,r.memoizedState=bi(1|t,n,void 0,void 0===a?null:a)}function wi(e,t,n,a){var r=ci();a=void 0===a?null:a;var o=void 0;if(null!==ti){var i=ti.memoizedState;if(o=i.destroy,null!==a&&ii(a,i.deps))return void bi(t,n,o,a)}ei.flags|=e,r.memoizedState=bi(1|t,n,o,a)}function ki(e,t){return _i(516,4,e,t)}function xi(e,t){return wi(516,4,e,t)}function Ei(e,t){return wi(4,2,e,t)}function Si(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Ti(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,Si.bind(null,t,e),n)}function Ci(){}function Ai(e,t){var n=ci();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&ii(t,a[1])?a[0]:(n.memoizedState=[e,t],e)}function Li(e,t){var n=ci();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&ii(t,a[1])?a[0]:(e=e(),n.memoizedState=[e,t],e)}function Pi(e,t){var n=Hr();Wr(98>n?98:n,(function(){e(!0)})),Wr(97<n?97:n,(function(){var n=Xo.transition;Xo.transition=1;try{e(!1),t()}finally{Xo.transition=n}}))}function Ni(e,t,n){var a=fs(),r=ps(e),o={lane:r,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?o.next=o:(o.next=i.next,i.next=o),t.pending=o,i=e.alternate,e===ei||null!==i&&i===ei)ri=ai=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var l=t.lastRenderedState,s=i(l,n);if(o.eagerReducer=i,o.eagerState=s,ua(s,l))return}catch(c){}gs(e,r,a)}}var Oi={readContext:io,useCallback:oi,useContext:oi,useEffect:oi,useImperativeHandle:oi,useLayoutEffect:oi,useMemo:oi,useReducer:oi,useRef:oi,useState:oi,useDebugValue:oi,useDeferredValue:oi,useTransition:oi,useMutableSource:oi,useOpaqueIdentifier:oi,unstable_isNewReconciler:!1},Ri={readContext:io,useCallback:function(e,t){return si().memoizedState=[e,void 0===t?null:t],e},useContext:io,useEffect:ki,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,_i(4,2,Si.bind(null,t,e),n)},useLayoutEffect:function(e,t){return _i(4,2,e,t)},useMemo:function(e,t){var n=si();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var a=si();return t=void 0!==n?n(t):t,a.memoizedState=a.baseState=t,e=(e=a.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Ni.bind(null,ei,e),[a.memoizedState,e]},useRef:vi,useState:hi,useDebugValue:Ci,useDeferredValue:function(e){var t=hi(e),n=t[0],a=t[1];return ki((function(){var t=Xo.transition;Xo.transition=1;try{a(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=hi(!1),t=e[0];return vi(e=Pi.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var a=si();return a.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},gi(a,e,t,n)},useOpaqueIdentifier:function(){if(zo){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Ya++).toString(36))),Error(i(355))})),n=hi(t)[1];return 0==(2&ei.mode)&&(ei.flags|=516,bi(5,(function(){n("r:"+(Ya++).toString(36))}),void 0,null)),t}return hi(t="r:"+(Ya++).toString(36)),t},unstable_isNewReconciler:!1},Ii={readContext:io,useCallback:Ai,useContext:io,useEffect:xi,useImperativeHandle:Ti,useLayoutEffect:Ei,useMemo:Li,useReducer:di,useRef:yi,useState:function(){return di(ui)},useDebugValue:Ci,useDeferredValue:function(e){var t=di(ui),n=t[0],a=t[1];return xi((function(){var t=Xo.transition;Xo.transition=1;try{a(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=di(ui)[0];return[yi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return di(ui)[0]},unstable_isNewReconciler:!1},Mi={readContext:io,useCallback:Ai,useContext:io,useEffect:xi,useImperativeHandle:Ti,useLayoutEffect:Ei,useMemo:Li,useReducer:fi,useRef:yi,useState:function(){return fi(ui)},useDebugValue:Ci,useDeferredValue:function(e){var t=fi(ui),n=t[0],a=t[1];return xi((function(){var t=Xo.transition;Xo.transition=1;try{a(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=fi(ui)[0];return[yi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return fi(ui)[0]},unstable_isNewReconciler:!1},ji=w.ReactCurrentOwner,Di=!1;function Bi(e,t,n,a){t.child=null===e?Ao(t,null,n,a):Co(t,e.child,n,a)}function Fi(e,t,n,a,r){n=n.render;var o=t.ref;return oo(t,r),a=li(e,t,n,a,o,r),null===e||Di?(t.flags|=1,Bi(e,t,a,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,ol(e,t,r))}function $i(e,t,n,a,r,o){if(null===e){var i=n.type;return"function"!=typeof i||Vs(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Gs(n.type,null,a,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,Ui(e,t,i,a,r,o))}return i=e.child,0==(r&o)&&(r=i.memoizedProps,(n=null!==(n=n.compare)?n:fa)(r,a)&&e.ref===t.ref)?ol(e,t,o):(t.flags|=1,(e=Ws(i,a)).ref=t.ref,e.return=t,t.child=e)}function Ui(e,t,n,a,r,o){if(null!==e&&fa(e.memoizedProps,a)&&e.ref===t.ref){if(Di=!1,0==(o&r))return t.lanes=e.lanes,ol(e,t,o);0!=(16384&e.flags)&&(Di=!0)}return Hi(e,t,n,a,o)}function zi(e,t,n){var a=t.pendingProps,r=a.children,o=null!==e?e.memoizedState:null;if("hidden"===a.mode||"unstable-defer-without-hiding"===a.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},ks(t,n);else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},ks(t,e),null;t.memoizedState={baseLanes:0},ks(t,null!==o?o.baseLanes:n)}else null!==o?(a=o.baseLanes|n,t.memoizedState=null):a=n,ks(t,a);return Bi(e,t,r,n),t.child}function Zi(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Hi(e,t,n,a,r){var o=br(n)?mr:pr.current;return o=hr(t,o),oo(t,r),n=li(e,t,n,a,o,r),null===e||Di?(t.flags|=1,Bi(e,t,n,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,ol(e,t,r))}function Vi(e,t,n,a,r){if(br(n)){var o=!0;wr(t)}else o=!1;if(oo(t,r),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),_o(t,n,a),ko(t,n,a,r),a=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=io(c):c=hr(t,c=br(n)?mr:pr.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==a||s!==c)&&wo(t,i,a,c),lo=!1;var f=t.memoizedState;i.state=f,go(t,a,i,r),s=t.memoizedState,l!==a||f!==s||gr.current||lo?("function"==typeof u&&(bo(t,n,u,a),s=t.memoizedState),(l=lo||yo(t,n,l,a,f,s,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=a,t.memoizedState=s),i.props=a,i.state=s,i.context=c,a=l):("function"==typeof i.componentDidMount&&(t.flags|=4),a=!1)}else{i=t.stateNode,co(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:Qr(t.type,l),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=io(s):s=hr(t,s=br(n)?mr:pr.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==s)&&wo(t,i,a,s),lo=!1,f=t.memoizedState,i.state=f,go(t,a,i,r);var g=t.memoizedState;l!==d||f!==g||gr.current||lo?("function"==typeof p&&(bo(t,n,p,a),g=t.memoizedState),(c=lo||yo(t,n,c,a,f,g,s))?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(a,g,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(a,g,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=a,t.memoizedState=g),i.props=a,i.state=g,i.context=s,a=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),a=!1)}return Wi(e,t,n,a,o,r)}function Wi(e,t,n,a,r,o){Zi(e,t);var i=0!=(64&t.flags);if(!a&&!i)return r&&kr(t,n,!1),ol(e,t,o);a=t.stateNode,ji.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:a.render();return t.flags|=1,null!==e&&i?(t.child=Co(t,e.child,null,o),t.child=Co(t,null,l,o)):Bi(e,t,l,o),t.memoizedState=a.state,r&&kr(t,n,!0),t.child}function Gi(e){var t=e.stateNode;t.pendingContext?yr(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yr(0,t.context,!1),Io(e,t.containerInfo)}var qi,Ki,Yi,Qi={dehydrated:null,retryLane:0};function Xi(e,t,n){var a,r=t.pendingProps,o=Bo.current,i=!1;return(a=0!=(64&t.flags))||(a=(null===e||null!==e.memoizedState)&&0!=(2&o)),a?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===r.fallback||!0===r.unstable_avoidThisFallback||(o|=1),dr(Bo,1&o),null===e?(void 0!==r.fallback&&Vo(t),e=r.children,o=r.fallback,i?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,e):"number"==typeof r.unstable_expectedLoadTime?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,t.lanes=33554432,e):((n=Ks({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(r=tl(e,t,r.children,r.fallback,n),i=t.child,o=e.child.memoizedState,i.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Qi,r):(n=el(e,t,r.children,n),t.memoizedState=null,n))}function Ji(e,t,n,a){var r=e.mode,o=e.child;return t={mode:"hidden",children:t},0==(2&r)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=Ks(t,r,0,null),n=qs(n,r,a,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function el(e,t,n,a){var r=e.child;return e=r.sibling,n=Ws(r,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=a),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function tl(e,t,n,a,r){var o=t.mode,i=e.child;e=i.sibling;var l={mode:"hidden",children:n};return 0==(2&o)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=l,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Ws(i,l),null!==e?a=Ws(e,a):(a=qs(a,o,r,null)).flags|=2,a.return=t,n.return=t,n.sibling=a,t.child=n,a}function nl(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ro(e.return,t)}function al(e,t,n,a,r,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:n,tailMode:r,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=a,i.tail=n,i.tailMode=r,i.lastEffect=o)}function rl(e,t,n){var a=t.pendingProps,r=a.revealOrder,o=a.tail;if(Bi(e,t,a.children,n),0!=(2&(a=Bo.current)))a=1&a|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&nl(e,n);else if(19===e.tag)nl(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}if(dr(Bo,a),0==(2&t.mode))t.memoizedState=null;else switch(r){case"forwards":for(n=t.child,r=null;null!==n;)null!==(e=n.alternate)&&null===Fo(e)&&(r=n),n=n.sibling;null===(n=r)?(r=t.child,t.child=null):(r=n.sibling,n.sibling=null),al(t,!1,r,n,o,t.lastEffect);break;case"backwards":for(n=null,r=t.child,t.child=null;null!==r;){if(null!==(e=r.alternate)&&null===Fo(e)){t.child=r;break}e=r.sibling,r.sibling=n,n=r,r=e}al(t,!0,n,null,o,t.lastEffect);break;case"together":al(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function ol(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ul|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Ws(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Ws(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function il(e,t){if(!zo)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var a=null;null!==n;)null!==n.alternate&&(a=n),n=n.sibling;null===a?t||null===e.tail?e.tail=null:e.tail.sibling=null:a.sibling=null}}function ll(e,t,n){var a=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return br(t.type)&&vr(),null;case 3:return Mo(),ur(gr),ur(pr),Yo(),(a=t.stateNode).pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),null!==e&&null!==e.child||(Go(t)?t.flags|=4:a.hydrate||(t.flags|=256)),null;case 5:Do(t);var o=Ro(Oo.current);if(n=t.type,null!==e&&null!=t.stateNode)Ki(e,t,n,a),e.ref!==t.ref&&(t.flags|=128);else{if(!a){if(null===t.stateNode)throw Error(i(166));return null}if(e=Ro(Po.current),Go(t)){a=t.stateNode,n=t.type;var l=t.memoizedProps;switch(a[Xa]=t,a[Ja]=l,n){case"dialog":Pa("cancel",a),Pa("close",a);break;case"iframe":case"object":case"embed":Pa("load",a);break;case"video":case"audio":for(e=0;e<Ta.length;e++)Pa(Ta[e],a);break;case"source":Pa("error",a);break;case"img":case"image":case"link":Pa("error",a),Pa("load",a);break;case"details":Pa("toggle",a);break;case"input":ee(a,l),Pa("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!l.multiple},Pa("invalid",a);break;case"textarea":se(a,l),Pa("invalid",a)}for(var c in Ee(n,l),e=null,l)l.hasOwnProperty(c)&&(o=l[c],"children"===c?"string"==typeof o?a.textContent!==o&&(e=["children",o]):"number"==typeof o&&a.textContent!==""+o&&(e=["children",""+o]):s.hasOwnProperty(c)&&null!=o&&"onScroll"===c&&Pa("scroll",a));switch(n){case"input":Y(a),ae(a,l,!0);break;case"textarea":Y(a),ue(a);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(a.onclick=$a)}a=e,t.updateQueue=a,null!==a&&(t.flags|=4)}else{switch(c=9===o.nodeType?o:o.ownerDocument,e===de&&(e=pe(n)),e===de?"script"===n?((e=c.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof a.is?e=c.createElement(n,{is:a.is}):(e=c.createElement(n),"select"===n&&(c=e,a.multiple?c.multiple=!0:a.size&&(c.size=a.size))):e=c.createElementNS(e,n),e[Xa]=t,e[Ja]=a,qi(e,t),t.stateNode=e,c=Se(n,a),n){case"dialog":Pa("cancel",e),Pa("close",e),o=a;break;case"iframe":case"object":case"embed":Pa("load",e),o=a;break;case"video":case"audio":for(o=0;o<Ta.length;o++)Pa(Ta[o],e);o=a;break;case"source":Pa("error",e),o=a;break;case"img":case"image":case"link":Pa("error",e),Pa("load",e),o=a;break;case"details":Pa("toggle",e),o=a;break;case"input":ee(e,a),o=J(e,a),Pa("invalid",e);break;case"option":o=oe(e,a);break;case"select":e._wrapperState={wasMultiple:!!a.multiple},o=r({},a,{value:void 0}),Pa("invalid",e);break;case"textarea":se(e,a),o=le(e,a),Pa("invalid",e);break;default:o=a}Ee(n,o);var u=o;for(l in u)if(u.hasOwnProperty(l)){var d=u[l];"style"===l?ke(e,d):"dangerouslySetInnerHTML"===l?null!=(d=d?d.__html:void 0)&&be(e,d):"children"===l?"string"==typeof d?("textarea"!==n||""!==d)&&ve(e,d):"number"==typeof d&&ve(e,""+d):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(s.hasOwnProperty(l)?null!=d&&"onScroll"===l&&Pa("scroll",e):null!=d&&_(e,l,d,c))}switch(n){case"input":Y(e),ae(e,a,!1);break;case"textarea":Y(e),ue(e);break;case"option":null!=a.value&&e.setAttribute("value",""+q(a.value));break;case"select":e.multiple=!!a.multiple,null!=(l=a.value)?ie(e,!!a.multiple,l,!1):null!=a.defaultValue&&ie(e,!!a.multiple,a.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=$a)}Za(n,a)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Yi(0,t,e.memoizedProps,a);else{if("string"!=typeof a&&null===t.stateNode)throw Error(i(166));n=Ro(Oo.current),Ro(Po.current),Go(t)?(a=t.stateNode,n=t.memoizedProps,a[Xa]=t,a.nodeValue!==n&&(t.flags|=4)):((a=(9===n.nodeType?n:n.ownerDocument).createTextNode(a))[Xa]=t,t.stateNode=a)}return null;case 13:return ur(Bo),a=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(a=null!==a,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Go(t):n=null!==e.memoizedState,a&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Bo.current)?0===Bl&&(Bl=3):(0!==Bl&&3!==Bl||(Bl=4),null===Rl||0==(134217727&Ul)&&0==(134217727&zl)||vs(Rl,Ml))),(a||n)&&(t.flags|=4),null);case 4:return Mo(),null===e&&Oa(t.stateNode.containerInfo),null;case 10:return ao(t),null;case 19:if(ur(Bo),null===(a=t.memoizedState))return null;if(l=0!=(64&t.flags),null===(c=a.rendering))if(l)il(a,!1);else{if(0!==Bl||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(c=Fo(e))){for(t.flags|=64,il(a,!1),null!==(l=c.updateQueue)&&(t.updateQueue=l,t.flags|=4),null===a.lastEffect&&(t.firstEffect=null),t.lastEffect=a.lastEffect,a=n,n=t.child;null!==n;)e=a,(l=n).flags&=2,l.nextEffect=null,l.firstEffect=null,l.lastEffect=null,null===(c=l.alternate)?(l.childLanes=0,l.lanes=e,l.child=null,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return dr(Bo,1&Bo.current|2),t.child}e=e.sibling}null!==a.tail&&Zr()>Wl&&(t.flags|=64,l=!0,il(a,!1),t.lanes=33554432)}else{if(!l)if(null!==(e=Fo(c))){if(t.flags|=64,l=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),il(a,!0),null===a.tail&&"hidden"===a.tailMode&&!c.alternate&&!zo)return null!==(t=t.lastEffect=a.lastEffect)&&(t.nextEffect=null),null}else 2*Zr()-a.renderingStartTime>Wl&&1073741824!==n&&(t.flags|=64,l=!0,il(a,!1),t.lanes=33554432);a.isBackwards?(c.sibling=t.child,t.child=c):(null!==(n=a.last)?n.sibling=c:t.child=c,a.last=c)}return null!==a.tail?(n=a.tail,a.rendering=n,a.tail=n.sibling,a.lastEffect=t.lastEffect,a.renderingStartTime=Zr(),n.sibling=null,t=Bo.current,dr(Bo,l?1&t|2:1&t),n):null;case 23:case 24:return xs(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==a.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function sl(e){switch(e.tag){case 1:br(e.type)&&vr();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Mo(),ur(gr),ur(pr),Yo(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Do(e),null;case 13:return ur(Bo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ur(Bo),null;case 4:return Mo(),null;case 10:return ao(e),null;case 23:case 24:return xs(),null;default:return null}}function cl(e,t){try{var n="",a=t;do{n+=W(a),a=a.return}while(a);var r=n}catch(o){r="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:r}}function ul(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ki=function(e,t,n,a){var o=e.memoizedProps;if(o!==a){e=t.stateNode,Ro(Po.current);var i,l=null;switch(n){case"input":o=J(e,o),a=J(e,a),l=[];break;case"option":o=oe(e,o),a=oe(e,a),l=[];break;case"select":o=r({},o,{value:void 0}),a=r({},a,{value:void 0}),l=[];break;case"textarea":o=le(e,o),a=le(e,a),l=[];break;default:"function"!=typeof o.onClick&&"function"==typeof a.onClick&&(e.onclick=$a)}for(d in Ee(n,a),n=null,o)if(!a.hasOwnProperty(d)&&o.hasOwnProperty(d)&&null!=o[d])if("style"===d){var c=o[d];for(i in c)c.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(s.hasOwnProperty(d)?l||(l=[]):(l=l||[]).push(d,null));for(d in a){var u=a[d];if(c=null!=o?o[d]:void 0,a.hasOwnProperty(d)&&u!==c&&(null!=u||null!=c))if("style"===d)if(c){for(i in c)!c.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&c[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(l||(l=[]),l.push(d,n)),n=u;else"dangerouslySetInnerHTML"===d?(u=u?u.__html:void 0,c=c?c.__html:void 0,null!=u&&c!==u&&(l=l||[]).push(d,u)):"children"===d?"string"!=typeof u&&"number"!=typeof u||(l=l||[]).push(d,""+u):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(s.hasOwnProperty(d)?(null!=u&&"onScroll"===d&&Pa("scroll",e),l||c===u||(l=[])):"object"==typeof u&&null!==u&&u.$$typeof===M?u.toString():(l=l||[]).push(d,u))}n&&(l=l||[]).push("style",n);var d=l;(t.updateQueue=d)&&(t.flags|=4)}},Yi=function(e,t,n,a){n!==a&&(t.flags|=4)};var dl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=uo(-1,n)).tag=3,n.payload={element:null};var a=t.value;return n.callback=function(){Yl||(Yl=!0,Ql=a),ul(0,t)},n}function pl(e,t,n){(n=uo(-1,n)).tag=3;var a=e.type.getDerivedStateFromError;if("function"==typeof a){var r=t.value;n.payload=function(){return ul(0,t),a(r)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof a&&(null===Xl?Xl=new Set([this]):Xl.add(this),ul(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var gl="function"==typeof WeakSet?WeakSet:Set;function ml(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){$s(e,n)}else t.current=null}function hl(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,a=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Qr(t.type,n),a),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Ga(t.stateNode.containerInfo))}throw Error(i(163))}function bl(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var a=e.create;e.destroy=a()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var r=e;a=r.next,0!=(4&(r=r.tag))&&0!=(1&r)&&(Ds(n,e),js(n,e)),e=a}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(a=n.elementType===n.type?t.memoizedProps:Qr(n.type,t.memoizedProps),e.componentDidUpdate(a,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&mo(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}mo(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&Za(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&kt(n)))))}throw Error(i(163))}function vl(e,t){for(var n=e;;){if(5===n.tag){var a=n.stateNode;if(t)"function"==typeof(a=a.style).setProperty?a.setProperty("display","none","important"):a.display="none";else{a=n.stateNode;var r=n.memoizedProps.style;r=null!=r&&r.hasOwnProperty("display")?r.display:null,a.style.display=we("display",r)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yl(e,t){if(Er&&"function"==typeof Er.onCommitFiberUnmount)try{Er.onCommitFiberUnmount(xr,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var a=n,r=a.destroy;if(a=a.tag,void 0!==r)if(0!=(4&a))Ds(t,n);else{a=t;try{r()}catch(o){$s(a,o)}}n=n.next}while(n!==e)}break;case 1:if(ml(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){$s(t,o)}break;case 5:ml(t);break;case 4:Sl(e,t)}}function _l(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function wl(e){return 5===e.tag||3===e.tag||4===e.tag}function kl(e){e:{for(var t=e.return;null!==t;){if(wl(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var a=!1;break;case 3:case 4:t=t.containerInfo,a=!0;break;default:throw Error(i(161))}16&n.flags&&(ve(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||wl(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}a?xl(e,n,t):El(e,n,t)}function xl(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=$a));else if(4!==a&&null!==(e=e.child))for(xl(e,t,n),e=e.sibling;null!==e;)xl(e,t,n),e=e.sibling}function El(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==a&&null!==(e=e.child))for(El(e,t,n),e=e.sibling;null!==e;)El(e,t,n),e=e.sibling}function Sl(e,t){for(var n,a,r=t,o=!1;;){if(!o){o=r.return;e:for(;;){if(null===o)throw Error(i(160));switch(n=o.stateNode,o.tag){case 5:a=!1;break e;case 3:case 4:n=n.containerInfo,a=!0;break e}o=o.return}o=!0}if(5===r.tag||6===r.tag){e:for(var l=e,s=r,c=s;;)if(yl(l,c),null!==c.child&&4!==c.tag)c.child.return=c,c=c.child;else{if(c===s)break e;for(;null===c.sibling;){if(null===c.return||c.return===s)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}a?(l=n,s=r.stateNode,8===l.nodeType?l.parentNode.removeChild(s):l.removeChild(s)):n.removeChild(r.stateNode)}else if(4===r.tag){if(null!==r.child){n=r.stateNode.containerInfo,a=!0,r.child.return=r,r=r.child;continue}}else if(yl(e,r),null!==r.child){r.child.return=r,r=r.child;continue}if(r===t)break;for(;null===r.sibling;){if(null===r.return||r.return===t)return;4===(r=r.return).tag&&(o=!1)}r.sibling.return=r.return,r=r.sibling}}function Tl(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var a=n=n.next;do{3==(3&a.tag)&&(e=a.destroy,a.destroy=void 0,void 0!==e&&e()),a=a.next}while(a!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){a=t.memoizedProps;var r=null!==e?e.memoizedProps:a;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Ja]=a,"input"===e&&"radio"===a.type&&null!=a.name&&te(n,a),Se(e,r),t=Se(e,a),r=0;r<o.length;r+=2){var l=o[r],s=o[r+1];"style"===l?ke(n,s):"dangerouslySetInnerHTML"===l?be(n,s):"children"===l?ve(n,s):_(n,l,s,t)}switch(e){case"input":ne(n,a);break;case"textarea":ce(n,a);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!a.multiple,null!=(o=a.value)?ie(n,!!a.multiple,o,!1):e!==!!a.multiple&&(null!=a.defaultValue?ie(n,!!a.multiple,a.defaultValue,!0):ie(n,!!a.multiple,a.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,kt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Vl=Zr(),vl(t.child,!0)),void Cl(t);case 19:return void Cl(t);case 23:case 24:return void vl(t,null!==t.memoizedState)}throw Error(i(163))}function Cl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new gl),t.forEach((function(t){var a=zs.bind(null,e,t);n.has(t)||(n.add(t),t.then(a,a))}))}}function Al(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ll=Math.ceil,Pl=w.ReactCurrentDispatcher,Nl=w.ReactCurrentOwner,Ol=0,Rl=null,Il=null,Ml=0,jl=0,Dl=cr(0),Bl=0,Fl=null,$l=0,Ul=0,zl=0,Zl=0,Hl=null,Vl=0,Wl=1/0;function Gl(){Wl=Zr()+500}var ql,Kl=null,Yl=!1,Ql=null,Xl=null,Jl=!1,es=null,ts=90,ns=[],as=[],rs=null,os=0,is=null,ls=-1,ss=0,cs=0,us=null,ds=!1;function fs(){return 0!=(48&Ol)?Zr():-1!==ls?ls:ls=Zr()}function ps(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Hr()?1:2;if(0===ss&&(ss=$l),0!==Yr.transition){0!==cs&&(cs=null!==Hl?Hl.pendingLanes:0),e=ss;var t=4186112&~cs;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Hr(),0!=(4&Ol)&&98===e?e=$t(12,ss):e=$t(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),ss),e}function gs(e,t,n){if(50<os)throw os=0,is=null,Error(i(185));if(null===(e=ms(e,t)))return null;Zt(e,t,n),e===Rl&&(zl|=t,4===Bl&&vs(e,Ml));var a=Hr();1===t?0!=(8&Ol)&&0==(48&Ol)?ys(e):(hs(e,n),0===Ol&&(Gl(),qr())):(0==(4&Ol)||98!==a&&99!==a||(null===rs?rs=new Set([e]):rs.add(e)),hs(e,n)),Hl=e}function ms(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function hs(e,t){for(var n=e.callbackNode,a=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,l=e.pendingLanes;0<l;){var s=31-Ht(l),c=1<<s,u=o[s];if(-1===u){if(0==(c&a)||0!=(c&r)){u=t,Dt(c);var d=jt;o[s]=10<=d?u+250:6<=d?u+5e3:-1}}else u<=t&&(e.expiredLanes|=c);l&=~c}if(a=Bt(e,e===Rl?Ml:0),t=jt,0===a)null!==n&&(n!==Dr&&Cr(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Dr&&Cr(n)}15===t?(n=ys.bind(null,e),null===Fr?(Fr=[n],$r=Tr(Or,Kr)):Fr.push(n),n=Dr):14===t?n=Gr(99,ys.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Gr(n,bs.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bs(e){if(ls=-1,cs=ss=0,0!=(48&Ol))throw Error(i(327));var t=e.callbackNode;if(Ms()&&e.callbackNode!==t)return null;var n=Bt(e,e===Rl?Ml:0);if(0===n)return null;var a=n,r=Ol;Ol|=16;var o=Ts();for(Rl===e&&Ml===a||(Gl(),Es(e,a));;)try{Ls();break}catch(s){Ss(e,s)}if(no(),Pl.current=o,Ol=r,null!==Il?a=0:(Rl=null,Ml=0,a=Bl),0!=($l&zl))Es(e,0);else if(0!==a){if(2===a&&(Ol|=64,e.hydrate&&(e.hydrate=!1,Ga(e.containerInfo)),0!==(n=Ft(e))&&(a=Cs(e,n))),1===a)throw t=Fl,Es(e,0),vs(e,n),hs(e,Zr()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,a){case 0:case 1:throw Error(i(345));case 2:case 5:Os(e);break;case 3:if(vs(e,n),(62914560&n)===n&&10<(a=Vl+500-Zr())){if(0!==Bt(e,0))break;if(((r=e.suspendedLanes)&n)!==n){fs(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=Va(Os.bind(null,e),a);break}Os(e);break;case 4:if(vs(e,n),(4186112&n)===n)break;for(a=e.eventTimes,r=-1;0<n;){var l=31-Ht(n);o=1<<l,(l=a[l])>r&&(r=l),n&=~o}if(n=r,10<(n=(120>(n=Zr()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ll(n/1960))-n)){e.timeoutHandle=Va(Os.bind(null,e),n);break}Os(e);break;default:throw Error(i(329))}}return hs(e,Zr()),e.callbackNode===t?bs.bind(null,e):null}function vs(e,t){for(t&=~Zl,t&=~zl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),a=1<<n;e[n]=-1,t&=~a}}function ys(e){if(0!=(48&Ol))throw Error(i(327));if(Ms(),e===Rl&&0!=(e.expiredLanes&Ml)){var t=Ml,n=Cs(e,t);0!=($l&zl)&&(n=Cs(e,t=Bt(e,t)))}else n=Cs(e,t=Bt(e,0));if(0!==e.tag&&2===n&&(Ol|=64,e.hydrate&&(e.hydrate=!1,Ga(e.containerInfo)),0!==(t=Ft(e))&&(n=Cs(e,t))),1===n)throw n=Fl,Es(e,0),vs(e,t),hs(e,Zr()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Os(e),hs(e,Zr()),null}function _s(e,t){var n=Ol;Ol|=1;try{return e(t)}finally{0===(Ol=n)&&(Gl(),qr())}}function ws(e,t){var n=Ol;Ol&=-2,Ol|=8;try{return e(t)}finally{0===(Ol=n)&&(Gl(),qr())}}function ks(e,t){dr(Dl,jl),jl|=t,$l|=t}function xs(){jl=Dl.current,ur(Dl)}function Es(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Wa(n)),null!==Il)for(n=Il.return;null!==n;){var a=n;switch(a.tag){case 1:null!=(a=a.type.childContextTypes)&&vr();break;case 3:Mo(),ur(gr),ur(pr),Yo();break;case 5:Do(a);break;case 4:Mo();break;case 13:case 19:ur(Bo);break;case 10:ao(a);break;case 23:case 24:xs()}n=n.return}Rl=e,Il=Ws(e.current,null),Ml=jl=$l=t,Bl=0,Fl=null,Zl=zl=Ul=0}function Ss(e,t){for(;;){var n=Il;try{if(no(),Qo.current=Oi,ai){for(var a=ei.memoizedState;null!==a;){var r=a.queue;null!==r&&(r.pending=null),a=a.next}ai=!1}if(Jo=0,ni=ti=ei=null,ri=!1,Nl.current=null,null===n||null===n.return){Bl=1,Fl=t,Il=null;break}e:{var o=e,i=n.return,l=n,s=t;if(t=Ml,l.flags|=2048,l.firstEffect=l.lastEffect=null,null!==s&&"object"==typeof s&&"function"==typeof s.then){var c=s;if(0==(2&l.mode)){var u=l.alternate;u?(l.updateQueue=u.updateQueue,l.memoizedState=u.memoizedState,l.lanes=u.lanes):(l.updateQueue=null,l.memoizedState=null)}var d=0!=(1&Bo.current),f=i;do{var p;if(p=13===f.tag){var g=f.memoizedState;if(null!==g)p=null!==g.dehydrated;else{var m=f.memoizedProps;p=void 0!==m.fallback&&(!0!==m.unstable_avoidThisFallback||!d)}}if(p){var h=f.updateQueue;if(null===h){var b=new Set;b.add(c),f.updateQueue=b}else h.add(c);if(0==(2&f.mode)){if(f.flags|=64,l.flags|=16384,l.flags&=-2981,1===l.tag)if(null===l.alternate)l.tag=17;else{var v=uo(-1,1);v.tag=2,fo(l,v)}l.lanes|=1;break e}s=void 0,l=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new dl,s=new Set,y.set(c,s)):void 0===(s=y.get(c))&&(s=new Set,y.set(c,s)),!s.has(l)){s.add(l);var _=Us.bind(null,o,c,l);c.then(_,_)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);s=Error((G(l.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Bl&&(Bl=2),s=cl(s,l),f=i;do{switch(f.tag){case 3:o=s,f.flags|=4096,t&=-t,f.lanes|=t,po(f,fl(0,o,t));break e;case 1:o=s;var w=f.type,k=f.stateNode;if(0==(64&f.flags)&&("function"==typeof w.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Xl||!Xl.has(k)))){f.flags|=4096,t&=-t,f.lanes|=t,po(f,pl(f,o,t));break e}}f=f.return}while(null!==f)}Ns(n)}catch(x){t=x,Il===n&&null!==n&&(Il=n=n.return);continue}break}}function Ts(){var e=Pl.current;return Pl.current=Oi,null===e?Oi:e}function Cs(e,t){var n=Ol;Ol|=16;var a=Ts();for(Rl===e&&Ml===t||Es(e,t);;)try{As();break}catch(r){Ss(e,r)}if(no(),Ol=n,Pl.current=a,null!==Il)throw Error(i(261));return Rl=null,Ml=0,Bl}function As(){for(;null!==Il;)Ps(Il)}function Ls(){for(;null!==Il&&!Ar();)Ps(Il)}function Ps(e){var t=ql(e.alternate,e,jl);e.memoizedProps=e.pendingProps,null===t?Ns(e):Il=t,Nl.current=null}function Ns(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ll(n,t,jl)))return void(Il=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&jl)||0==(4&n.mode)){for(var a=0,r=n.child;null!==r;)a|=r.lanes|r.childLanes,r=r.sibling;n.childLanes=a}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=sl(t)))return n.flags&=2047,void(Il=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Il=t);Il=t=e}while(null!==t);0===Bl&&(Bl=5)}function Os(e){var t=Hr();return Wr(99,Rs.bind(null,e,t)),null}function Rs(e,t){do{Ms()}while(null!==es);if(0!=(48&Ol))throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var a=n.lanes|n.childLanes,r=a,o=e.pendingLanes&~r;e.pendingLanes=r,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=r,e.mutableReadLanes&=r,e.entangledLanes&=r,r=e.entanglements;for(var l=e.eventTimes,s=e.expirationTimes;0<o;){var c=31-Ht(o),u=1<<c;r[c]=0,l[c]=-1,s[c]=-1,o&=~u}if(null!==rs&&0==(24&a)&&rs.has(e)&&rs.delete(e),e===Rl&&(Il=Rl=null,Ml=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,a=n.firstEffect):a=n:a=n.firstEffect,null!==a){if(r=Ol,Ol|=32,Nl.current=null,Ua=Kt,ba(l=ha())){if("selectionStart"in l)s={start:l.selectionStart,end:l.selectionEnd};else e:if(s=(s=l.ownerDocument)&&s.defaultView||window,(u=s.getSelection&&s.getSelection())&&0!==u.rangeCount){s=u.anchorNode,o=u.anchorOffset,c=u.focusNode,u=u.focusOffset;try{s.nodeType,c.nodeType}catch(T){s=null;break e}var d=0,f=-1,p=-1,g=0,m=0,h=l,b=null;t:for(;;){for(var v;h!==s||0!==o&&3!==h.nodeType||(f=d+o),h!==c||0!==u&&3!==h.nodeType||(p=d+u),3===h.nodeType&&(d+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===l)break t;if(b===s&&++g===o&&(f=d),b===c&&++m===u&&(p=d),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}s=-1===f||-1===p?null:{start:f,end:p}}else s=null;s=s||{start:0,end:0}}else s=null;za={focusedElem:l,selectionRange:s},Kt=!1,us=null,ds=!1,Kl=a;do{try{Is()}catch(T){if(null===Kl)throw Error(i(330));$s(Kl,T),Kl=Kl.nextEffect}}while(null!==Kl);us=null,Kl=a;do{try{for(l=e;null!==Kl;){var y=Kl.flags;if(16&y&&ve(Kl.stateNode,""),128&y){var _=Kl.alternate;if(null!==_){var w=_.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&y){case 2:kl(Kl),Kl.flags&=-3;break;case 6:kl(Kl),Kl.flags&=-3,Tl(Kl.alternate,Kl);break;case 1024:Kl.flags&=-1025;break;case 1028:Kl.flags&=-1025,Tl(Kl.alternate,Kl);break;case 4:Tl(Kl.alternate,Kl);break;case 8:Sl(l,s=Kl);var k=s.alternate;_l(s),null!==k&&_l(k)}Kl=Kl.nextEffect}}catch(T){if(null===Kl)throw Error(i(330));$s(Kl,T),Kl=Kl.nextEffect}}while(null!==Kl);if(w=za,_=ha(),y=w.focusedElem,l=w.selectionRange,_!==y&&y&&y.ownerDocument&&ma(y.ownerDocument.documentElement,y)){null!==l&&ba(y)&&(_=l.start,void 0===(w=l.end)&&(w=_),"selectionStart"in y?(y.selectionStart=_,y.selectionEnd=Math.min(w,y.value.length)):(w=(_=y.ownerDocument||document)&&_.defaultView||window).getSelection&&(w=w.getSelection(),s=y.textContent.length,k=Math.min(l.start,s),l=void 0===l.end?k:Math.min(l.end,s),!w.extend&&k>l&&(s=l,l=k,k=s),s=ga(y,k),o=ga(y,l),s&&o&&(1!==w.rangeCount||w.anchorNode!==s.node||w.anchorOffset!==s.offset||w.focusNode!==o.node||w.focusOffset!==o.offset)&&((_=_.createRange()).setStart(s.node,s.offset),w.removeAllRanges(),k>l?(w.addRange(_),w.extend(o.node,o.offset)):(_.setEnd(o.node,o.offset),w.addRange(_))))),_=[];for(w=y;w=w.parentNode;)1===w.nodeType&&_.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<_.length;y++)(w=_[y]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Kt=!!Ua,za=Ua=null,e.current=n,Kl=a;do{try{for(y=e;null!==Kl;){var x=Kl.flags;if(36&x&&bl(y,Kl.alternate,Kl),128&x){_=void 0;var E=Kl.ref;if(null!==E){var S=Kl.stateNode;Kl.tag,_=S,"function"==typeof E?E(_):E.current=_}}Kl=Kl.nextEffect}}catch(T){if(null===Kl)throw Error(i(330));$s(Kl,T),Kl=Kl.nextEffect}}while(null!==Kl);Kl=null,Br(),Ol=r}else e.current=n;if(Jl)Jl=!1,es=e,ts=t;else for(Kl=a;null!==Kl;)t=Kl.nextEffect,Kl.nextEffect=null,8&Kl.flags&&((x=Kl).sibling=null,x.stateNode=null),Kl=t;if(0===(a=e.pendingLanes)&&(Xl=null),1===a?e===is?os++:(os=0,is=e):os=0,n=n.stateNode,Er&&"function"==typeof Er.onCommitFiberRoot)try{Er.onCommitFiberRoot(xr,n,void 0,64==(64&n.current.flags))}catch(T){}if(hs(e,Zr()),Yl)throw Yl=!1,e=Ql,Ql=null,e;return 0!=(8&Ol)||qr(),null}function Is(){for(;null!==Kl;){var e=Kl.alternate;ds||null===us||(0!=(8&Kl.flags)?et(Kl,us)&&(ds=!0):13===Kl.tag&&Al(e,Kl)&&et(Kl,us)&&(ds=!0));var t=Kl.flags;0!=(256&t)&&hl(e,Kl),0==(512&t)||Jl||(Jl=!0,Gr(97,(function(){return Ms(),null}))),Kl=Kl.nextEffect}}function Ms(){if(90!==ts){var e=97<ts?97:ts;return ts=90,Wr(e,Bs)}return!1}function js(e,t){ns.push(t,e),Jl||(Jl=!0,Gr(97,(function(){return Ms(),null})))}function Ds(e,t){as.push(t,e),Jl||(Jl=!0,Gr(97,(function(){return Ms(),null})))}function Bs(){if(null===es)return!1;var e=es;if(es=null,0!=(48&Ol))throw Error(i(331));var t=Ol;Ol|=32;var n=as;as=[];for(var a=0;a<n.length;a+=2){var r=n[a],o=n[a+1],l=r.destroy;if(r.destroy=void 0,"function"==typeof l)try{l()}catch(c){if(null===o)throw Error(i(330));$s(o,c)}}for(n=ns,ns=[],a=0;a<n.length;a+=2){r=n[a],o=n[a+1];try{var s=r.create;r.destroy=s()}catch(c){if(null===o)throw Error(i(330));$s(o,c)}}for(s=e.current.firstEffect;null!==s;)e=s.nextEffect,s.nextEffect=null,8&s.flags&&(s.sibling=null,s.stateNode=null),s=e;return Ol=t,qr(),!0}function Fs(e,t,n){fo(e,t=fl(0,t=cl(n,t),1)),t=fs(),null!==(e=ms(e,1))&&(Zt(e,1,t),hs(e,t))}function $s(e,t){if(3===e.tag)Fs(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Fs(n,e,t);break}if(1===n.tag){var a=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof a.componentDidCatch&&(null===Xl||!Xl.has(a))){var r=pl(n,e=cl(t,e),1);if(fo(n,r),r=fs(),null!==(n=ms(n,1)))Zt(n,1,r),hs(n,r);else if("function"==typeof a.componentDidCatch&&(null===Xl||!Xl.has(a)))try{a.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function Us(e,t,n){var a=e.pingCache;null!==a&&a.delete(t),t=fs(),e.pingedLanes|=e.suspendedLanes&n,Rl===e&&(Ml&n)===n&&(4===Bl||3===Bl&&(62914560&Ml)===Ml&&500>Zr()-Vl?Es(e,0):Zl|=n),hs(e,t)}function zs(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===Hr()?1:2:(0===ss&&(ss=$l),0===(t=Ut(62914560&~ss))&&(t=4194304))),n=fs(),null!==(e=ms(e,t))&&(Zt(e,t,n),hs(e,n))}function Zs(e,t,n,a){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Hs(e,t,n,a){return new Zs(e,t,n,a)}function Vs(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Ws(e,t){var n=e.alternate;return null===n?((n=Hs(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Gs(e,t,n,a,r,o){var l=2;if(a=e,"function"==typeof e)Vs(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case E:return qs(n.children,r,o,t);case j:l=8,r|=16;break;case S:l=8,r|=1;break;case T:return(e=Hs(12,n,t,8|r)).elementType=T,e.type=T,e.lanes=o,e;case P:return(e=Hs(13,n,t,r)).type=P,e.elementType=P,e.lanes=o,e;case N:return(e=Hs(19,n,t,r)).elementType=N,e.lanes=o,e;case D:return Ks(n,r,o,t);case B:return(e=Hs(24,n,t,r)).elementType=B,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case A:l=9;break e;case L:l=11;break e;case O:l=14;break e;case R:l=16,a=null;break e;case I:l=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Hs(l,n,t,r)).elementType=e,t.type=a,t.lanes=o,t}function qs(e,t,n,a){return(e=Hs(7,e,a,t)).lanes=n,e}function Ks(e,t,n,a){return(e=Hs(23,e,a,t)).elementType=D,e.lanes=n,e}function Ys(e,t,n){return(e=Hs(6,e,null,t)).lanes=n,e}function Qs(e,t,n){return(t=Hs(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Xs(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=zt(0),this.expirationTimes=zt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=zt(0),this.mutableSourceEagerHydrationData=null}function Js(e,t,n){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:x,key:null==a?null:""+a,children:e,containerInfo:t,implementation:n}}function ec(e,t,n,a){var r=t.current,o=fs(),l=ps(r);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var s=n;do{switch(s.tag){case 3:s=s.stateNode.context;break t;case 1:if(br(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break t}}s=s.return}while(null!==s);throw Error(i(171))}if(1===n.tag){var c=n.type;if(br(c)){n=_r(n,c,s);break e}}n=s}else n=fr;return null===t.context?t.context=n:t.pendingContext=n,(t=uo(o,l)).payload={element:e},null!==(a=void 0===a?null:a)&&(t.callback=a),fo(r,t),gs(r,l,o),l}function tc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function nc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function ac(e,t){nc(e,t),(e=e.alternate)&&nc(e,t)}function rc(e,t,n){var a=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Xs(e,t,null!=n&&!0===n.hydrate),t=Hs(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,so(t),e[er]=n.current,Oa(8===e.nodeType?e.parentNode:e),a)for(e=0;e<a.length;e++){var r=(t=a[e])._getVersion;r=r(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,r]:n.mutableSourceEagerHydrationData.push(t,r)}this._internalRoot=n}function oc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function ic(e,t,n,a,r){var o=n._reactRootContainer;if(o){var i=o._internalRoot;if("function"==typeof r){var l=r;r=function(){var e=tc(i);l.call(e)}}ec(t,i,e,r)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new rc(e,0,t?{hydrate:!0}:void 0)}(n,a),i=o._internalRoot,"function"==typeof r){var s=r;r=function(){var e=tc(i);s.call(e)}}ws((function(){ec(t,i,e,r)}))}return tc(i)}function lc(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!oc(t))throw Error(i(200));return Js(e,t,null,n)}ql=function(e,t,n){var a=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||gr.current)Di=!0;else{if(0==(n&a)){switch(Di=!1,t.tag){case 3:Gi(t),qo();break;case 5:jo(t);break;case 1:br(t.type)&&wr(t);break;case 4:Io(t,t.stateNode.containerInfo);break;case 10:a=t.memoizedProps.value;var r=t.type._context;dr(Xr,r._currentValue),r._currentValue=a;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Xi(e,t,n):(dr(Bo,1&Bo.current),null!==(t=ol(e,t,n))?t.sibling:null);dr(Bo,1&Bo.current);break;case 19:if(a=0!=(n&t.childLanes),0!=(64&e.flags)){if(a)return rl(e,t,n);t.flags|=64}if(null!==(r=t.memoizedState)&&(r.rendering=null,r.tail=null,r.lastEffect=null),dr(Bo,Bo.current),a)break;return null;case 23:case 24:return t.lanes=0,zi(e,t,n)}return ol(e,t,n)}Di=0!=(16384&e.flags)}else Di=!1;switch(t.lanes=0,t.tag){case 2:if(a=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=hr(t,pr.current),oo(t,n),r=li(null,t,a,e,r,n),t.flags|=1,"object"==typeof r&&null!==r&&"function"==typeof r.render&&void 0===r.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,br(a)){var o=!0;wr(t)}else o=!1;t.memoizedState=null!==r.state&&void 0!==r.state?r.state:null,so(t);var l=a.getDerivedStateFromProps;"function"==typeof l&&bo(t,a,l,e),r.updater=vo,t.stateNode=r,r._reactInternals=t,ko(t,a,e,n),t=Wi(null,t,a,!0,o,n)}else t.tag=0,Bi(null,t,r,n),t=t.child;return t;case 16:r=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Vs(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===O)return 14}return 2}(r),e=Qr(r,e),o){case 0:t=Hi(null,t,r,e,n);break e;case 1:t=Vi(null,t,r,e,n);break e;case 11:t=Fi(null,t,r,e,n);break e;case 14:t=$i(null,t,r,Qr(r.type,e),a,n);break e}throw Error(i(306,r,""))}return t;case 0:return a=t.type,r=t.pendingProps,Hi(e,t,a,r=t.elementType===a?r:Qr(a,r),n);case 1:return a=t.type,r=t.pendingProps,Vi(e,t,a,r=t.elementType===a?r:Qr(a,r),n);case 3:if(Gi(t),a=t.updateQueue,null===e||null===a)throw Error(i(282));if(a=t.pendingProps,r=null!==(r=t.memoizedState)?r.element:null,co(e,t),go(t,a,null,n),(a=t.memoizedState.element)===r)qo(),t=ol(e,t,n);else{if((o=(r=t.stateNode).hydrate)&&(Uo=qa(t.stateNode.containerInfo.firstChild),$o=t,o=zo=!0),o){if(null!=(e=r.mutableSourceEagerHydrationData))for(r=0;r<e.length;r+=2)(o=e[r])._workInProgressVersionPrimary=e[r+1],Ko.push(o);for(n=Ao(t,null,a,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Bi(e,t,a,n),qo();t=t.child}return t;case 5:return jo(t),null===e&&Vo(t),a=t.type,r=t.pendingProps,o=null!==e?e.memoizedProps:null,l=r.children,Ha(a,r)?l=null:null!==o&&Ha(a,o)&&(t.flags|=16),Zi(e,t),Bi(e,t,l,n),t.child;case 6:return null===e&&Vo(t),null;case 13:return Xi(e,t,n);case 4:return Io(t,t.stateNode.containerInfo),a=t.pendingProps,null===e?t.child=Co(t,null,a,n):Bi(e,t,a,n),t.child;case 11:return a=t.type,r=t.pendingProps,Fi(e,t,a,r=t.elementType===a?r:Qr(a,r),n);case 7:return Bi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Bi(e,t,t.pendingProps.children,n),t.child;case 10:e:{a=t.type._context,r=t.pendingProps,l=t.memoizedProps,o=r.value;var s=t.type._context;if(dr(Xr,s._currentValue),s._currentValue=o,null!==l)if(s=l.value,0===(o=ua(s,o)?0:0|("function"==typeof a._calculateChangedBits?a._calculateChangedBits(s,o):1073741823))){if(l.children===r.children&&!gr.current){t=ol(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var c=s.dependencies;if(null!==c){l=s.child;for(var u=c.firstContext;null!==u;){if(u.context===a&&0!=(u.observedBits&o)){1===s.tag&&((u=uo(-1,n&-n)).tag=2,fo(s,u)),s.lanes|=n,null!==(u=s.alternate)&&(u.lanes|=n),ro(s.return,n),c.lanes|=n;break}u=u.next}}else l=10===s.tag&&s.type===t.type?null:s.child;if(null!==l)l.return=s;else for(l=s;null!==l;){if(l===t){l=null;break}if(null!==(s=l.sibling)){s.return=l.return,l=s;break}l=l.return}s=l}Bi(e,t,r.children,n),t=t.child}return t;case 9:return r=t.type,a=(o=t.pendingProps).children,oo(t,n),a=a(r=io(r,o.unstable_observedBits)),t.flags|=1,Bi(e,t,a,n),t.child;case 14:return o=Qr(r=t.type,t.pendingProps),$i(e,t,r,o=Qr(r.type,o),a,n);case 15:return Ui(e,t,t.type,t.pendingProps,a,n);case 17:return a=t.type,r=t.pendingProps,r=t.elementType===a?r:Qr(a,r),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,br(a)?(e=!0,wr(t)):e=!1,oo(t,n),_o(t,a,r),ko(t,a,r,n),Wi(null,t,a,!0,e,n);case 19:return rl(e,t,n);case 23:case 24:return zi(e,t,n)}throw Error(i(156,t.tag))},rc.prototype.render=function(e){ec(e,this._internalRoot,null,null)},rc.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;ec(null,e,null,(function(){t[er]=null}))},tt=function(e){13===e.tag&&(gs(e,4,fs()),ac(e,4))},nt=function(e){13===e.tag&&(gs(e,67108864,fs()),ac(e,67108864))},at=function(e){if(13===e.tag){var t=fs(),n=ps(e);gs(e,n,t),ac(e,n)}},rt=function(e,t){return t()},Ce=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var a=n[t];if(a!==e&&a.form===e.form){var r=or(a);if(!r)throw Error(i(90));Q(a),ne(a,r)}}}break;case"textarea":ce(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Re=_s,Ie=function(e,t,n,a,r){var o=Ol;Ol|=4;try{return Wr(98,e.bind(null,t,n,a,r))}finally{0===(Ol=o)&&(Gl(),qr())}},Me=function(){0==(49&Ol)&&(function(){if(null!==rs){var e=rs;rs=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hs(e,Zr())}))}qr()}(),Ms())},je=function(e,t){var n=Ol;Ol|=2;try{return e(t)}finally{0===(Ol=n)&&(Gl(),qr())}};var sc={Events:[ar,rr,or,Ne,Oe,Ms,{current:!1}]},cc={findFiberByHostInstance:nr,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},uc={bundleType:cc.bundleType,version:cc.version,rendererPackageName:cc.rendererPackageName,rendererConfig:cc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Je(e))?null:e.stateNode},findFiberByHostInstance:cc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var dc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!dc.isDisabled&&dc.supportsFiber)try{xr=dc.inject(uc),Er=dc}catch(he){}}t.createPortal=lc,t.hydrate=function(e,t,n){if(!oc(t))throw Error(i(200));return ic(null,e,t,!0,n)}},73935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(64448)},69590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,a="function"==typeof Set,r="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!o(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!o(s.value[1],i.get(s.value[0])))return!1;return!0}if(a&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(r&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===i.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!o(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},70405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>V,ql:()=>J});var a=n(67294),r=n(45697),o=n.n(r),i=n(69590),l=n.n(i),s=n(41143),c=n.n(s),u=n(96774),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)t.indexOf(n=o[a])>=0||(r[n]=e[n]);return r}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},_=Object.keys(h).map((function(e){return h[e]})),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(w).reduce((function(e,t){return e[w[t]]=t,e}),{}),x=function(e,t){for(var n=e.length-1;n>=0;n-=1){var a=e[n];if(Object.prototype.hasOwnProperty.call(a,t))return a[t]}return null},E=function(e){var t=x(e,h.TITLE),n=x(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var a=x(e,"defaultTitle");return t||a||void 0},S=function(e){return x(e,"onChangeClientState")||function(){}},T=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},C=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var a=Object.keys(n),r=0;r<a.length;r+=1){var o=a[r].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},A=function(e,t,n){var a={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var r={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return a[n]||(a[n]={}),r[n]||(r[n]={}),!a[n][c]&&(r[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(r),i=0;i<o.length;i+=1){var l=o[i],s=f({},a[l],r[l]);a[l]=s}return e}),[]).reverse()},L=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},P=function(e){return Array.isArray(e)?e.join(""):e},N=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),a=0;a<n.length;a+=1)if(t[n[a]]&&t[n[a]].includes(e[n[a]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},O=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},R=[h.NOSCRIPT,h.SCRIPT,h.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},M=function(e){return Object.keys(e).reduce((function(t,n){var a=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+a:a}),"")},j=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},D=function(e,t){return t.map((function(t,n){var r,o=((r={key:n})["data-rh"]=!0,r);return Object.keys(t).forEach((function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),a.createElement(e,o)}))},B=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(r={key:e=t.title})["data-rh"]=!0,o=j(n,r),[a.createElement(h.TITLE,o,e)];var e,n,r,o},toString:function(){return function(e,t,n,a){var r=M(n),o=P(t);return r?"<"+e+' data-rh="true" '+r+">"+I(o,a)+"</"+e+">":"<"+e+' data-rh="true">'+I(o,a)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return j(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return D(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,a){var r=Object.keys(a).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var r=void 0===a[t]?t:t+'="'+I(a[t],n)+'"';return e?e+" "+r:r}),""),o=a.innerHTML||a.cssText||"",i=-1===R.indexOf(e);return t+"<"+e+' data-rh="true" '+r+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},F=function(e){var t=e.baseTag,n=e.bodyAttributes,a=e.encode,r=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,a=e.encode,r=N(e.metaTags,y),o=N(t,b),i=N(n,v);return{priorityMethods:{toComponent:function(){return[].concat(D(h.META,r.priority),D(h.LINK,o.priority),D(h.SCRIPT,i.priority))},toString:function(){return B(h.META,r.priority,a)+" "+B(h.LINK,o.priority,a)+" "+B(h.SCRIPT,i.priority,a)}},metaTags:r.default,linkTags:o.default,scriptTags:i.default}}(e);p=g.priorityMethods,u=g.linkTags,d=g.metaTags,f=g.scriptTags}return{priority:p,base:B(h.BASE,t,a),bodyAttributes:B("bodyAttributes",n,a),htmlAttributes:B("htmlAttributes",r,a),link:B(h.LINK,u,a),meta:B(h.META,d,a),noscript:B(h.NOSCRIPT,o,a),script:B(h.SCRIPT,f,a),style:B(h.STYLE,i,a),title:B(h.TITLE,{title:s,titleAttributes:c},a)}},$=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?$:n.instances},add:function(e){(n.canUseDOM?$:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?$:n.instances).indexOf(e);(n.canUseDOM?$:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=F({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},z=a.createContext({}),Z=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),H="undefined"!=typeof document,V=function(e){function t(n){var a;return(a=e.call(this,n)||this).helmetData=new U(a.props.context,t.canUseDOM),a}return p(t,e),t.prototype.render=function(){return a.createElement(z.Provider,{value:this.helmetData.value},this.props.children)},t}(a.Component);V.canUseDOM=H,V.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},V.defaultProps={context:{}},V.displayName="HelmetProvider";var W=function(e,t){var n,a=document.head||document.querySelector(h.HEAD),r=a.querySelectorAll(e+"[data-rh]"),o=[].slice.call(r),i=[];return t&&t.length&&t.forEach((function(t){var a=document.createElement(e);for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&("innerHTML"===r?a.innerHTML=t.innerHTML:"cssText"===r?a.styleSheet?a.styleSheet.cssText=t.cssText:a.appendChild(document.createTextNode(t.cssText)):a.setAttribute(r,void 0===t[r]?"":t[r]));a.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,a.isEqualNode(e)}))?o.splice(n,1):i.push(a)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return a.appendChild(e)})),{oldTags:o,newTags:i}},G=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var a=n.getAttribute("data-rh"),r=a?a.split(","):[],o=[].concat(r),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],c=t[s]||"";n.getAttribute(s)!==c&&n.setAttribute(s,c),-1===r.indexOf(s)&&r.push(s);var u=o.indexOf(s);-1!==u&&o.splice(u,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);r.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},q=function(e,t){var n=e.baseTag,a=e.htmlAttributes,r=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;G(h.BODY,e.bodyAttributes),G(h.HTML,a),function(e,t){void 0!==e&&document.title!==e&&(document.title=P(e)),G(h.TITLE,t)}(u,d);var f={baseTag:W(h.BASE,n),linkTags:W(h.LINK,r),metaTags:W(h.META,o),noscriptTags:W(h.NOSCRIPT,i),scriptTags:W(h.SCRIPT,s),styleTags:W(h.STYLE,c)},p={},g={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,a=t.oldTags;n.length&&(p[e]=n),a.length&&(g[e]=f[e].oldTags)})),t&&t(),l(e,p,g)},K=null,Y=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,a=n.setHelmet,r=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:C(["href"],e),bodyAttributes:T("bodyAttributes",e),defer:x(e,"defer"),encode:x(e,"encodeSpecialCharacters"),htmlAttributes:T("htmlAttributes",e),linkTags:A(h.LINK,["rel","href"],e),metaTags:A(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:S(e),scriptTags:A(h.SCRIPT,["src","innerHTML"],e),styleTags:A(h.STYLE,["cssText"],e),title:E(e),titleAttributes:T("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});V.canUseDOM?(t=o,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){q(t,(function(){K=null}))})):(q(t),K=null)):F&&(r=F(o)),a(r)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(a.Component);Y.propTypes={context:Z.isRequired},Y.displayName="HelmetDispatcher";var Q=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(O(this.props,"helmetData"),O(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,a=e.arrayTypeChildren;return f({},a,((t={})[n.type]=[].concat(a[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,a=e.child,r=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(a.type){case h.TITLE:return f({},r,((t={})[a.type]=i,t.titleAttributes=f({},o),t));case h.BODY:return f({},r,{bodyAttributes:f({},o)});case h.HTML:return f({},r,{htmlAttributes:f({},o)});default:return f({},r,((n={})[a.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var a;n=f({},n,((a={})[t]=e[t],a))})),n},n.warnOnInvalidChildren=function(e,t){return c()(_.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+_.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,r={};return a.Children.forEach(e,(function(e){if(e&&e.props){var a=e.props,o=a.children,i=m(a,Q),l=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(r,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),r=f({},n),o=n.helmetData;return t&&(r=this.mapChildrenToProps(t,r)),!o||o instanceof U||(o=new U(o.context,o.instances)),o?a.createElement(Y,f({},r,{context:o.value,helmetData:void 0})):a.createElement(z.Consumer,null,(function(e){return a.createElement(Y,f({},r,{context:e}))}))},t}(a.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},69921:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,a=n?Symbol.for("react.element"):60103,r=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,_=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case a:switch(e=e.type){case u:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case h:case m:case s:return e;default:return t}}case r:return t}}}function k(e){return w(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=s,t.Element=a,t.ForwardRef=f,t.Fragment=o,t.Lazy=h,t.Memo=m,t.Portal=r,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return k(e)||w(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===c},t.isContextProvider=function(e){return w(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.isForwardRef=function(e){return w(e)===f},t.isFragment=function(e){return w(e)===o},t.isLazy=function(e){return w(e)===h},t.isMemo=function(e){return w(e)===m},t.isPortal=function(e){return w(e)===r},t.isProfiler=function(e){return w(e)===l},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===s||e.$$typeof===c||e.$$typeof===f||e.$$typeof===v||e.$$typeof===y||e.$$typeof===_||e.$$typeof===b)},t.typeOf=w},59864:(e,t,n)=>{"use strict";e.exports=n(69921)},68356:(e,t,n)=>{"use strict";function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},i.apply(this,arguments)}var l=n(67294),s=n(45697),c=[],u=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(a){var r=d(e[a]);r.loading?t.loading=!0:(t.loaded[a]=r.loaded,t.error=r.error),n.push(r.promise),r.promise.then((function(e){t.loaded[a]=e})).catch((function(e){t.error=e}))}))}catch(a){t.error=a}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function g(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return c.push(h),"function"==typeof g.webpack&&u.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var a;return o(r(r(a=t.call(this,n)||this)),"retry",(function(){a.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),a._loadModule()})),h(),a.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},a}a(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.loadable.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextTypes",{loadable:s.shape({report:s.func.isRequired})}),f}function m(e){return g(d,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(f,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}a(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}o(h,"propTypes",{report:s.func.isRequired}),o(h,"childContextTypes",{loadable:s.shape({report:s.func.isRequired}).isRequired}),m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=m},18790:(e,t,n)=>{"use strict";n.d(t,{H:()=>l,f:()=>i});var a=n(16550),r=n(87462),o=n(67294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var r=e.path?(0,a.LX)(t,e):n.length?n[n.length-1].match:a.F0.computeRootMatch(t);return r&&(n.push({route:e,match:r}),e.routes&&i(e.routes,t,n)),r})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(a.rs,n,e.map((function(e,n){return o.createElement(a.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,r.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,r.Z)({},n,t,{route:e}))}})}))):null}},73727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>y,VK:()=>u,rU:()=>h});var a=n(16550),r=n(75068),o=n(67294),i=n(42358),l=n(87462),s=n(63366),c=n(38776),u=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).history=(0,i.lX)(t.props),t}return(0,r.Z)(t,e),t.prototype.render=function(){return o.createElement(a.F0,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},p=function(e){return e},g=o.forwardRef;void 0===g&&(g=p);var m=g((function(e,t){var n=e.innerRef,a=e.navigate,r=e.onClick,i=(0,s.Z)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.Z)({},i,{onClick:function(e){try{r&&r(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),a())}});return u.ref=p!==g&&t||n,o.createElement("a",u)}));var h=g((function(e,t){var n=e.component,r=void 0===n?m:n,u=e.replace,h=e.to,b=e.innerRef,v=(0,s.Z)(e,["component","replace","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=e.history,a=f(d(h,e.location),e.location),s=a?n.createHref(a):"",m=(0,l.Z)({},v,{href:s,navigate:function(){var t=d(h,e.location),a=(0,i.Ep)(e.location)===(0,i.Ep)(f(t));(u||a?n.replace:n.push)(t)}});return p!==g?m.ref=t||b:m.innerRef=b,o.createElement(r,m)}))})),b=function(e){return e},v=o.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],r=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,p=e.activeStyle,g=e.className,m=e.exact,y=e.isActive,_=e.location,w=e.sensitive,k=e.strict,x=e.style,E=e.to,S=e.innerRef,T=(0,s.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=_||e.location,i=f(d(E,n),n),s=i.pathname,C=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=C?(0,a.LX)(n.pathname,{path:C,exact:m,sensitive:w,strict:k}):null,L=!!(y?y(A,n):A),P="function"==typeof g?g(L):g,N="function"==typeof x?x(L):x;L&&(P=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(P,u),N=(0,l.Z)({},N,p));var O=(0,l.Z)({"aria-current":L&&r||null,className:P,style:N,to:i},T);return b!==v?O.ref=t||S:O.innerRef=S,o.createElement(h,O)}))}))},16550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>L,F0:()=>_,LX:()=>A,TH:()=>B,k6:()=>D,l_:()=>S,rs:()=>M,s6:()=>y});var a=n(75068),r=n(67294),o=n(45697),i=n.n(o),l=n(42358),s=n(38776),c=n(87462),u=n(39658),d=n.n(u),f=(n(59864),n(63366)),p=(n(8679),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};function m(e){var t=[];return{on:function(e){t.push(e)},off:function(e){t=t.filter((function(t){return t!==e}))},get:function(){return e},set:function(n,a){e=n,t.forEach((function(t){return t(e,a)}))}}}var h=r.createContext||function(e,t){var n,o,l="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).emitter=m(t.props.value),t}(0,a.Z)(n,e);var r=n.prototype;return r.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},r.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,a=this.props.value,r=e.value;((o=a)===(i=r)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(a,r):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},r.render=function(){return this.props.children},n}(r.Component);s.childContextTypes=((n={})[l]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t.call.apply(t,[this].concat(a))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,a.Z)(n,t);var r=n.prototype;return r.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},r.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},r.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},r.getValue=function(){return this.context[l]?this.context[l].get():e},r.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(r.Component);return c.contextTypes=((o={})[l]=i().object,o),{Provider:s,Consumer:c}},b=function(e){var t=h();return t.displayName=e,t},v=b("Router-History"),y=b("Router"),_=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,a.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return r.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},r.createElement(v.Provider,{children:this.props.children||null,value:this.props.history}))},t}(r.Component);r.Component;var w=function(e){function t(){return e.apply(this,arguments)||this}(0,a.Z)(t,e);var n=t.prototype;return n.componentDidMount=function(){this.props.onMount&&this.props.onMount.call(this,this)},n.componentDidUpdate=function(e){this.props.onUpdate&&this.props.onUpdate.call(this,this,e)},n.componentWillUnmount=function(){this.props.onUnmount&&this.props.onUnmount.call(this,this)},n.render=function(){return null},t}(r.Component);var k={},x=0;function E(e,t){return void 0===e&&(e="/"),void 0===t&&(t={}),"/"===e?e:function(e){if(k[e])return k[e];var t=d().compile(e);return x<1e4&&(k[e]=t,x++),t}(e)(t,{pretty:!0})}function S(e){var t=e.computedMatch,n=e.to,a=e.push,o=void 0!==a&&a;return r.createElement(y.Consumer,null,(function(e){e||(0,s.Z)(!1);var a=e.history,i=e.staticContext,u=o?a.push:a.replace,d=(0,l.ob)(t?"string"==typeof n?E(n,t.params):(0,c.Z)({},n,{pathname:E(n.pathname,t.params)}):n);return i?(u(d),null):r.createElement(w,{onMount:function(){u(d)},onUpdate:function(e,t){var n=(0,l.ob)(t.to);(0,l.Hp)(n,(0,c.Z)({},d,{key:n.key}))||u(d)},to:n})}))}var T={},C=0;function A(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,a=n.path,r=n.exact,o=void 0!==r&&r,i=n.strict,l=void 0!==i&&i,s=n.sensitive,c=void 0!==s&&s;return[].concat(a).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var a=function(e,t){var n=""+t.end+t.strict+t.sensitive,a=T[n]||(T[n]={});if(a[e])return a[e];var r=[],o={regexp:d()(e,r,t),keys:r};return C<1e4&&(a[e]=o,C++),o}(n,{end:o,strict:l,sensitive:c}),r=a.regexp,i=a.keys,s=r.exec(e);if(!s)return null;var u=s[0],f=s.slice(1),p=e===u;return o&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var L=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(y.Consumer,null,(function(t){t||(0,s.Z)(!1);var n=e.props.location||t.location,a=e.props.computedMatch?e.props.computedMatch:e.props.path?A(n.pathname,e.props):t.match,o=(0,c.Z)({},t,{location:n,match:a}),i=e.props,l=i.children,u=i.component,d=i.render;return Array.isArray(l)&&function(e){return 0===r.Children.count(e)}(l)&&(l=null),r.createElement(y.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:u?r.createElement(u,o):d?d(o):null:"function"==typeof l?l(o):null)}))},t}(r.Component);function P(e){return"/"===e.charAt(0)?e:"/"+e}function N(e,t){if(!e)return t;var n=P(e);return 0!==t.pathname.indexOf(n)?t:(0,c.Z)({},t,{pathname:t.pathname.substr(n.length)})}function O(e){return"string"==typeof e?e:(0,l.Ep)(e)}function R(e){return function(){(0,s.Z)(!1)}}function I(){}r.Component;var M=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(y.Consumer,null,(function(t){t||(0,s.Z)(!1);var n,a,o=e.props.location||t.location;return r.Children.forEach(e.props.children,(function(e){if(null==a&&r.isValidElement(e)){n=e;var i=e.props.path||e.props.from;a=i?A(o.pathname,(0,c.Z)({},e.props,{path:i})):t.match}})),a?r.cloneElement(n,{location:o,computedMatch:a}):null}))},t}(r.Component);var j=r.useContext;function D(){return j(v)}function B(){return j(y).location}},39658:(e,t,n)=>{var a=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var r=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,a=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=r.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],v=n[5],y=n[6],_=n[7];l&&(a.push(l),l="");var w=null!=m&&null!=g&&g!==m,k="+"===y||"*"===y,x="?"===y||"*"===y,E=n[2]||u,S=b||v;a.push({name:h||o++,prefix:m||"",delimiter:E,optional:x,repeat:k,partial:w,asterisk:!!_,pattern:S?c(S):_?".*":"[^"+s(E)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&a.push(l),a}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),r=0;r<e.length;r++)"object"==typeof e[r]&&(n[r]=new RegExp("^(?:"+e[r].pattern+")$",d(t)));return function(t,r){for(var o="",l=t||{},s=(r||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=l[u.name];if(null==f){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(a(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=s(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');o+=u.prefix+d}}else o+=u}return o}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){a(t)||(n=t||n,t=[]);for(var r=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var f=s(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var g=s(n.delimiter||"/"),m=i.slice(-g.length)===g;return r||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=o?"$":r&&m?"":"(?="+g+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return a(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var a=0;a<n.length;a++)t.push({name:a,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):a(e)?function(e,t,n){for(var a=[],r=0;r<e.length;r++)a.push(p(e[r],t,n).source);return u(new RegExp("(?:"+a.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},72408:(e,t,n)=>{"use strict";var a=n(27418),r=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,l=60110,s=60112;t.Suspense=60113;var c=60115,u=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;r=d("react.element"),o=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),l=d("react.context"),s=d("react.forward_ref"),t.Suspense=d("react.suspense"),c=d("react.memo"),u=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m={};function h(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,a(y,h.prototype),y.isPureReactComponent=!0;var _={current:null},w=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,n){var a,o={},i=null,l=null;if(null!=t)for(a in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)w.call(t,a)&&!k.hasOwnProperty(a)&&(o[a]=t[a]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(a in s=e.defaultProps)void 0===o[a]&&(o[a]=s[a]);return{$$typeof:r,type:e,key:i,ref:l,props:o,_owner:_.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===r}var S=/\/+/g;function T(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function C(e,t,n,a,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case r:case o:s=!0}}if(s)return i=i(s=e),e=""===a?"."+T(s,0):a,Array.isArray(i)?(n="",null!=e&&(n=e.replace(S,"$&/")+"/"),C(i,t,n,"",(function(e){return e}))):null!=i&&(E(i)&&(i=function(e,t){return{$$typeof:r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(S,"$&/")+"/")+e)),t.push(i)),1;if(s=0,a=""===a?".":a+":",Array.isArray(e))for(var c=0;c<e.length;c++){var u=a+T(l=e[c],c);s+=C(l,t,n,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=C(l=l.value,t,n,u=a+T(l,c++),i);else if("object"===l)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return s}function A(e,t,n){if(null==e)return e;var a=[],r=0;return C(e,a,"","",(function(e){return t.call(n,e,r++)})),a}function L(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var P={current:null};function N(){var e=P.current;if(null===e)throw Error(p(321));return e}var O={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:_,IsSomeRendererActing:{current:!1},assign:a};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!E(e))throw Error(p(143));return e}},t.Component=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var o=a({},e.props),i=e.key,l=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(l=t.ref,s=_.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)w.call(t,u)&&!k.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){c=Array(u);for(var d=0;d<u;d++)c[d]=arguments[d+2];o.children=c}return{$$typeof:r,type:e.type,key:i,ref:l,props:o,_owner:s}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:l,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=x,t.createFactory=function(e){var t=x.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:s,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:c,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return N().useCallback(e,t)},t.useContext=function(e,t){return N().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return N().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return N().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return N().useLayoutEffect(e,t)},t.useMemo=function(e,t){return N().useMemo(e,t)},t.useReducer=function(e,t,n){return N().useReducer(e,t,n)},t.useRef=function(e){return N().useRef(e)},t.useState=function(e){return N().useState(e)},t.version="17.0.2"},67294:(e,t,n)=>{"use strict";e.exports=n(72408)},60053:(e,t)=>{"use strict";var n,a,r,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var c=null,u=null,d=function(){if(null!==c)try{var e=t.unstable_now();c(!0,e),c=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==c?setTimeout(n,0,e):(c=e,setTimeout(d,0))},a=function(e,t){u=setTimeout(e,t)},r=function(){clearTimeout(u)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var g=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof g&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,h=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):v=0<e?Math.floor(1e3/e):5};var _=new MessageChannel,w=_.port2;_.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?w.postMessage(null):(m=!1,h=null)}catch(n){throw w.postMessage(null),n}}else m=!1},n=function(e){h=e,m||(m=!0,w.postMessage(null))},a=function(e,n){b=f((function(){e(t.unstable_now())}),n)},r=function(){p(b),b=-1}}function k(e,t){var n=e.length;e.push(t);e:for(;;){var a=n-1>>>1,r=e[a];if(!(void 0!==r&&0<S(r,t)))break e;e[a]=t,e[n]=r,n=a}}function x(e){return void 0===(e=e[0])?null:e}function E(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var a=0,r=e.length;a<r;){var o=2*(a+1)-1,i=e[o],l=o+1,s=e[l];if(void 0!==i&&0>S(i,n))void 0!==s&&0>S(s,i)?(e[a]=s,e[l]=n,a=l):(e[a]=i,e[o]=n,a=o);else{if(!(void 0!==s&&0>S(s,n)))break e;e[a]=s,e[l]=n,a=l}}}return t}return null}function S(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var T=[],C=[],A=1,L=null,P=3,N=!1,O=!1,R=!1;function I(e){for(var t=x(C);null!==t;){if(null===t.callback)E(C);else{if(!(t.startTime<=e))break;E(C),t.sortIndex=t.expirationTime,k(T,t)}t=x(C)}}function M(e){if(R=!1,I(e),!O)if(null!==x(T))O=!0,n(j);else{var t=x(C);null!==t&&a(M,t.startTime-e)}}function j(e,n){O=!1,R&&(R=!1,r()),N=!0;var o=P;try{for(I(n),L=x(T);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=L.callback;if("function"==typeof i){L.callback=null,P=L.priorityLevel;var l=i(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?L.callback=l:L===x(T)&&E(T),I(n)}else E(T);L=x(T)}if(null!==L)var s=!0;else{var c=x(C);null!==c&&a(M,c.startTime-n),s=!1}return s}finally{L=null,P=o,N=!1}}var D=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){O||N||(O=!0,n(j))},t.unstable_getCurrentPriorityLevel=function(){return P},t.unstable_getFirstCallbackNode=function(){return x(T)},t.unstable_next=function(e){switch(P){case 1:case 2:case 3:var t=3;break;default:t=P}var n=P;P=t;try{return e()}finally{P=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=D,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=P;P=e;try{return t()}finally{P=n}},t.unstable_scheduleCallback=function(e,o,i){var l=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?l+i:l:i=l,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:A++,callback:o,priorityLevel:e,startTime:i,expirationTime:s=i+s,sortIndex:-1},i>l?(e.sortIndex=i,k(C,e),null===x(T)&&e===x(C)&&(R?r():R=!0,a(M,i-l))):(e.sortIndex=s,k(T,e),O||N||(O=!0,n(j))),e},t.unstable_wrapCallback=function(e){var t=P;return function(){var n=P;P=t;try{return e.apply(this,arguments)}finally{P=n}}}},63840:(e,t,n)=>{"use strict";e.exports=n(60053)},96774:e=>{e.exports=function(e,t,n,a){var r=n?n.call(a,e,t):void 0;if(void 0!==r)return!!r;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var c=o[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(r=n?n.call(a,u,d,c):void 0)||void 0===r&&u!==d)return!1}return!0}},53250:(e,t,n)=>{"use strict";var a=n(67294);var r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=a.useState,i=a.useEffect,l=a.useLayoutEffect,s=a.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch(a){return!0}}var u="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),a=o({inst:{value:n,getSnapshot:t}}),r=a[0].inst,u=a[1];return l((function(){r.value=n,r.getSnapshot=t,c(r)&&u({inst:r})}),[e,n,t]),i((function(){return c(r)&&u({inst:r}),e((function(){c(r)&&u({inst:r})}))}),[e]),s(n),n};t.useSyncExternalStore=void 0!==a.useSyncExternalStore?a.useSyncExternalStore:u},61688:(e,t,n)=>{"use strict";e.exports=n(53250)},36809:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});const a={title:"GG",url:"https://greeng00se.github.io",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/duck.png",organizationName:"greeng00se",projectName:"greeng00se.github.io",trailingSlash:!1,i18n:{defaultLocale:"ko",locales:["ko"],path:"i18n",localeConfigs:{}},markdown:{mermaid:!0},themes:["@docusaurus/theme-mermaid"],presets:[["classic",{blog:{showReadingTime:!0,routeBasePath:"/",archiveBasePath:"/blog",postsPerPage:1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/"},docs:{sidebarPath:"/home/runner/work/greeng00se.github.io/greeng00se.github.io/sidebars.js",showLastUpdateTime:!0,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/"},theme:{customCss:"/home/runner/work/greeng00se.github.io/greeng00se.github.io/src/css/custom.css"},gtag:{trackingID:"G-17TREGCW4H",anonymizeIP:!0}}]],themeConfig:{navbar:{title:"greeng\xf6\xf6se",items:[{to:"/blog",label:"\ube14\ub85c\uadf8",position:"left"},{position:"left",type:"doc",label:"\ubb38\uc11c",docId:"intro"},{href:"https://github.com/greeng00se",position:"right",className:"header-github-link","aria-label":"GitHub repository"}],hideOnScroll:!1},algolia:{appId:"YSMNU47L51",apiKey:"16caa11a7af7bf5db56b5f640fa738cd",indexName:"gh",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["java","kotlin","groovy"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},metadata:[{name:"google-site-verification",content:"APK6j79LMymudgmQDTV8u_RYyncFYyuFUjY9A0hVPv4"}],colorMode:{defaultMode:"dark",respectPrefersColorScheme:!0,disableSwitch:!1},mermaid:{theme:{light:"neutral",dark:"dark"},options:{}},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],tagline:"",titleDelimiter:"|",noIndex:!1}},87462:(e,t,n)=>{"use strict";function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},a.apply(this,arguments)}n.d(t,{Z:()=>a})},75068:(e,t,n)=>{"use strict";function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,a(e,t)}n.d(t,{Z:()=>r})},63366:(e,t,n)=>{"use strict";function a(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}n.d(t,{Z:()=>a})},38776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var a="Invariant failed";function r(e,t){if(!e)throw new Error(a)}},57529:e=>{"use strict";e.exports=JSON.parse('{"theme.AnnouncementBar.closeButtonAriaLabel":"\ub2eb\uae30","theme.BackToTopButton.buttonAriaLabel":"\ub9e8 \uc704\ub85c \uc2a4\ud06c\ub864\ud558\uae30","theme.CodeBlock.copied":"\ubcf5\uc0ac\ud588\uc2b5\ub2c8\ub2e4","theme.CodeBlock.copy":"\ubcf5\uc0ac","theme.CodeBlock.copyButtonAriaLabel":"\ud074\ub9bd\ubcf4\ub4dc\uc5d0 \ucf54\ub4dc \ubcf5\uc0ac","theme.CodeBlock.wordWrapToggle":"\uc904 \ubc14\uafc8 \uc804\ud658","theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel":"\uc811\uc744 \uc218 \uc788\ub294 \uc0ac\uc774\ub4dc\ubc14 \ubd84\ub958 \'{label}\' \uc811\uae30(\ud3bc\uce58\uae30)","theme.ErrorPageContent.title":"\ud398\uc774\uc9c0\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4.","theme.ErrorPageContent.tryAgain":"\ub2e4\uc2dc \uc2dc\ub3c4\ud574 \ubcf4\uc138\uc694","theme.NavBar.navAriaLabel":"Main","theme.NotFound.p1":"\uc6d0\ud558\ub294 \ud398\uc774\uc9c0\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.","theme.NotFound.p2":"\uc0ac\uc774\ud2b8 \uad00\ub9ac\uc790\uc5d0\uac8c \ub9c1\ud06c\uac00 \uae68\uc9c4 \uac83\uc744 \uc54c\ub824\uc8fc\uc138\uc694.","theme.NotFound.title":"\ud398\uc774\uc9c0\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.","theme.TOCCollapsible.toggleButtonLabel":"\uc774 \ud398\uc774\uc9c0\uc5d0\uc11c","theme.admonition.caution":"\uc8fc\uc758","theme.admonition.danger":"\uc704\ud5d8","theme.admonition.info":"\uc815\ubcf4","theme.admonition.note":"\ub178\ud2b8","theme.admonition.tip":"\ud301","theme.blog.archive.description":"\uac8c\uc2dc\ubb3c \ubaa9\ub85d","theme.blog.archive.title":"\uac8c\uc2dc\ubb3c \ubaa9\ub85d","theme.blog.paginator.navAriaLabel":"\ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c \ubaa9\ub85d \ud0d0\uc0c9","theme.blog.paginator.newerEntries":"\uc774\uc804 \ud398\uc774\uc9c0","theme.blog.paginator.olderEntries":"\ub2e4\uc74c \ud398\uc774\uc9c0","theme.blog.post.paginator.navAriaLabel":"\ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c \ud0d0\uc0c9","theme.blog.post.paginator.newerPost":"\uc774\uc804 \uac8c\uc2dc\ubb3c","theme.blog.post.paginator.olderPost":"\ub2e4\uc74c \uac8c\uc2dc\ubb3c","theme.blog.post.plurals":"{count}\uac1c \uac8c\uc2dc\ubb3c","theme.blog.post.readMore":"\uc790\uc138\ud788 \ubcf4\uae30","theme.blog.post.readMoreLabel":"{title} \uc5d0 \ub300\ud574 \ub354 \uc77d\uc5b4\ubcf4\uae30","theme.blog.post.readingTime.plurals":"\uc57d {readingTime}\ubd84","theme.blog.sidebar.navAriaLabel":"\ucd5c\uadfc \ube14\ub85c\uadf8 \ubb38\uc11c \ub458\ub7ec\ubcf4\uae30","theme.blog.tagTitle":"\\"{tagName}\\" \ud0dc\uadf8\ub85c \uc5f0\uacb0\ub41c {nPosts}\uac1c\uc758 \uac8c\uc2dc\ubb3c\uc774 \uc788\uc2b5\ub2c8\ub2e4.","theme.colorToggle.ariaLabel":"\uc5b4\ub450\uc6b4 \ubaa8\ub4dc\uc640 \ubc1d\uc740 \ubaa8\ub4dc \uc804\ud658\ud558\uae30 (\ud604\uc7ac {mode})","theme.colorToggle.ariaLabel.mode.dark":"\uc5b4\ub450\uc6b4 \ubaa8\ub4dc","theme.colorToggle.ariaLabel.mode.light":"\ubc1d\uc740 \ubaa8\ub4dc","theme.common.editThisPage":"\ud398\uc774\uc9c0 \ud3b8\uc9d1","theme.common.headingLinkTitle":"{heading}\uc5d0 \ub300\ud55c \uc9c1\uc811 \ub9c1\ud06c","theme.common.skipToMainContent":"\ubcf8\ubb38\uc73c\ub85c \uac74\ub108\ub6f0\uae30","theme.docs.DocCard.categoryDescription":"{count} \ud56d\ubaa9","theme.docs.breadcrumbs.home":"\ud648","theme.docs.breadcrumbs.navAriaLabel":"Breadcrumbs","theme.docs.paginator.navAriaLabel":"\ubb38\uc11c \ud0d0\uc0c9","theme.docs.paginator.next":"\ub2e4\uc74c","theme.docs.paginator.previous":"\uc774\uc804","theme.docs.sidebar.closeSidebarButtonAriaLabel":"Close navigation bar","theme.docs.sidebar.collapseButtonAriaLabel":"\uc0ac\uc774\ub4dc\ubc14 \uc228\uae30\uae30","theme.docs.sidebar.collapseButtonTitle":"\uc0ac\uc774\ub4dc\ubc14 \uc228\uae30\uae30","theme.docs.sidebar.expandButtonAriaLabel":"\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30","theme.docs.sidebar.expandButtonTitle":"\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30","theme.docs.sidebar.navAriaLabel":"Docs sidebar","theme.docs.sidebar.toggleSidebarButtonAriaLabel":"Toggle navigation bar","theme.docs.tagDocListPageTitle":"{nDocsTagged} \\"{tagName}\\" \ud0dc\uadf8\uc5d0 \ubd84\ub958\ub418\uc5c8\uc2b5\ub2c8\ub2e4","theme.docs.tagDocListPageTitle.nDocsTagged":"{count}\uac1c \ubb38\uc11c\uac00","theme.docs.versionBadge.label":"\ubc84\uc804: {versionLabel}","theme.docs.versions.latestVersionLinkLabel":"\ucd5c\uc2e0 \ubc84\uc804","theme.docs.versions.latestVersionSuggestionLabel":"\ucd5c\uc2e0 \ubb38\uc11c\ub294 {latestVersionLink} ({versionLabel})\uc744 \ud655\uc778\ud558\uc138\uc694.","theme.docs.versions.unmaintainedVersionLabel":"{siteTitle} {versionLabel} \ubb38\uc11c\ub294 \ub354 \uc774\uc0c1 \uc5c5\ub370\uc774\ud2b8\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.","theme.docs.versions.unreleasedVersionLabel":"{siteTitle} {versionLabel} \ubb38\uc11c\ub294 \uc544\uc9c1 \uc815\uc2dd \uacf5\uac1c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.","theme.lastUpdated.atDate":" {date}\uc5d0","theme.lastUpdated.byUser":" {user}\uac00","theme.lastUpdated.lastUpdatedAtBy":"\ucd5c\uc885 \uc218\uc815: {atDate}{byUser}","theme.navbar.mobileLanguageDropdown.label":"\uc5b8\uc5b4","theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel":"\u2190 \uba54\uc778 \uba54\ub274\ub85c \ub3cc\uc544\uac00\uae30","theme.navbar.mobileVersionsDropdown.label":"\ubc84\uc804","theme.tags.tagsListLabel":"\ud0dc\uadf8:","theme.tags.tagsPageLink":"\ubaa8\ub4e0 \ud0dc\uadf8 \ubcf4\uae30","theme.tags.tagsPageTitle":"\ud0dc\uadf8","theme.SearchBar.label":"\uac80\uc0c9","theme.SearchBar.seeAll":"{count}\uac1c\uc758 \uacb0\uacfc \ud655\uc778\ud558\uae30","theme.SearchModal.errorScreen.helpText":"\uc778\ud130\ub137 \uc5f0\uacb0\uc744 \ub2e4\uc2dc \ud655\uc778\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.","theme.SearchModal.errorScreen.titleText":"\uacb0\uacfc\ub97c \ubd88\ub7ec\uc62c \uc218 \uc5c6\uc74c","theme.SearchModal.footer.closeKeyAriaLabel":"Esc \ud0a4","theme.SearchModal.footer.closeText":"\ub85c \uc885\ub8cc","theme.SearchModal.footer.navigateDownKeyAriaLabel":"\ud654\uc0b4\ud45c \uc544\ub798 \ud0a4","theme.SearchModal.footer.navigateText":"\ub85c \uc774\ub3d9","theme.SearchModal.footer.navigateUpKeyAriaLabel":"\ud654\uc0b4\ud45c \uc704 \ud0a4","theme.SearchModal.footer.searchByText":"\uac80\uc0c9 \uc81c\uacf5","theme.SearchModal.footer.selectKeyAriaLabel":"\uc5d4\ud130 \ud0a4","theme.SearchModal.footer.selectText":"\ub85c \uc120\ud0dd","theme.SearchModal.noResultsScreen.noResultsText":"\uac80\uc0c9 \uacb0\uacfc \uc5c6\uc74c","theme.SearchModal.noResultsScreen.reportMissingResultsLinkText":"\uc54c\ub824\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.","theme.SearchModal.noResultsScreen.reportMissingResultsText":"\uac80\uc0c9 \uacb0\uacfc\uac00 \uc5c6\ub294 \uac83\uc774 \uc624\ub958\ub77c\uace0 \uc0dd\uac01\ub418\uc2ed\ub2c8\uae4c?","theme.SearchModal.noResultsScreen.suggestedQueryText":"\ub2e4\ub978 \ucd94\ucc9c \uac80\uc0c9\uc5b4","theme.SearchModal.placeholder":"\ubb38\uc11c \uac80\uc0c9","theme.SearchModal.searchBox.cancelButtonText":"\ucde8\uc18c","theme.SearchModal.searchBox.resetButtonTitle":"\uac80\uc0c9\uc5b4 \ucd08\uae30\ud654","theme.SearchModal.startScreen.favoriteSearchesTitle":"\uc990\uaca8\ucc3e\uae30","theme.SearchModal.startScreen.noRecentSearchesText":"\ucd5c\uadfc \uac80\uc0c9\uc5b4 \uc5c6\uc74c","theme.SearchModal.startScreen.recentSearchesTitle":"\ucd5c\uadfc","theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle":"\uc774 \uac80\uc0c9\uc5b4\ub97c \uc990\uaca8\ucc3e\uae30\uc5d0\uc11c \uc0ad\uc81c","theme.SearchModal.startScreen.removeRecentSearchButtonTitle":"\uc774 \uac80\uc0c9\uc5b4\ub97c \ucd5c\uadfc \uac80\uc0c9\uc5b4\uc5d0\uc11c \uc0ad\uc81c","theme.SearchModal.startScreen.saveRecentSearchButtonTitle":"\uc774 \uac80\uc0c9\uc5b4\ub97c \uc800\uc7a5","theme.SearchPage.algoliaLabel":"Algolia\ub85c \uac80\uc0c9","theme.SearchPage.documentsFound.plurals":"{count}\uac1c\uc758 \ubb38\uc11c\ub97c \ucc3e\uc558\uc2b5\ub2c8\ub2e4.","theme.SearchPage.emptyResultsTitle":"\ubb38\uc11c\ub97c \uac80\uc0c9\ud569\ub2c8\ub2e4.","theme.SearchPage.existingResultsTitle":"\\"{query}\\" \uac80\uc0c9 \uacb0\uacfc","theme.SearchPage.fetchingNewResults":"\uc0c8\ub85c\uc6b4 \uac80\uc0c9 \uacb0\uacfc\ub97c \ubd88\ub7ec\uc624\ub294 \uc911\uc785\ub2c8\ub2e4.","theme.SearchPage.inputLabel":"\uac80\uc0c9","theme.SearchPage.inputPlaceholder":"\uac80\uc0c9\uc5b4\ub97c \uc785\ub825\ud558\uc138\uc694.","theme.SearchPage.noResultsText":"\uac80\uc0c9 \uacb0\uacfc\uac00 \uc5c6\uc2b5\ub2c8\ub2e4."}')},16887:e=>{"use strict";e.exports=JSON.parse('{"/1-fe7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1563fc8b"},"/10-440":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"a571ae8c"},"/11-74a":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1c74a8fd"},"/12-0c3":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"34a9e1b6"},"/13-bf5":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"0b2567db"},"/14-f02":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"d297da14"},"/15-e52":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"06ea9cd1"},"/16-b3b":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"b393c858"},"/17-cc2":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"d693e23c"},"/18-a45":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"92926477"},"/19-e8b":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"882ffb20"},"/2-4be":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"9f324683"},"/20-2a7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"49c232d6"},"/21-794":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"24214711"},"/22-8d6":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"5f785aa3"},"/23-8a8":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"0f9a8782"},"/24-312":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"397e7345"},"/25-922":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"c0a61fca"},"/26-5fd":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"b2e443b6"},"/27-a34":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"3f4fb381"},"/28-203":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"2e892090"},"/29-784":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"43f49b9e"},"/3-cf7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"b7811d78"},"/30-9f7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"4413b451"},"/31-20a":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"899da081"},"/32-fa9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"0ecaa6ec"},"/33-e77":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"a0333b7c"},"/34-58f":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"3028ca57"},"/35-481":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"6600e5b0"},"/36-827":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"3216290d"},"/37-559":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"f619e31e"},"/38-068":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"d3752f11"},"/39-820":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"ae6a2dc6"},"/4-dd9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1c5d8736"},"/40-b09":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1e4ebcd5"},"/41-e92":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"72367227"},"/5-b35":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"86863b3d"},"/6-5d9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"8e3d08a4"},"/7-374":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"4177cd87"},"/8-274":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"f20d36f2"},"/9-2e9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"fd60e617"},"/blog-3d8":{"__comp":"9e4087bc","__context":{"plugin":"509d519c"},"archive":"b2b675dd"},"/docs/tags-820":{"__comp":"3720c009","__context":{"plugin":"dcf70953"},"tags":"55960ee5"},"/docs/tags/book-c20":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"f4c6e7e6"},"/docs/tags/etc-338":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"c189d18f"},"/docs/tags/jpa-f95":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"5ffd2c10"},"/docs/tags/monitoring-50f":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"1c93669b"},"/docs/tags/nginx-ecc":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"c60995f6"},"/docs/tags/pacakge-c10":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"c33ca104"},"/docs/tags/postmortem-4b0":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"7e4c1ed7"},"/docs/tags/test-b58":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"9bbc65ac"},"/page/10-df1":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95c5de0b"}],"metadata":"f332d221"},"/page/11-6d9":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0e9b73e4"}],"metadata":"fbd57548"},"/page/12-4e5":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0050401e"}],"metadata":"f4f49e13"},"/page/13-80b":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0cb2f220"}],"metadata":"2832e534"},"/page/14-684":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"8e9056ec"}],"metadata":"4959fc42"},"/page/15-902":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ee00b37a"}],"metadata":"38d8699e"},"/page/16-528":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4aa09797"}],"metadata":"09fbb6bd"},"/page/17-e48":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"33ae6a7e"}],"metadata":"d1cef389"},"/page/18-324":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"dcfccecb"}],"metadata":"9cfe8fd1"},"/page/19-b8e":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6c60e25f"}],"metadata":"96adae60"},"/page/2-2ae":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"03e71e14"}],"metadata":"0c071de2"},"/page/20-502":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ab2128e5"}],"metadata":"35293ec4"},"/page/21-a21":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"2f7a5a88"}],"metadata":"80960b4b"},"/page/22-d46":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b8de016f"}],"metadata":"ef5b2427"},"/page/23-48f":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"metadata":"871c1e5a"},"/page/24-01f":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"metadata":"635a92d5"},"/page/25-b54":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"metadata":"226700de"},"/page/26-c6a":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"87a22936"}],"metadata":"54cb095e"},"/page/27-2d5":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"741df4e1"}],"metadata":"5f81b25c"},"/page/28-62f":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95dc859f"}],"metadata":"270346fa"},"/page/29-bbe":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"76603d6f"}],"metadata":"12cbeba7"},"/page/3-11c":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"456b5fae"}],"metadata":"e4ebfe18"},"/page/30-d73":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"d6c08822"}],"metadata":"00931cc3"},"/page/31-b8d":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a5b179f0"}],"metadata":"d50fd269"},"/page/32-140":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6b90f600"}],"metadata":"754fb852"},"/page/33-d53":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f2b7d1a9"}],"metadata":"f3e308ad"},"/page/34-03f":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4f3c73fd"}],"metadata":"6dd1c948"},"/page/35-53e":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b73048db"}],"metadata":"c29bedb9"},"/page/36-485":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"3cc6ebf8"}],"metadata":"69c28c32"},"/page/37-6c4":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a1cea306"}],"metadata":"494882d1"},"/page/38-dd7":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f1783c84"}],"metadata":"2e10a69c"},"/page/39-32f":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f105176d"}],"metadata":"64868a43"},"/page/4-2d9":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"686688fd"}],"metadata":"7762a24e"},"/page/40-5c4":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"041ed4b0"}],"metadata":"eec33099"},"/page/41-ee3":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e3a9c3a3"}],"metadata":"32b2299c"},"/page/5-0b6":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b1d2ea98"}],"metadata":"8d05b77c"},"/page/6-2f0":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0a7a6076"}],"metadata":"7af1d52f"},"/page/7-0b3":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"metadata":"d0e4cdf1"},"/page/8-ab4":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"268e20d0"}],"metadata":"f75a8651"},"/page/9-94f":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"804ef369"}],"metadata":"6093f82b"},"/search-c1e":{"__comp":"1a4e3797","__context":{"plugin":"18c69d70"}},"/tags-4bf":{"__comp":"01a85c17","__context":{"plugin":"509d519c"},"sidebar":"814f3328","tags":"c573638f"},"/tags/async-1a2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"03e71e14"}],"tag":"8fbd512b","listMetadata":"a1877440"},"/tags/awt-f0a":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"456b5fae"}],"tag":"cf8e491a","listMetadata":"9b56b618"},"/tags/awt/page/2-284":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0a7a6076"}],"tag":"f0978ee1","listMetadata":"32397cb2"},"/tags/book-909":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b8de016f"}],"tag":"2d3b202f","listMetadata":"14164549"},"/tags/book/page/2-989":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f105176d"}],"tag":"2bfe7c0b","listMetadata":"c0cb7215"},"/tags/book/page/3-a75":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e3a9c3a3"}],"tag":"df862072","listMetadata":"ffb0fa11"},"/tags/class-3ca":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"741df4e1"}],"tag":"33736670","listMetadata":"8d7288fe"},"/tags/cloudwatch-4e0":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f14eea08"}],"tag":"b7d33121","listMetadata":"6cfe3a99"},"/tags/composite-737":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"8e9056ec"}],"tag":"255134d9","listMetadata":"ae1d6508"},"/tags/data-base-ab7":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"tag":"0a2eaa84","listMetadata":"309173fa"},"/tags/data-base/page/2-f0a":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"tag":"9dec6b67","listMetadata":"66d1c769"},"/tags/data-base/page/3-f63":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"tag":"02689328","listMetadata":"dfa84138"},"/tags/documentation-989":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"804ef369"}],"tag":"7bbc420e","listMetadata":"20e99c2a"},"/tags/dto-a68":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4aa09797"}],"tag":"5a6c6934","listMetadata":"d0277431"},"/tags/elastic-beanstalk-a4b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ab2128e5"}],"tag":"28a1570f","listMetadata":"0746167d"},"/tags/event-6b5":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"03e71e14"}],"tag":"0cb009d1","listMetadata":"8dc09bac"},"/tags/grasp-efe":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a5b179f0"}],"tag":"b9bcab37","listMetadata":"2f43e44a"},"/tags/image-7cc":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"456b5fae"}],"tag":"75121fd5","listMetadata":"d368e73e"},"/tags/image/page/2-3e2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"686688fd"}],"tag":"562496aa","listMetadata":"b474adfe"},"/tags/image/page/3-bcb":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0a7a6076"}],"tag":"d6a3d698","listMetadata":"4b2fba3e"},"/tags/inno-db-ea2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"tag":"49b8d9dd","listMetadata":"a9221bd5"},"/tags/intelli-j-0f1":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"3cc6ebf8"}],"tag":"fe8cce0a","listMetadata":"db7928b3"},"/tags/isolation-869":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"tag":"c3ea66fe","listMetadata":"d2935d14"},"/tags/java-75d":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"tag":"274c9143","listMetadata":"fe273484"},"/tags/java/page/2-e04":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"741df4e1"}],"tag":"1893cb59","listMetadata":"54150be7"},"/tags/java/page/3-fb9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95dc859f"}],"tag":"8e498bb6","listMetadata":"198f8d8a"},"/tags/java/page/4-de0":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b73048db"}],"tag":"a3dddb77","listMetadata":"08726fcf"},"/tags/java/page/5-6c2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f1783c84"}],"tag":"e2de2dbb","listMetadata":"35b2eb5a"},"/tags/jdbc-c84":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95dc859f"}],"tag":"a85e626a","listMetadata":"d40f51e1"},"/tags/jenkins-9e9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ab2128e5"}],"tag":"3b0f99e8","listMetadata":"0281109c"},"/tags/kotlin-27e":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a1cea306"}],"tag":"633582b9","listMetadata":"9fae68e2"},"/tags/lock-092":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"tag":"6a19354d","listMetadata":"5eed1665"},"/tags/lock/page/2-cc1":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"tag":"9ca52986","listMetadata":"492a6565"},"/tags/log-e50":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f14eea08"}],"tag":"19f4ae8e","listMetadata":"5088fe06"},"/tags/mock-31b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"87a22936"}],"tag":"1d81daa1","listMetadata":"c6004f62"},"/tags/mockito-60c":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b1d2ea98"}],"tag":"3b18521e","listMetadata":"2b479afe"},"/tags/monitoring-32c":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f14eea08"}],"tag":"3d6c40c1","listMetadata":"1fbde614"},"/tags/my-sql-c5a":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"tag":"e0e4666e","listMetadata":"bf933b37"},"/tags/oop-544":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a5b179f0"}],"tag":"9d8ee3a8","listMetadata":"d202e2c5"},"/tags/pattern-433":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"8e9056ec"}],"tag":"2d9296e4","listMetadata":"e9ff60ad"},"/tags/python-5b4":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"686688fd"}],"tag":"c7015929","listMetadata":"f580a9d0"},"/tags/retrospective-5d6":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95c5de0b"}],"tag":"8c6c0796","listMetadata":"a4a1e915"},"/tags/retrospective/page/10-581":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"76603d6f"}],"tag":"bbc01ba0","listMetadata":"9dc4119a"},"/tags/retrospective/page/11-be6":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"d6c08822"}],"tag":"e073eb07","listMetadata":"7405ea58"},"/tags/retrospective/page/12-2c3":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6b90f600"}],"tag":"3c5aea38","listMetadata":"e0d68441"},"/tags/retrospective/page/13-5eb":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f2b7d1a9"}],"tag":"d88bdb28","listMetadata":"e9624b4f"},"/tags/retrospective/page/14-d3f":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4f3c73fd"}],"tag":"7fd9a574","listMetadata":"21e890b0"},"/tags/retrospective/page/15-4e0":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"041ed4b0"}],"tag":"16cc6f3a","listMetadata":"b5f3dcc5"},"/tags/retrospective/page/2-120":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0e9b73e4"}],"tag":"abc83b7f","listMetadata":"533bfc57"},"/tags/retrospective/page/3-ac5":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0050401e"}],"tag":"bd2d06b5","listMetadata":"2b22d492"},"/tags/retrospective/page/4-ae9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0cb2f220"}],"tag":"303c1e60","listMetadata":"d126aabd"},"/tags/retrospective/page/5-57b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ee00b37a"}],"tag":"ee92877e","listMetadata":"43a97218"},"/tags/retrospective/page/6-080":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"33ae6a7e"}],"tag":"e8d6e7ce","listMetadata":"6bc709ad"},"/tags/retrospective/page/7-a0b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"dcfccecb"}],"tag":"a0410ab5","listMetadata":"564337ec"},"/tags/retrospective/page/8-8f0":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6c60e25f"}],"tag":"e21c8cc4","listMetadata":"05b907fc"},"/tags/retrospective/page/9-e54":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"2f7a5a88"}],"tag":"8b79a48d","listMetadata":"7e59392d"},"/tags/spring-5ac":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"tag":"3ed04b60","listMetadata":"7fbacf84"},"/tags/spring-boot-9b9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"tag":"087c46fa","listMetadata":"41b4728f"},"/tags/static-0f7":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b1d2ea98"}],"tag":"269a2f75","listMetadata":"70a12cc4"},"/tags/teco-chat-789":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0cb2f220"}],"tag":"af81a133","listMetadata":"f042b56c"},"/tags/teco-chat/page/2-bb6":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6c60e25f"}],"tag":"c60ea0ff","listMetadata":"d5dfecc2"},"/tags/teco-chat/page/3-c60":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"2f7a5a88"}],"tag":"1a6b9123","listMetadata":"d09f7e4b"},"/tags/test-900":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"87a22936"}],"tag":"2a8faff0","listMetadata":"1a665c6f"},"/tags/time-667":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f1783c84"}],"tag":"f156dfb9","listMetadata":"fd5d2408"},"/tags/transaction-a90":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"tag":"d0840b01","listMetadata":"c037d168"},"/tags/web-socket-852":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"268e20d0"}],"tag":"489347ff","listMetadata":"3972c49f"},"/tags/woowahan-techcourse-83c":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95c5de0b"}],"tag":"39ee6679","listMetadata":"5a29fbab"},"/tags/woowahan-techcourse/page/10-d7f":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f2b7d1a9"}],"tag":"5c38e66e","listMetadata":"21d253a0"},"/tags/woowahan-techcourse/page/11-6ea":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4f3c73fd"}],"tag":"d2770bf7","listMetadata":"64f377d6"},"/tags/woowahan-techcourse/page/2-ae2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0e9b73e4"}],"tag":"86b4da3d","listMetadata":"e7d2a655"},"/tags/woowahan-techcourse/page/3-a3b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0050401e"}],"tag":"dab4c683","listMetadata":"ac23d7ee"},"/tags/woowahan-techcourse/page/4-2ef":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ee00b37a"}],"tag":"8da65e83","listMetadata":"6425a984"},"/tags/woowahan-techcourse/page/5-06b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"33ae6a7e"}],"tag":"fed8bc04","listMetadata":"bbceb8f1"},"/tags/woowahan-techcourse/page/6-046":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"dcfccecb"}],"tag":"a896be03","listMetadata":"f078e301"},"/tags/woowahan-techcourse/page/7-7e9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"76603d6f"}],"tag":"f63a747b","listMetadata":"abb0816f"},"/tags/woowahan-techcourse/page/8-c0b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"d6c08822"}],"tag":"672a376b","listMetadata":"ddf9e0bd"},"/tags/woowahan-techcourse/page/9-d99":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6b90f600"}],"tag":"43fcf0e9","listMetadata":"7c660760"},"/docs-71c":{"__comp":"1be78505","__context":{"plugin":"dcf70953"},"versionMetadata":"935f2afb"},"/docs-818":{"__comp":"17896441","content":"f8409a7e"},"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551-8a6":{"__comp":"17896441","content":"3b0d95bc"},"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4-594":{"__comp":"17896441","content":"c55d205b"},"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5-90a":{"__comp":"17896441","content":"d86f7a37"},"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30-ec3":{"__comp":"17896441","content":"459bd227"},"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30-1b0":{"__comp":"17896441","content":"3fc16fd0"},"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815-c04":{"__comp":"17896441","content":"29476979"},"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815-9d4":{"__comp":"17896441","content":"fcb446a5"},"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131-94d":{"__comp":"17896441","content":"0d47646f"},"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c-644":{"__comp":"17896441","content":"9e477a5e"},"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0-f6b":{"__comp":"17896441","content":"981f7647"},"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8-bef":{"__comp":"17896441","content":"a43f2942"},"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59-06a":{"__comp":"17896441","content":"48bd1d32"},"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd-c2c":{"__comp":"17896441","content":"0462f8fc"},"/-3ce":{"__comp":"c4f5d8e4","__context":{"plugin":"ae3384b2"},"config":"5e9f5e1a"},"/-adc":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f14eea08"}],"metadata":"a5557bb9"}}')}},e=>{e.O(0,[532],(()=>{return t=49383,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.75d5e417.js.LICENSE.txt b/assets/js/main.0ea3d648.js.LICENSE.txt similarity index 100% rename from assets/js/main.75d5e417.js.LICENSE.txt rename to assets/js/main.0ea3d648.js.LICENSE.txt diff --git a/assets/js/main.75d5e417.js b/assets/js/main.75d5e417.js deleted file mode 100644 index b585f4d4b..000000000 --- a/assets/js/main.75d5e417.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.75d5e417.js.LICENSE.txt */ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});var a=n(7294);function r(){return a.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},a.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(7294),r=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"0050401e":[()=>n.e(9735).then(n.bind(n,5401)),"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",5401],"00931cc3":[()=>n.e(5669).then(n.t.bind(n,2291,19)),"~blog/default/page-30-25c.json",2291],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,4524)),"@theme/BlogTagsListPage",4524],"02689328":[()=>n.e(6346).then(n.t.bind(n,5577,19)),"~blog/default/tags-data-base-page-3-9db.json",5577],"0281109c":[()=>n.e(422).then(n.t.bind(n,5266,19)),"~blog/default/tags-jenkins-2e5-list.json",5266],"03e71e14":[()=>Promise.all([n.e(532),n.e(4371)]).then(n.bind(n,9056)),"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx?truncated=true",9056],"041ed4b0":[()=>n.e(6847).then(n.bind(n,9363)),"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx?truncated=true",9363],"0462f8fc":[()=>n.e(4481).then(n.bind(n,7572)),"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd.mdx",7572],"05b907fc":[()=>n.e(734).then(n.t.bind(n,2943,19)),"~blog/default/tags-retrospective-page-8-5ab-list.json",2943],"06ea9cd1":[()=>n.e(8296).then(n.bind(n,6635)),"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx",6635],"0746167d":[()=>n.e(1113).then(n.t.bind(n,9758,19)),"~blog/default/tags-elastic-beanstalk-119-list.json",9758],"08726fcf":[()=>n.e(5487).then(n.t.bind(n,8441,19)),"~blog/default/tags-java-page-4-c22-list.json",8441],"087c46fa":[()=>n.e(96).then(n.t.bind(n,5774,19)),"~blog/default/tags-spring-boot-889.json",5774],"09fbb6bd":[()=>n.e(5964).then(n.t.bind(n,1679,19)),"~blog/default/page-16-d6c.json",1679],"0a2eaa84":[()=>n.e(8942).then(n.t.bind(n,2930,19)),"~blog/default/tags-data-base-4e8.json",2930],"0a7a6076":[()=>n.e(5212).then(n.bind(n,328)),"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx?truncated=true",328],"0b2567db":[()=>n.e(3578).then(n.bind(n,2141)),"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx",2141],"0c071de2":[()=>n.e(321).then(n.t.bind(n,3125,19)),"~blog/default/page-2-b45.json",3125],"0cb009d1":[()=>n.e(116).then(n.t.bind(n,6643,19)),"~blog/default/tags-event-f04.json",6643],"0cb2f220":[()=>n.e(8188).then(n.bind(n,1149)),"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx?truncated=true",1149],"0d47646f":[()=>n.e(2342).then(n.bind(n,7019)),"@site/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131.mdx",7019],"0e9b73e4":[()=>n.e(9823).then(n.bind(n,8513)),"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx?truncated=true",8513],"0ecaa6ec":[()=>n.e(6304).then(n.bind(n,8906)),"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx",8906],"0f9a8782":[()=>n.e(782).then(n.bind(n,3923)),"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx",3923],"12cbeba7":[()=>n.e(6508).then(n.t.bind(n,6134,19)),"~blog/default/page-29-e3c.json",6134],14164549:[()=>n.e(7268).then(n.t.bind(n,1279,19)),"~blog/default/tags-book-baf-list.json",1279],"1563fc8b":[()=>n.e(9690).then(n.bind(n,1295)),"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx",1295],"16cc6f3a":[()=>n.e(425).then(n.t.bind(n,2946,19)),"~blog/default/tags-retrospective-page-15-26b.json",2946],17896441:[()=>Promise.all([n.e(532),n.e(8126),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"1893cb59":[()=>n.e(286).then(n.t.bind(n,6269,19)),"~blog/default/tags-java-page-2-8c6.json",6269],"18c69d70":[()=>n.e(9171).then(n.t.bind(n,7085,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"198f8d8a":[()=>n.e(9059).then(n.t.bind(n,7238,19)),"~blog/default/tags-java-page-3-b02-list.json",7238],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,9172)),"@theme/SearchPage",9172],"1a665c6f":[()=>n.e(454).then(n.t.bind(n,8767,19)),"~blog/default/tags-test-435-list.json",8767],"1a6b9123":[()=>n.e(9874).then(n.t.bind(n,4343,19)),"~blog/default/tags-teco-chat-page-3-007.json",4343],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1c5d8736":[()=>n.e(7011).then(n.bind(n,5631)),"@site/blog/2023/2023-01-08-JSR-310.mdx",5631],"1c74a8fd":[()=>n.e(2007).then(n.bind(n,7339)),"@site/blog/2023/2023-03-30-GRASP.mdx",7339],"1c93669b":[()=>n.e(6526).then(n.t.bind(n,7579,19)),"~docs/default/tag-docs-tags-monitoring-149.json",7579],"1d81daa1":[()=>n.e(7681).then(n.t.bind(n,6725,19)),"~blog/default/tags-mock-330.json",6725],"1e4ebcd5":[()=>Promise.all([n.e(532),n.e(311)]).then(n.bind(n,692)),"@site/blog/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac/2023-08-13-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ube44\ub3d9\uae30 \ucc98\ub9ac.mdx",692],"20e99c2a":[()=>n.e(3530).then(n.t.bind(n,9507,19)),"~blog/default/tags-documentation-ee3-list.json",9507],"21d253a0":[()=>n.e(1853).then(n.t.bind(n,3986,19)),"~blog/default/tags-woowahan-techcourse-page-10-f03-list.json",3986],"21e890b0":[()=>n.e(8288).then(n.t.bind(n,551,19)),"~blog/default/tags-retrospective-page-14-99d-list.json",551],"226700de":[()=>n.e(6035).then(n.t.bind(n,1961,19)),"~blog/default/page-25-52d.json",1961],24214711:[()=>n.e(4041).then(n.bind(n,7164)),"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx",7164],"255134d9":[()=>n.e(8151).then(n.t.bind(n,753,19)),"~blog/default/tags-composite-240.json",753],"268e20d0":[()=>n.e(5164).then(n.bind(n,4615)),"@site/blog/2023/2023-06-26-WebSocket.mdx?truncated=true",4615],"269a2f75":[()=>n.e(1994).then(n.t.bind(n,8414,19)),"~blog/default/tags-static-b68.json",8414],"270346fa":[()=>n.e(7975).then(n.t.bind(n,9424,19)),"~blog/default/page-28-907.json",9424],"274c9143":[()=>n.e(6984).then(n.t.bind(n,58,19)),"~blog/default/tags-java-a6e.json",58],"2832e534":[()=>n.e(2476).then(n.t.bind(n,9870,19)),"~blog/default/page-13-99f.json",9870],"28a1570f":[()=>n.e(448).then(n.t.bind(n,2252,19)),"~blog/default/tags-elastic-beanstalk-119.json",2252],29476979:[()=>n.e(4030).then(n.bind(n,8804)),"@site/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815.md",8804],"2a8faff0":[()=>n.e(7901).then(n.t.bind(n,1150,19)),"~blog/default/tags-test-435.json",1150],"2b22d492":[()=>n.e(7652).then(n.t.bind(n,6986,19)),"~blog/default/tags-retrospective-page-3-ee4-list.json",6986],"2b479afe":[()=>n.e(9591).then(n.t.bind(n,6973,19)),"~blog/default/tags-mockito-3c0-list.json",6973],"2bfe7c0b":[()=>n.e(1762).then(n.t.bind(n,2670,19)),"~blog/default/tags-book-page-2-bc6.json",2670],"2d3b202f":[()=>n.e(1196).then(n.t.bind(n,2524,19)),"~blog/default/tags-book-baf.json",2524],"2d9296e4":[()=>n.e(3483).then(n.t.bind(n,9429,19)),"~blog/default/tags-pattern-b4e.json",9429],"2e10a69c":[()=>n.e(7581).then(n.t.bind(n,9981,19)),"~blog/default/page-38-d34.json",9981],"2e892090":[()=>n.e(1560).then(n.bind(n,9544)),"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx",9544],"2f43e44a":[()=>n.e(6743).then(n.t.bind(n,2396,19)),"~blog/default/tags-grasp-418-list.json",2396],"2f7a5a88":[()=>n.e(8927).then(n.bind(n,7879)),"@site/blog/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30/2023-04-22-\ud14c\ucf54\ucc57 1. \ud504\ub85c\ud1a0\ud0c0\uc785 \ub9cc\ub4e4\uae30.mdx?truncated=true",7879],"3028ca57":[()=>n.e(3211).then(n.bind(n,6733)),"@site/blog/2023/2023-06-26-WebSocket.mdx",6733],"303c1e60":[()=>n.e(2656).then(n.t.bind(n,9529,19)),"~blog/default/tags-retrospective-page-4-3a3.json",9529],"309173fa":[()=>n.e(1793).then(n.t.bind(n,2684,19)),"~blog/default/tags-data-base-4e8-list.json",2684],"3216290d":[()=>n.e(6799).then(n.bind(n,630)),"@site/blog/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd/2023-07-27-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uae30\uc220 \uc120\ud0dd.mdx",630],"32397cb2":[()=>n.e(548).then(n.t.bind(n,2050,19)),"~blog/default/tags-awt-page-2-eb4-list.json",2050],33736670:[()=>n.e(2742).then(n.t.bind(n,700,19)),"~blog/default/tags-class-eca.json",700],"33ae6a7e":[()=>n.e(5005).then(n.bind(n,8760)),"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",8760],"34a9e1b6":[()=>n.e(7381).then(n.bind(n,5382)),"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx",5382],"35293ec4":[()=>n.e(7697).then(n.t.bind(n,14,19)),"~blog/default/page-20-038.json",14],"35b2eb5a":[()=>n.e(372).then(n.t.bind(n,7815,19)),"~blog/default/tags-java-page-5-b71-list.json",7815],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,727)),"@theme/DocTagsListPage",727],"38d8699e":[()=>n.e(471).then(n.t.bind(n,7481,19)),"~blog/default/page-15-208.json",7481],"3972c49f":[()=>n.e(6629).then(n.t.bind(n,1782,19)),"~blog/default/tags-web-socket-c6e-list.json",1782],"397e7345":[()=>n.e(1892).then(n.bind(n,9142)),"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx",9142],"39ee6679":[()=>n.e(5717).then(n.t.bind(n,3636,19)),"~blog/default/tags-woowahan-techcourse-b50.json",3636],"3b0d95bc":[()=>n.e(970).then(n.bind(n,8973)),"@site/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551.mdx",8973],"3b0f99e8":[()=>n.e(3553).then(n.t.bind(n,34,19)),"~blog/default/tags-jenkins-2e5.json",34],"3b18521e":[()=>n.e(2773).then(n.t.bind(n,8086,19)),"~blog/default/tags-mockito-3c0.json",8086],"3c5aea38":[()=>n.e(6250).then(n.t.bind(n,6516,19)),"~blog/default/tags-retrospective-page-12-8cf.json",6516],"3cc6ebf8":[()=>n.e(8405).then(n.bind(n,4740)),"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx?truncated=true",4740],"3ed04b60":[()=>n.e(7157).then(n.t.bind(n,4792,19)),"~blog/default/tags-spring-de1.json",4792],"3f4fb381":[()=>n.e(5356).then(n.bind(n,57)),"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx",57],"3fc16fd0":[()=>n.e(3886).then(n.bind(n,2929)),"@site/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30.mdx",2929],"4177cd87":[()=>n.e(7450).then(n.bind(n,2169)),"@site/blog/2023/2023-02-12-Parameterized Tests.mdx",2169],"41b4728f":[()=>n.e(8628).then(n.t.bind(n,171,19)),"~blog/default/tags-spring-boot-889-list.json",171],"43a97218":[()=>n.e(4815).then(n.t.bind(n,5215,19)),"~blog/default/tags-retrospective-page-5-22d-list.json",5215],"43f49b9e":[()=>n.e(4670).then(n.bind(n,2414)),"@site/blog/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604/2023-06-01-\ud14c\ucf54\ucc57 3. \uae30\ub2a5 \uad6c\ud604.mdx",2414],"43fcf0e9":[()=>n.e(6468).then(n.t.bind(n,4822,19)),"~blog/default/tags-woowahan-techcourse-page-9-065.json",4822],"4413b451":[()=>n.e(2048).then(n.bind(n,8617)),"@site/blog/2023/2023-06-04-\uc7a5\ubc14\uad6c\ub2c8 \uc8fc\ubb38 \ubbf8\uc158 \ud68c\uace0.mdx",8617],"456b5fae":[()=>n.e(1865).then(n.bind(n,2790)),"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx?truncated=true",2790],"459bd227":[()=>n.e(9094).then(n.bind(n,6693)),"@site/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30.mdx",6693],"489347ff":[()=>n.e(2793).then(n.t.bind(n,526,19)),"~blog/default/tags-web-socket-c6e.json",526],"48bd1d32":[()=>n.e(9563).then(n.bind(n,1683)),"@site/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59.mdx",1683],"492a6565":[()=>n.e(4212).then(n.t.bind(n,4929,19)),"~blog/default/tags-lock-page-2-819-list.json",4929],"494882d1":[()=>n.e(4471).then(n.t.bind(n,2098,19)),"~blog/default/page-37-cb2.json",2098],"4959fc42":[()=>n.e(240).then(n.t.bind(n,897,19)),"~blog/default/page-14-0a2.json",897],"49b8d9dd":[()=>n.e(1103).then(n.t.bind(n,4420,19)),"~blog/default/tags-inno-db-59e.json",4420],"49c232d6":[()=>n.e(7176).then(n.bind(n,1574)),"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx",1574],"4aa09797":[()=>n.e(3306).then(n.bind(n,4369)),"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx?truncated=true",4369],"4b2fba3e":[()=>n.e(328).then(n.t.bind(n,8234,19)),"~blog/default/tags-image-page-3-942-list.json",8234],"4f3c73fd":[()=>n.e(8876).then(n.bind(n,9978)),"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",9978],"509d519c":[()=>n.e(743).then(n.t.bind(n,4469,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],"533bfc57":[()=>n.e(5100).then(n.t.bind(n,4371,19)),"~blog/default/tags-retrospective-page-2-e2b-list.json",4371],"54150be7":[()=>n.e(5088).then(n.t.bind(n,8707,19)),"~blog/default/tags-java-page-2-8c6-list.json",8707],"54cb095e":[()=>n.e(7009).then(n.t.bind(n,5159,19)),"~blog/default/page-26-a44.json",5159],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,8070,19)),"~docs/default/tags-list-current-prop-15a.json",8070],"562496aa":[()=>n.e(6161).then(n.t.bind(n,8146,19)),"~blog/default/tags-image-page-2-cc3.json",8146],"564337ec":[()=>n.e(5649).then(n.t.bind(n,8563,19)),"~blog/default/tags-retrospective-page-7-3e2-list.json",8563],"5a29fbab":[()=>n.e(7857).then(n.t.bind(n,5381,19)),"~blog/default/tags-woowahan-techcourse-b50-list.json",5381],"5a6c6934":[()=>n.e(5953).then(n.t.bind(n,8630,19)),"~blog/default/tags-dto-cb6.json",8630],"5c38e66e":[()=>n.e(5521).then(n.t.bind(n,8638,19)),"~blog/default/tags-woowahan-techcourse-page-10-f03.json",8638],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5eed1665":[()=>n.e(8142).then(n.t.bind(n,9729,19)),"~blog/default/tags-lock-529-list.json",9729],"5f785aa3":[()=>n.e(497).then(n.bind(n,9679)),"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx",9679],"5f81b25c":[()=>n.e(4889).then(n.t.bind(n,9492,19)),"~blog/default/page-27-eb3.json",9492],"5ffd2c10":[()=>n.e(2100).then(n.t.bind(n,6515,19)),"~docs/default/tag-docs-tags-jpa-c8c.json",6515],"6093f82b":[()=>n.e(6017).then(n.t.bind(n,708,19)),"~blog/default/page-9-361.json",708],"633582b9":[()=>n.e(2448).then(n.t.bind(n,2401,19)),"~blog/default/tags-kotlin-6ac.json",2401],"635a92d5":[()=>n.e(7891).then(n.t.bind(n,2126,19)),"~blog/default/page-24-fbb.json",2126],"6425a984":[()=>n.e(5467).then(n.t.bind(n,5377,19)),"~blog/default/tags-woowahan-techcourse-page-4-bcd-list.json",5377],"64868a43":[()=>n.e(1501).then(n.t.bind(n,3159,19)),"~blog/default/page-39-76c.json",3159],"64f377d6":[()=>n.e(732).then(n.t.bind(n,2898,19)),"~blog/default/tags-woowahan-techcourse-page-11-6c9-list.json",2898],"6600e5b0":[()=>n.e(9572).then(n.bind(n,3437)),"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx",3437],"66d1c769":[()=>n.e(7476).then(n.t.bind(n,122,19)),"~blog/default/tags-data-base-page-2-3a7-list.json",122],"672a376b":[()=>n.e(5753).then(n.t.bind(n,1690,19)),"~blog/default/tags-woowahan-techcourse-page-8-93a.json",1690],"686688fd":[()=>n.e(8193).then(n.bind(n,5879)),"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx?truncated=true",5879],"6875c492":[()=>Promise.all([n.e(532),n.e(8126),n.e(6048),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"69c28c32":[()=>n.e(1065).then(n.t.bind(n,9263,19)),"~blog/default/page-36-1da.json",9263],"6a19354d":[()=>n.e(693).then(n.t.bind(n,6232,19)),"~blog/default/tags-lock-529.json",6232],"6b90f600":[()=>n.e(4659).then(n.bind(n,407)),"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",407],"6bc709ad":[()=>n.e(9393).then(n.t.bind(n,1399,19)),"~blog/default/tags-retrospective-page-6-594-list.json",1399],"6c60e25f":[()=>n.e(2756).then(n.bind(n,6949)),"@site/blog/2023/2023-05-01-\ud14c\ucf54\ucc57 2. \ubc30\ud3ec.mdx?truncated=true",6949],"6dd1c948":[()=>n.e(7064).then(n.t.bind(n,6376,19)),"~blog/default/page-34-16c.json",6376],"70a12cc4":[()=>n.e(5682).then(n.t.bind(n,9461,19)),"~blog/default/tags-static-b68-list.json",9461],"7405ea58":[()=>n.e(2345).then(n.t.bind(n,702,19)),"~blog/default/tags-retrospective-page-11-e3c-list.json",702],"741df4e1":[()=>n.e(280).then(n.bind(n,1601)),"@site/blog/2023/2023-04-03-\uc790\ubc14 \ud074\ub798\uc2a4\ud30c\uc77c \uad6c\uc870.mdx?truncated=true",1601],"75121fd5":[()=>n.e(5335).then(n.t.bind(n,674,19)),"~blog/default/tags-image-97d.json",674],"754fb852":[()=>n.e(988).then(n.t.bind(n,8242,19)),"~blog/default/page-32-596.json",8242],"76603d6f":[()=>n.e(4560).then(n.bind(n,2182)),"@site/blog/2023/2023-04-01-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca81 \ud68c\uace0.mdx?truncated=true",2182],"7762a24e":[()=>n.e(2753).then(n.t.bind(n,5095,19)),"~blog/default/page-4-365.json",5095],"7af1d52f":[()=>n.e(2334).then(n.t.bind(n,9565,19)),"~blog/default/page-6-d10.json",9565],"7bbc420e":[()=>n.e(4311).then(n.t.bind(n,1691,19)),"~blog/default/tags-documentation-ee3.json",1691],"7c660760":[()=>n.e(2087).then(n.t.bind(n,1870,19)),"~blog/default/tags-woowahan-techcourse-page-9-065-list.json",1870],"7e4c1ed7":[()=>n.e(1653).then(n.t.bind(n,3297,19)),"~docs/default/tag-docs-tags-postmortem-ede.json",3297],"7e59392d":[()=>n.e(7281).then(n.t.bind(n,3202,19)),"~blog/default/tags-retrospective-page-9-473-list.json",3202],"7fbacf84":[()=>n.e(5797).then(n.t.bind(n,8701,19)),"~blog/default/tags-spring-de1-list.json",8701],"7fd9a574":[()=>n.e(2889).then(n.t.bind(n,5863,19)),"~blog/default/tags-retrospective-page-14-99d.json",5863],"804ef369":[()=>n.e(4044).then(n.bind(n,70)),"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx?truncated=true",70],"80960b4b":[()=>n.e(7599).then(n.t.bind(n,8386,19)),"~blog/default/page-21-7a8.json",8386],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"86863b3d":[()=>Promise.all([n.e(532),n.e(3359)]).then(n.bind(n,5838)),"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx",5838],"86b4da3d":[()=>n.e(952).then(n.t.bind(n,4149,19)),"~blog/default/tags-woowahan-techcourse-page-2-567.json",4149],"871c1e5a":[()=>n.e(5966).then(n.t.bind(n,1247,19)),"~blog/default/page-23-651.json",1247],"87a22936":[()=>n.e(418).then(n.bind(n,1637)),"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx?truncated=true",1637],"882ffb20":[()=>n.e(3910).then(n.bind(n,1645)),"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",1645],"899da081":[()=>n.e(7528).then(n.bind(n,6539)),"@site/blog/2023/2023-06-08-\ub808\ubca8 2 - \ub808\ubca8 \uc778\ud130\ubdf0 \ud68c\uace0.mdx",6539],"8b79a48d":[()=>n.e(9287).then(n.t.bind(n,9070,19)),"~blog/default/tags-retrospective-page-9-473.json",9070],"8c6c0796":[()=>n.e(2816).then(n.t.bind(n,9123,19)),"~blog/default/tags-retrospective-2fb.json",9123],"8d05b77c":[()=>n.e(4149).then(n.t.bind(n,2801,19)),"~blog/default/page-5-264.json",2801],"8d7288fe":[()=>n.e(4801).then(n.t.bind(n,1830,19)),"~blog/default/tags-class-eca-list.json",1830],"8da65e83":[()=>n.e(9427).then(n.t.bind(n,1341,19)),"~blog/default/tags-woowahan-techcourse-page-4-bcd.json",1341],"8dc09bac":[()=>n.e(8338).then(n.t.bind(n,8881,19)),"~blog/default/tags-event-f04-list.json",8881],"8e3d08a4":[()=>n.e(2727).then(n.bind(n,7553)),"@site/blog/2023-01-30-IntelliJ \uc124\uc815.mdx/index.mdx",7553],"8e498bb6":[()=>n.e(1436).then(n.t.bind(n,257,19)),"~blog/default/tags-java-page-3-b02.json",257],"8e9056ec":[()=>n.e(893).then(n.bind(n,5346)),"@site/blog/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30/2023-05-26-\ucef4\ud3ec\uc9c0\ud2b8 \ud328\ud134\uc73c\ub85c \uc694\uae08 \uc815\ucc45 \ucd94\uc0c1\ud654\ud558\uae30.mdx?truncated=true",5346],"8fbd512b":[()=>n.e(5873).then(n.t.bind(n,15,19)),"~blog/default/tags-async-326.json",15],92926477:[()=>n.e(6080).then(n.bind(n,6133)),"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx",6133],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"95c5de0b":[()=>n.e(5686).then(n.bind(n,3444)),"@site/blog/2023/2023-06-11-\uc6b0\uc544\ud55c\ud14c\ud06c\ucf54\uc2a4 \ub808\ubca82 \ud68c\uace0.mdx?truncated=true",3444],"95dc859f":[()=>Promise.all([n.e(532),n.e(3307)]).then(n.bind(n,5650)),"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx?truncated=true",5650],"96adae60":[()=>n.e(172).then(n.t.bind(n,4217,19)),"~blog/default/page-19-21b.json",4217],"96b08d81":[()=>n.e(4435).then(n.bind(n,1626)),"@site/blog/2023/2023-04-07-InnoDB \uc2a4\ud1a0\ub9ac\uc9c0 \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx?truncated=true",1626],"981f7647":[()=>n.e(2947).then(n.bind(n,1077)),"@site/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0.mdx",1077],"9a859616":[()=>n.e(8492).then(n.bind(n,4553)),"@site/blog/2023/2023-04-06-MySQL \uc5d4\uc9c4\uc758 \uc7a0\uae08.mdx?truncated=true",4553],"9b56b618":[()=>n.e(9538).then(n.t.bind(n,7e3,19)),"~blog/default/tags-awt-0e2-list.json",7e3],"9bbc65ac":[()=>n.e(7210).then(n.t.bind(n,1020,19)),"~docs/default/tag-docs-tags-test-8ab.json",1020],"9ca52986":[()=>n.e(3490).then(n.t.bind(n,2016,19)),"~blog/default/tags-lock-page-2-819.json",2016],"9cfe8fd1":[()=>n.e(7725).then(n.t.bind(n,7113,19)),"~blog/default/page-18-46d.json",7113],"9d8ee3a8":[()=>n.e(5962).then(n.t.bind(n,1297,19)),"~blog/default/tags-oop-03c.json",1297],"9dc4119a":[()=>n.e(6490).then(n.t.bind(n,4408,19)),"~blog/default/tags-retrospective-page-10-4a6-list.json",4408],"9dec6b67":[()=>n.e(8524).then(n.t.bind(n,8221,19)),"~blog/default/tags-data-base-page-2-3a7.json",8221],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9e477a5e":[()=>n.e(8312).then(n.bind(n,4686)),"@site/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c.mdx",4686],"9f324683":[()=>n.e(7974).then(n.bind(n,7998)),"@site/blog/2023/2023-01-02-2022\ub144 \ud68c\uace0.mdx",7998],"9fae68e2":[()=>n.e(297).then(n.t.bind(n,7536,19)),"~blog/default/tags-kotlin-6ac-list.json",7536],a0333b7c:[()=>n.e(7306).then(n.bind(n,1702)),"@site/blog/2023-06-18-Docusaurus/2023-06-18-Docusaurus.mdx",1702],a0410ab5:[()=>n.e(7843).then(n.t.bind(n,6970,19)),"~blog/default/tags-retrospective-page-7-3e2.json",6970],a1877440:[()=>n.e(7648).then(n.t.bind(n,3235,19)),"~blog/default/tags-async-326-list.json",3235],a1cea306:[()=>Promise.all([n.e(532),n.e(9537)]).then(n.bind(n,3179)),"@site/blog/2023/2023-01-16-Kotlin\uc5d0\uc11c null\uc744 \ub2e4\ub8e8\ub294 \ubc29\ubc95.mdx?truncated=true",3179],a3dddb77:[()=>n.e(475).then(n.t.bind(n,5479,19)),"~blog/default/tags-java-page-4-c22.json",5479],a413785b:[()=>n.e(5142).then(n.bind(n,4236)),"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx?truncated=true",4236],a43f2942:[()=>n.e(104).then(n.bind(n,7894)),"@site/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8.mdx",7894],a4a1e915:[()=>n.e(3671).then(n.t.bind(n,166,19)),"~blog/default/tags-retrospective-2fb-list.json",166],a5557bb9:[()=>n.e(5991).then(n.t.bind(n,3885,19)),"~blog/default/index.json",3885],a571ae8c:[()=>n.e(1329).then(n.bind(n,7999)),"@site/blog/2023/2023-03-14-\ube14\ub799\uc7ad \ubbf8\uc158 \ud68c\uace0.mdx",7999],a5b179f0:[()=>n.e(9761).then(n.bind(n,7971)),"@site/blog/2023/2023-03-30-GRASP.mdx?truncated=true",7971],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(8126),n.e(6048),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a85e626a:[()=>n.e(9092).then(n.t.bind(n,8458,19)),"~blog/default/tags-jdbc-4bd.json",8458],a896be03:[()=>n.e(2526).then(n.t.bind(n,4030,19)),"~blog/default/tags-woowahan-techcourse-page-6-429.json",4030],a9221bd5:[()=>n.e(5507).then(n.t.bind(n,319,19)),"~blog/default/tags-inno-db-59e-list.json",319],ab2128e5:[()=>n.e(7921).then(n.bind(n,5914)),"@site/blog/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815/2023-04-30-Jenkins\ub85c \ubc30\ud3ec \uc790\ub3d9\ud654 \uc124\uc815.mdx?truncated=true",5914],abb0816f:[()=>n.e(4174).then(n.t.bind(n,2969,19)),"~blog/default/tags-woowahan-techcourse-page-7-5bd-list.json",2969],abc83b7f:[()=>n.e(2215).then(n.t.bind(n,8412,19)),"~blog/default/tags-retrospective-page-2-e2b.json",8412],ac23d7ee:[()=>n.e(3213).then(n.t.bind(n,3943,19)),"~blog/default/tags-woowahan-techcourse-page-3-9a8-list.json",3943],ae1d6508:[()=>n.e(2181).then(n.t.bind(n,3486,19)),"~blog/default/tags-composite-240-list.json",3486],ae3384b2:[()=>n.e(2965).then(n.t.bind(n,5745,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],ae6a2dc6:[()=>n.e(7374).then(n.bind(n,8532)),"@site/blog/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604/2023-08-02-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \uad6c\ud604.mdx",8532],af81a133:[()=>n.e(7787).then(n.t.bind(n,3800,19)),"~blog/default/tags-teco-chat-d21.json",3800],b1d2ea98:[()=>n.e(8533).then(n.bind(n,9267)),"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx?truncated=true",9267],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2e443b6:[()=>n.e(2901).then(n.bind(n,591)),"@site/blog/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5/2023-05-24-\uc911\ubcf5\uacfc \uc6b0\ubc1c\uc801 \uc911\ubcf5.mdx",591],b393c858:[()=>n.e(9922).then(n.bind(n,7084)),"@site/blog/2023/2023-04-04-\ud14c\uc2a4\ud2b8 \ub300\uc5ed.mdx",7084],b474adfe:[()=>n.e(573).then(n.t.bind(n,5419,19)),"~blog/default/tags-image-page-2-cc3-list.json",5419],b5f3dcc5:[()=>n.e(7723).then(n.t.bind(n,3005,19)),"~blog/default/tags-retrospective-page-15-26b-list.json",3005],b73048db:[()=>n.e(5912).then(n.bind(n,8838)),"@site/blog/2023/2023-02-12-Parameterized Tests.mdx?truncated=true",8838],b7811d78:[()=>n.e(7008).then(n.bind(n,6111)),"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx",6111],b8de016f:[()=>n.e(7340).then(n.bind(n,5055)),"@site/blog/2023/2023-04-08-\uc0c1\uc790 \ubc16\uc5d0 \uc788\ub294 \uc0ac\ub78c.mdx?truncated=true",5055],b9bcab37:[()=>n.e(7688).then(n.t.bind(n,3632,19)),"~blog/default/tags-grasp-418.json",3632],bbc01ba0:[()=>n.e(3009).then(n.t.bind(n,2333,19)),"~blog/default/tags-retrospective-page-10-4a6.json",2333],bbceb8f1:[()=>n.e(653).then(n.t.bind(n,6529,19)),"~blog/default/tags-woowahan-techcourse-page-5-ac5-list.json",6529],bd2d06b5:[()=>n.e(9763).then(n.t.bind(n,3081,19)),"~blog/default/tags-retrospective-page-3-ee4.json",3081],bf933b37:[()=>n.e(3095).then(n.t.bind(n,2954,19)),"~blog/default/tags-my-sql-46a-list.json",2954],c037d168:[()=>n.e(6587).then(n.t.bind(n,1235,19)),"~blog/default/tags-transaction-ea3-list.json",1235],c0a61fca:[()=>n.e(344).then(n.bind(n,5086)),"@site/blog/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0/2023-05-12-\uc6f9 \uc7a5\ubc14\uad6c\ub2c8 \ubbf8\uc158 \ud68c\uace0.mdx",5086],c0cb7215:[()=>n.e(7966).then(n.t.bind(n,6109,19)),"~blog/default/tags-book-page-2-bc6-list.json",6109],c189d18f:[()=>n.e(4962).then(n.t.bind(n,3470,19)),"~docs/default/tag-docs-tags-etc-c52.json",3470],c29bedb9:[()=>n.e(9242).then(n.t.bind(n,4025,19)),"~blog/default/page-35-8fd.json",4025],c33ca104:[()=>n.e(5696).then(n.t.bind(n,8872,19)),"~docs/default/tag-docs-tags-pacakge-040.json",8872],c3ea66fe:[()=>n.e(6698).then(n.t.bind(n,3504,19)),"~blog/default/tags-isolation-79d.json",3504],c4f5d8e4:[()=>n.e(4195).then(n.bind(n,2841)),"@site/src/pages/index.js",2841],c55d205b:[()=>n.e(3438).then(n.bind(n,3859)),"@site/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4.mdx",3859],c573638f:[()=>n.e(964).then(n.t.bind(n,8866,19)),"~blog/default/tags-tags-c2b.json",8866],c6004f62:[()=>n.e(5892).then(n.t.bind(n,7567,19)),"~blog/default/tags-mock-330-list.json",7567],c60995f6:[()=>n.e(6199).then(n.t.bind(n,2474,19)),"~docs/default/tag-docs-tags-nginx-3b7.json",2474],c60ea0ff:[()=>n.e(3085).then(n.t.bind(n,4072,19)),"~blog/default/tags-teco-chat-page-2-d4f.json",4072],c7015929:[()=>n.e(4185).then(n.t.bind(n,910,19)),"~blog/default/tags-python-687.json",910],ccc49370:[()=>Promise.all([n.e(532),n.e(8126),n.e(6048),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],cf8e491a:[()=>n.e(5870).then(n.t.bind(n,9799,19)),"~blog/default/tags-awt-0e2.json",9799],d0277431:[()=>n.e(846).then(n.t.bind(n,4838,19)),"~blog/default/tags-dto-cb6-list.json",4838],d0840b01:[()=>n.e(8037).then(n.t.bind(n,317,19)),"~blog/default/tags-transaction-ea3.json",317],d09f7e4b:[()=>n.e(3098).then(n.t.bind(n,4057,19)),"~blog/default/tags-teco-chat-page-3-007-list.json",4057],d0e4cdf1:[()=>n.e(5465).then(n.t.bind(n,4020,19)),"~blog/default/page-7-3c3.json",4020],d126aabd:[()=>n.e(1675).then(n.t.bind(n,7220,19)),"~blog/default/tags-retrospective-page-4-3a3-list.json",7220],d1cef389:[()=>n.e(9310).then(n.t.bind(n,836,19)),"~blog/default/page-17-62c.json",836],d202e2c5:[()=>n.e(7175).then(n.t.bind(n,3395,19)),"~blog/default/tags-oop-03c-list.json",3395],d2770bf7:[()=>n.e(843).then(n.t.bind(n,1156,19)),"~blog/default/tags-woowahan-techcourse-page-11-6c9.json",1156],d2935d14:[()=>n.e(3259).then(n.t.bind(n,2158,19)),"~blog/default/tags-isolation-79d-list.json",2158],d297da14:[()=>Promise.all([n.e(532),n.e(7704)]).then(n.bind(n,4269)),"@site/blog/2023/2023-04-02-\ucee4\uc2a4\ud140 JdbcTemplate \ub9cc\ub4e4\uae30.mdx",4269],d368e73e:[()=>n.e(7954).then(n.t.bind(n,1965,19)),"~blog/default/tags-image-97d-list.json",1965],d3752f11:[()=>n.e(4819).then(n.bind(n,8185)),"@site/blog/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c/2023-07-31-\uacbd\ub85c \uc774\ubbf8\uc9c0 \uc0dd\uc131\ud558\uae30 - \ud30c\uc774\uc36c.mdx",8185],d40f51e1:[()=>n.e(9633).then(n.t.bind(n,9415,19)),"~blog/default/tags-jdbc-4bd-list.json",9415],d50fd269:[()=>n.e(100).then(n.t.bind(n,8132,19)),"~blog/default/page-31-308.json",8132],d5dfecc2:[()=>n.e(1677).then(n.t.bind(n,3335,19)),"~blog/default/tags-teco-chat-page-2-d4f-list.json",3335],d693e23c:[()=>n.e(6697).then(n.bind(n,5397)),"@site/blog/2023/2023-04-05-\ud2b8\ub79c\uc7ad\uc158\uacfc \uaca9\ub9ac\uc218\uc900.mdx",5397],d6a3d698:[()=>n.e(2890).then(n.t.bind(n,9477,19)),"~blog/default/tags-image-page-3-942.json",9477],d6c08822:[()=>n.e(2678).then(n.bind(n,2099)),"@site/blog/2023/2023-03-31-\uccb4\uc2a4 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",2099],d86f7a37:[()=>n.e(3392).then(n.bind(n,823)),"@site/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5.mdx",823],d88bdb28:[()=>n.e(9788).then(n.t.bind(n,9417,19)),"~blog/default/tags-retrospective-page-13-49c.json",9417],dab4c683:[()=>n.e(6058).then(n.t.bind(n,7315,19)),"~blog/default/tags-woowahan-techcourse-page-3-9a8.json",7315],db7928b3:[()=>n.e(5046).then(n.t.bind(n,1478,19)),"~blog/default/tags-intelli-j-2bf-list.json",1478],dcf70953:[()=>n.e(1761).then(n.t.bind(n,3769,19)),"/home/runner/work/greeng00se.github.io/greeng00se.github.io/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],dcfccecb:[()=>n.e(5841).then(n.bind(n,2789)),"@site/blog/2023/2023-05-02-\uc6f9 \uc790\ub3d9\ucc28 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",2789],ddf9e0bd:[()=>n.e(2542).then(n.t.bind(n,3274,19)),"~blog/default/tags-woowahan-techcourse-page-8-93a-list.json",3274],df203c0f:[()=>n.e(9924).then(n.bind(n,491)),"@theme/DocTagDocListPage",491],df862072:[()=>n.e(7474).then(n.t.bind(n,4827,19)),"~blog/default/tags-book-page-3-a93.json",4827],dfa84138:[()=>n.e(1434).then(n.t.bind(n,2483,19)),"~blog/default/tags-data-base-page-3-9db-list.json",2483],e073eb07:[()=>n.e(5819).then(n.t.bind(n,7743,19)),"~blog/default/tags-retrospective-page-11-e3c.json",7743],e0d68441:[()=>n.e(628).then(n.t.bind(n,5301,19)),"~blog/default/tags-retrospective-page-12-8cf-list.json",5301],e0e4666e:[()=>n.e(4665).then(n.t.bind(n,6482,19)),"~blog/default/tags-my-sql-46a.json",6482],e21c8cc4:[()=>n.e(6049).then(n.t.bind(n,8765,19)),"~blog/default/tags-retrospective-page-8-5ab.json",8765],e2de2dbb:[()=>n.e(6710).then(n.t.bind(n,7023,19)),"~blog/default/tags-java-page-5-b71.json",7023],e3a9c3a3:[()=>n.e(8855).then(n.bind(n,8729)),"@site/blog/2023/2023-01-01-\uae00, \uc6b0\ub9ac\ub3c4 \uc798 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.mdx?truncated=true",8729],e4ebfe18:[()=>n.e(9940).then(n.t.bind(n,7954,19)),"~blog/default/page-3-02e.json",7954],e5f297b0:[()=>n.e(4109).then(n.bind(n,5769)),"@site/blog/2023/2023-07-24-\uc790\ubc14 17, \uc2a4\ud504\ub9c1 6.0, \uc2a4\ud504\ub9c1 \ubd80\ud2b8 3.1.mdx?truncated=true",5769],e7d2a655:[()=>n.e(8652).then(n.t.bind(n,1501,19)),"~blog/default/tags-woowahan-techcourse-page-2-567-list.json",1501],e8d6e7ce:[()=>n.e(3912).then(n.t.bind(n,5245,19)),"~blog/default/tags-retrospective-page-6-594.json",5245],e9624b4f:[()=>n.e(4564).then(n.t.bind(n,1780,19)),"~blog/default/tags-retrospective-page-13-49c-list.json",1780],e9ff60ad:[()=>n.e(2530).then(n.t.bind(n,242,19)),"~blog/default/tags-pattern-b4e-list.json",242],ee00b37a:[()=>n.e(63).then(n.bind(n,2860)),"@site/blog/2023/2023-05-25-\uc9c0\ud558\ucca0 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",2860],ee92877e:[()=>n.e(8716).then(n.t.bind(n,1106,19)),"~blog/default/tags-retrospective-page-5-22d.json",1106],eec33099:[()=>n.e(4953).then(n.t.bind(n,133,19)),"~blog/default/page-40-397.json",133],ef5b2427:[()=>n.e(9606).then(n.t.bind(n,195,19)),"~blog/default/page-22-f33.json",195],f042b56c:[()=>n.e(8919).then(n.t.bind(n,7490,19)),"~blog/default/tags-teco-chat-d21-list.json",7490],f078e301:[()=>n.e(1926).then(n.t.bind(n,8385,19)),"~blog/default/tags-woowahan-techcourse-page-6-429-list.json",8385],f0978ee1:[()=>n.e(7740).then(n.t.bind(n,9366,19)),"~blog/default/tags-awt-page-2-eb4.json",9366],f105176d:[()=>n.e(5094).then(n.bind(n,861)),"@site/blog/2023/2023-01-07-\uac1d\uccb4\uc9c0\ud5a5\uc758 \uc0ac\uc2e4\uacfc \uc624\ud574.mdx?truncated=true",861],f156dfb9:[()=>n.e(5602).then(n.t.bind(n,3311,19)),"~blog/default/tags-time-471.json",3311],f1783c84:[()=>n.e(7465).then(n.bind(n,8719)),"@site/blog/2023/2023-01-08-JSR-310.mdx?truncated=true",8719],f20d36f2:[()=>n.e(7689).then(n.bind(n,8036)),"@site/blog/2023/2023-02-14-\uc790\ub3d9\ucc28 \uacbd\uc8fc \ubbf8\uc158 \ud68c\uace0.mdx",8036],f2b7d1a9:[()=>n.e(2382).then(n.bind(n,6030)),"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx?truncated=true",6030],f332d221:[()=>n.e(2717).then(n.t.bind(n,9371,19)),"~blog/default/page-10-857.json",9371],f3e308ad:[()=>n.e(6123).then(n.t.bind(n,6240,19)),"~blog/default/page-33-758.json",6240],f4c6e7e6:[()=>n.e(31).then(n.t.bind(n,7922,19)),"~docs/default/tag-docs-tags-book-8e4.json",7922],f4f49e13:[()=>n.e(6887).then(n.t.bind(n,6329,19)),"~blog/default/page-12-b6a.json",6329],f580a9d0:[()=>n.e(9887).then(n.t.bind(n,8989,19)),"~blog/default/tags-python-687-list.json",8989],f619e31e:[()=>n.e(5888).then(n.bind(n,5069)),"@site/blog/2023/2023-07-30-Mockito \uc774\uc6a9\ud574\uc11c static \uba54\uc11c\ub4dc \ubaa8\ud0b9\ud558\uae30.mdx",5069],f63a747b:[()=>n.e(5131).then(n.t.bind(n,1723,19)),"~blog/default/tags-woowahan-techcourse-page-7-5bd.json",1723],f75a8651:[()=>n.e(8882).then(n.t.bind(n,4633,19)),"~blog/default/page-8-8c2.json",4633],f8409a7e:[()=>n.e(3206).then(n.bind(n,9568)),"@site/docs/intro.mdx",9568],fbd57548:[()=>n.e(6837).then(n.t.bind(n,990,19)),"~blog/default/page-11-f65.json",990],fcb446a5:[()=>n.e(3440).then(n.bind(n,4425)),"@site/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815.md",4425],fd5d2408:[()=>n.e(3614).then(n.t.bind(n,4631,19)),"~blog/default/tags-time-471-list.json",4631],fd60e617:[()=>n.e(16).then(n.bind(n,844)),"@site/blog/2023/2023-02-26-\uc0ac\ub2e4\ub9ac \ud0c0\uae30 \ubbf8\uc158 \ud68c\uace0.mdx",844],fe273484:[()=>n.e(8355).then(n.t.bind(n,3034,19)),"~blog/default/tags-java-a6e-list.json",3034],fe8cce0a:[()=>n.e(955).then(n.t.bind(n,8535,19)),"~blog/default/tags-intelli-j-2bf.json",8535],fed8bc04:[()=>n.e(8110).then(n.t.bind(n,6375,19)),"~blog/default/tags-woowahan-techcourse-page-5-ac5.json",6375],ffb0fa11:[()=>n.e(7400).then(n.t.bind(n,8214,19)),"~blog/default/tags-book-page-3-a93-list.json",8214]};function c(e){let{error:t,retry:n,pastDelay:r}=e;return t?a.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},a.createElement("p",null,String(t)),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},"Retry"))):r?a.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},a.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},a.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"8"},a.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return a.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},a.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],g=[],m=(0,u.Z)(o);return Object.entries(m).forEach((e=>{let[t,n]=e;const a=s[n];a&&(f[t]=a[0],p.push(a[1]),g.push(a[2]))})),i().Map({loading:c,loader:f,modules:p,webpack:()=>g,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,a]=t;const r=a.default;if(!r)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof r&&"function"!=typeof r||Object.keys(a).filter((e=>"default"!==e)).forEach((e=>{r[e]=a[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=r}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,a.createElement(d.z,{value:s},a.createElement(l,(0,r.Z)({},i,n)))}})}const p=[{path:"/1",component:f("/1","fe7"),exact:!0},{path:"/10",component:f("/10","440"),exact:!0},{path:"/11",component:f("/11","74a"),exact:!0},{path:"/12",component:f("/12","0c3"),exact:!0},{path:"/13",component:f("/13","bf5"),exact:!0},{path:"/14",component:f("/14","f02"),exact:!0},{path:"/15",component:f("/15","e52"),exact:!0},{path:"/16",component:f("/16","b3b"),exact:!0},{path:"/17",component:f("/17","cc2"),exact:!0},{path:"/18",component:f("/18","a45"),exact:!0},{path:"/19",component:f("/19","e8b"),exact:!0},{path:"/2",component:f("/2","4be"),exact:!0},{path:"/20",component:f("/20","2a7"),exact:!0},{path:"/21",component:f("/21","794"),exact:!0},{path:"/22",component:f("/22","8d6"),exact:!0},{path:"/23",component:f("/23","8a8"),exact:!0},{path:"/24",component:f("/24","312"),exact:!0},{path:"/25",component:f("/25","922"),exact:!0},{path:"/26",component:f("/26","5fd"),exact:!0},{path:"/27",component:f("/27","a34"),exact:!0},{path:"/28",component:f("/28","203"),exact:!0},{path:"/29",component:f("/29","784"),exact:!0},{path:"/3",component:f("/3","cf7"),exact:!0},{path:"/30",component:f("/30","9f7"),exact:!0},{path:"/31",component:f("/31","20a"),exact:!0},{path:"/32",component:f("/32","fa9"),exact:!0},{path:"/33",component:f("/33","e77"),exact:!0},{path:"/34",component:f("/34","58f"),exact:!0},{path:"/35",component:f("/35","481"),exact:!0},{path:"/36",component:f("/36","827"),exact:!0},{path:"/37",component:f("/37","559"),exact:!0},{path:"/38",component:f("/38","068"),exact:!0},{path:"/39",component:f("/39","820"),exact:!0},{path:"/4",component:f("/4","dd9"),exact:!0},{path:"/40",component:f("/40","b09"),exact:!0},{path:"/5",component:f("/5","b35"),exact:!0},{path:"/6",component:f("/6","5d9"),exact:!0},{path:"/7",component:f("/7","374"),exact:!0},{path:"/8",component:f("/8","274"),exact:!0},{path:"/9",component:f("/9","2e9"),exact:!0},{path:"/blog",component:f("/blog","3d8"),exact:!0},{path:"/docs/tags",component:f("/docs/tags","820"),exact:!0},{path:"/docs/tags/book",component:f("/docs/tags/book","c20"),exact:!0},{path:"/docs/tags/etc",component:f("/docs/tags/etc","338"),exact:!0},{path:"/docs/tags/jpa",component:f("/docs/tags/jpa","f95"),exact:!0},{path:"/docs/tags/monitoring",component:f("/docs/tags/monitoring","50f"),exact:!0},{path:"/docs/tags/nginx",component:f("/docs/tags/nginx","ecc"),exact:!0},{path:"/docs/tags/pacakge",component:f("/docs/tags/pacakge","c10"),exact:!0},{path:"/docs/tags/postmortem",component:f("/docs/tags/postmortem","4b0"),exact:!0},{path:"/docs/tags/test",component:f("/docs/tags/test","b58"),exact:!0},{path:"/page/10",component:f("/page/10","ce5"),exact:!0},{path:"/page/11",component:f("/page/11","eec"),exact:!0},{path:"/page/12",component:f("/page/12","77a"),exact:!0},{path:"/page/13",component:f("/page/13","cae"),exact:!0},{path:"/page/14",component:f("/page/14","ff1"),exact:!0},{path:"/page/15",component:f("/page/15","764"),exact:!0},{path:"/page/16",component:f("/page/16","cdf"),exact:!0},{path:"/page/17",component:f("/page/17","33e"),exact:!0},{path:"/page/18",component:f("/page/18","102"),exact:!0},{path:"/page/19",component:f("/page/19","1cc"),exact:!0},{path:"/page/2",component:f("/page/2","033"),exact:!0},{path:"/page/20",component:f("/page/20","c45"),exact:!0},{path:"/page/21",component:f("/page/21","cbd"),exact:!0},{path:"/page/22",component:f("/page/22","072"),exact:!0},{path:"/page/23",component:f("/page/23","609"),exact:!0},{path:"/page/24",component:f("/page/24","6df"),exact:!0},{path:"/page/25",component:f("/page/25","009"),exact:!0},{path:"/page/26",component:f("/page/26","f89"),exact:!0},{path:"/page/27",component:f("/page/27","a5b"),exact:!0},{path:"/page/28",component:f("/page/28","d28"),exact:!0},{path:"/page/29",component:f("/page/29","658"),exact:!0},{path:"/page/3",component:f("/page/3","749"),exact:!0},{path:"/page/30",component:f("/page/30","943"),exact:!0},{path:"/page/31",component:f("/page/31","822"),exact:!0},{path:"/page/32",component:f("/page/32","d7b"),exact:!0},{path:"/page/33",component:f("/page/33","0eb"),exact:!0},{path:"/page/34",component:f("/page/34","5b3"),exact:!0},{path:"/page/35",component:f("/page/35","837"),exact:!0},{path:"/page/36",component:f("/page/36","d24"),exact:!0},{path:"/page/37",component:f("/page/37","143"),exact:!0},{path:"/page/38",component:f("/page/38","7b8"),exact:!0},{path:"/page/39",component:f("/page/39","771"),exact:!0},{path:"/page/4",component:f("/page/4","b12"),exact:!0},{path:"/page/40",component:f("/page/40","b7c"),exact:!0},{path:"/page/5",component:f("/page/5","527"),exact:!0},{path:"/page/6",component:f("/page/6","ee0"),exact:!0},{path:"/page/7",component:f("/page/7","ef0"),exact:!0},{path:"/page/8",component:f("/page/8","cce"),exact:!0},{path:"/page/9",component:f("/page/9","56d"),exact:!0},{path:"/search",component:f("/search","c1e"),exact:!0},{path:"/tags",component:f("/tags","4bf"),exact:!0},{path:"/tags/async",component:f("/tags/async","1a2"),exact:!0},{path:"/tags/awt",component:f("/tags/awt","f0a"),exact:!0},{path:"/tags/awt/page/2",component:f("/tags/awt/page/2","284"),exact:!0},{path:"/tags/book",component:f("/tags/book","909"),exact:!0},{path:"/tags/book/page/2",component:f("/tags/book/page/2","989"),exact:!0},{path:"/tags/book/page/3",component:f("/tags/book/page/3","a75"),exact:!0},{path:"/tags/class",component:f("/tags/class","3ca"),exact:!0},{path:"/tags/composite",component:f("/tags/composite","737"),exact:!0},{path:"/tags/data-base",component:f("/tags/data-base","ab7"),exact:!0},{path:"/tags/data-base/page/2",component:f("/tags/data-base/page/2","f0a"),exact:!0},{path:"/tags/data-base/page/3",component:f("/tags/data-base/page/3","f63"),exact:!0},{path:"/tags/documentation",component:f("/tags/documentation","989"),exact:!0},{path:"/tags/dto",component:f("/tags/dto","a68"),exact:!0},{path:"/tags/elastic-beanstalk",component:f("/tags/elastic-beanstalk","a4b"),exact:!0},{path:"/tags/event",component:f("/tags/event","6b5"),exact:!0},{path:"/tags/grasp",component:f("/tags/grasp","efe"),exact:!0},{path:"/tags/image",component:f("/tags/image","7cc"),exact:!0},{path:"/tags/image/page/2",component:f("/tags/image/page/2","3e2"),exact:!0},{path:"/tags/image/page/3",component:f("/tags/image/page/3","bcb"),exact:!0},{path:"/tags/inno-db",component:f("/tags/inno-db","ea2"),exact:!0},{path:"/tags/intelli-j",component:f("/tags/intelli-j","0f1"),exact:!0},{path:"/tags/isolation",component:f("/tags/isolation","869"),exact:!0},{path:"/tags/java",component:f("/tags/java","75d"),exact:!0},{path:"/tags/java/page/2",component:f("/tags/java/page/2","e04"),exact:!0},{path:"/tags/java/page/3",component:f("/tags/java/page/3","fb9"),exact:!0},{path:"/tags/java/page/4",component:f("/tags/java/page/4","de0"),exact:!0},{path:"/tags/java/page/5",component:f("/tags/java/page/5","6c2"),exact:!0},{path:"/tags/jdbc",component:f("/tags/jdbc","c84"),exact:!0},{path:"/tags/jenkins",component:f("/tags/jenkins","9e9"),exact:!0},{path:"/tags/kotlin",component:f("/tags/kotlin","27e"),exact:!0},{path:"/tags/lock",component:f("/tags/lock","092"),exact:!0},{path:"/tags/lock/page/2",component:f("/tags/lock/page/2","cc1"),exact:!0},{path:"/tags/mock",component:f("/tags/mock","31b"),exact:!0},{path:"/tags/mockito",component:f("/tags/mockito","60c"),exact:!0},{path:"/tags/my-sql",component:f("/tags/my-sql","c5a"),exact:!0},{path:"/tags/oop",component:f("/tags/oop","544"),exact:!0},{path:"/tags/pattern",component:f("/tags/pattern","433"),exact:!0},{path:"/tags/python",component:f("/tags/python","5b4"),exact:!0},{path:"/tags/retrospective",component:f("/tags/retrospective","5d6"),exact:!0},{path:"/tags/retrospective/page/10",component:f("/tags/retrospective/page/10","581"),exact:!0},{path:"/tags/retrospective/page/11",component:f("/tags/retrospective/page/11","be6"),exact:!0},{path:"/tags/retrospective/page/12",component:f("/tags/retrospective/page/12","2c3"),exact:!0},{path:"/tags/retrospective/page/13",component:f("/tags/retrospective/page/13","5eb"),exact:!0},{path:"/tags/retrospective/page/14",component:f("/tags/retrospective/page/14","d3f"),exact:!0},{path:"/tags/retrospective/page/15",component:f("/tags/retrospective/page/15","4e0"),exact:!0},{path:"/tags/retrospective/page/2",component:f("/tags/retrospective/page/2","120"),exact:!0},{path:"/tags/retrospective/page/3",component:f("/tags/retrospective/page/3","ac5"),exact:!0},{path:"/tags/retrospective/page/4",component:f("/tags/retrospective/page/4","ae9"),exact:!0},{path:"/tags/retrospective/page/5",component:f("/tags/retrospective/page/5","57b"),exact:!0},{path:"/tags/retrospective/page/6",component:f("/tags/retrospective/page/6","080"),exact:!0},{path:"/tags/retrospective/page/7",component:f("/tags/retrospective/page/7","a0b"),exact:!0},{path:"/tags/retrospective/page/8",component:f("/tags/retrospective/page/8","8f0"),exact:!0},{path:"/tags/retrospective/page/9",component:f("/tags/retrospective/page/9","e54"),exact:!0},{path:"/tags/spring",component:f("/tags/spring","5ac"),exact:!0},{path:"/tags/spring-boot",component:f("/tags/spring-boot","9b9"),exact:!0},{path:"/tags/static",component:f("/tags/static","0f7"),exact:!0},{path:"/tags/teco-chat",component:f("/tags/teco-chat","789"),exact:!0},{path:"/tags/teco-chat/page/2",component:f("/tags/teco-chat/page/2","bb6"),exact:!0},{path:"/tags/teco-chat/page/3",component:f("/tags/teco-chat/page/3","c60"),exact:!0},{path:"/tags/test",component:f("/tags/test","900"),exact:!0},{path:"/tags/time",component:f("/tags/time","667"),exact:!0},{path:"/tags/transaction",component:f("/tags/transaction","a90"),exact:!0},{path:"/tags/web-socket",component:f("/tags/web-socket","852"),exact:!0},{path:"/tags/woowahan-techcourse",component:f("/tags/woowahan-techcourse","83c"),exact:!0},{path:"/tags/woowahan-techcourse/page/10",component:f("/tags/woowahan-techcourse/page/10","d7f"),exact:!0},{path:"/tags/woowahan-techcourse/page/11",component:f("/tags/woowahan-techcourse/page/11","6ea"),exact:!0},{path:"/tags/woowahan-techcourse/page/2",component:f("/tags/woowahan-techcourse/page/2","ae2"),exact:!0},{path:"/tags/woowahan-techcourse/page/3",component:f("/tags/woowahan-techcourse/page/3","a3b"),exact:!0},{path:"/tags/woowahan-techcourse/page/4",component:f("/tags/woowahan-techcourse/page/4","2ef"),exact:!0},{path:"/tags/woowahan-techcourse/page/5",component:f("/tags/woowahan-techcourse/page/5","06b"),exact:!0},{path:"/tags/woowahan-techcourse/page/6",component:f("/tags/woowahan-techcourse/page/6","046"),exact:!0},{path:"/tags/woowahan-techcourse/page/7",component:f("/tags/woowahan-techcourse/page/7","7e9"),exact:!0},{path:"/tags/woowahan-techcourse/page/8",component:f("/tags/woowahan-techcourse/page/8","c0b"),exact:!0},{path:"/tags/woowahan-techcourse/page/9",component:f("/tags/woowahan-techcourse/page/9","d99"),exact:!0},{path:"/docs",component:f("/docs","71c"),routes:[{path:"/docs",component:f("/docs","818"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551",component:f("/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","8a6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4",component:f("/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","594"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5",component:f("/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","90a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30",component:f("/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30","ec3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30",component:f("/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","1b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815",component:f("/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815","c04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815",component:f("/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815","9d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131",component:f("/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","94d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c",component:f("/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","644"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0",component:f("/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0","f6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8",component:f("/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","bef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59",component:f("/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","06a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd",component:f("/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","c2c"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/",component:f("/","3ce"),exact:!0},{path:"/",component:f("/","43c"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,t:()=>o});var a=n(7294);const r=a.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{o(!0)}),[]),a.createElement(r.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var a=n(7294),r=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(6657),n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790);function f(e){let{children:t}=e;return a.createElement(a.Fragment,null,t)}var p=n(7462),g=n(5742),m=n(2263),h=n(4996),b=n(6668),v=n(833),y=n(4711),_=n(9727),w=n(3320),k=n(197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,m.Z)(),n=(0,y.l)();return a.createElement(g.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:r}]=e;return a.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:r})})),a.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),r=function(){const{siteConfig:{url:e}}=(0,m.Z)(),{pathname:t}=(0,u.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:r;return a.createElement(g.Z,null,a.createElement("meta",{property:"og:url",content:o}),a.createElement("link",{rel:"canonical",href:o}))}function S(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return a.createElement(a.Fragment,null,a.createElement(g.Z,null,a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("body",{className:_.h})),n&&a.createElement(v.d,{image:n}),a.createElement(x,null),a.createElement(E,null),a.createElement(k.Z,{tag:w.HX,locale:e}),a.createElement(g.Z,null,t.map(((e,t)=>a.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function C(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(8934),L=n(8940);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];const r=s.map((t=>(t.default?.[e]??t[e])?.(...n)));return()=>r.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,a.useLayoutEffect)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const a=t.pathname===n.pathname,r=t.hash===n.hash,o=t.search===n.search;if(a&&r&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1));document.getElementById(e)?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends a.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return a.createElement(N,{previousLocation:this.previousLocation,location:t},a.createElement(u.AW,{location:t,render:()=>e}))}}const I=R,M="docusaurus-base-url-issue-banner-container",j="docusaurus-base-url-issue-banner-suggestion-container",D="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${D}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${D}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseurl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${j}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${j}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function F(){const{siteConfig:{baseUrl:e}}=(0,m.Z)();return(0,a.useLayoutEffect)((()=>{window[D]=!1}),[]),a.createElement(a.Fragment,null,!l.Z.canUseDOM&&a.createElement(g.Z,null,a.createElement("script",null,B(e))),a.createElement("div",{id:M}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?a.createElement(F,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,m.Z)(),i=(0,h.Z)(e),{htmlLang:l,direction:s}=o[r];return a.createElement(g.Z,null,a.createElement("html",{lang:l,dir:s}),a.createElement("title",null,t),a.createElement("meta",{property:"og:title",content:t}),a.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&a.createElement("link",{rel:"icon",href:i}))}var z=n(4763);function Z(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return a.createElement(z.Z,null,a.createElement(L.M,null,a.createElement(A.t,null,a.createElement(f,null,a.createElement(U,null),a.createElement(S,null),a.createElement($,null),a.createElement(I,{location:C(t)},e)))))}var H=n(6887);const V=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();(document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode)?.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const a=new XMLHttpRequest;a.open("GET",e,!0),a.withCredentials=!0,a.onload=()=>{200===a.status?t():n()},a.send(null)}))};var W=n(9670);const G=new Set,q=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Y={prefetch(e){if(!(e=>!K()&&!q.has(e)&&!G.has(e))(e))return!1;G.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(H).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,W.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?V(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!q.has(e))(e)&&(q.add(e),O(e))},Q=Object.freeze(Y);if(l.Z.canUseDOM){window.docusaurus=Q;const e=r.hydrate;O(window.location.pathname).then((()=>{e(a.createElement(i.B6,null,a.createElement(o.VK,null,a.createElement(Z,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var a=n(7294),r=n(6809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":"G-17TREGCW4H","anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"intro","docs":[{"id":"intro","path":"/docs/","sidebar":"tutorialSidebar"},{"id":"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","path":"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","sidebar":"tutorialSidebar"},{"id":"Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","path":"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4","sidebar":"tutorialSidebar"},{"id":"Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","path":"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5","sidebar":"tutorialSidebar"},{"id":"\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30","path":"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30","sidebar":"tutorialSidebar"},{"id":"\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","path":"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30","sidebar":"tutorialSidebar"},{"id":"\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815","path":"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815","sidebar":"tutorialSidebar"},{"id":"\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815","path":"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815","sidebar":"tutorialSidebar"},{"id":"\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","path":"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131","sidebar":"tutorialSidebar"},{"id":"\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","path":"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c","sidebar":"tutorialSidebar"},{"id":"\uc124\uacc4/\ud328\ud0a4\uc9c0","path":"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0","sidebar":"tutorialSidebar"},{"id":"\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","path":"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8","sidebar":"tutorialSidebar"},{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","path":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59","sidebar":"tutorialSidebar"},{"id":"\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","path":"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551","label":"JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"ko","locales":["ko"],"path":"i18n","currentLocale":"ko","localeConfigs":{"ko":{"label":"\ud55c\uad6d\uc5b4","direction":"ltr","htmlLang":"ko","calendar":"gregory","path":"ko"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.3.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.3.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.3.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.3.0"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.3.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.3.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.3.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.3.0"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.3.0"}}}'),c={siteConfig:r.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=a.createContext(c);function d(e){let{children:t}=e;return a.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(7294),r=n(412),o=n(5742),i=n(4774);function l(e){let{error:t,tryAgain:n}=e;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},a.createElement("h1",null,"This page crashed."),a.createElement("p",null,t.message),a.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return a.createElement(u,{fallback:()=>a.createElement(l,{error:t,tryAgain:n})},a.createElement(o.Z,null,a.createElement("title",null,"Page Error")),a.createElement(i.Z,null,a.createElement(l,{error:t,tryAgain:n})))}const c=e=>a.createElement(s,e);class u extends a.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){r.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??c)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const a="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,r={canUseDOM:a,canUseEventListeners:a&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:a&&"IntersectionObserver"in window,canUseViewport:a&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(7294),r=n(405);function o(e){return a.createElement(r.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(7462),r=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),c=n(412);const u=r.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:_}}=(0,l.Z)(),{withBaseUrl:w}=(0,d.C)(),k=(0,r.useContext)(u),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const x=f||p;const S=(0,s.Z)(x),T=x?.replace("pathname://","");let C=void 0!==T?(A=T,b&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;C&&S&&(C=(0,i.applyTrailingSlash)(C,{trailingSlash:y,baseUrl:_}));const L=(0,r.useRef)(!1),P=n?o.OL:o.rU,N=c.Z.canUseIntersectionObserver,O=(0,r.useRef)(),R=()=>{L.current||null==C||(window.docusaurus.preload(C),L.current=!0)};(0,r.useEffect)((()=>(!N&&S&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&O.current&&O.current.disconnect()})),[O,C,N,S]);const I=C?.startsWith("#")??!1,M=!C||!S||I;return M||h||k.collectLink(C),M?r.createElement("a",(0,a.Z)({ref:E,href:C},x&&!S&&{target:"_blank",rel:"noopener noreferrer"},v)):r.createElement(P,(0,a.Z)({},v,{onMouseEnter:R,onTouchStart:R,innerRef:e=>{E.current=e,N&&e&&S&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),O.current.observe(e))},to:C},n&&{isActive:m,activeClassName:g}))}const p=r.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var a=n(7294);function r(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,a.isValidElement)(e)))?n.map(((e,t)=>(0,a.isValidElement)(e)?a.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:a}=e;return r(i({message:n,id:a}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const l=i({message:t,id:n});return a.createElement(a.Fragment,null,r(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>a});const a="default"},3919:(e,t,n)=>{"use strict";function a(e){return/^(?:\w*:|\/\/)/.test(e)}function r(e){return void 0!==e&&!a(e)}n.d(t,{Z:()=>r,b:()=>a})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var a=n(7294),r=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)(),n=(0,a.useCallback)(((n,a)=>function(e,t,n,a){let{forcePrependBaseUrl:r=!1,absolute:i=!1}=void 0===a?{}:a;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,a)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(7294),r=n(8940);function o(){return(0,a.useContext)(r._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(7294),r=n(8934);function o(){return(0,a.useContext)(r._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[r,o]=n;const i=a?`${a}.${r}`:r;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,z:()=>o});var a=n(7294);const r=a.createContext(null);function o(e){let{children:t,value:n}=e;const o=a.useContext(r),i=(0,a.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const a={...t.data,...n?.data};return{plugin:t.plugin,data:a}}({parent:o,value:n})),[o,n]);return a.createElement(r.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>g,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>h,gB:()=>m});var a=n(6550),r=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,a.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),r=n?.docs.find((e=>!!(0,a.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:r,alternateDocVersions:r?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((a=>{a.id===t&&(n[e.name]=a)}))})),n}(r.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const a=i(e)?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,a.TH)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,a.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function g(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,a.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function m(e){return f(e).versions}function h(e){const t=f(e);return l(t)}function b(e){const t=f(e),{pathname:n}=(0,a.TH)();return c(t,n)}function v(e){const t=f(e),{pathname:n}=(0,a.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});const a={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var a=n(4865),r=n.n(a);r().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{r().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){r().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var a=n(7410),r=n(6809);!function(e){const{themeConfig:{prism:t}}=r.default,{additionalLanguages:a}=t;globalThis.Prism=e,a.forEach((e=>{n(2811)(`./prism-${e}`)})),delete globalThis.Prism}(a.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(7294);const r="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return a.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r},a.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},4774:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ct});var a=n(7294),r=n(6010),o=n(4763),i=n(833),l=n(7462),s=n(6550),c=n(5999),u=n(5936);const d="docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,a.useRef)(null),{action:t}=(0,s.k6)(),n=(0,a.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.S)((n=>{let{location:a}=n;e.current&&!a.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=p();return a.createElement("div",{ref:n,role:"region","aria-label":g},a.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:r}),t))}var h=n(5281),b=n(9727);const v="skipToContent_fXgn";function y(){return a.createElement(m,{className:v})}var _=n(6668),w=n(9689);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return a.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),a.createElement("g",{stroke:r,strokeWidth:o},a.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const E="closeButton_CVFx";function x(e){return a.createElement("button",(0,l.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,r.Z)("clean-btn close",E,e.className)}),a.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const S="content_knG7";function T(e){const{announcementBar:t}=(0,_.L)(),{content:n}=t;return a.createElement("div",(0,l.Z)({},e,{className:(0,r.Z)(S,e.className),dangerouslySetInnerHTML:{__html:n}}))}const C="announcementBar_mb4j",A="announcementBarPlaceholder_vyr4",L="announcementBarClose_gvF7",P="announcementBarContent_xLdY";function N(){const{announcementBar:e}=(0,_.L)(),{isActive:t,close:n}=(0,w.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:i}=e;return a.createElement("div",{className:C,style:{backgroundColor:r,color:o},role:"banner"},i&&a.createElement("div",{className:A}),a.createElement(T,{className:P}),i&&a.createElement(x,{onClick:n,className:L}))}var O=n(3163),R=n(2466);var I=n(902),M=n(3102);const j=a.createContext(null);function D(e){let{children:t}=e;const n=function(){const e=(0,O.e)(),t=(0,M.HY)(),[n,r]=(0,a.useState)(!1),o=null!==t.component,i=(0,I.D9)(o);return(0,a.useEffect)((()=>{o&&!i&&r(!0)}),[o,i]),(0,a.useEffect)((()=>{o?e.shown||r(!0):r(!1)}),[e.shown,o]),(0,a.useMemo)((()=>[n,r]),[n])}();return a.createElement(j.Provider,{value:n},t)}function B(e){if(e.component){const t=e.component;return a.createElement(t,e.props)}}function F(){const e=(0,a.useContext)(j);if(!e)throw new I.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,r=(0,a.useCallback)((()=>n(!1)),[n]),o=(0,M.HY)();return(0,a.useMemo)((()=>({shown:t,hide:r,content:B(o)})),[r,o,t])}function $(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=F();return a.createElement("div",{className:"navbar-sidebar"},t,a.createElement("div",{className:(0,r.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},a.createElement("div",{className:"navbar-sidebar__item menu"},n),a.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var U=n(2949),z=n(2389);function Z(e){return a.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function H(e){return a.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const V={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function W(e){let{className:t,value:n,onChange:o}=e;const i=(0,z.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return a.createElement("div",{className:(0,r.Z)(V.toggle,t)},a.createElement("button",{className:(0,r.Z)("clean-btn",V.toggleButton,!i&&V.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},a.createElement(Z,{className:(0,r.Z)(V.toggleIcon,V.lightToggleIcon)}),a.createElement(H,{className:(0,r.Z)(V.toggleIcon,V.darkToggleIcon)})))}const G=a.memo(W);function q(e){let{className:t}=e;const n=(0,_.L)().colorMode.disableSwitch,{colorMode:r,setColorMode:o}=(0,U.I)();return n?null:a.createElement(G,{className:t,value:r,onChange:o})}var K=n(1327);function Y(){return a.createElement(K.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,O.e)();return a.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},a.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function X(){return a.createElement("div",{className:"navbar-sidebar__brand"},a.createElement(Y,null),a.createElement(q,{className:"margin-right--md"}),a.createElement(Q,null))}var J=n(9960),ee=n(4996),te=n(3919),ne=n(8022),ae=n(9471);function re(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:i,html:s,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const f=(0,ee.Z)(r),p=(0,ee.Z)(t),g=(0,ee.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,te.Z)(o),h=s?{dangerouslySetInnerHTML:{__html:s}}:{children:a.createElement(a.Fragment,null,i,m&&a.createElement(ae.Z,c&&{width:12,height:12}))};return o?a.createElement(J.Z,(0,l.Z)({href:u?g:o},d,h)):a.createElement(J.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ne.F)(n,t.pathname):t.pathname.startsWith(p)},d,h))}function oe(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=a.createElement(re,(0,l.Z)({className:(0,r.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?a.createElement("li",null,i):i}function ie(e){let{className:t,isDropdownItem:n,...o}=e;return a.createElement("li",{className:"menu__list-item"},a.createElement(re,(0,l.Z)({className:(0,r.Z)("menu__link",t)},o)))}function le(e){let{mobile:t=!1,position:n,...r}=e;const o=t?ie:oe;return a.createElement(o,(0,l.Z)({},r,{activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var se=n(6043),ce=n(8596),ue=n(2263);function de(e,t){return e.some((e=>function(e,t){return!!(0,ce.Mg)(e.to,t)||!!(0,ne.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function fe(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const c=(0,a.useRef)(null),[u,d]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[c]),a.createElement("div",{ref:c,className:(0,r.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},a.createElement(re,(0,l.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,r.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),s.children??s.label),a.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>a.createElement(Ve,(0,l.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=c.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function pe(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,ue.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=de(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,se.u)({initialState:()=>!d});return(0,a.useEffect)((()=>{d&&g(!d)}),[u,d,g]),a.createElement("li",{className:(0,r.Z)("menu__list-item",{"menu__list-item--collapsed":f})},a.createElement(re,(0,l.Z)({role:"button",className:(0,r.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),p()}}),c.children??c.label),a.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>a.createElement(Ve,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function ge(e){let{mobile:t=!1,...n}=e;const r=t?pe:fe;return a.createElement(r,n)}var me=n(4711);function he(e){let{width:t=20,height:n=20,...r}=e;return a.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},r),a.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const be="iconLanguage_nlXk";function ve(){return a.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},a.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ye=n(830),_e=["translations"];function we(){return we=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},we.apply(this,arguments)}function ke(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var a,r,o=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(a=n.next()).done)&&(o.push(a.value),!t||o.length!==t);i=!0);}catch(s){l=!0,r=s}finally{try{i||null==n.return||n.return()}finally{if(l)throw r}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Ee(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ee(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n<t;n++)a[n]=e[n];return a}function xe(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var Se="Ctrl";var Te=a.forwardRef((function(e,t){var n=e.translations,r=void 0===n?{}:n,o=xe(e,_e),i=r.buttonText,l=void 0===i?"Search":i,s=r.buttonAriaLabel,c=void 0===s?"Search":s,u=ke((0,a.useState)(null),2),d=u[0],f=u[1];return(0,a.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Se))}),[]),a.createElement("button",we({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),a.createElement("span",{className:"DocSearch-Button-Container"},a.createElement(ye.W,null),a.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),a.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&a.createElement(a.Fragment,null,a.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?a.createElement(ve,null):d),a.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Ce=n(5742),Ae=n(6177),Le=n(239),Pe=n(3320);var Ne=n(3935);const Oe={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Re=null;function Ie(e){let{hit:t,children:n}=e;return a.createElement(J.Z,{to:t.url},n)}function Me(e){let{state:t,onClose:n}=e;const{generateSearchPageLink:r}=(0,Ae.O)();return a.createElement(J.Z,{to:r(t.query),onClick:n},a.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function je(e){let{contextualSearch:t,externalUrlRegex:r,...o}=e;const{siteMetadata:i}=(0,ue.Z)(),c=(0,Le.l)(),u=function(){const{locale:e,tags:t}=(0,Pe._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,p={...o.searchParameters,facetFilters:f},g=(0,s.k6)(),m=(0,a.useRef)(null),h=(0,a.useRef)(null),[b,v]=(0,a.useState)(!1),[y,_]=(0,a.useState)(void 0),w=(0,a.useCallback)((()=>Re?Promise.resolve():Promise.all([n.e(6780).then(n.bind(n,6780)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Re=t}))),[]),k=(0,a.useCallback)((()=>{w().then((()=>{m.current=document.createElement("div"),document.body.insertBefore(m.current,document.body.firstChild),v(!0)}))}),[w,v]),E=(0,a.useCallback)((()=>{v(!1),m.current?.remove()}),[v]),x=(0,a.useCallback)((e=>{w().then((()=>{v(!0),_(e.key)}))}),[w,v,_]),S=(0,a.useRef)({navigate(e){let{itemUrl:t}=e;(0,ne.F)(r,t)?window.location.href=t:g.push(t)}}).current,T=(0,a.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:c(e.url)}))))).current,C=(0,a.useMemo)((()=>e=>a.createElement(Me,(0,l.Z)({},e,{onClose:E}))),[E]),A=(0,a.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,r=e.onClose,o=e.onInput,i=e.searchButtonRef;a.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?r():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,r,o,i])}({isOpen:b,onOpen:k,onClose:E,onInput:x,searchButtonRef:h}),a.createElement(a.Fragment,null,a.createElement(Ce.Z,null,a.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),a.createElement(Te,{onTouchStart:w,onFocus:w,onMouseOver:w,onClick:k,ref:h,translations:Oe.button}),b&&Re&&m.current&&(0,Ne.createPortal)(a.createElement(Re,(0,l.Z)({onClose:E,initialScrollY:window.scrollY,initialQuery:y,navigator:S,transformItems:T,hitComponent:Ie,transformSearchClient:A},o.searchPagePath&&{resultsFooterComponent:C},o,{searchParameters:p,placeholder:Oe.placeholder,translations:Oe.modal})),m.current))}function De(){const{siteConfig:e}=(0,ue.Z)();return a.createElement(je,e.themeConfig.algolia)}const Be="searchBox_ZlJk";function Fe(e){let{children:t,className:n}=e;return a.createElement("div",{className:(0,r.Z)(n,Be)},t)}var $e=n(143),Ue=n(3438);var ze=n(373);const Ze=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:le,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,ue.Z)(),f=(0,me.l)(),{search:p,hash:g}=(0,s.TH)(),m=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return a.createElement(ge,(0,l.Z)({},o,{mobile:t,label:a.createElement(a.Fragment,null,a.createElement(he,{className:be}),h),items:m}))},search:function(e){let{mobile:t,className:n}=e;return t?null:a.createElement(Fe,{className:n},a.createElement(De,null))},dropdown:ge,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return a.createElement(l,{className:(0,r.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:i}=(0,$e.Iw)(r),s=(0,Ue.vY)(t,r);return null===s?null:a.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:i}=(0,$e.Iw)(r),s=(0,Ue.oz)(t,r).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return a.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const i=(0,Ue.lO)(r)[0],s=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return a.createElement(le,(0,l.Z)({},o,{label:s,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,$e.Iw)(n),g=(0,$e.gB)(n),{savePreferredVersionName:m}=(0,ze.J)(n),h=[...o,...g.map((e=>{const t=p.alternateDocVersions[e.name]??Ze(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...i],b=(0,Ue.lO)(n)[0],v=t&&h.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:Ze(b).path;return h.length<=1?a.createElement(le,(0,l.Z)({},u,{mobile:t,label:v,to:y,isActive:r?()=>!1:void 0})):a.createElement(ge,(0,l.Z)({},u,{mobile:t,label:v,to:y,items:h,isActive:r?()=>!1:void 0}))}};function Ve(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return a.createElement(o,n)}function We(){const e=(0,O.e)(),t=(0,_.L)().navbar.items;return a.createElement("ul",{className:"menu__list"},t.map(((t,n)=>a.createElement(Ve,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ge(e){return a.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),a.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function qe(){const e=0===(0,_.L)().navbar.items.length,t=F();return a.createElement(a.Fragment,null,!e&&a.createElement(Ge,{onClick:()=>t.hide()}),t.content)}function Ke(){const e=(0,O.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,a.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?a.createElement($,{header:a.createElement(X,null),primaryMenu:a.createElement(We,null),secondaryMenu:a.createElement(qe,null)}):null}const Ye="navbarHideable_m1mJ",Qe="navbarHidden_jGov";function Xe(e){return a.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,r.Z)("navbar-sidebar__backdrop",e.className)}))}function Je(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,_.L)(),i=(0,O.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,a.useState)(e),r=(0,a.useRef)(!1),o=(0,a.useRef)(0),i=(0,a.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,a)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(r.current)return void(r.current=!1);const l=a?.scrollY,s=document.documentElement.scrollHeight-o.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,u.S)((t=>{if(!e)return;const a=t.location.hash;if(a?document.getElementById(a.substring(1)):void 0)return r.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return a.createElement("nav",{ref:l,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,r.Z)("navbar","navbar--fixed-top",n&&[Ye,!s&&Qe],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,a.createElement(Xe,{onClick:i.toggle}),a.createElement(Ke,null))}function et(e){let{width:t=30,height:n=30,className:r,...o}=e;return a.createElement("svg",(0,l.Z)({className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function tt(){const{toggle:e,shown:t}=(0,O.e)();return a.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},a.createElement(et,null))}const nt="colorModeToggle_DEke";function at(e){let{items:t}=e;return a.createElement(a.Fragment,null,t.map(((e,t)=>a.createElement(Ve,(0,l.Z)({},e,{key:t})))))}function rt(e){let{left:t,right:n}=e;return a.createElement("div",{className:"navbar__inner"},a.createElement("div",{className:"navbar__items"},t),a.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ot(){const e=(0,O.e)(),t=(0,_.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return a.createElement(rt,{left:a.createElement(a.Fragment,null,!e.disabled&&a.createElement(tt,null),a.createElement(Y,null),a.createElement(at,{items:n})),right:a.createElement(a.Fragment,null,a.createElement(at,{items:r}),a.createElement(q,{className:nt}),!o&&a.createElement(Fe,null,a.createElement(De,null)))})}function it(){return a.createElement(Je,null,a.createElement(ot,null))}function lt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:i,...s}=t,c=(0,ee.Z)(n),u=(0,ee.Z)(r,{forcePrependBaseUrl:!0});return a.createElement(J.Z,(0,l.Z)({className:"footer__link-item"},r?{href:i?u:r}:{to:c},s),o,r&&!(0,te.Z)(r)&&a.createElement(ae.Z,null))}function st(e){let{item:t}=e;return t.html?a.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement("li",{key:t.href??t.to,className:"footer__item"},a.createElement(lt,{item:t}))}function ct(e){let{column:t}=e;return a.createElement("div",{className:"col footer__col"},a.createElement("div",{className:"footer__title"},t.title),a.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>a.createElement(st,{key:t,item:e})))))}function ut(e){let{columns:t}=e;return a.createElement("div",{className:"row footer__links"},t.map(((e,t)=>a.createElement(ct,{key:t,column:e}))))}function dt(){return a.createElement("span",{className:"footer__link-separator"},"\xb7")}function ft(e){let{item:t}=e;return t.html?a.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement(lt,{item:t})}function pt(e){let{links:t}=e;return a.createElement("div",{className:"footer__links text--center"},a.createElement("div",{className:"footer__links"},t.map(((e,n)=>a.createElement(a.Fragment,{key:n},a.createElement(ft,{item:e}),t.length!==n+1&&a.createElement(dt,null))))))}function gt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?a.createElement(ut,{columns:t}):a.createElement(pt,{links:t})}var mt=n(941);const ht="footerLogoLink_BH7S";function bt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,ee.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return a.createElement(mt.Z,{className:(0,r.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function vt(e){let{logo:t}=e;return t.href?a.createElement(J.Z,{href:t.href,className:ht,target:t.target},a.createElement(bt,{logo:t})):a.createElement(bt,{logo:t})}function yt(e){let{copyright:t}=e;return a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(e){let{style:t,links:n,logo:o,copyright:i}=e;return a.createElement("footer",{className:(0,r.Z)("footer",{"footer--dark":"dark"===t})},a.createElement("div",{className:"container container-fluid"},n,(o||i)&&a.createElement("div",{className:"footer__bottom text--center"},o&&a.createElement("div",{className:"margin-bottom--sm"},o),i)))}function wt(){const{footer:e}=(0,_.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return a.createElement(_t,{style:o,links:n&&n.length>0&&a.createElement(gt,{links:n}),logo:r&&a.createElement(vt,{logo:r}),copyright:t&&a.createElement(yt,{copyright:t})})}const kt=a.memo(wt),Et=(0,I.Qc)([U.S,w.pl,R.OC,ze.L5,i.VC,function(e){let{children:t}=e;return a.createElement(M.n2,null,a.createElement(O.M,null,a.createElement(D,null,t)))}]);function xt(e){let{children:t}=e;return a.createElement(Et,null,t)}function St(e){let{error:t,tryAgain:n}=e;return a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),a.createElement("p",null,t.message),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},a.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const Tt="mainWrapper_z2l0";function Ct(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:c}=e;return(0,b.t)(),a.createElement(xt,null,a.createElement(i.d,{title:s,description:c}),a.createElement(y,null),a.createElement(N,null),a.createElement(it,null),a.createElement("div",{id:d,className:(0,r.Z)(h.k.wrapper.main,Tt,l)},a.createElement(o.Z,{fallback:e=>a.createElement(St,e)},t)),!n&&a.createElement(kt,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(7462),r=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:a}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=r.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return a?r.createElement("div",{className:a},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:c}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,g=(0,i.Z)(c?.href||"/"),m=n?"":t,h=c?.alt??m;return r.createElement(o.Z,(0,a.Z)({to:g},p,c?.target&&{target:c.target}),c&&r.createElement(u,{logo:c,alt:h,imageClassName:d}),null!=n&&r.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(7294),r=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return a.createElement(r.Z,null,t&&a.createElement("meta",{name:"docusaurus_locale",content:t}),n&&a.createElement("meta",{name:"docusaurus_version",content:n}),o&&a.createElement("meta",{name:"docusaurus_tag",content:o}),i&&a.createElement("meta",{name:"docsearch:language",content:i}),n&&a.createElement("meta",{name:"docsearch:version",content:n}),o&&a.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(7462),r=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return r.createElement(r.Fragment,null,p.map((e=>r.createElement("img",(0,a.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],u)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>g});var a=n(7462),r=n(7294),o=n(412);function i(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??"ease-in-out"}`,height:`${t}px`}}function i(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,r.useRef)(null);return u({collapsibleRef:f,collapsed:n,animation:o}),r.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(f.current,n),i?.(n))},className:l},a)}function p(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,s]=(0,r.useState)(t);return(0,r.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,r.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?r.createElement(f,(0,a.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const a=t?p:f;return r.createElement(a,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>p});var a=n(7294),r=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),f=a.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,r.Z)(),[n,o]=(0,a.useState)((()=>!!t&&u()));(0,a.useEffect)((()=>{o(u())}),[]);const i=(0,a.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,a.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const a=t!==n;c.set(t),a&&d(!1),!a&&u()||o(!1)}),[e]),(0,a.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return a.createElement(f.Provider,{value:n},t)}function g(){const e=(0,a.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>m});var a=n(7294),r=n(412),o=n(902),i=n(12),l=n(6668);const s=a.createContext(void 0),c="theme",u=(0,i.WA)(c),d="light",f="dark",p=e=>e===f?f:d;function g(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,a.useState)((e=>r.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,a.useEffect)((()=>{t&&u.del()}),[t]);const s=(0,a.useCallback)((function(t,a){void 0===a&&(a={});const{persist:r=!0}=a;t?(i(t),r&&(e=>{u.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),u.del())}),[n,e]);(0,a.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,a.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const g=(0,a.useRef)(!1);return(0,a.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),a=()=>{window.matchMedia("print").matches||g.current?g.current=window.matchMedia("print").matches:s(null)};return e.addListener(a),()=>e.removeListener(a)}),[s,t,n]),(0,a.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[o,s])}function m(e){let{children:t}=e;const n=g();return a.createElement(s.Provider,{value:n},t)}function h(){const e=(0,a.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b,Oh:()=>_});var a=n(7294),r=n(143),o=n(9935),i=n(6668),l=n(3438),s=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d=(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},f=(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),p=(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()};const g=a.createContext(null);function m(){const e=(0,r._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,a.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,a.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,a.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:a}=e;function r(e){const t=f(e,n);return a[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,r(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,a.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return a.createElement(g.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?a.createElement(h,null,t):a.createElement(a.Fragment,null,t)}function v(){const e=(0,a.useContext)(g);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.m);const t=(0,r.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,a.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function _(){const e=(0,r._r)(),[t]=v();function n(n){const a=e[n],{preferredVersionName:r}=t[n];return a.versions.find((e=>e.name===r))??null}const a=Object.keys(e);return Object.fromEntries(a.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var a=n(7294),r=n(902);const o=Symbol("EmptyContext"),i=a.createContext(o);function l(e){let{children:t,name:n,items:r}=e;const o=(0,a.useMemo)((()=>n&&r?{name:n,items:r}:null),[n,r]);return a.createElement(i.Provider,{value:o},t)}function s(){const e=(0,a.useContext)(i);if(e===o)throw new r.i6("DocsSidebarProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var a=n(7294),r=n(3102),o=n(7524),i=n(1980),l=n(6668),s=n(902);const c=a.createContext(void 0);function u(){const e=function(){const e=(0,r.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[s,c]=(0,a.useState)(!1);(0,i.Rb)((()=>{if(s)return c(!1),!1}));const u=(0,a.useCallback)((()=>{c((e=>!e))}),[]);return(0,a.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,a.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:s})),[e,n,u,s])}function d(e){let{children:t}=e;const n=u();return a.createElement(c.Provider,{value:n},t)}function f(){const e=a.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var a=n(7294),r=n(902);const o=a.createContext(null);function i(e){let{children:t}=e;const n=(0,a.useState)({component:null,props:null});return a.createElement(o.Provider,{value:n},t)}function l(){const e=(0,a.useContext)(o);if(!e)throw new r.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,a.useContext)(o);if(!i)throw new r.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,r.Ql)(n);return(0,a.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,a.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>r,t:()=>o});var a=n(7294);const r="navigation-with-keyboard";function o(){(0,a.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(r),"mousedown"===e.type&&document.body.classList.remove(r)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(r),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{O:()=>l});var a=n(7294),r=n(6550),o=n(2263);const i="q";function l(){const e=(0,r.k6)(),{siteConfig:{baseUrl:t,themeConfig:n}}=(0,o.Z)(),{algolia:{searchPagePath:l}}=n,[s,c]=(0,a.useState)("");(0,a.useEffect)((()=>{const e=new URLSearchParams(window.location.search).get(i)??"";c(e)}),[]);return{searchQuery:s,setSearchQuery:(0,a.useCallback)((t=>{const n=new URLSearchParams(window.location.search);t?n.set(i,t):n.delete(i),e.replace({search:n.toString()}),c(t)}),[e]),generateSearchPageLink:(0,a.useCallback)((e=>`${t}${l}?q=${encodeURIComponent(e)}`),[t,l])}}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var a=n(7294),r=n(412);const o="desktop",i="mobile",l="ssr";function s(){return r.Z.canUseDOM?window.innerWidth>996?o:i:l}function c(){const[e,t]=(0,a.useState)((()=>s()));return(0,a.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>a});const a={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},3438:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>g,cE:()=>d,hI:()=>_,lO:()=>b,oz:()=>v,s1:()=>h,vY:()=>y});var a=n(7294),r=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116),c=n(7392),u=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,u.Mg)(e,t);function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||((e,t)=>e.some((e=>g(e,t))))(e.items,t))}function m(e){let{sidebarItems:t,pathname:n,onlyCategories:a=!1}=e;const r=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return a&&"category"!==o.type||r.unshift(o),!0}return!1}(t),r}function h(){const e=(0,s.V)(),{pathname:t}=(0,r.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?m({sidebarItems:e.items,pathname:t}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),r=(0,i.yW)(e);return(0,a.useMemo)((()=>(0,c.j)([t,n,r].filter(Boolean))),[t,n,r])}function v(e,t){const n=b(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),a=t.find((t=>t[0]===e));if(!a)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return a[1]}),[e,n])}function y(e,t){const n=b(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),a=t.find((t=>t.id===e));if(!a){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return a}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const a=(0,r.TH)(),i=t.routes,l=i.find((e=>(0,r.LX)(a.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>r});var a=n(2263);function r(e){const{siteConfig:t}=(0,a.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>l,_X:()=>s});var a=n(7294),r=n(6550),o=n(1688),i=n(902);function l(e){!function(e){const t=(0,r.k6)(),n=(0,i.zX)(e);(0,a.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,r.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function a(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,a)=>e.findIndex((e=>t(e,n)))!==a))}function r(e){return Array.from(new Set(e))}n.d(t,{j:()=>r,l:()=>a})},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var a=n(7294),r=n(6010),o=n(5742),i=n(226);function l(){const e=a.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2128);function u(e){let{title:t,description:n,keywords:r,image:i,children:l}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return a.createElement(o.Z,null,t&&a.createElement("title",null,u),t&&a.createElement("meta",{property:"og:title",content:u}),n&&a.createElement("meta",{name:"description",content:n}),n&&a.createElement("meta",{property:"og:description",content:n}),r&&a.createElement("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&a.createElement("meta",{property:"og:image",content:f}),f&&a.createElement("meta",{name:"twitter:image",content:f}),l)}const d=a.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=a.useContext(d),l=(0,r.Z)(i,t);return a.createElement(d.Provider,{value:l},a.createElement(o.Z,null,a.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return a.createElement(f,{className:(0,r.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var a=n(7294);const r=n(412).Z.canUseDOM?a.useLayoutEffect:a.useEffect;function o(e){const t=(0,a.useRef)(e);return r((()=>{t.current=e}),[e]),(0,a.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,a.useRef)();return r((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,a.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return a.createElement(a.Fragment,null,e.reduceRight(((e,t)=>a.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function a(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>a})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var a=n(7294),r=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,a.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function a(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(a)||e(t.filter(r).flatMap((e=>e.routes??[])))}(n)}({routes:r.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>s,RF:()=>d,o5:()=>f});var a=n(7294),r=n(412),o=n(2389),i=n(902);const l=a.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,a.useRef)(!0);return(0,a.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return a.createElement(l.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>r.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),r=(0,a.useRef)(u()),o=(0,i.zX)(e);(0,a.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,r.current),r.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=c(),t=function(){const e=(0,a.useRef)({elem:null,top:0}),t=(0,a.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,a.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const a=t.getBoundingClientRect().top-n;return a&&window.scrollBy({left:0,top:a}),e.current={elem:null,top:0},{restored:0!==a}}),[]);return(0,a.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,a.useRef)(void 0),r=(0,a.useCallback)((a=>{t.save(a),e.disableScrollEvents(),n.current=()=>{const{restored:a}=t.restore();if(n.current=void 0,a){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,a.useLayoutEffect)((()=>{n.current?.()})),{blockElementScrollPositionUntilNextRender:r}}function p(){const e=(0,a.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function a(){const r=document.documentElement.scrollTop;(n&&r>e||!n&&r<e)&&(t=requestAnimationFrame(a),window.scrollTo(0,Math.floor(.85*(r-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var a=n(143),r=n(2263),o=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,r.Z)(),t=(0,a._r)(),n=(0,a.WS)(),s=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const a=n?.activePlugin.pluginId===e?n.activeVersion:void 0,r=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(a??r??o).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var a=n(7294),r=n(1688);const o="localStorage";function i(e){let{key:t,oldValue:n,newValue:a,storage:r}=e;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,a,window.location.href,r),window.dispatchEvent(o)}function l(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=l(t?.persistence);return null===n?c:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const a=n.getItem(e);n.setItem(e,t),i({key:e,oldValue:a,newValue:t,storage:n})}catch(a){console.error(`Docusaurus storage error, can't set ${e}=${t}`,a)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),i({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const a=a=>{a.storageArea===n&&a.key===e&&t(a)};return window.addEventListener("storage",a),()=>window.removeEventListener("storage",a)}catch(a){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,a),()=>{}}}}}function d(e,t){const n=(0,a.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,a.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var a=n(2263),r=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,a.Z)(),{pathname:i}=(0,r.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:a,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(a)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var a=n(7294),r=n(6550),o=n(902);function i(e){const t=(0,r.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,a.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var a=n(2263);function r(){return(0,a.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var a=n(2263);function r(){const{siteConfig:{themeConfig:e}}=(0,a.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var a=n(7294),r=n(8022),o=n(4996),i=n(6278);function l(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,a.useCallback)((a=>{const o=new URL(a);if((0,r.F)(t,o.href))return a;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:a}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[r]=e.split(/[#?]/),o="/"===r||r===a?r:(i=r,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(r,o)}},8780:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var r=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return a(r).default}})},6010:(e,t,n)=>{"use strict";function a(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=a(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}n.d(t,{Z:()=>r});const r=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=a(e))&&(r&&(r+=" "),r+=t);return r}},2358:(e,t,n)=>{"use strict";n.d(t,{lX:()=>E,q_:()=>L,ob:()=>m,PP:()=>N,Ep:()=>g,Hp:()=>h});var a=n(7462);function r(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,a=n+1,r=e.length;a<r;n+=1,a+=1)e[n]=e[a];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,a=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&r(e),s=t&&r(t),c=l||s;if(e&&r(e)?i=a:a.length&&(i.pop(),i=i.concat(a)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&r(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,a){return e(t,n[a])}));if("object"==typeof t||"object"==typeof n){var a=l(t),r=l(n);return a!==t||r!==n?e(a,r):Object.keys(Object.assign({},t,n)).every((function(a){return e(t[a],n[a])}))}return!1};var c=n(8776);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function g(e){var t=e.pathname,n=e.search,a=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),a&&"#"!==a&&(r+="#"===a.charAt(0)?a:"#"+a),r}function m(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",a="",r=t.indexOf("#");-1!==r&&(a=t.substr(r),t=t.substr(0,r));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===a?"":a}}(e),o.state=t):(void 0===(o=(0,a.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function h(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,a,r){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof a?a(o,r):r(!0):r(!1!==o)}else r(!0)},appendListener:function(e){var n=!0;function a(){n&&e.apply(void 0,arguments)}return t.push(a),function(){n=!1,t=t.filter((function(e){return e!==a}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];t.forEach((function(e){return e.apply(void 0,n)}))}}}var v=!("undefined"==typeof window||!window.document||!window.document.createElement);function y(e,t){t(window.confirm(e))}var _="popstate",w="hashchange";function k(){try{return window.history.state||{}}catch(e){return{}}}function E(e){void 0===e&&(e={}),v||(0,c.Z)(!1);var t,n=window.history,r=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,l=i.forceRefresh,s=void 0!==l&&l,d=i.getUserConfirmation,h=void 0===d?y:d,E=i.keyLength,x=void 0===E?6:E,S=e.basename?p(u(e.basename)):"";function T(e){var t=e||{},n=t.key,a=t.state,r=window.location,o=r.pathname+r.search+r.hash;return S&&(o=f(o,S)),m(o,a,n)}function C(){return Math.random().toString(36).substr(2,x)}var A=b();function L(e){(0,a.Z)(U,e),U.length=n.length,A.notifyListeners(U.location,U.action)}function P(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||R(T(e.state))}function N(){R(T(k()))}var O=!1;function R(e){if(O)O=!1,L();else{A.confirmTransitionTo(e,"POP",h,(function(t){t?L({action:"POP",location:e}):function(e){var t=U.location,n=M.indexOf(t.key);-1===n&&(n=0);var a=M.indexOf(e.key);-1===a&&(a=0);var r=n-a;r&&(O=!0,D(r))}(e)}))}}var I=T(k()),M=[I.key];function j(e){return S+g(e)}function D(e){n.go(e)}var B=0;function F(e){1===(B+=e)&&1===e?(window.addEventListener(_,P),o&&window.addEventListener(w,N)):0===B&&(window.removeEventListener(_,P),o&&window.removeEventListener(w,N))}var $=!1;var U={length:n.length,action:"POP",location:I,createHref:j,push:function(e,t){var a="PUSH",o=m(e,t,C(),U.location);A.confirmTransitionTo(o,a,h,(function(e){if(e){var t=j(o),i=o.key,l=o.state;if(r)if(n.pushState({key:i,state:l},null,t),s)window.location.href=t;else{var c=M.indexOf(U.location.key),u=M.slice(0,c+1);u.push(o.key),M=u,L({action:a,location:o})}else window.location.href=t}}))},replace:function(e,t){var a="REPLACE",o=m(e,t,C(),U.location);A.confirmTransitionTo(o,a,h,(function(e){if(e){var t=j(o),i=o.key,l=o.state;if(r)if(n.replaceState({key:i,state:l},null,t),s)window.location.replace(t);else{var c=M.indexOf(U.location.key);-1!==c&&(M[c]=o.key),L({action:a,location:o})}else window.location.replace(t)}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return $||(F(1),$=!0),function(){return $&&($=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return U}var x="hashchange",S={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:u},slash:{encodePath:u,decodePath:u}};function T(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function C(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function A(e){window.location.replace(T(window.location.href)+"#"+e)}function L(e){void 0===e&&(e={}),v||(0,c.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),r=n.getUserConfirmation,o=void 0===r?y:r,i=n.hashType,l=void 0===i?"slash":i,s=e.basename?p(u(e.basename)):"",d=S[l],h=d.encodePath,_=d.decodePath;function w(){var e=_(C());return s&&(e=f(e,s)),m(e)}var k=b();function E(e){(0,a.Z)($,e),$.length=t.length,k.notifyListeners($.location,$.action)}var L=!1,P=null;function N(){var e,t,n=C(),a=h(n);if(n!==a)A(a);else{var r=w(),i=$.location;if(!L&&(t=r,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(P===g(r))return;P=null,function(e){if(L)L=!1,E();else{var t="POP";k.confirmTransitionTo(e,t,o,(function(n){n?E({action:t,location:e}):function(e){var t=$.location,n=M.lastIndexOf(g(t));-1===n&&(n=0);var a=M.lastIndexOf(g(e));-1===a&&(a=0);var r=n-a;r&&(L=!0,j(r))}(e)}))}}(r)}}var O=C(),R=h(O);O!==R&&A(R);var I=w(),M=[g(I)];function j(e){t.go(e)}var D=0;function B(e){1===(D+=e)&&1===e?window.addEventListener(x,N):0===D&&window.removeEventListener(x,N)}var F=!1;var $={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=T(window.location.href)),n+"#"+h(s+g(e))},push:function(e,t){var n="PUSH",a=m(e,void 0,void 0,$.location);k.confirmTransitionTo(a,n,o,(function(e){if(e){var t=g(a),r=h(s+t);if(C()!==r){P=t,function(e){window.location.hash=e}(r);var o=M.lastIndexOf(g($.location)),i=M.slice(0,o+1);i.push(t),M=i,E({action:n,location:a})}else E()}}))},replace:function(e,t){var n="REPLACE",a=m(e,void 0,void 0,$.location);k.confirmTransitionTo(a,n,o,(function(e){if(e){var t=g(a),r=h(s+t);C()!==r&&(P=t,A(r));var o=M.indexOf(g($.location));-1!==o&&(M[o]=t),E({action:n,location:a})}}))},go:j,goBack:function(){j(-1)},goForward:function(){j(1)},block:function(e){void 0===e&&(e=!1);var t=k.setPrompt(e);return F||(B(1),F=!0),function(){return F&&(F=!1,B(-1)),t()}},listen:function(e){var t=k.appendListener(e);return B(1),function(){B(-1),t()}}};return $}function P(e,t,n){return Math.min(Math.max(e,t),n)}function N(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,r=t.initialEntries,o=void 0===r?["/"]:r,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,c=void 0===s?6:s,u=b();function d(e){(0,a.Z)(_,e),_.length=_.entries.length,u.notifyListeners(_.location,_.action)}function f(){return Math.random().toString(36).substr(2,c)}var p=P(l,0,o.length-1),h=o.map((function(e){return m(e,void 0,"string"==typeof e?f():e.key||f())})),v=g;function y(e){var t=P(_.index+e,0,_.entries.length-1),a=_.entries[t];u.confirmTransitionTo(a,"POP",n,(function(e){e?d({action:"POP",location:a,index:t}):d()}))}var _={length:h.length,action:"POP",location:h[p],index:p,entries:h,createHref:v,push:function(e,t){var a="PUSH",r=m(e,t,f(),_.location);u.confirmTransitionTo(r,a,n,(function(e){if(e){var t=_.index+1,n=_.entries.slice(0);n.length>t?n.splice(t,n.length-t,r):n.push(r),d({action:a,location:r,index:t,entries:n})}}))},replace:function(e,t){var a="REPLACE",r=m(e,t,f(),_.location);u.confirmTransitionTo(r,a,n,(function(e){e&&(_.entries[_.index]=r,d({action:a,location:r}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=_.index+e;return t>=0&&t<_.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return _}},8679:(e,t,n)=>{"use strict";var a=n(9864),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return a.isMemo(e)?i:l[e.$$typeof]||r}l[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[a.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,a){if("string"!=typeof n){if(g){var r=p(n);r&&r!==g&&e(t,r,a)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),m=s(n),h=0;h<i.length;++h){var b=i[h];if(!(o[b]||a&&a[b]||m&&m[b]||l&&l[b])){var v=f(n,b);try{c(t,b,v)}catch(y){}}}}return t}},1143:e=>{"use strict";e.exports=function(e,t,n,a,r,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,a,r,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var a,r;a=function(){var e,t,n={version:"0.2.0"},a=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function r(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var r;return(r="translate3d"===a.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,r}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,a.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(a.barSelector),u=a.speed,d=a.easing;return o.offsetWidth,l((function(t){""===a.positionUsing&&(a.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),a.trickleSpeed)};return a.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*a.trickleRate)},e=0,t=0,n.promise=function(a){return a&&"resolved"!==a.state()?(0===t&&n.start(),e++,t++,a.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var r,i=t.querySelector(a.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(a.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),a.showSpinner||(r=t.querySelector(a.spinnerSelector))&&p(r),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function a(t){var n=document.body.style;if(t in n)return t;for(var a,r=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((a=e[r]+o)in n)return a;return t}function r(e){return e=n(e),t[e]||(t[e]=a(e))}function o(e,t,n){t=r(t),e.style[t]=n}return function(e,t){var n,a,r=arguments;if(2==r.length)for(n in t)void 0!==(a=t[n])&&t.hasOwnProperty(n)&&o(e,n,a);else o(e,r[1],r[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),a=n+t;c(n,t)||(e.className=a.substring(1))}function d(e,t){var n,a=f(e);c(e,t)&&(n=a.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(r="function"==typeof a?a.call(t,n,t,e):a)||(e.exports=r)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function r(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach((function(e){a[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(r){return!1}}()?Object.assign:function(e,o){for(var i,l,s=r(e),c=1;c<arguments.length;c++){for(var u in i=Object(arguments[c]))n.call(i,u)&&(s[u]=i[u]);if(t){l=t(i);for(var d=0;d<l.length;d++)a.call(i,l[d])&&(s[l[d]]=i[l[d]])}}return s}},7410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},a={util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var r,o;switch(n=n||{},a.util.type(t)){case"Object":if(o=a.util.objId(t),n[o])return n[o];for(var i in r={},n[o]=r,t)t.hasOwnProperty(i)&&(r[i]=e(t[i],n));return r;case"Array":return o=a.util.objId(t),n[o]?n[o]:(r=[],n[o]=r,t.forEach((function(t,a){r[a]=e(t,n)})),r);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var a="no-"+t;e;){var r=e.classList;if(r.contains(t))return!0;if(r.contains(a))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=a.util.clone(a.languages[e]);for(var r in t)n[r]=t[r];return n},insertBefore:function(e,t,n,r){var o=(r=r||a.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var c=r[e];return r[e]=i,a.languages.DFS(a.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,r,o){o=o||{};var i=a.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],r||l);var s=t[l],c=a.util.type(s);"Object"!==c||o[i(s)]?"Array"!==c||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return a.hooks.run("before-tokenize",o),o.tokens=a.tokenize(o.code,o.grammar),a.hooks.run("after-tokenize",o),r.stringify(a.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest}var r=new l;return s(r,r.head,e),i(e,r,t,r.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(r)},hooks:{all:{},add:function(e,t){var n=a.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=a.hooks.all[e];if(n&&n.length)for(var r,o=0;r=n[o++];)r(t)}},Token:r};function r(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function o(e,t,n,a){e.lastIndex=t;var r=e.exec(n);if(r&&a&&r[1]){var o=r[1].length;r.index+=o,r[0]=r[0].slice(o)}return r}function i(e,t,n,l,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var g=0;g<p.length;++g){if(d&&d.cause==f+","+g)return;var m=p[g],h=m.inside,b=!!m.lookbehind,v=!!m.greedy,y=m.alias;if(v&&!m.pattern.global){var _=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,_+"g")}for(var w=m.pattern||m,k=l.next,E=u;k!==t.tail&&!(d&&E>=d.reach);E+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof r)){var S,T=1;if(v){if(!(S=o(w,E,e,b))||S.index>=e.length)break;var C=S.index,A=S.index+S[0].length,L=E;for(L+=k.value.length;C>=L;)L+=(k=k.next).value.length;if(E=L-=k.value.length,k.value instanceof r)continue;for(var P=k;P!==t.tail&&(L<A||"string"==typeof P.value);P=P.next)T++,L+=P.value.length;T--,x=e.slice(E,L),S.index-=E}else if(!(S=o(w,0,x,b)))continue;C=S.index;var N=S[0],O=x.slice(0,C),R=x.slice(C+N.length),I=E+x.length;d&&I>d.reach&&(d.reach=I);var M=k.prev;if(O&&(M=s(t,M,O),E+=O.length),c(t,M,T),k=s(t,M,new r(f,h?a.tokenize(N,h):N,y,N)),R&&s(t,k,R),T>1){var j={cause:f+","+g,reach:I};i(e,t,n,k.prev,E,j),d&&j.reach>d.reach&&(d.reach=j.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function c(e,t,n){for(var a=t.next,r=0;r<n&&a!==e.tail;r++)a=a.next;t.next=a,a.prev=t,e.length-=r}return r.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var r="";return t.forEach((function(t){r+=e(t,n)})),r}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),a.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},a}(),r=a;a.default=a,r.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},r.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=a.variable[1].inside,i=0;i<r.length;i++)o[r[i]]=e.languages.bash[r[i]];e.languages.shell=e.languages.bash}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.c=r.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),r.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),r.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},r.languages.c.string],char:r.languages.c.char,comment:r.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:r.languages.c}}}}),r.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete r.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(r),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var a={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:r})}(r),r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(r),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<key>>/g,(function(){return"(?:"+r+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(r),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return a})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+o+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+o+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,a=t.length;n<a;n++){var r=t[n];if("code"===r.type){var o=r.content[1],i=r.content[3];if(o&&i&&"code-language"===o.type&&"code-block"===i.type&&"string"==typeof o.content){var l=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),s="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,s]:i.alias.push(s):i.alias=[s]}}else e(r.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",a=0,r=t.classes.length;a<r;a++){var o=t.classes[a],c=/language-(.+)/.exec(o);if(c){n=c[1];break}}var u,d=e.languages[n];if(d)t.content=e.highlight((u=t.content,u.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n);var a=l[t];return a||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var f="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=f,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(f);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(r),r.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:r.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},r.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var a=t[n++];if("keyword"===a.type&&"mutation"===a.content){var r=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),r.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),r.length>0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&r.indexOf(c.content)>=0&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var a=u(n+t);if(!a||a.type!==e[n])return!1}return!0}function f(e,a){for(var r=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))r++;else if(a.test(l)&&0===--r)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),r.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,a=t.inside.interpolation,r=a.inside["interpolation-punctuation"],o=a.pattern.source;function i(t,a){if(e.languages[t])return{pattern:RegExp("((?:"+a+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,a){var r={code:t,grammar:n,language:a};return e.hooks.run("before-tokenize",r),r.tokens=e.tokenize(r.code,r.grammar),e.hooks.run("after-tokenize",r),r.tokens}function c(t){var n={};n["interpolation-punctuation"]=r;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,a.alias,t)}function u(t,n,a){var r=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(r.map((function(e){if("string"==typeof e)return e;for(var n,r=e.content;-1!==t.indexOf(n=l(i++,a)););return u[n]=r,n})).join(""),n,a),f=Object.keys(u);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=f.length)return;var a=t[n];if("string"==typeof a||"string"==typeof a.content){var r=f[i],o="string"==typeof a?a:a.content,l=o.indexOf(r);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[r]),p=o.substring(l+r.length),g=[];if(s&&g.push(s),g.push(d),p){var m=[p];e(m),g.push.apply(g,m)}"string"==typeof a?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):a.content=g}}else{var h=a.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(a,d,"language-"+a,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var a=0,r=n.length;a<r;a++){var o=n[a];if("string"!=typeof o){var i=o.content;if(Array.isArray(i))if("template-string"===o.type){var l=i[1];if(3===i.length&&"string"!=typeof l&&"embedded-code"===l.type){var s=f(l),c=l.alias,d=Array.isArray(c)?c[0]:c,p=e.languages[d];if(!p)continue;i[1]=u(s,p,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(r),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(r),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],a=0;a<n.length;a++){var r=n[a],o=e.languages.javascript[r];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[r]={pattern:o});var i=o.inside||{};o.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(r),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,a=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,r=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return a})).replace(/<SPREAD>/g,(function(){return r})),RegExp(e,t)}r=o(r).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],a=0;a<t.length;a++){var r=t[a],o=!1;if("string"!=typeof r&&("tag"===r.type&&r.content[0]&&"tag"===r.content[0].type?"</"===r.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(r.content[0].content[1])&&n.pop():"/>"===r.content[r.content.length-1].content||n.push({tagName:i(r.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===r.type&&"{"===r.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof r)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(r);a<t.length-1&&("string"==typeof t[a+1]||"plain-text"===t[a+1].type)&&(s+=i(t[a+1]),t.splice(a+1,1)),a>0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(s=i(t[a-1])+s,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",s,null,s)}r.content&&"string"!=typeof r.content&&l(r.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(r),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var a=t[n],r=[];/^\w+$/.test(n)||r.push(/\w+/.exec(n)[0]),"diff"===n&&r.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+a+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(r),r.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},r.languages.go=r.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),r.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete r.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,r,o){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,l=i.length;-1!==n.code.indexOf(r=t(a,l));)++l;return i[l]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var r=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(r>=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[r],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(a,u),g=f.indexOf(p);if(g>-1){++r;var m=f.substring(0,g),h=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),b=f.substring(g+p.length),v=[];m&&v.push.apply(v,i([m])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(r),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(r),r.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},r.languages.webmanifest=r.languages.json,r.languages.less=r.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),r.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),r.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},r.languages.objectivec=r.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete r.languages.objectivec["class-name"],r.languages.objc=r.languages.objectivec,r.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},r.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},r.languages.python["string-interpolation"].inside.interpolation.inside.rest=r.languages.python,r.languages.py=r.languages.python,r.languages.reason=r.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),r.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete r.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(r),r.languages.scss=r.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),r.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),r.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),r.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),r.languages.scss.atrule.inside.rest=r.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},a={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};a.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:a}},a.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:a}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:a}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:a}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:a}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:a.interpolation}},rest:a}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:a.interpolation,comment:a.comment,punctuation:/[{},]/}},func:a.func,string:a.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:a.interpolation,punctuation:/[{}()\[\];:.]/}}(r),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(r),r.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=r},485:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},2811:(e,t,n)=>{var a={"./prism-groovy":485,"./prism-java":2503,"./prism-kotlin":2334};function r(e){var t=o(e);return n(t)}function o(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=o,e.exports=r,r.id=2811},2703:(e,t,n)=>{"use strict";var a=n(414);function r(){}function o(){}o.resetWarningCache=r,e.exports=function(){function e(e,t,n,r,o,i){if(i!==a){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:r};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var a=n(7294),r=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!a)throw Error(i(227));var l=new Set,s={};function c(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(s[e]=t,e=0;e<t.length;e++)l.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p=Object.prototype.hasOwnProperty,g={},m={};function h(e,t,n,a,r,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=a,this.attributeNamespace=r,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function _(e,t,n,a){var r=b.hasOwnProperty(t)?b[t]:null;(null!==r?0===r.type:!a&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,a){if(null==t||function(e,t,n,a){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!a&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,a))return!0;if(a)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,r,a)&&(n=null),a||null===r?function(e){return!!p.call(m,e)||!p.call(g,e)&&(f.test(e)?m[e]=!0:(g[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):r.mustUseProperty?e[r.propertyName]=null===n?3!==r.type&&"":n:(t=r.attributeName,a=r.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(r=r.type)||4===r&&!0===n?"":""+n,a?e.setAttributeNS(a,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,E=60106,x=60107,S=60108,T=60114,C=60109,A=60110,L=60112,P=60113,N=60120,O=60115,R=60116,I=60121,M=60128,j=60129,D=60130,B=60131;if("function"==typeof Symbol&&Symbol.for){var F=Symbol.for;k=F("react.element"),E=F("react.portal"),x=F("react.fragment"),S=F("react.strict_mode"),T=F("react.profiler"),C=F("react.provider"),A=F("react.context"),L=F("react.forward_ref"),P=F("react.suspense"),N=F("react.suspense_list"),O=F("react.memo"),R=F("react.lazy"),I=F("react.block"),F("react.scope"),M=F("react.opaque.id"),j=F("react.debug_trace_mode"),D=F("react.offscreen"),B=F("react.legacy_hidden")}var $,U="function"==typeof Symbol&&Symbol.iterator;function z(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=U&&e[U]||e["@@iterator"])?e:null}function Z(e){if(void 0===$)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);$=t&&t[1]||""}return"\n"+$+e}var H=!1;function V(e,t){if(!e||H)return"";H=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(s){var a=s}Reflect.construct(e,[],t)}else{try{t.call()}catch(s){a=s}e.call(t.prototype)}else{try{throw Error()}catch(s){a=s}e()}}catch(s){if(s&&a&&"string"==typeof s.stack){for(var r=s.stack.split("\n"),o=a.stack.split("\n"),i=r.length-1,l=o.length-1;1<=i&&0<=l&&r[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(r[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||r[i]!==o[l])return"\n"+r[i].replace(" at new "," at ")}while(1<=i&&0<=l);break}}}finally{H=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Z(e):""}function W(e){switch(e.tag){case 5:return Z(e.type);case 16:return Z("Lazy");case 13:return Z("Suspense");case 19:return Z("SuspenseList");case 0:case 2:case 15:return e=V(e.type,!1);case 11:return e=V(e.type.render,!1);case 22:return e=V(e.type._render,!1);case 1:return e=V(e.type,!0);default:return""}}function G(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case x:return"Fragment";case E:return"Portal";case T:return"Profiler";case S:return"StrictMode";case P:return"Suspense";case N:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case L:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case O:return G(e.type);case I:return G(e._render);case R:t=e._payload,e=e._init;try{return G(e(t))}catch(n){}}return null}function q(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function K(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var t=K(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var r=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(e){a=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(e){a=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=K(e)?e.checked?"true":"false":e.value),(e=a)!==n&&(t.setValue(e),!0)}function X(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return r({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,a=null!=t.checked?t.checked:t.defaultChecked;n=q(null!=t.value?t.value:n),e._wrapperState={initialChecked:a,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&_(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=q(t.value),a=t.type;if(null!=n)"number"===a?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===a||"reset"===a)return void e.removeAttribute("value");t.hasOwnProperty("value")?re(e,t.type,n):t.hasOwnProperty("defaultValue")&&re(e,t.type,q(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function ae(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!("submit"!==a&&"reset"!==a||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function re(e,t,n){"number"===t&&X(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=r({children:void 0},t),(t=function(e){var t="";return a.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,a){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t["$"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty("$"+e[n].value),e[n].selected!==r&&(e[n].selected=r),r&&a&&(e[n].defaultSelected=!0)}else{for(n=""+q(n),t=null,r=0;r<e.length;r++){if(e[r].value===n)return e[r].selected=!0,void(a&&(e[r].defaultSelected=!0));null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function le(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return r({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function se(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:q(n)}}function ce(e,t){var n=q(t.value),a=q(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=a&&(e.defaultValue=""+a)}function ue(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de="http://www.w3.org/1999/xhtml",fe="http://www.w3.org/2000/svg";function pe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function ge(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?pe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var me,he,be=(he=function(e,t){if(e.namespaceURI!==fe||"innerHTML"in e)e.innerHTML=t;else{for((me=me||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=me.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,a){MSApp.execUnsafeLocalFunction((function(){return he(e,t)}))}:he);function ve(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ye={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},_e=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ye.hasOwnProperty(e)&&ye[e]?(""+t).trim():t+"px"}function ke(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var a=0===n.indexOf("--"),r=we(n,t[n],a);"float"===n&&(n="cssFloat"),a?e.setProperty(n,r):e[n]=r}}Object.keys(ye).forEach((function(e){_e.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ye[t]=ye[e]}))}));var Ee=r({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function xe(e,t){if(t){if(Ee[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function Se(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Te(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ce=null,Ae=null,Le=null;function Pe(e){if(e=ar(e)){if("function"!=typeof Ce)throw Error(i(280));var t=e.stateNode;t&&(t=or(t),Ce(e.stateNode,e.type,t))}}function Ne(e){Ae?Le?Le.push(e):Le=[e]:Ae=e}function Oe(){if(Ae){var e=Ae,t=Le;if(Le=Ae=null,Pe(e),t)for(e=0;e<t.length;e++)Pe(t[e])}}function Re(e,t){return e(t)}function Ie(e,t,n,a,r){return e(t,n,a,r)}function Me(){}var je=Re,De=!1,Be=!1;function Fe(){null===Ae&&null===Le||(Me(),Oe())}function $e(e,t){var n=e.stateNode;if(null===n)return null;var a=or(n);if(null===a)return null;n=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(a=!a.disabled)||(a=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!a;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var Ue=!1;if(d)try{var ze={};Object.defineProperty(ze,"passive",{get:function(){Ue=!0}}),window.addEventListener("test",ze,ze),window.removeEventListener("test",ze,ze)}catch(he){Ue=!1}function Ze(e,t,n,a,r,o,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var He=!1,Ve=null,We=!1,Ge=null,qe={onError:function(e){He=!0,Ve=e}};function Ke(e,t,n,a,r,o,i,l,s){He=!1,Ve=null,Ze.apply(qe,arguments)}function Ye(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ye(e)!==e)throw Error(i(188))}function Je(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,a=t;;){var r=n.return;if(null===r)break;var o=r.alternate;if(null===o){if(null!==(a=r.return)){n=a;continue}break}if(r.child===o.child){for(o=r.child;o;){if(o===n)return Xe(r),e;if(o===a)return Xe(r),t;o=o.sibling}throw Error(i(188))}if(n.return!==a.return)n=r,a=o;else{for(var l=!1,s=r.child;s;){if(s===n){l=!0,n=r,a=o;break}if(s===a){l=!0,a=r,n=o;break}s=s.sibling}if(!l){for(s=o.child;s;){if(s===n){l=!0,n=o,a=r;break}if(s===a){l=!0,a=o,n=r;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==a)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function et(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var tt,nt,at,rt,ot=!1,it=[],lt=null,st=null,ct=null,ut=new Map,dt=new Map,ft=[],pt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function gt(e,t,n,a,r){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:r,targetContainers:[a]}}function mt(e,t){switch(e){case"focusin":case"focusout":lt=null;break;case"dragenter":case"dragleave":st=null;break;case"mouseover":case"mouseout":ct=null;break;case"pointerover":case"pointerout":ut.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":dt.delete(t.pointerId)}}function ht(e,t,n,a,r,o){return null===e||e.nativeEvent!==o?(e=gt(t,n,a,r,o),null!==t&&(null!==(t=ar(t))&&nt(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,null!==r&&-1===t.indexOf(r)&&t.push(r),e)}function bt(e){var t=nr(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Qe(n)))return e.blockedOn=t,void rt(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){at(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function vt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Jt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=ar(n))&&nt(t),e.blockedOn=n,!1;t.shift()}return!0}function yt(e,t,n){vt(e)&&n.delete(t)}function _t(){for(ot=!1;0<it.length;){var e=it[0];if(null!==e.blockedOn){null!==(e=ar(e.blockedOn))&&tt(e);break}for(var t=e.targetContainers;0<t.length;){var n=Jt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&it.shift()}null!==lt&&vt(lt)&&(lt=null),null!==st&&vt(st)&&(st=null),null!==ct&&vt(ct)&&(ct=null),ut.forEach(yt),dt.forEach(yt)}function wt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,_t)))}function kt(e){function t(t){return wt(t,e)}if(0<it.length){wt(it[0],e);for(var n=1;n<it.length;n++){var a=it[n];a.blockedOn===e&&(a.blockedOn=null)}}for(null!==lt&&wt(lt,e),null!==st&&wt(st,e),null!==ct&&wt(ct,e),ut.forEach(t),dt.forEach(t),n=0;n<ft.length;n++)(a=ft[n]).blockedOn===e&&(a.blockedOn=null);for(;0<ft.length&&null===(n=ft[0]).blockedOn;)bt(n),null===n.blockedOn&&ft.shift()}function Et(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var xt={animationend:Et("Animation","AnimationEnd"),animationiteration:Et("Animation","AnimationIteration"),animationstart:Et("Animation","AnimationStart"),transitionend:Et("Transition","TransitionEnd")},St={},Tt={};function Ct(e){if(St[e])return St[e];if(!xt[e])return e;var t,n=xt[e];for(t in n)if(n.hasOwnProperty(t)&&t in Tt)return St[e]=n[t];return e}d&&(Tt=document.createElement("div").style,"AnimationEvent"in window||(delete xt.animationend.animation,delete xt.animationiteration.animation,delete xt.animationstart.animation),"TransitionEvent"in window||delete xt.transitionend.transition);var At=Ct("animationend"),Lt=Ct("animationiteration"),Pt=Ct("animationstart"),Nt=Ct("transitionend"),Ot=new Map,Rt=new Map,It=["abort","abort",At,"animationEnd",Lt,"animationIteration",Pt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Nt,"transitionEnd","waiting","waiting"];function Mt(e,t){for(var n=0;n<e.length;n+=2){var a=e[n],r=e[n+1];r="on"+(r[0].toUpperCase()+r.slice(1)),Rt.set(a,t),Ot.set(a,r),c(r,[a])}}(0,o.unstable_now)();var jt=8;function Dt(e){if(0!=(1&e))return jt=15,1;if(0!=(2&e))return jt=14,2;if(0!=(4&e))return jt=13,4;var t=24&e;return 0!==t?(jt=12,t):0!=(32&e)?(jt=11,32):0!==(t=192&e)?(jt=10,t):0!=(256&e)?(jt=9,256):0!==(t=3584&e)?(jt=8,t):0!=(4096&e)?(jt=7,4096):0!==(t=4186112&e)?(jt=6,t):0!==(t=62914560&e)?(jt=5,t):67108864&e?(jt=4,67108864):0!=(134217728&e)?(jt=3,134217728):0!==(t=805306368&e)?(jt=2,t):0!=(1073741824&e)?(jt=1,1073741824):(jt=8,e)}function Bt(e,t){var n=e.pendingLanes;if(0===n)return jt=0;var a=0,r=0,o=e.expiredLanes,i=e.suspendedLanes,l=e.pingedLanes;if(0!==o)a=o,r=jt=15;else if(0!==(o=134217727&n)){var s=o&~i;0!==s?(a=Dt(s),r=jt):0!==(l&=o)&&(a=Dt(l),r=jt)}else 0!==(o=n&~i)?(a=Dt(o),r=jt):0!==l&&(a=Dt(l),r=jt);if(0===a)return 0;if(a=n&((0>(a=31-Ht(a))?0:1<<a)<<1)-1,0!==t&&t!==a&&0==(t&i)){if(Dt(t),r<=jt)return t;jt=r}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=a;0<t;)r=1<<(n=31-Ht(t)),a|=e[n],t&=~r;return a}function Ft(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function $t(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Ut(24&~t))?$t(10,t):e;case 10:return 0===(e=Ut(192&~t))?$t(8,t):e;case 8:return 0===(e=Ut(3584&~t))&&(0===(e=Ut(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Ut(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function Ut(e){return e&-e}function zt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Zt(e,t,n){e.pendingLanes|=t;var a=t-1;e.suspendedLanes&=a,e.pingedLanes&=a,(e=e.eventTimes)[t=31-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Vt(e)/Wt|0)|0},Vt=Math.log,Wt=Math.LN2;var Gt=o.unstable_UserBlockingPriority,qt=o.unstable_runWithPriority,Kt=!0;function Yt(e,t,n,a){De||Me();var r=Xt,o=De;De=!0;try{Ie(r,e,t,n,a)}finally{(De=o)||Fe()}}function Qt(e,t,n,a){qt(Gt,Xt.bind(null,e,t,n,a))}function Xt(e,t,n,a){var r;if(Kt)if((r=0==(4&t))&&0<it.length&&-1<pt.indexOf(e))e=gt(null,e,t,n,a),it.push(e);else{var o=Jt(e,t,n,a);if(null===o)r&&mt(e,a);else{if(r){if(-1<pt.indexOf(e))return e=gt(o,e,t,n,a),void it.push(e);if(function(e,t,n,a,r){switch(t){case"focusin":return lt=ht(lt,e,t,n,a,r),!0;case"dragenter":return st=ht(st,e,t,n,a,r),!0;case"mouseover":return ct=ht(ct,e,t,n,a,r),!0;case"pointerover":var o=r.pointerId;return ut.set(o,ht(ut.get(o)||null,e,t,n,a,r)),!0;case"gotpointercapture":return o=r.pointerId,dt.set(o,ht(dt.get(o)||null,e,t,n,a,r)),!0}return!1}(o,e,t,n,a))return;mt(e,a)}Ma(e,t,a,null,n)}}}function Jt(e,t,n,a){var r=Te(a);if(null!==(r=nr(r))){var o=Ye(r);if(null===o)r=null;else{var i=o.tag;if(13===i){if(null!==(r=Qe(o)))return r;r=null}else if(3===i){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;r=null}else o!==r&&(r=null)}}return Ma(e,t,a,r,n),null}var en=null,tn=null,nn=null;function an(){if(nn)return nn;var e,t,n=tn,a=n.length,r="value"in en?en.value:en.textContent,o=r.length;for(e=0;e<a&&n[e]===r[e];e++);var i=a-e;for(t=1;t<=i&&n[a-t]===r[o-t];t++);return nn=r.slice(e,1<t?1-t:void 0)}function rn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function on(){return!0}function ln(){return!1}function sn(e){function t(t,n,a,r,o){for(var i in this._reactName=t,this._targetInst=a,this.type=n,this.nativeEvent=r,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(r):r[i]);return this.isDefaultPrevented=(null!=r.defaultPrevented?r.defaultPrevented:!1===r.returnValue)?on:ln,this.isPropagationStopped=ln,this}return r(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=on)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=on)},persist:function(){},isPersistent:on}),t}var cn,un,dn,fn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=sn(fn),gn=r({},fn,{view:0,detail:0}),mn=sn(gn),hn=r({},gn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:An,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==dn&&(dn&&"mousemove"===e.type?(cn=e.screenX-dn.screenX,un=e.screenY-dn.screenY):un=cn=0,dn=e),cn)},movementY:function(e){return"movementY"in e?e.movementY:un}}),bn=sn(hn),vn=sn(r({},hn,{dataTransfer:0})),yn=sn(r({},gn,{relatedTarget:0})),_n=sn(r({},fn,{animationName:0,elapsedTime:0,pseudoElement:0})),wn=r({},fn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),kn=sn(wn),En=sn(r({},fn,{data:0})),xn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Sn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Tn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Tn[e])&&!!t[e]}function An(){return Cn}var Ln=r({},gn,{key:function(e){if(e.key){var t=xn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=rn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Sn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:An,charCode:function(e){return"keypress"===e.type?rn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?rn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Pn=sn(Ln),Nn=sn(r({},hn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),On=sn(r({},gn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:An})),Rn=sn(r({},fn,{propertyName:0,elapsedTime:0,pseudoElement:0})),In=r({},hn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Mn=sn(In),jn=[9,13,27,32],Dn=d&&"CompositionEvent"in window,Bn=null;d&&"documentMode"in document&&(Bn=document.documentMode);var Fn=d&&"TextEvent"in window&&!Bn,$n=d&&(!Dn||Bn&&8<Bn&&11>=Bn),Un=String.fromCharCode(32),zn=!1;function Zn(e,t){switch(e){case"keyup":return-1!==jn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Vn=!1;var Wn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Gn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Wn[e.type]:"textarea"===t}function qn(e,t,n,a){Ne(a),0<(t=Da(t,"onChange")).length&&(n=new pn("onChange","change",null,n,a),e.push({event:n,listeners:t}))}var Kn=null,Yn=null;function Qn(e){La(e,0)}function Xn(e){if(Q(rr(e)))return e}function Jn(e,t){if("change"===e)return t}var ea=!1;if(d){var ta;if(d){var na="oninput"in document;if(!na){var aa=document.createElement("div");aa.setAttribute("oninput","return;"),na="function"==typeof aa.oninput}ta=na}else ta=!1;ea=ta&&(!document.documentMode||9<document.documentMode)}function ra(){Kn&&(Kn.detachEvent("onpropertychange",oa),Yn=Kn=null)}function oa(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(qn(t,Yn,e,Te(e)),e=Qn,De)e(t);else{De=!0;try{Re(e,t)}finally{De=!1,Fe()}}}}function ia(e,t,n){"focusin"===e?(ra(),Yn=n,(Kn=t).attachEvent("onpropertychange",oa)):"focusout"===e&&ra()}function la(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function sa(e,t){if("click"===e)return Xn(t)}function ca(e,t){if("input"===e||"change"===e)return Xn(t)}var ua="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},da=Object.prototype.hasOwnProperty;function fa(e,t){if(ua(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(a=0;a<n.length;a++)if(!da.call(t,n[a])||!ua(e[n[a]],t[n[a]]))return!1;return!0}function pa(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ga(e,t){var n,a=pa(e);for(e=0;a;){if(3===a.nodeType){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=pa(a)}}function ma(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?ma(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function ha(){for(var e=window,t=X();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(a){n=!1}if(!n)break;t=X((e=t.contentWindow).document)}return t}function ba(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var va=d&&"documentMode"in document&&11>=document.documentMode,ya=null,_a=null,wa=null,ka=!1;function Ea(e,t,n){var a=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;ka||null==ya||ya!==X(a)||("selectionStart"in(a=ya)&&ba(a)?a={start:a.selectionStart,end:a.selectionEnd}:a={anchorNode:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset},wa&&fa(wa,a)||(wa=a,0<(a=Da(_a,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:a}),t.target=ya)))}Mt("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),Mt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),Mt(It,2);for(var xa="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Sa=0;Sa<xa.length;Sa++)Rt.set(xa[Sa],0);u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),c("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),c("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),c("onBeforeInput",["compositionend","keypress","textInput","paste"]),c("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ta="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ca=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ta));function Aa(e,t,n){var a=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,a,r,o,l,s,c){if(Ke.apply(this,arguments),He){if(!He)throw Error(i(198));var u=Ve;He=!1,Ve=null,We||(We=!0,Ge=u)}}(a,t,void 0,e),e.currentTarget=null}function La(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var a=e[n],r=a.event;a=a.listeners;e:{var o=void 0;if(t)for(var i=a.length-1;0<=i;i--){var l=a[i],s=l.instance,c=l.currentTarget;if(l=l.listener,s!==o&&r.isPropagationStopped())break e;Aa(r,l,c),o=s}else for(i=0;i<a.length;i++){if(s=(l=a[i]).instance,c=l.currentTarget,l=l.listener,s!==o&&r.isPropagationStopped())break e;Aa(r,l,c),o=s}}}if(We)throw e=Ge,We=!1,Ge=null,e}function Pa(e,t){var n=ir(t),a=e+"__bubble";n.has(a)||(Ia(t,e,2,!1),n.add(a))}var Na="_reactListening"+Math.random().toString(36).slice(2);function Oa(e){e[Na]||(e[Na]=!0,l.forEach((function(t){Ca.has(t)||Ra(t,!1,e,null),Ra(t,!0,e,null)})))}function Ra(e,t,n,a){var r=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==a&&!t&&Ca.has(e)){if("scroll"!==e)return;r|=2,o=a}var i=ir(o),l=e+"__"+(t?"capture":"bubble");i.has(l)||(t&&(r|=4),Ia(o,e,r,t),i.add(l))}function Ia(e,t,n,a){var r=Rt.get(t);switch(void 0===r?2:r){case 0:r=Yt;break;case 1:r=Qt;break;default:r=Xt}n=r.bind(null,t,n,e),r=void 0,!Ue||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(r=!0),a?void 0!==r?e.addEventListener(t,n,{capture:!0,passive:r}):e.addEventListener(t,n,!0):void 0!==r?e.addEventListener(t,n,{passive:r}):e.addEventListener(t,n,!1)}function Ma(e,t,n,a,r){var o=a;if(0==(1&t)&&0==(2&t)&&null!==a)e:for(;;){if(null===a)return;var i=a.tag;if(3===i||4===i){var l=a.stateNode.containerInfo;if(l===r||8===l.nodeType&&l.parentNode===r)break;if(4===i)for(i=a.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===r||8===s.nodeType&&s.parentNode===r))return;i=i.return}for(;null!==l;){if(null===(i=nr(l)))return;if(5===(s=i.tag)||6===s){a=o=i;continue e}l=l.parentNode}}a=a.return}!function(e,t,n){if(Be)return e(t,n);Be=!0;try{je(e,t,n)}finally{Be=!1,Fe()}}((function(){var a=o,r=Te(n),i=[];e:{var l=Ot.get(e);if(void 0!==l){var s=pn,c=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":s=Pn;break;case"focusin":c="focus",s=yn;break;case"focusout":c="blur",s=yn;break;case"beforeblur":case"afterblur":s=yn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=bn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=vn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=On;break;case At:case Lt:case Pt:s=_n;break;case Nt:s=Rn;break;case"scroll":s=mn;break;case"wheel":s=Mn;break;case"copy":case"cut":case"paste":s=kn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Nn}var u=0!=(4&t),d=!u&&"scroll"===e,f=u?null!==l?l+"Capture":null:l;u=[];for(var p,g=a;null!==g;){var m=(p=g).stateNode;if(5===p.tag&&null!==m&&(p=m,null!==f&&(null!=(m=$e(g,f))&&u.push(ja(g,m,p)))),d)break;g=g.return}0<u.length&&(l=new s(l,c,null,n,r),i.push({event:l,listeners:u}))}}if(0==(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(c=n.relatedTarget||n.fromElement)||!nr(c)&&!c[er])&&(s||l)&&(l=r.window===r?r:(l=r.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=a,null!==(c=(c=n.relatedTarget||n.toElement)?nr(c):null)&&(c!==(d=Ye(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=a),s!==c)){if(u=bn,m="onMouseLeave",f="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(u=Nn,m="onPointerLeave",f="onPointerEnter",g="pointer"),d=null==s?l:rr(s),p=null==c?l:rr(c),(l=new u(m,g+"leave",s,n,r)).target=d,l.relatedTarget=p,m=null,nr(r)===a&&((u=new u(f,g+"enter",c,n,r)).target=p,u.relatedTarget=d,m=u),d=m,s&&c)e:{for(f=c,g=0,p=u=s;p;p=Ba(p))g++;for(p=0,m=f;m;m=Ba(m))p++;for(;0<g-p;)u=Ba(u),g--;for(;0<p-g;)f=Ba(f),p--;for(;g--;){if(u===f||null!==f&&u===f.alternate)break e;u=Ba(u),f=Ba(f)}u=null}else u=null;null!==s&&Fa(i,l,s,u,!1),null!==c&&null!==d&&Fa(i,d,c,u,!0)}if("select"===(s=(l=a?rr(a):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Jn;else if(Gn(l))if(ea)h=ca;else{h=la;var b=ia}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=sa);switch(h&&(h=h(e,a))?qn(i,h,n,r):(b&&b(e,l,a),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&re(l,"number",l.value)),b=a?rr(a):window,e){case"focusin":(Gn(b)||"true"===b.contentEditable)&&(ya=b,_a=a,wa=null);break;case"focusout":wa=_a=ya=null;break;case"mousedown":ka=!0;break;case"contextmenu":case"mouseup":case"dragend":ka=!1,Ea(i,n,r);break;case"selectionchange":if(va)break;case"keydown":case"keyup":Ea(i,n,r)}var v;if(Dn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Vn?Zn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&($n&&"ko"!==n.locale&&(Vn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Vn&&(v=an()):(tn="value"in(en=r)?en.value:en.textContent,Vn=!0)),0<(b=Da(a,y)).length&&(y=new En(y,e,null,n,r),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=Hn(n))&&(y.data=v))),(v=Fn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:(zn=!0,Un);case"textInput":return(e=t.data)===Un&&zn?null:e;default:return null}}(e,n):function(e,t){if(Vn)return"compositionend"===e||!Dn&&Zn(e,t)?(e=an(),nn=tn=en=null,Vn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return $n&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(a=Da(a,"onBeforeInput")).length&&(r=new En("onBeforeInput","beforeinput",null,n,r),i.push({event:r,listeners:a}),r.data=v))}La(i,t)}))}function ja(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Da(e,t){for(var n=t+"Capture",a=[];null!==e;){var r=e,o=r.stateNode;5===r.tag&&null!==o&&(r=o,null!=(o=$e(e,n))&&a.unshift(ja(e,o,r)),null!=(o=$e(e,t))&&a.push(ja(e,o,r))),e=e.return}return a}function Ba(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Fa(e,t,n,a,r){for(var o=t._reactName,i=[];null!==n&&n!==a;){var l=n,s=l.alternate,c=l.stateNode;if(null!==s&&s===a)break;5===l.tag&&null!==c&&(l=c,r?null!=(s=$e(n,o))&&i.unshift(ja(n,s,l)):r||null!=(s=$e(n,o))&&i.push(ja(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function $a(){}var Ua=null,za=null;function Za(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Ha(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Va="function"==typeof setTimeout?setTimeout:void 0,Wa="function"==typeof clearTimeout?clearTimeout:void 0;function Ga(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qa(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Ka(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Ya=0;var Qa=Math.random().toString(36).slice(2),Xa="__reactFiber$"+Qa,Ja="__reactProps$"+Qa,er="__reactContainer$"+Qa,tr="__reactEvents$"+Qa;function nr(e){var t=e[Xa];if(t)return t;for(var n=e.parentNode;n;){if(t=n[er]||n[Xa]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Ka(e);null!==e;){if(n=e[Xa])return n;e=Ka(e)}return t}n=(e=n).parentNode}return null}function ar(e){return!(e=e[Xa]||e[er])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function rr(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function or(e){return e[Ja]||null}function ir(e){var t=e[tr];return void 0===t&&(t=e[tr]=new Set),t}var lr=[],sr=-1;function cr(e){return{current:e}}function ur(e){0>sr||(e.current=lr[sr],lr[sr]=null,sr--)}function dr(e,t){sr++,lr[sr]=e.current,e.current=t}var fr={},pr=cr(fr),gr=cr(!1),mr=fr;function hr(e,t){var n=e.type.contextTypes;if(!n)return fr;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var r,o={};for(r in n)o[r]=t[r];return a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function br(e){return null!=(e=e.childContextTypes)}function vr(){ur(gr),ur(pr)}function yr(e,t,n){if(pr.current!==fr)throw Error(i(168));dr(pr,t),dr(gr,n)}function _r(e,t,n){var a=e.stateNode;if(e=t.childContextTypes,"function"!=typeof a.getChildContext)return n;for(var o in a=a.getChildContext())if(!(o in e))throw Error(i(108,G(t)||"Unknown",o));return r({},n,a)}function wr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||fr,mr=pr.current,dr(pr,e),dr(gr,gr.current),!0}function kr(e,t,n){var a=e.stateNode;if(!a)throw Error(i(169));n?(e=_r(e,t,mr),a.__reactInternalMemoizedMergedChildContext=e,ur(gr),ur(pr),dr(pr,e)):ur(gr),dr(gr,n)}var Er=null,xr=null,Sr=o.unstable_runWithPriority,Tr=o.unstable_scheduleCallback,Cr=o.unstable_cancelCallback,Ar=o.unstable_shouldYield,Lr=o.unstable_requestPaint,Pr=o.unstable_now,Nr=o.unstable_getCurrentPriorityLevel,Or=o.unstable_ImmediatePriority,Rr=o.unstable_UserBlockingPriority,Ir=o.unstable_NormalPriority,Mr=o.unstable_LowPriority,jr=o.unstable_IdlePriority,Dr={},Br=void 0!==Lr?Lr:function(){},Fr=null,$r=null,Ur=!1,zr=Pr(),Zr=1e4>zr?Pr:function(){return Pr()-zr};function Hr(){switch(Nr()){case Or:return 99;case Rr:return 98;case Ir:return 97;case Mr:return 96;case jr:return 95;default:throw Error(i(332))}}function Vr(e){switch(e){case 99:return Or;case 98:return Rr;case 97:return Ir;case 96:return Mr;case 95:return jr;default:throw Error(i(332))}}function Wr(e,t){return e=Vr(e),Sr(e,t)}function Gr(e,t,n){return e=Vr(e),Tr(e,t,n)}function qr(){if(null!==$r){var e=$r;$r=null,Cr(e)}Kr()}function Kr(){if(!Ur&&null!==Fr){Ur=!0;var e=0;try{var t=Fr;Wr(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fr=null}catch(n){throw null!==Fr&&(Fr=Fr.slice(e+1)),Tr(Or,qr),n}finally{Ur=!1}}}var Yr=w.ReactCurrentBatchConfig;function Qr(e,t){if(e&&e.defaultProps){for(var n in t=r({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Xr=cr(null),Jr=null,eo=null,to=null;function no(){to=eo=Jr=null}function ao(e){var t=Xr.current;ur(Xr),e.type._context._currentValue=t}function ro(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function oo(e,t){Jr=e,to=eo=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Di=!0),e.firstContext=null)}function io(e,t){if(to!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(to=e,t=1073741823),t={context:e,observedBits:t,next:null},null===eo){if(null===Jr)throw Error(i(308));eo=t,Jr.dependencies={lanes:0,firstContext:t,responders:null}}else eo=eo.next=t;return e._currentValue}var lo=!1;function so(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function co(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function uo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function fo(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function po(e,t){var n=e.updateQueue,a=e.alternate;if(null!==a&&n===(a=a.updateQueue)){var r=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?r=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?r=o=t:o=o.next=t}else r=o=t;return n={baseState:a.baseState,firstBaseUpdate:r,lastBaseUpdate:o,shared:a.shared,effects:a.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function go(e,t,n,a){var o=e.updateQueue;lo=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var c=s,u=c.next;c.next=null,null===l?i=u:l.next=u,l=c;var d=e.alternate;if(null!==d){var f=(d=d.updateQueue).lastBaseUpdate;f!==l&&(null===f?d.firstBaseUpdate=u:f.next=u,d.lastBaseUpdate=c)}}if(null!==i){for(f=o.baseState,l=0,d=u=c=null;;){s=i.lane;var p=i.eventTime;if((a&s)===s){null!==d&&(d=d.next={eventTime:p,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var g=e,m=i;switch(s=t,p=n,m.tag){case 1:if("function"==typeof(g=m.payload)){f=g.call(p,f,s);break e}f=g;break e;case 3:g.flags=-4097&g.flags|64;case 0:if(null==(s="function"==typeof(g=m.payload)?g.call(p,f,s):g))break e;f=r({},f,s);break e;case 2:lo=!0}}null!==i.callback&&(e.flags|=32,null===(s=o.effects)?o.effects=[i]:s.push(i))}else p={eventTime:p,lane:s,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(u=d=p,c=f):d=d.next=p,l|=s;if(null===(i=i.next)){if(null===(s=o.shared.pending))break;i=s.next,s.next=null,o.lastBaseUpdate=s,o.shared.pending=null}}null===d&&(c=f),o.baseState=c,o.firstBaseUpdate=u,o.lastBaseUpdate=d,Ul|=l,e.lanes=l,e.memoizedState=f}}function mo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var a=e[t],r=a.callback;if(null!==r){if(a.callback=null,a=n,"function"!=typeof r)throw Error(i(191,r));r.call(a)}}}var ho=(new a.Component).refs;function bo(e,t,n,a){n=null==(n=n(a,t=e.memoizedState))?t:r({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var vo={isMounted:function(e){return!!(e=e._reactInternals)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var a=fs(),r=ps(e),o=uo(a,r);o.payload=t,null!=n&&(o.callback=n),fo(e,o),gs(e,r,a)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var a=fs(),r=ps(e),o=uo(a,r);o.tag=1,o.payload=t,null!=n&&(o.callback=n),fo(e,o),gs(e,r,a)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=fs(),a=ps(e),r=uo(n,a);r.tag=2,null!=t&&(r.callback=t),fo(e,r),gs(e,a,n)}};function yo(e,t,n,a,r,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(a,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!fa(n,a)||!fa(r,o))}function _o(e,t,n){var a=!1,r=fr,o=t.contextType;return"object"==typeof o&&null!==o?o=io(o):(r=br(t)?mr:pr.current,o=(a=null!=(a=t.contextTypes))?hr(e,r):fr),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=vo,e.stateNode=t,t._reactInternals=e,a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=o),t}function wo(e,t,n,a){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,a),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,a),t.state!==e&&vo.enqueueReplaceState(t,t.state,null)}function ko(e,t,n,a){var r=e.stateNode;r.props=n,r.state=e.memoizedState,r.refs=ho,so(e);var o=t.contextType;"object"==typeof o&&null!==o?r.context=io(o):(o=br(t)?mr:pr.current,r.context=hr(e,o)),go(e,n,r,a),r.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(bo(e,t,o,n),r.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof r.getSnapshotBeforeUpdate||"function"!=typeof r.UNSAFE_componentWillMount&&"function"!=typeof r.componentWillMount||(t=r.state,"function"==typeof r.componentWillMount&&r.componentWillMount(),"function"==typeof r.UNSAFE_componentWillMount&&r.UNSAFE_componentWillMount(),t!==r.state&&vo.enqueueReplaceState(r,r.state,null),go(e,n,r,a),r.state=e.memoizedState),"function"==typeof r.componentDidMount&&(e.flags|=4)}var Eo=Array.isArray;function xo(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var a=n.stateNode}if(!a)throw Error(i(147,e));var r=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===r?t.ref:(t=function(e){var t=a.refs;t===ho&&(t=a.refs={}),null===e?delete t[r]:t[r]=e},t._stringRef=r,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function So(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function To(e){function t(t,n){if(e){var a=t.lastEffect;null!==a?(a.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,a){if(!e)return null;for(;null!==a;)t(n,a),a=a.sibling;return null}function a(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function r(e,t){return(e=Ws(e,t)).index=0,e.sibling=null,e}function o(t,n,a){return t.index=a,e?null!==(a=t.alternate)?(a=a.index)<n?(t.flags=2,n):a:(t.flags=2,n):n}function l(t){return e&&null===t.alternate&&(t.flags=2),t}function s(e,t,n,a){return null===t||6!==t.tag?((t=Ys(n,e.mode,a)).return=e,t):((t=r(t,n)).return=e,t)}function c(e,t,n,a){return null!==t&&t.elementType===n.type?((a=r(t,n.props)).ref=xo(e,t,n),a.return=e,a):((a=Gs(n.type,n.key,n.props,null,e.mode,a)).ref=xo(e,t,n),a.return=e,a)}function u(e,t,n,a){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Qs(n,e.mode,a)).return=e,t):((t=r(t,n.children||[])).return=e,t)}function d(e,t,n,a,o){return null===t||7!==t.tag?((t=qs(n,e.mode,a,o)).return=e,t):((t=r(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Ys(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Gs(t.type,t.key,t.props,null,e.mode,n)).ref=xo(e,null,t),n.return=e,n;case E:return(t=Qs(t,e.mode,n)).return=e,t}if(Eo(t)||z(t))return(t=qs(t,e.mode,n,null)).return=e,t;So(e,t)}return null}function p(e,t,n,a){var r=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==r?null:s(e,t,""+n,a);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===r?n.type===x?d(e,t,n.props.children,a,r):c(e,t,n,a):null;case E:return n.key===r?u(e,t,n,a):null}if(Eo(n)||z(n))return null!==r?null:d(e,t,n,a,null);So(e,n)}return null}function g(e,t,n,a,r){if("string"==typeof a||"number"==typeof a)return s(t,e=e.get(n)||null,""+a,r);if("object"==typeof a&&null!==a){switch(a.$$typeof){case k:return e=e.get(null===a.key?n:a.key)||null,a.type===x?d(t,e,a.props.children,r,a.key):c(t,e,a,r);case E:return u(t,e=e.get(null===a.key?n:a.key)||null,a,r)}if(Eo(a)||z(a))return d(t,e=e.get(n)||null,a,r,null);So(t,a)}return null}function m(r,i,l,s){for(var c=null,u=null,d=i,m=i=0,h=null;null!==d&&m<l.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var b=p(r,d,l[m],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(r,d),i=o(b,i,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===l.length)return n(r,d),c;if(null===d){for(;m<l.length;m++)null!==(d=f(r,l[m],s))&&(i=o(d,i,m),null===u?c=d:u.sibling=d,u=d);return c}for(d=a(r,d);m<l.length;m++)null!==(h=g(d,r,m,l[m],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),i=o(h,i,m),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(r,e)})),c}function h(r,l,s,c){var u=z(s);if("function"!=typeof u)throw Error(i(150));if(null==(s=u.call(s)))throw Error(i(151));for(var d=u=null,m=l,h=l=0,b=null,v=s.next();null!==m&&!v.done;h++,v=s.next()){m.index>h?(b=m,m=null):b=m.sibling;var y=p(r,m,v.value,c);if(null===y){null===m&&(m=b);break}e&&m&&null===y.alternate&&t(r,m),l=o(y,l,h),null===d?u=y:d.sibling=y,d=y,m=b}if(v.done)return n(r,m),u;if(null===m){for(;!v.done;h++,v=s.next())null!==(v=f(r,v.value,c))&&(l=o(v,l,h),null===d?u=v:d.sibling=v,d=v);return u}for(m=a(r,m);!v.done;h++,v=s.next())null!==(v=g(m,r,h,v.value,c))&&(e&&null!==v.alternate&&m.delete(null===v.key?h:v.key),l=o(v,l,h),null===d?u=v:d.sibling=v,d=v);return e&&m.forEach((function(e){return t(r,e)})),u}return function(e,a,o,s){var c="object"==typeof o&&null!==o&&o.type===x&&null===o.key;c&&(o=o.props.children);var u="object"==typeof o&&null!==o;if(u)switch(o.$$typeof){case k:e:{for(u=o.key,c=a;null!==c;){if(c.key===u){if(7===c.tag){if(o.type===x){n(e,c.sibling),(a=r(c,o.props.children)).return=e,e=a;break e}}else if(c.elementType===o.type){n(e,c.sibling),(a=r(c,o.props)).ref=xo(e,c,o),a.return=e,e=a;break e}n(e,c);break}t(e,c),c=c.sibling}o.type===x?((a=qs(o.props.children,e.mode,s,o.key)).return=e,e=a):((s=Gs(o.type,o.key,o.props,null,e.mode,s)).ref=xo(e,a,o),s.return=e,e=s)}return l(e);case E:e:{for(c=o.key;null!==a;){if(a.key===c){if(4===a.tag&&a.stateNode.containerInfo===o.containerInfo&&a.stateNode.implementation===o.implementation){n(e,a.sibling),(a=r(a,o.children||[])).return=e,e=a;break e}n(e,a);break}t(e,a),a=a.sibling}(a=Qs(o,e.mode,s)).return=e,e=a}return l(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==a&&6===a.tag?(n(e,a.sibling),(a=r(a,o)).return=e,e=a):(n(e,a),(a=Ys(o,e.mode,s)).return=e,e=a),l(e);if(Eo(o))return m(e,a,o,s);if(z(o))return h(e,a,o,s);if(u&&So(e,o),void 0===o&&!c)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,G(e.type)||"Component"))}return n(e,a)}}var Co=To(!0),Ao=To(!1),Lo={},Po=cr(Lo),No=cr(Lo),Oo=cr(Lo);function Ro(e){if(e===Lo)throw Error(i(174));return e}function Io(e,t){switch(dr(Oo,t),dr(No,e),dr(Po,Lo),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:ge(null,"");break;default:t=ge(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ur(Po),dr(Po,t)}function Mo(){ur(Po),ur(No),ur(Oo)}function jo(e){Ro(Oo.current);var t=Ro(Po.current),n=ge(t,e.type);t!==n&&(dr(No,e),dr(Po,n))}function Do(e){No.current===e&&(ur(Po),ur(No))}var Bo=cr(0);function Fo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var $o=null,Uo=null,zo=!1;function Zo(e,t){var n=Hs(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ho(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Vo(e){if(zo){var t=Uo;if(t){var n=t;if(!Ho(e,t)){if(!(t=qa(n.nextSibling))||!Ho(e,t))return e.flags=-1025&e.flags|2,zo=!1,void($o=e);Zo($o,n)}$o=e,Uo=qa(t.firstChild)}else e.flags=-1025&e.flags|2,zo=!1,$o=e}}function Wo(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;$o=e}function Go(e){if(e!==$o)return!1;if(!zo)return Wo(e),zo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Ha(t,e.memoizedProps))for(t=Uo;t;)Zo(e,t),t=qa(t.nextSibling);if(Wo(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){Uo=qa(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Uo=null}}else Uo=$o?qa(e.stateNode.nextSibling):null;return!0}function qo(){Uo=$o=null,zo=!1}var Ko=[];function Yo(){for(var e=0;e<Ko.length;e++)Ko[e]._workInProgressVersionPrimary=null;Ko.length=0}var Qo=w.ReactCurrentDispatcher,Xo=w.ReactCurrentBatchConfig,Jo=0,ei=null,ti=null,ni=null,ai=!1,ri=!1;function oi(){throw Error(i(321))}function ii(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ua(e[n],t[n]))return!1;return!0}function li(e,t,n,a,r,o){if(Jo=o,ei=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Qo.current=null===e||null===e.memoizedState?Ri:Ii,e=n(a,r),ri){o=0;do{if(ri=!1,!(25>o))throw Error(i(301));o+=1,ni=ti=null,t.updateQueue=null,Qo.current=Mi,e=n(a,r)}while(ri)}if(Qo.current=Oi,t=null!==ti&&null!==ti.next,Jo=0,ni=ti=ei=null,ai=!1,t)throw Error(i(300));return e}function si(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ni?ei.memoizedState=ni=e:ni=ni.next=e,ni}function ci(){if(null===ti){var e=ei.alternate;e=null!==e?e.memoizedState:null}else e=ti.next;var t=null===ni?ei.memoizedState:ni.next;if(null!==t)ni=t,ti=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ti=e).memoizedState,baseState:ti.baseState,baseQueue:ti.baseQueue,queue:ti.queue,next:null},null===ni?ei.memoizedState=ni=e:ni=ni.next=e}return ni}function ui(e,t){return"function"==typeof t?t(e):t}function di(e){var t=ci(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var a=ti,r=a.baseQueue,o=n.pending;if(null!==o){if(null!==r){var l=r.next;r.next=o.next,o.next=l}a.baseQueue=r=o,n.pending=null}if(null!==r){r=r.next,a=a.baseState;var s=l=o=null,c=r;do{var u=c.lane;if((Jo&u)===u)null!==s&&(s=s.next={lane:0,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null}),a=c.eagerReducer===e?c.eagerState:e(a,c.action);else{var d={lane:u,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null};null===s?(l=s=d,o=a):s=s.next=d,ei.lanes|=u,Ul|=u}c=c.next}while(null!==c&&c!==r);null===s?o=a:s.next=l,ua(a,t.memoizedState)||(Di=!0),t.memoizedState=a,t.baseState=o,t.baseQueue=s,n.lastRenderedState=a}return[t.memoizedState,n.dispatch]}function fi(e){var t=ci(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var a=n.dispatch,r=n.pending,o=t.memoizedState;if(null!==r){n.pending=null;var l=r=r.next;do{o=e(o,l.action),l=l.next}while(l!==r);ua(o,t.memoizedState)||(Di=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,a]}function pi(e,t,n){var a=t._getVersion;a=a(t._source);var r=t._workInProgressVersionPrimary;if(null!==r?e=r===a:(e=e.mutableReadLanes,(e=(Jo&e)===e)&&(t._workInProgressVersionPrimary=a,Ko.push(t))),e)return n(t._source);throw Ko.push(t),Error(i(350))}function gi(e,t,n,a){var r=Rl;if(null===r)throw Error(i(349));var o=t._getVersion,l=o(t._source),s=Qo.current,c=s.useState((function(){return pi(r,t,n)})),u=c[1],d=c[0];c=ni;var f=e.memoizedState,p=f.refs,g=p.getSnapshot,m=f.source;f=f.subscribe;var h=ei;return e.memoizedState={refs:p,source:t,subscribe:a},s.useEffect((function(){p.getSnapshot=n,p.setSnapshot=u;var e=o(t._source);if(!ua(l,e)){e=n(t._source),ua(d,e)||(u(e),e=ps(h),r.mutableReadLanes|=e&r.pendingLanes),e=r.mutableReadLanes,r.entangledLanes|=e;for(var a=r.entanglements,i=e;0<i;){var s=31-Ht(i),c=1<<s;a[s]|=e,i&=~c}}}),[n,t,a]),s.useEffect((function(){return a(t._source,(function(){var e=p.getSnapshot,n=p.setSnapshot;try{n(e(t._source));var a=ps(h);r.mutableReadLanes|=a&r.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,a]),ua(g,n)&&ua(m,t)&&ua(f,a)||((e={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:d}).dispatch=u=Ni.bind(null,ei,e),c.queue=e,c.baseQueue=null,d=pi(r,t,n),c.memoizedState=c.baseState=d),d}function mi(e,t,n){return gi(ci(),e,t,n)}function hi(e){var t=si();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:e}).dispatch=Ni.bind(null,ei,e),[t.memoizedState,e]}function bi(e,t,n,a){return e={tag:e,create:t,destroy:n,deps:a,next:null},null===(t=ei.updateQueue)?(t={lastEffect:null},ei.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(a=n.next,n.next=e,e.next=a,t.lastEffect=e),e}function vi(e){return e={current:e},si().memoizedState=e}function yi(){return ci().memoizedState}function _i(e,t,n,a){var r=si();ei.flags|=e,r.memoizedState=bi(1|t,n,void 0,void 0===a?null:a)}function wi(e,t,n,a){var r=ci();a=void 0===a?null:a;var o=void 0;if(null!==ti){var i=ti.memoizedState;if(o=i.destroy,null!==a&&ii(a,i.deps))return void bi(t,n,o,a)}ei.flags|=e,r.memoizedState=bi(1|t,n,o,a)}function ki(e,t){return _i(516,4,e,t)}function Ei(e,t){return wi(516,4,e,t)}function xi(e,t){return wi(4,2,e,t)}function Si(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Ti(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,Si.bind(null,t,e),n)}function Ci(){}function Ai(e,t){var n=ci();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&ii(t,a[1])?a[0]:(n.memoizedState=[e,t],e)}function Li(e,t){var n=ci();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&ii(t,a[1])?a[0]:(e=e(),n.memoizedState=[e,t],e)}function Pi(e,t){var n=Hr();Wr(98>n?98:n,(function(){e(!0)})),Wr(97<n?97:n,(function(){var n=Xo.transition;Xo.transition=1;try{e(!1),t()}finally{Xo.transition=n}}))}function Ni(e,t,n){var a=fs(),r=ps(e),o={lane:r,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?o.next=o:(o.next=i.next,i.next=o),t.pending=o,i=e.alternate,e===ei||null!==i&&i===ei)ri=ai=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var l=t.lastRenderedState,s=i(l,n);if(o.eagerReducer=i,o.eagerState=s,ua(s,l))return}catch(c){}gs(e,r,a)}}var Oi={readContext:io,useCallback:oi,useContext:oi,useEffect:oi,useImperativeHandle:oi,useLayoutEffect:oi,useMemo:oi,useReducer:oi,useRef:oi,useState:oi,useDebugValue:oi,useDeferredValue:oi,useTransition:oi,useMutableSource:oi,useOpaqueIdentifier:oi,unstable_isNewReconciler:!1},Ri={readContext:io,useCallback:function(e,t){return si().memoizedState=[e,void 0===t?null:t],e},useContext:io,useEffect:ki,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,_i(4,2,Si.bind(null,t,e),n)},useLayoutEffect:function(e,t){return _i(4,2,e,t)},useMemo:function(e,t){var n=si();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var a=si();return t=void 0!==n?n(t):t,a.memoizedState=a.baseState=t,e=(e=a.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Ni.bind(null,ei,e),[a.memoizedState,e]},useRef:vi,useState:hi,useDebugValue:Ci,useDeferredValue:function(e){var t=hi(e),n=t[0],a=t[1];return ki((function(){var t=Xo.transition;Xo.transition=1;try{a(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=hi(!1),t=e[0];return vi(e=Pi.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var a=si();return a.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},gi(a,e,t,n)},useOpaqueIdentifier:function(){if(zo){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Ya++).toString(36))),Error(i(355))})),n=hi(t)[1];return 0==(2&ei.mode)&&(ei.flags|=516,bi(5,(function(){n("r:"+(Ya++).toString(36))}),void 0,null)),t}return hi(t="r:"+(Ya++).toString(36)),t},unstable_isNewReconciler:!1},Ii={readContext:io,useCallback:Ai,useContext:io,useEffect:Ei,useImperativeHandle:Ti,useLayoutEffect:xi,useMemo:Li,useReducer:di,useRef:yi,useState:function(){return di(ui)},useDebugValue:Ci,useDeferredValue:function(e){var t=di(ui),n=t[0],a=t[1];return Ei((function(){var t=Xo.transition;Xo.transition=1;try{a(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=di(ui)[0];return[yi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return di(ui)[0]},unstable_isNewReconciler:!1},Mi={readContext:io,useCallback:Ai,useContext:io,useEffect:Ei,useImperativeHandle:Ti,useLayoutEffect:xi,useMemo:Li,useReducer:fi,useRef:yi,useState:function(){return fi(ui)},useDebugValue:Ci,useDeferredValue:function(e){var t=fi(ui),n=t[0],a=t[1];return Ei((function(){var t=Xo.transition;Xo.transition=1;try{a(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=fi(ui)[0];return[yi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return fi(ui)[0]},unstable_isNewReconciler:!1},ji=w.ReactCurrentOwner,Di=!1;function Bi(e,t,n,a){t.child=null===e?Ao(t,null,n,a):Co(t,e.child,n,a)}function Fi(e,t,n,a,r){n=n.render;var o=t.ref;return oo(t,r),a=li(e,t,n,a,o,r),null===e||Di?(t.flags|=1,Bi(e,t,a,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,ol(e,t,r))}function $i(e,t,n,a,r,o){if(null===e){var i=n.type;return"function"!=typeof i||Vs(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Gs(n.type,null,a,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,Ui(e,t,i,a,r,o))}return i=e.child,0==(r&o)&&(r=i.memoizedProps,(n=null!==(n=n.compare)?n:fa)(r,a)&&e.ref===t.ref)?ol(e,t,o):(t.flags|=1,(e=Ws(i,a)).ref=t.ref,e.return=t,t.child=e)}function Ui(e,t,n,a,r,o){if(null!==e&&fa(e.memoizedProps,a)&&e.ref===t.ref){if(Di=!1,0==(o&r))return t.lanes=e.lanes,ol(e,t,o);0!=(16384&e.flags)&&(Di=!0)}return Hi(e,t,n,a,o)}function zi(e,t,n){var a=t.pendingProps,r=a.children,o=null!==e?e.memoizedState:null;if("hidden"===a.mode||"unstable-defer-without-hiding"===a.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},ks(t,n);else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},ks(t,e),null;t.memoizedState={baseLanes:0},ks(t,null!==o?o.baseLanes:n)}else null!==o?(a=o.baseLanes|n,t.memoizedState=null):a=n,ks(t,a);return Bi(e,t,r,n),t.child}function Zi(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Hi(e,t,n,a,r){var o=br(n)?mr:pr.current;return o=hr(t,o),oo(t,r),n=li(e,t,n,a,o,r),null===e||Di?(t.flags|=1,Bi(e,t,n,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,ol(e,t,r))}function Vi(e,t,n,a,r){if(br(n)){var o=!0;wr(t)}else o=!1;if(oo(t,r),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),_o(t,n,a),ko(t,n,a,r),a=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=io(c):c=hr(t,c=br(n)?mr:pr.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==a||s!==c)&&wo(t,i,a,c),lo=!1;var f=t.memoizedState;i.state=f,go(t,a,i,r),s=t.memoizedState,l!==a||f!==s||gr.current||lo?("function"==typeof u&&(bo(t,n,u,a),s=t.memoizedState),(l=lo||yo(t,n,l,a,f,s,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=a,t.memoizedState=s),i.props=a,i.state=s,i.context=c,a=l):("function"==typeof i.componentDidMount&&(t.flags|=4),a=!1)}else{i=t.stateNode,co(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:Qr(t.type,l),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=io(s):s=hr(t,s=br(n)?mr:pr.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==s)&&wo(t,i,a,s),lo=!1,f=t.memoizedState,i.state=f,go(t,a,i,r);var g=t.memoizedState;l!==d||f!==g||gr.current||lo?("function"==typeof p&&(bo(t,n,p,a),g=t.memoizedState),(c=lo||yo(t,n,c,a,f,g,s))?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(a,g,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(a,g,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=a,t.memoizedState=g),i.props=a,i.state=g,i.context=s,a=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),a=!1)}return Wi(e,t,n,a,o,r)}function Wi(e,t,n,a,r,o){Zi(e,t);var i=0!=(64&t.flags);if(!a&&!i)return r&&kr(t,n,!1),ol(e,t,o);a=t.stateNode,ji.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:a.render();return t.flags|=1,null!==e&&i?(t.child=Co(t,e.child,null,o),t.child=Co(t,null,l,o)):Bi(e,t,l,o),t.memoizedState=a.state,r&&kr(t,n,!0),t.child}function Gi(e){var t=e.stateNode;t.pendingContext?yr(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yr(0,t.context,!1),Io(e,t.containerInfo)}var qi,Ki,Yi,Qi={dehydrated:null,retryLane:0};function Xi(e,t,n){var a,r=t.pendingProps,o=Bo.current,i=!1;return(a=0!=(64&t.flags))||(a=(null===e||null!==e.memoizedState)&&0!=(2&o)),a?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===r.fallback||!0===r.unstable_avoidThisFallback||(o|=1),dr(Bo,1&o),null===e?(void 0!==r.fallback&&Vo(t),e=r.children,o=r.fallback,i?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,e):"number"==typeof r.unstable_expectedLoadTime?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,t.lanes=33554432,e):((n=Ks({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(r=tl(e,t,r.children,r.fallback,n),i=t.child,o=e.child.memoizedState,i.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Qi,r):(n=el(e,t,r.children,n),t.memoizedState=null,n))}function Ji(e,t,n,a){var r=e.mode,o=e.child;return t={mode:"hidden",children:t},0==(2&r)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=Ks(t,r,0,null),n=qs(n,r,a,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function el(e,t,n,a){var r=e.child;return e=r.sibling,n=Ws(r,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=a),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function tl(e,t,n,a,r){var o=t.mode,i=e.child;e=i.sibling;var l={mode:"hidden",children:n};return 0==(2&o)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=l,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Ws(i,l),null!==e?a=Ws(e,a):(a=qs(a,o,r,null)).flags|=2,a.return=t,n.return=t,n.sibling=a,t.child=n,a}function nl(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ro(e.return,t)}function al(e,t,n,a,r,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:n,tailMode:r,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=a,i.tail=n,i.tailMode=r,i.lastEffect=o)}function rl(e,t,n){var a=t.pendingProps,r=a.revealOrder,o=a.tail;if(Bi(e,t,a.children,n),0!=(2&(a=Bo.current)))a=1&a|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&nl(e,n);else if(19===e.tag)nl(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}if(dr(Bo,a),0==(2&t.mode))t.memoizedState=null;else switch(r){case"forwards":for(n=t.child,r=null;null!==n;)null!==(e=n.alternate)&&null===Fo(e)&&(r=n),n=n.sibling;null===(n=r)?(r=t.child,t.child=null):(r=n.sibling,n.sibling=null),al(t,!1,r,n,o,t.lastEffect);break;case"backwards":for(n=null,r=t.child,t.child=null;null!==r;){if(null!==(e=r.alternate)&&null===Fo(e)){t.child=r;break}e=r.sibling,r.sibling=n,n=r,r=e}al(t,!0,n,null,o,t.lastEffect);break;case"together":al(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function ol(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ul|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Ws(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Ws(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function il(e,t){if(!zo)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var a=null;null!==n;)null!==n.alternate&&(a=n),n=n.sibling;null===a?t||null===e.tail?e.tail=null:e.tail.sibling=null:a.sibling=null}}function ll(e,t,n){var a=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return br(t.type)&&vr(),null;case 3:return Mo(),ur(gr),ur(pr),Yo(),(a=t.stateNode).pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),null!==e&&null!==e.child||(Go(t)?t.flags|=4:a.hydrate||(t.flags|=256)),null;case 5:Do(t);var o=Ro(Oo.current);if(n=t.type,null!==e&&null!=t.stateNode)Ki(e,t,n,a),e.ref!==t.ref&&(t.flags|=128);else{if(!a){if(null===t.stateNode)throw Error(i(166));return null}if(e=Ro(Po.current),Go(t)){a=t.stateNode,n=t.type;var l=t.memoizedProps;switch(a[Xa]=t,a[Ja]=l,n){case"dialog":Pa("cancel",a),Pa("close",a);break;case"iframe":case"object":case"embed":Pa("load",a);break;case"video":case"audio":for(e=0;e<Ta.length;e++)Pa(Ta[e],a);break;case"source":Pa("error",a);break;case"img":case"image":case"link":Pa("error",a),Pa("load",a);break;case"details":Pa("toggle",a);break;case"input":ee(a,l),Pa("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!l.multiple},Pa("invalid",a);break;case"textarea":se(a,l),Pa("invalid",a)}for(var c in xe(n,l),e=null,l)l.hasOwnProperty(c)&&(o=l[c],"children"===c?"string"==typeof o?a.textContent!==o&&(e=["children",o]):"number"==typeof o&&a.textContent!==""+o&&(e=["children",""+o]):s.hasOwnProperty(c)&&null!=o&&"onScroll"===c&&Pa("scroll",a));switch(n){case"input":Y(a),ae(a,l,!0);break;case"textarea":Y(a),ue(a);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(a.onclick=$a)}a=e,t.updateQueue=a,null!==a&&(t.flags|=4)}else{switch(c=9===o.nodeType?o:o.ownerDocument,e===de&&(e=pe(n)),e===de?"script"===n?((e=c.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof a.is?e=c.createElement(n,{is:a.is}):(e=c.createElement(n),"select"===n&&(c=e,a.multiple?c.multiple=!0:a.size&&(c.size=a.size))):e=c.createElementNS(e,n),e[Xa]=t,e[Ja]=a,qi(e,t),t.stateNode=e,c=Se(n,a),n){case"dialog":Pa("cancel",e),Pa("close",e),o=a;break;case"iframe":case"object":case"embed":Pa("load",e),o=a;break;case"video":case"audio":for(o=0;o<Ta.length;o++)Pa(Ta[o],e);o=a;break;case"source":Pa("error",e),o=a;break;case"img":case"image":case"link":Pa("error",e),Pa("load",e),o=a;break;case"details":Pa("toggle",e),o=a;break;case"input":ee(e,a),o=J(e,a),Pa("invalid",e);break;case"option":o=oe(e,a);break;case"select":e._wrapperState={wasMultiple:!!a.multiple},o=r({},a,{value:void 0}),Pa("invalid",e);break;case"textarea":se(e,a),o=le(e,a),Pa("invalid",e);break;default:o=a}xe(n,o);var u=o;for(l in u)if(u.hasOwnProperty(l)){var d=u[l];"style"===l?ke(e,d):"dangerouslySetInnerHTML"===l?null!=(d=d?d.__html:void 0)&&be(e,d):"children"===l?"string"==typeof d?("textarea"!==n||""!==d)&&ve(e,d):"number"==typeof d&&ve(e,""+d):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(s.hasOwnProperty(l)?null!=d&&"onScroll"===l&&Pa("scroll",e):null!=d&&_(e,l,d,c))}switch(n){case"input":Y(e),ae(e,a,!1);break;case"textarea":Y(e),ue(e);break;case"option":null!=a.value&&e.setAttribute("value",""+q(a.value));break;case"select":e.multiple=!!a.multiple,null!=(l=a.value)?ie(e,!!a.multiple,l,!1):null!=a.defaultValue&&ie(e,!!a.multiple,a.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=$a)}Za(n,a)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Yi(0,t,e.memoizedProps,a);else{if("string"!=typeof a&&null===t.stateNode)throw Error(i(166));n=Ro(Oo.current),Ro(Po.current),Go(t)?(a=t.stateNode,n=t.memoizedProps,a[Xa]=t,a.nodeValue!==n&&(t.flags|=4)):((a=(9===n.nodeType?n:n.ownerDocument).createTextNode(a))[Xa]=t,t.stateNode=a)}return null;case 13:return ur(Bo),a=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(a=null!==a,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Go(t):n=null!==e.memoizedState,a&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Bo.current)?0===Bl&&(Bl=3):(0!==Bl&&3!==Bl||(Bl=4),null===Rl||0==(134217727&Ul)&&0==(134217727&zl)||vs(Rl,Ml))),(a||n)&&(t.flags|=4),null);case 4:return Mo(),null===e&&Oa(t.stateNode.containerInfo),null;case 10:return ao(t),null;case 19:if(ur(Bo),null===(a=t.memoizedState))return null;if(l=0!=(64&t.flags),null===(c=a.rendering))if(l)il(a,!1);else{if(0!==Bl||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(c=Fo(e))){for(t.flags|=64,il(a,!1),null!==(l=c.updateQueue)&&(t.updateQueue=l,t.flags|=4),null===a.lastEffect&&(t.firstEffect=null),t.lastEffect=a.lastEffect,a=n,n=t.child;null!==n;)e=a,(l=n).flags&=2,l.nextEffect=null,l.firstEffect=null,l.lastEffect=null,null===(c=l.alternate)?(l.childLanes=0,l.lanes=e,l.child=null,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return dr(Bo,1&Bo.current|2),t.child}e=e.sibling}null!==a.tail&&Zr()>Wl&&(t.flags|=64,l=!0,il(a,!1),t.lanes=33554432)}else{if(!l)if(null!==(e=Fo(c))){if(t.flags|=64,l=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),il(a,!0),null===a.tail&&"hidden"===a.tailMode&&!c.alternate&&!zo)return null!==(t=t.lastEffect=a.lastEffect)&&(t.nextEffect=null),null}else 2*Zr()-a.renderingStartTime>Wl&&1073741824!==n&&(t.flags|=64,l=!0,il(a,!1),t.lanes=33554432);a.isBackwards?(c.sibling=t.child,t.child=c):(null!==(n=a.last)?n.sibling=c:t.child=c,a.last=c)}return null!==a.tail?(n=a.tail,a.rendering=n,a.tail=n.sibling,a.lastEffect=t.lastEffect,a.renderingStartTime=Zr(),n.sibling=null,t=Bo.current,dr(Bo,l?1&t|2:1&t),n):null;case 23:case 24:return Es(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==a.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function sl(e){switch(e.tag){case 1:br(e.type)&&vr();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Mo(),ur(gr),ur(pr),Yo(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Do(e),null;case 13:return ur(Bo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ur(Bo),null;case 4:return Mo(),null;case 10:return ao(e),null;case 23:case 24:return Es(),null;default:return null}}function cl(e,t){try{var n="",a=t;do{n+=W(a),a=a.return}while(a);var r=n}catch(o){r="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:r}}function ul(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ki=function(e,t,n,a){var o=e.memoizedProps;if(o!==a){e=t.stateNode,Ro(Po.current);var i,l=null;switch(n){case"input":o=J(e,o),a=J(e,a),l=[];break;case"option":o=oe(e,o),a=oe(e,a),l=[];break;case"select":o=r({},o,{value:void 0}),a=r({},a,{value:void 0}),l=[];break;case"textarea":o=le(e,o),a=le(e,a),l=[];break;default:"function"!=typeof o.onClick&&"function"==typeof a.onClick&&(e.onclick=$a)}for(d in xe(n,a),n=null,o)if(!a.hasOwnProperty(d)&&o.hasOwnProperty(d)&&null!=o[d])if("style"===d){var c=o[d];for(i in c)c.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(s.hasOwnProperty(d)?l||(l=[]):(l=l||[]).push(d,null));for(d in a){var u=a[d];if(c=null!=o?o[d]:void 0,a.hasOwnProperty(d)&&u!==c&&(null!=u||null!=c))if("style"===d)if(c){for(i in c)!c.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&c[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(l||(l=[]),l.push(d,n)),n=u;else"dangerouslySetInnerHTML"===d?(u=u?u.__html:void 0,c=c?c.__html:void 0,null!=u&&c!==u&&(l=l||[]).push(d,u)):"children"===d?"string"!=typeof u&&"number"!=typeof u||(l=l||[]).push(d,""+u):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(s.hasOwnProperty(d)?(null!=u&&"onScroll"===d&&Pa("scroll",e),l||c===u||(l=[])):"object"==typeof u&&null!==u&&u.$$typeof===M?u.toString():(l=l||[]).push(d,u))}n&&(l=l||[]).push("style",n);var d=l;(t.updateQueue=d)&&(t.flags|=4)}},Yi=function(e,t,n,a){n!==a&&(t.flags|=4)};var dl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=uo(-1,n)).tag=3,n.payload={element:null};var a=t.value;return n.callback=function(){Yl||(Yl=!0,Ql=a),ul(0,t)},n}function pl(e,t,n){(n=uo(-1,n)).tag=3;var a=e.type.getDerivedStateFromError;if("function"==typeof a){var r=t.value;n.payload=function(){return ul(0,t),a(r)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof a&&(null===Xl?Xl=new Set([this]):Xl.add(this),ul(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var gl="function"==typeof WeakSet?WeakSet:Set;function ml(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){$s(e,n)}else t.current=null}function hl(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,a=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Qr(t.type,n),a),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Ga(t.stateNode.containerInfo))}throw Error(i(163))}function bl(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var a=e.create;e.destroy=a()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var r=e;a=r.next,0!=(4&(r=r.tag))&&0!=(1&r)&&(Ds(n,e),js(n,e)),e=a}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(a=n.elementType===n.type?t.memoizedProps:Qr(n.type,t.memoizedProps),e.componentDidUpdate(a,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&mo(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}mo(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&Za(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&kt(n)))))}throw Error(i(163))}function vl(e,t){for(var n=e;;){if(5===n.tag){var a=n.stateNode;if(t)"function"==typeof(a=a.style).setProperty?a.setProperty("display","none","important"):a.display="none";else{a=n.stateNode;var r=n.memoizedProps.style;r=null!=r&&r.hasOwnProperty("display")?r.display:null,a.style.display=we("display",r)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yl(e,t){if(xr&&"function"==typeof xr.onCommitFiberUnmount)try{xr.onCommitFiberUnmount(Er,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var a=n,r=a.destroy;if(a=a.tag,void 0!==r)if(0!=(4&a))Ds(t,n);else{a=t;try{r()}catch(o){$s(a,o)}}n=n.next}while(n!==e)}break;case 1:if(ml(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){$s(t,o)}break;case 5:ml(t);break;case 4:Sl(e,t)}}function _l(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function wl(e){return 5===e.tag||3===e.tag||4===e.tag}function kl(e){e:{for(var t=e.return;null!==t;){if(wl(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var a=!1;break;case 3:case 4:t=t.containerInfo,a=!0;break;default:throw Error(i(161))}16&n.flags&&(ve(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||wl(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}a?El(e,n,t):xl(e,n,t)}function El(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=$a));else if(4!==a&&null!==(e=e.child))for(El(e,t,n),e=e.sibling;null!==e;)El(e,t,n),e=e.sibling}function xl(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==a&&null!==(e=e.child))for(xl(e,t,n),e=e.sibling;null!==e;)xl(e,t,n),e=e.sibling}function Sl(e,t){for(var n,a,r=t,o=!1;;){if(!o){o=r.return;e:for(;;){if(null===o)throw Error(i(160));switch(n=o.stateNode,o.tag){case 5:a=!1;break e;case 3:case 4:n=n.containerInfo,a=!0;break e}o=o.return}o=!0}if(5===r.tag||6===r.tag){e:for(var l=e,s=r,c=s;;)if(yl(l,c),null!==c.child&&4!==c.tag)c.child.return=c,c=c.child;else{if(c===s)break e;for(;null===c.sibling;){if(null===c.return||c.return===s)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}a?(l=n,s=r.stateNode,8===l.nodeType?l.parentNode.removeChild(s):l.removeChild(s)):n.removeChild(r.stateNode)}else if(4===r.tag){if(null!==r.child){n=r.stateNode.containerInfo,a=!0,r.child.return=r,r=r.child;continue}}else if(yl(e,r),null!==r.child){r.child.return=r,r=r.child;continue}if(r===t)break;for(;null===r.sibling;){if(null===r.return||r.return===t)return;4===(r=r.return).tag&&(o=!1)}r.sibling.return=r.return,r=r.sibling}}function Tl(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var a=n=n.next;do{3==(3&a.tag)&&(e=a.destroy,a.destroy=void 0,void 0!==e&&e()),a=a.next}while(a!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){a=t.memoizedProps;var r=null!==e?e.memoizedProps:a;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Ja]=a,"input"===e&&"radio"===a.type&&null!=a.name&&te(n,a),Se(e,r),t=Se(e,a),r=0;r<o.length;r+=2){var l=o[r],s=o[r+1];"style"===l?ke(n,s):"dangerouslySetInnerHTML"===l?be(n,s):"children"===l?ve(n,s):_(n,l,s,t)}switch(e){case"input":ne(n,a);break;case"textarea":ce(n,a);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!a.multiple,null!=(o=a.value)?ie(n,!!a.multiple,o,!1):e!==!!a.multiple&&(null!=a.defaultValue?ie(n,!!a.multiple,a.defaultValue,!0):ie(n,!!a.multiple,a.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,kt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Vl=Zr(),vl(t.child,!0)),void Cl(t);case 19:return void Cl(t);case 23:case 24:return void vl(t,null!==t.memoizedState)}throw Error(i(163))}function Cl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new gl),t.forEach((function(t){var a=zs.bind(null,e,t);n.has(t)||(n.add(t),t.then(a,a))}))}}function Al(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ll=Math.ceil,Pl=w.ReactCurrentDispatcher,Nl=w.ReactCurrentOwner,Ol=0,Rl=null,Il=null,Ml=0,jl=0,Dl=cr(0),Bl=0,Fl=null,$l=0,Ul=0,zl=0,Zl=0,Hl=null,Vl=0,Wl=1/0;function Gl(){Wl=Zr()+500}var ql,Kl=null,Yl=!1,Ql=null,Xl=null,Jl=!1,es=null,ts=90,ns=[],as=[],rs=null,os=0,is=null,ls=-1,ss=0,cs=0,us=null,ds=!1;function fs(){return 0!=(48&Ol)?Zr():-1!==ls?ls:ls=Zr()}function ps(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Hr()?1:2;if(0===ss&&(ss=$l),0!==Yr.transition){0!==cs&&(cs=null!==Hl?Hl.pendingLanes:0),e=ss;var t=4186112&~cs;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Hr(),0!=(4&Ol)&&98===e?e=$t(12,ss):e=$t(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),ss),e}function gs(e,t,n){if(50<os)throw os=0,is=null,Error(i(185));if(null===(e=ms(e,t)))return null;Zt(e,t,n),e===Rl&&(zl|=t,4===Bl&&vs(e,Ml));var a=Hr();1===t?0!=(8&Ol)&&0==(48&Ol)?ys(e):(hs(e,n),0===Ol&&(Gl(),qr())):(0==(4&Ol)||98!==a&&99!==a||(null===rs?rs=new Set([e]):rs.add(e)),hs(e,n)),Hl=e}function ms(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function hs(e,t){for(var n=e.callbackNode,a=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,l=e.pendingLanes;0<l;){var s=31-Ht(l),c=1<<s,u=o[s];if(-1===u){if(0==(c&a)||0!=(c&r)){u=t,Dt(c);var d=jt;o[s]=10<=d?u+250:6<=d?u+5e3:-1}}else u<=t&&(e.expiredLanes|=c);l&=~c}if(a=Bt(e,e===Rl?Ml:0),t=jt,0===a)null!==n&&(n!==Dr&&Cr(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Dr&&Cr(n)}15===t?(n=ys.bind(null,e),null===Fr?(Fr=[n],$r=Tr(Or,Kr)):Fr.push(n),n=Dr):14===t?n=Gr(99,ys.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Gr(n,bs.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bs(e){if(ls=-1,cs=ss=0,0!=(48&Ol))throw Error(i(327));var t=e.callbackNode;if(Ms()&&e.callbackNode!==t)return null;var n=Bt(e,e===Rl?Ml:0);if(0===n)return null;var a=n,r=Ol;Ol|=16;var o=Ts();for(Rl===e&&Ml===a||(Gl(),xs(e,a));;)try{Ls();break}catch(s){Ss(e,s)}if(no(),Pl.current=o,Ol=r,null!==Il?a=0:(Rl=null,Ml=0,a=Bl),0!=($l&zl))xs(e,0);else if(0!==a){if(2===a&&(Ol|=64,e.hydrate&&(e.hydrate=!1,Ga(e.containerInfo)),0!==(n=Ft(e))&&(a=Cs(e,n))),1===a)throw t=Fl,xs(e,0),vs(e,n),hs(e,Zr()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,a){case 0:case 1:throw Error(i(345));case 2:case 5:Os(e);break;case 3:if(vs(e,n),(62914560&n)===n&&10<(a=Vl+500-Zr())){if(0!==Bt(e,0))break;if(((r=e.suspendedLanes)&n)!==n){fs(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=Va(Os.bind(null,e),a);break}Os(e);break;case 4:if(vs(e,n),(4186112&n)===n)break;for(a=e.eventTimes,r=-1;0<n;){var l=31-Ht(n);o=1<<l,(l=a[l])>r&&(r=l),n&=~o}if(n=r,10<(n=(120>(n=Zr()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ll(n/1960))-n)){e.timeoutHandle=Va(Os.bind(null,e),n);break}Os(e);break;default:throw Error(i(329))}}return hs(e,Zr()),e.callbackNode===t?bs.bind(null,e):null}function vs(e,t){for(t&=~Zl,t&=~zl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),a=1<<n;e[n]=-1,t&=~a}}function ys(e){if(0!=(48&Ol))throw Error(i(327));if(Ms(),e===Rl&&0!=(e.expiredLanes&Ml)){var t=Ml,n=Cs(e,t);0!=($l&zl)&&(n=Cs(e,t=Bt(e,t)))}else n=Cs(e,t=Bt(e,0));if(0!==e.tag&&2===n&&(Ol|=64,e.hydrate&&(e.hydrate=!1,Ga(e.containerInfo)),0!==(t=Ft(e))&&(n=Cs(e,t))),1===n)throw n=Fl,xs(e,0),vs(e,t),hs(e,Zr()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Os(e),hs(e,Zr()),null}function _s(e,t){var n=Ol;Ol|=1;try{return e(t)}finally{0===(Ol=n)&&(Gl(),qr())}}function ws(e,t){var n=Ol;Ol&=-2,Ol|=8;try{return e(t)}finally{0===(Ol=n)&&(Gl(),qr())}}function ks(e,t){dr(Dl,jl),jl|=t,$l|=t}function Es(){jl=Dl.current,ur(Dl)}function xs(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Wa(n)),null!==Il)for(n=Il.return;null!==n;){var a=n;switch(a.tag){case 1:null!=(a=a.type.childContextTypes)&&vr();break;case 3:Mo(),ur(gr),ur(pr),Yo();break;case 5:Do(a);break;case 4:Mo();break;case 13:case 19:ur(Bo);break;case 10:ao(a);break;case 23:case 24:Es()}n=n.return}Rl=e,Il=Ws(e.current,null),Ml=jl=$l=t,Bl=0,Fl=null,Zl=zl=Ul=0}function Ss(e,t){for(;;){var n=Il;try{if(no(),Qo.current=Oi,ai){for(var a=ei.memoizedState;null!==a;){var r=a.queue;null!==r&&(r.pending=null),a=a.next}ai=!1}if(Jo=0,ni=ti=ei=null,ri=!1,Nl.current=null,null===n||null===n.return){Bl=1,Fl=t,Il=null;break}e:{var o=e,i=n.return,l=n,s=t;if(t=Ml,l.flags|=2048,l.firstEffect=l.lastEffect=null,null!==s&&"object"==typeof s&&"function"==typeof s.then){var c=s;if(0==(2&l.mode)){var u=l.alternate;u?(l.updateQueue=u.updateQueue,l.memoizedState=u.memoizedState,l.lanes=u.lanes):(l.updateQueue=null,l.memoizedState=null)}var d=0!=(1&Bo.current),f=i;do{var p;if(p=13===f.tag){var g=f.memoizedState;if(null!==g)p=null!==g.dehydrated;else{var m=f.memoizedProps;p=void 0!==m.fallback&&(!0!==m.unstable_avoidThisFallback||!d)}}if(p){var h=f.updateQueue;if(null===h){var b=new Set;b.add(c),f.updateQueue=b}else h.add(c);if(0==(2&f.mode)){if(f.flags|=64,l.flags|=16384,l.flags&=-2981,1===l.tag)if(null===l.alternate)l.tag=17;else{var v=uo(-1,1);v.tag=2,fo(l,v)}l.lanes|=1;break e}s=void 0,l=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new dl,s=new Set,y.set(c,s)):void 0===(s=y.get(c))&&(s=new Set,y.set(c,s)),!s.has(l)){s.add(l);var _=Us.bind(null,o,c,l);c.then(_,_)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);s=Error((G(l.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Bl&&(Bl=2),s=cl(s,l),f=i;do{switch(f.tag){case 3:o=s,f.flags|=4096,t&=-t,f.lanes|=t,po(f,fl(0,o,t));break e;case 1:o=s;var w=f.type,k=f.stateNode;if(0==(64&f.flags)&&("function"==typeof w.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Xl||!Xl.has(k)))){f.flags|=4096,t&=-t,f.lanes|=t,po(f,pl(f,o,t));break e}}f=f.return}while(null!==f)}Ns(n)}catch(E){t=E,Il===n&&null!==n&&(Il=n=n.return);continue}break}}function Ts(){var e=Pl.current;return Pl.current=Oi,null===e?Oi:e}function Cs(e,t){var n=Ol;Ol|=16;var a=Ts();for(Rl===e&&Ml===t||xs(e,t);;)try{As();break}catch(r){Ss(e,r)}if(no(),Ol=n,Pl.current=a,null!==Il)throw Error(i(261));return Rl=null,Ml=0,Bl}function As(){for(;null!==Il;)Ps(Il)}function Ls(){for(;null!==Il&&!Ar();)Ps(Il)}function Ps(e){var t=ql(e.alternate,e,jl);e.memoizedProps=e.pendingProps,null===t?Ns(e):Il=t,Nl.current=null}function Ns(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ll(n,t,jl)))return void(Il=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&jl)||0==(4&n.mode)){for(var a=0,r=n.child;null!==r;)a|=r.lanes|r.childLanes,r=r.sibling;n.childLanes=a}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=sl(t)))return n.flags&=2047,void(Il=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Il=t);Il=t=e}while(null!==t);0===Bl&&(Bl=5)}function Os(e){var t=Hr();return Wr(99,Rs.bind(null,e,t)),null}function Rs(e,t){do{Ms()}while(null!==es);if(0!=(48&Ol))throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var a=n.lanes|n.childLanes,r=a,o=e.pendingLanes&~r;e.pendingLanes=r,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=r,e.mutableReadLanes&=r,e.entangledLanes&=r,r=e.entanglements;for(var l=e.eventTimes,s=e.expirationTimes;0<o;){var c=31-Ht(o),u=1<<c;r[c]=0,l[c]=-1,s[c]=-1,o&=~u}if(null!==rs&&0==(24&a)&&rs.has(e)&&rs.delete(e),e===Rl&&(Il=Rl=null,Ml=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,a=n.firstEffect):a=n:a=n.firstEffect,null!==a){if(r=Ol,Ol|=32,Nl.current=null,Ua=Kt,ba(l=ha())){if("selectionStart"in l)s={start:l.selectionStart,end:l.selectionEnd};else e:if(s=(s=l.ownerDocument)&&s.defaultView||window,(u=s.getSelection&&s.getSelection())&&0!==u.rangeCount){s=u.anchorNode,o=u.anchorOffset,c=u.focusNode,u=u.focusOffset;try{s.nodeType,c.nodeType}catch(T){s=null;break e}var d=0,f=-1,p=-1,g=0,m=0,h=l,b=null;t:for(;;){for(var v;h!==s||0!==o&&3!==h.nodeType||(f=d+o),h!==c||0!==u&&3!==h.nodeType||(p=d+u),3===h.nodeType&&(d+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===l)break t;if(b===s&&++g===o&&(f=d),b===c&&++m===u&&(p=d),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}s=-1===f||-1===p?null:{start:f,end:p}}else s=null;s=s||{start:0,end:0}}else s=null;za={focusedElem:l,selectionRange:s},Kt=!1,us=null,ds=!1,Kl=a;do{try{Is()}catch(T){if(null===Kl)throw Error(i(330));$s(Kl,T),Kl=Kl.nextEffect}}while(null!==Kl);us=null,Kl=a;do{try{for(l=e;null!==Kl;){var y=Kl.flags;if(16&y&&ve(Kl.stateNode,""),128&y){var _=Kl.alternate;if(null!==_){var w=_.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&y){case 2:kl(Kl),Kl.flags&=-3;break;case 6:kl(Kl),Kl.flags&=-3,Tl(Kl.alternate,Kl);break;case 1024:Kl.flags&=-1025;break;case 1028:Kl.flags&=-1025,Tl(Kl.alternate,Kl);break;case 4:Tl(Kl.alternate,Kl);break;case 8:Sl(l,s=Kl);var k=s.alternate;_l(s),null!==k&&_l(k)}Kl=Kl.nextEffect}}catch(T){if(null===Kl)throw Error(i(330));$s(Kl,T),Kl=Kl.nextEffect}}while(null!==Kl);if(w=za,_=ha(),y=w.focusedElem,l=w.selectionRange,_!==y&&y&&y.ownerDocument&&ma(y.ownerDocument.documentElement,y)){null!==l&&ba(y)&&(_=l.start,void 0===(w=l.end)&&(w=_),"selectionStart"in y?(y.selectionStart=_,y.selectionEnd=Math.min(w,y.value.length)):(w=(_=y.ownerDocument||document)&&_.defaultView||window).getSelection&&(w=w.getSelection(),s=y.textContent.length,k=Math.min(l.start,s),l=void 0===l.end?k:Math.min(l.end,s),!w.extend&&k>l&&(s=l,l=k,k=s),s=ga(y,k),o=ga(y,l),s&&o&&(1!==w.rangeCount||w.anchorNode!==s.node||w.anchorOffset!==s.offset||w.focusNode!==o.node||w.focusOffset!==o.offset)&&((_=_.createRange()).setStart(s.node,s.offset),w.removeAllRanges(),k>l?(w.addRange(_),w.extend(o.node,o.offset)):(_.setEnd(o.node,o.offset),w.addRange(_))))),_=[];for(w=y;w=w.parentNode;)1===w.nodeType&&_.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<_.length;y++)(w=_[y]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Kt=!!Ua,za=Ua=null,e.current=n,Kl=a;do{try{for(y=e;null!==Kl;){var E=Kl.flags;if(36&E&&bl(y,Kl.alternate,Kl),128&E){_=void 0;var x=Kl.ref;if(null!==x){var S=Kl.stateNode;Kl.tag,_=S,"function"==typeof x?x(_):x.current=_}}Kl=Kl.nextEffect}}catch(T){if(null===Kl)throw Error(i(330));$s(Kl,T),Kl=Kl.nextEffect}}while(null!==Kl);Kl=null,Br(),Ol=r}else e.current=n;if(Jl)Jl=!1,es=e,ts=t;else for(Kl=a;null!==Kl;)t=Kl.nextEffect,Kl.nextEffect=null,8&Kl.flags&&((E=Kl).sibling=null,E.stateNode=null),Kl=t;if(0===(a=e.pendingLanes)&&(Xl=null),1===a?e===is?os++:(os=0,is=e):os=0,n=n.stateNode,xr&&"function"==typeof xr.onCommitFiberRoot)try{xr.onCommitFiberRoot(Er,n,void 0,64==(64&n.current.flags))}catch(T){}if(hs(e,Zr()),Yl)throw Yl=!1,e=Ql,Ql=null,e;return 0!=(8&Ol)||qr(),null}function Is(){for(;null!==Kl;){var e=Kl.alternate;ds||null===us||(0!=(8&Kl.flags)?et(Kl,us)&&(ds=!0):13===Kl.tag&&Al(e,Kl)&&et(Kl,us)&&(ds=!0));var t=Kl.flags;0!=(256&t)&&hl(e,Kl),0==(512&t)||Jl||(Jl=!0,Gr(97,(function(){return Ms(),null}))),Kl=Kl.nextEffect}}function Ms(){if(90!==ts){var e=97<ts?97:ts;return ts=90,Wr(e,Bs)}return!1}function js(e,t){ns.push(t,e),Jl||(Jl=!0,Gr(97,(function(){return Ms(),null})))}function Ds(e,t){as.push(t,e),Jl||(Jl=!0,Gr(97,(function(){return Ms(),null})))}function Bs(){if(null===es)return!1;var e=es;if(es=null,0!=(48&Ol))throw Error(i(331));var t=Ol;Ol|=32;var n=as;as=[];for(var a=0;a<n.length;a+=2){var r=n[a],o=n[a+1],l=r.destroy;if(r.destroy=void 0,"function"==typeof l)try{l()}catch(c){if(null===o)throw Error(i(330));$s(o,c)}}for(n=ns,ns=[],a=0;a<n.length;a+=2){r=n[a],o=n[a+1];try{var s=r.create;r.destroy=s()}catch(c){if(null===o)throw Error(i(330));$s(o,c)}}for(s=e.current.firstEffect;null!==s;)e=s.nextEffect,s.nextEffect=null,8&s.flags&&(s.sibling=null,s.stateNode=null),s=e;return Ol=t,qr(),!0}function Fs(e,t,n){fo(e,t=fl(0,t=cl(n,t),1)),t=fs(),null!==(e=ms(e,1))&&(Zt(e,1,t),hs(e,t))}function $s(e,t){if(3===e.tag)Fs(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Fs(n,e,t);break}if(1===n.tag){var a=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof a.componentDidCatch&&(null===Xl||!Xl.has(a))){var r=pl(n,e=cl(t,e),1);if(fo(n,r),r=fs(),null!==(n=ms(n,1)))Zt(n,1,r),hs(n,r);else if("function"==typeof a.componentDidCatch&&(null===Xl||!Xl.has(a)))try{a.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function Us(e,t,n){var a=e.pingCache;null!==a&&a.delete(t),t=fs(),e.pingedLanes|=e.suspendedLanes&n,Rl===e&&(Ml&n)===n&&(4===Bl||3===Bl&&(62914560&Ml)===Ml&&500>Zr()-Vl?xs(e,0):Zl|=n),hs(e,t)}function zs(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===Hr()?1:2:(0===ss&&(ss=$l),0===(t=Ut(62914560&~ss))&&(t=4194304))),n=fs(),null!==(e=ms(e,t))&&(Zt(e,t,n),hs(e,n))}function Zs(e,t,n,a){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Hs(e,t,n,a){return new Zs(e,t,n,a)}function Vs(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Ws(e,t){var n=e.alternate;return null===n?((n=Hs(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Gs(e,t,n,a,r,o){var l=2;if(a=e,"function"==typeof e)Vs(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case x:return qs(n.children,r,o,t);case j:l=8,r|=16;break;case S:l=8,r|=1;break;case T:return(e=Hs(12,n,t,8|r)).elementType=T,e.type=T,e.lanes=o,e;case P:return(e=Hs(13,n,t,r)).type=P,e.elementType=P,e.lanes=o,e;case N:return(e=Hs(19,n,t,r)).elementType=N,e.lanes=o,e;case D:return Ks(n,r,o,t);case B:return(e=Hs(24,n,t,r)).elementType=B,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case A:l=9;break e;case L:l=11;break e;case O:l=14;break e;case R:l=16,a=null;break e;case I:l=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Hs(l,n,t,r)).elementType=e,t.type=a,t.lanes=o,t}function qs(e,t,n,a){return(e=Hs(7,e,a,t)).lanes=n,e}function Ks(e,t,n,a){return(e=Hs(23,e,a,t)).elementType=D,e.lanes=n,e}function Ys(e,t,n){return(e=Hs(6,e,null,t)).lanes=n,e}function Qs(e,t,n){return(t=Hs(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Xs(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=zt(0),this.expirationTimes=zt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=zt(0),this.mutableSourceEagerHydrationData=null}function Js(e,t,n){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:E,key:null==a?null:""+a,children:e,containerInfo:t,implementation:n}}function ec(e,t,n,a){var r=t.current,o=fs(),l=ps(r);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var s=n;do{switch(s.tag){case 3:s=s.stateNode.context;break t;case 1:if(br(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break t}}s=s.return}while(null!==s);throw Error(i(171))}if(1===n.tag){var c=n.type;if(br(c)){n=_r(n,c,s);break e}}n=s}else n=fr;return null===t.context?t.context=n:t.pendingContext=n,(t=uo(o,l)).payload={element:e},null!==(a=void 0===a?null:a)&&(t.callback=a),fo(r,t),gs(r,l,o),l}function tc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function nc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function ac(e,t){nc(e,t),(e=e.alternate)&&nc(e,t)}function rc(e,t,n){var a=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Xs(e,t,null!=n&&!0===n.hydrate),t=Hs(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,so(t),e[er]=n.current,Oa(8===e.nodeType?e.parentNode:e),a)for(e=0;e<a.length;e++){var r=(t=a[e])._getVersion;r=r(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,r]:n.mutableSourceEagerHydrationData.push(t,r)}this._internalRoot=n}function oc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function ic(e,t,n,a,r){var o=n._reactRootContainer;if(o){var i=o._internalRoot;if("function"==typeof r){var l=r;r=function(){var e=tc(i);l.call(e)}}ec(t,i,e,r)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new rc(e,0,t?{hydrate:!0}:void 0)}(n,a),i=o._internalRoot,"function"==typeof r){var s=r;r=function(){var e=tc(i);s.call(e)}}ws((function(){ec(t,i,e,r)}))}return tc(i)}function lc(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!oc(t))throw Error(i(200));return Js(e,t,null,n)}ql=function(e,t,n){var a=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||gr.current)Di=!0;else{if(0==(n&a)){switch(Di=!1,t.tag){case 3:Gi(t),qo();break;case 5:jo(t);break;case 1:br(t.type)&&wr(t);break;case 4:Io(t,t.stateNode.containerInfo);break;case 10:a=t.memoizedProps.value;var r=t.type._context;dr(Xr,r._currentValue),r._currentValue=a;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Xi(e,t,n):(dr(Bo,1&Bo.current),null!==(t=ol(e,t,n))?t.sibling:null);dr(Bo,1&Bo.current);break;case 19:if(a=0!=(n&t.childLanes),0!=(64&e.flags)){if(a)return rl(e,t,n);t.flags|=64}if(null!==(r=t.memoizedState)&&(r.rendering=null,r.tail=null,r.lastEffect=null),dr(Bo,Bo.current),a)break;return null;case 23:case 24:return t.lanes=0,zi(e,t,n)}return ol(e,t,n)}Di=0!=(16384&e.flags)}else Di=!1;switch(t.lanes=0,t.tag){case 2:if(a=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=hr(t,pr.current),oo(t,n),r=li(null,t,a,e,r,n),t.flags|=1,"object"==typeof r&&null!==r&&"function"==typeof r.render&&void 0===r.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,br(a)){var o=!0;wr(t)}else o=!1;t.memoizedState=null!==r.state&&void 0!==r.state?r.state:null,so(t);var l=a.getDerivedStateFromProps;"function"==typeof l&&bo(t,a,l,e),r.updater=vo,t.stateNode=r,r._reactInternals=t,ko(t,a,e,n),t=Wi(null,t,a,!0,o,n)}else t.tag=0,Bi(null,t,r,n),t=t.child;return t;case 16:r=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Vs(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===O)return 14}return 2}(r),e=Qr(r,e),o){case 0:t=Hi(null,t,r,e,n);break e;case 1:t=Vi(null,t,r,e,n);break e;case 11:t=Fi(null,t,r,e,n);break e;case 14:t=$i(null,t,r,Qr(r.type,e),a,n);break e}throw Error(i(306,r,""))}return t;case 0:return a=t.type,r=t.pendingProps,Hi(e,t,a,r=t.elementType===a?r:Qr(a,r),n);case 1:return a=t.type,r=t.pendingProps,Vi(e,t,a,r=t.elementType===a?r:Qr(a,r),n);case 3:if(Gi(t),a=t.updateQueue,null===e||null===a)throw Error(i(282));if(a=t.pendingProps,r=null!==(r=t.memoizedState)?r.element:null,co(e,t),go(t,a,null,n),(a=t.memoizedState.element)===r)qo(),t=ol(e,t,n);else{if((o=(r=t.stateNode).hydrate)&&(Uo=qa(t.stateNode.containerInfo.firstChild),$o=t,o=zo=!0),o){if(null!=(e=r.mutableSourceEagerHydrationData))for(r=0;r<e.length;r+=2)(o=e[r])._workInProgressVersionPrimary=e[r+1],Ko.push(o);for(n=Ao(t,null,a,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Bi(e,t,a,n),qo();t=t.child}return t;case 5:return jo(t),null===e&&Vo(t),a=t.type,r=t.pendingProps,o=null!==e?e.memoizedProps:null,l=r.children,Ha(a,r)?l=null:null!==o&&Ha(a,o)&&(t.flags|=16),Zi(e,t),Bi(e,t,l,n),t.child;case 6:return null===e&&Vo(t),null;case 13:return Xi(e,t,n);case 4:return Io(t,t.stateNode.containerInfo),a=t.pendingProps,null===e?t.child=Co(t,null,a,n):Bi(e,t,a,n),t.child;case 11:return a=t.type,r=t.pendingProps,Fi(e,t,a,r=t.elementType===a?r:Qr(a,r),n);case 7:return Bi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Bi(e,t,t.pendingProps.children,n),t.child;case 10:e:{a=t.type._context,r=t.pendingProps,l=t.memoizedProps,o=r.value;var s=t.type._context;if(dr(Xr,s._currentValue),s._currentValue=o,null!==l)if(s=l.value,0===(o=ua(s,o)?0:0|("function"==typeof a._calculateChangedBits?a._calculateChangedBits(s,o):1073741823))){if(l.children===r.children&&!gr.current){t=ol(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var c=s.dependencies;if(null!==c){l=s.child;for(var u=c.firstContext;null!==u;){if(u.context===a&&0!=(u.observedBits&o)){1===s.tag&&((u=uo(-1,n&-n)).tag=2,fo(s,u)),s.lanes|=n,null!==(u=s.alternate)&&(u.lanes|=n),ro(s.return,n),c.lanes|=n;break}u=u.next}}else l=10===s.tag&&s.type===t.type?null:s.child;if(null!==l)l.return=s;else for(l=s;null!==l;){if(l===t){l=null;break}if(null!==(s=l.sibling)){s.return=l.return,l=s;break}l=l.return}s=l}Bi(e,t,r.children,n),t=t.child}return t;case 9:return r=t.type,a=(o=t.pendingProps).children,oo(t,n),a=a(r=io(r,o.unstable_observedBits)),t.flags|=1,Bi(e,t,a,n),t.child;case 14:return o=Qr(r=t.type,t.pendingProps),$i(e,t,r,o=Qr(r.type,o),a,n);case 15:return Ui(e,t,t.type,t.pendingProps,a,n);case 17:return a=t.type,r=t.pendingProps,r=t.elementType===a?r:Qr(a,r),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,br(a)?(e=!0,wr(t)):e=!1,oo(t,n),_o(t,a,r),ko(t,a,r,n),Wi(null,t,a,!0,e,n);case 19:return rl(e,t,n);case 23:case 24:return zi(e,t,n)}throw Error(i(156,t.tag))},rc.prototype.render=function(e){ec(e,this._internalRoot,null,null)},rc.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;ec(null,e,null,(function(){t[er]=null}))},tt=function(e){13===e.tag&&(gs(e,4,fs()),ac(e,4))},nt=function(e){13===e.tag&&(gs(e,67108864,fs()),ac(e,67108864))},at=function(e){if(13===e.tag){var t=fs(),n=ps(e);gs(e,n,t),ac(e,n)}},rt=function(e,t){return t()},Ce=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var a=n[t];if(a!==e&&a.form===e.form){var r=or(a);if(!r)throw Error(i(90));Q(a),ne(a,r)}}}break;case"textarea":ce(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Re=_s,Ie=function(e,t,n,a,r){var o=Ol;Ol|=4;try{return Wr(98,e.bind(null,t,n,a,r))}finally{0===(Ol=o)&&(Gl(),qr())}},Me=function(){0==(49&Ol)&&(function(){if(null!==rs){var e=rs;rs=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hs(e,Zr())}))}qr()}(),Ms())},je=function(e,t){var n=Ol;Ol|=2;try{return e(t)}finally{0===(Ol=n)&&(Gl(),qr())}};var sc={Events:[ar,rr,or,Ne,Oe,Ms,{current:!1}]},cc={findFiberByHostInstance:nr,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},uc={bundleType:cc.bundleType,version:cc.version,rendererPackageName:cc.rendererPackageName,rendererConfig:cc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Je(e))?null:e.stateNode},findFiberByHostInstance:cc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var dc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!dc.isDisabled&&dc.supportsFiber)try{Er=dc.inject(uc),xr=dc}catch(he){}}t.createPortal=lc,t.hydrate=function(e,t,n){if(!oc(t))throw Error(i(200));return ic(null,e,t,!0,n)}},3935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(4448)},9590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,a="function"==typeof Set,r="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!o(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!o(s.value[1],i.get(s.value[0])))return!1;return!0}if(a&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(r&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===i.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!o(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>V,ql:()=>J});var a=n(7294),r=n(5697),o=n.n(r),i=n(9590),l=n.n(i),s=n(1143),c=n.n(s),u=n(6774),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)t.indexOf(n=o[a])>=0||(r[n]=e[n]);return r}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},_=Object.keys(h).map((function(e){return h[e]})),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(w).reduce((function(e,t){return e[w[t]]=t,e}),{}),E=function(e,t){for(var n=e.length-1;n>=0;n-=1){var a=e[n];if(Object.prototype.hasOwnProperty.call(a,t))return a[t]}return null},x=function(e){var t=E(e,h.TITLE),n=E(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var a=E(e,"defaultTitle");return t||a||void 0},S=function(e){return E(e,"onChangeClientState")||function(){}},T=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},C=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var a=Object.keys(n),r=0;r<a.length;r+=1){var o=a[r].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},A=function(e,t,n){var a={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var r={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return a[n]||(a[n]={}),r[n]||(r[n]={}),!a[n][c]&&(r[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(r),i=0;i<o.length;i+=1){var l=o[i],s=f({},a[l],r[l]);a[l]=s}return e}),[]).reverse()},L=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},P=function(e){return Array.isArray(e)?e.join(""):e},N=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),a=0;a<n.length;a+=1)if(t[n[a]]&&t[n[a]].includes(e[n[a]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},O=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},R=[h.NOSCRIPT,h.SCRIPT,h.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},M=function(e){return Object.keys(e).reduce((function(t,n){var a=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+a:a}),"")},j=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},D=function(e,t){return t.map((function(t,n){var r,o=((r={key:n})["data-rh"]=!0,r);return Object.keys(t).forEach((function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),a.createElement(e,o)}))},B=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(r={key:e=t.title})["data-rh"]=!0,o=j(n,r),[a.createElement(h.TITLE,o,e)];var e,n,r,o},toString:function(){return function(e,t,n,a){var r=M(n),o=P(t);return r?"<"+e+' data-rh="true" '+r+">"+I(o,a)+"</"+e+">":"<"+e+' data-rh="true">'+I(o,a)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return j(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return D(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,a){var r=Object.keys(a).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var r=void 0===a[t]?t:t+'="'+I(a[t],n)+'"';return e?e+" "+r:r}),""),o=a.innerHTML||a.cssText||"",i=-1===R.indexOf(e);return t+"<"+e+' data-rh="true" '+r+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},F=function(e){var t=e.baseTag,n=e.bodyAttributes,a=e.encode,r=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,a=e.encode,r=N(e.metaTags,y),o=N(t,b),i=N(n,v);return{priorityMethods:{toComponent:function(){return[].concat(D(h.META,r.priority),D(h.LINK,o.priority),D(h.SCRIPT,i.priority))},toString:function(){return B(h.META,r.priority,a)+" "+B(h.LINK,o.priority,a)+" "+B(h.SCRIPT,i.priority,a)}},metaTags:r.default,linkTags:o.default,scriptTags:i.default}}(e);p=g.priorityMethods,u=g.linkTags,d=g.metaTags,f=g.scriptTags}return{priority:p,base:B(h.BASE,t,a),bodyAttributes:B("bodyAttributes",n,a),htmlAttributes:B("htmlAttributes",r,a),link:B(h.LINK,u,a),meta:B(h.META,d,a),noscript:B(h.NOSCRIPT,o,a),script:B(h.SCRIPT,f,a),style:B(h.STYLE,i,a),title:B(h.TITLE,{title:s,titleAttributes:c},a)}},$=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?$:n.instances},add:function(e){(n.canUseDOM?$:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?$:n.instances).indexOf(e);(n.canUseDOM?$:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=F({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},z=a.createContext({}),Z=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),H="undefined"!=typeof document,V=function(e){function t(n){var a;return(a=e.call(this,n)||this).helmetData=new U(a.props.context,t.canUseDOM),a}return p(t,e),t.prototype.render=function(){return a.createElement(z.Provider,{value:this.helmetData.value},this.props.children)},t}(a.Component);V.canUseDOM=H,V.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},V.defaultProps={context:{}},V.displayName="HelmetProvider";var W=function(e,t){var n,a=document.head||document.querySelector(h.HEAD),r=a.querySelectorAll(e+"[data-rh]"),o=[].slice.call(r),i=[];return t&&t.length&&t.forEach((function(t){var a=document.createElement(e);for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&("innerHTML"===r?a.innerHTML=t.innerHTML:"cssText"===r?a.styleSheet?a.styleSheet.cssText=t.cssText:a.appendChild(document.createTextNode(t.cssText)):a.setAttribute(r,void 0===t[r]?"":t[r]));a.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,a.isEqualNode(e)}))?o.splice(n,1):i.push(a)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return a.appendChild(e)})),{oldTags:o,newTags:i}},G=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var a=n.getAttribute("data-rh"),r=a?a.split(","):[],o=[].concat(r),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],c=t[s]||"";n.getAttribute(s)!==c&&n.setAttribute(s,c),-1===r.indexOf(s)&&r.push(s);var u=o.indexOf(s);-1!==u&&o.splice(u,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);r.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},q=function(e,t){var n=e.baseTag,a=e.htmlAttributes,r=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;G(h.BODY,e.bodyAttributes),G(h.HTML,a),function(e,t){void 0!==e&&document.title!==e&&(document.title=P(e)),G(h.TITLE,t)}(u,d);var f={baseTag:W(h.BASE,n),linkTags:W(h.LINK,r),metaTags:W(h.META,o),noscriptTags:W(h.NOSCRIPT,i),scriptTags:W(h.SCRIPT,s),styleTags:W(h.STYLE,c)},p={},g={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,a=t.oldTags;n.length&&(p[e]=n),a.length&&(g[e]=f[e].oldTags)})),t&&t(),l(e,p,g)},K=null,Y=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,a=n.setHelmet,r=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:C(["href"],e),bodyAttributes:T("bodyAttributes",e),defer:E(e,"defer"),encode:E(e,"encodeSpecialCharacters"),htmlAttributes:T("htmlAttributes",e),linkTags:A(h.LINK,["rel","href"],e),metaTags:A(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:S(e),scriptTags:A(h.SCRIPT,["src","innerHTML"],e),styleTags:A(h.STYLE,["cssText"],e),title:x(e),titleAttributes:T("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});V.canUseDOM?(t=o,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){q(t,(function(){K=null}))})):(q(t),K=null)):F&&(r=F(o)),a(r)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(a.Component);Y.propTypes={context:Z.isRequired},Y.displayName="HelmetDispatcher";var Q=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(O(this.props,"helmetData"),O(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,a=e.arrayTypeChildren;return f({},a,((t={})[n.type]=[].concat(a[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,a=e.child,r=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(a.type){case h.TITLE:return f({},r,((t={})[a.type]=i,t.titleAttributes=f({},o),t));case h.BODY:return f({},r,{bodyAttributes:f({},o)});case h.HTML:return f({},r,{htmlAttributes:f({},o)});default:return f({},r,((n={})[a.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var a;n=f({},n,((a={})[t]=e[t],a))})),n},n.warnOnInvalidChildren=function(e,t){return c()(_.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+_.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,r={};return a.Children.forEach(e,(function(e){if(e&&e.props){var a=e.props,o=a.children,i=m(a,Q),l=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(r,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),r=f({},n),o=n.helmetData;return t&&(r=this.mapChildrenToProps(t,r)),!o||o instanceof U||(o=new U(o.context,o.instances)),o?a.createElement(Y,f({},r,{context:o.value,helmetData:void 0})):a.createElement(z.Consumer,null,(function(e){return a.createElement(Y,f({},r,{context:e}))}))},t}(a.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},9921:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,a=n?Symbol.for("react.element"):60103,r=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,_=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case a:switch(e=e.type){case u:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case h:case m:case s:return e;default:return t}}case r:return t}}}function k(e){return w(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=s,t.Element=a,t.ForwardRef=f,t.Fragment=o,t.Lazy=h,t.Memo=m,t.Portal=r,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return k(e)||w(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===c},t.isContextProvider=function(e){return w(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.isForwardRef=function(e){return w(e)===f},t.isFragment=function(e){return w(e)===o},t.isLazy=function(e){return w(e)===h},t.isMemo=function(e){return w(e)===m},t.isPortal=function(e){return w(e)===r},t.isProfiler=function(e){return w(e)===l},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===s||e.$$typeof===c||e.$$typeof===f||e.$$typeof===v||e.$$typeof===y||e.$$typeof===_||e.$$typeof===b)},t.typeOf=w},9864:(e,t,n)=>{"use strict";e.exports=n(9921)},8356:(e,t,n)=>{"use strict";function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},i.apply(this,arguments)}var l=n(7294),s=n(5697),c=[],u=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(a){var r=d(e[a]);r.loading?t.loading=!0:(t.loaded[a]=r.loaded,t.error=r.error),n.push(r.promise),r.promise.then((function(e){t.loaded[a]=e})).catch((function(e){t.error=e}))}))}catch(a){t.error=a}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function g(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return c.push(h),"function"==typeof g.webpack&&u.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var a;return o(r(r(a=t.call(this,n)||this)),"retry",(function(){a.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),a._loadModule()})),h(),a.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},a}a(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.loadable.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextTypes",{loadable:s.shape({report:s.func.isRequired})}),f}function m(e){return g(d,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(f,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}a(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}o(h,"propTypes",{report:s.func.isRequired}),o(h,"childContextTypes",{loadable:s.shape({report:s.func.isRequired}).isRequired}),m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=m},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>l,f:()=>i});var a=n(6550),r=n(7462),o=n(7294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var r=e.path?(0,a.LX)(t,e):n.length?n[n.length-1].match:a.F0.computeRootMatch(t);return r&&(n.push({route:e,match:r}),e.routes&&i(e.routes,t,n)),r})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(a.rs,n,e.map((function(e,n){return o.createElement(a.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,r.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,r.Z)({},n,t,{route:e}))}})}))):null}},3727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>y,VK:()=>u,rU:()=>h});var a=n(6550),r=n(5068),o=n(7294),i=n(2358),l=n(7462),s=n(3366),c=n(8776),u=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).history=(0,i.lX)(t.props),t}return(0,r.Z)(t,e),t.prototype.render=function(){return o.createElement(a.F0,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},p=function(e){return e},g=o.forwardRef;void 0===g&&(g=p);var m=g((function(e,t){var n=e.innerRef,a=e.navigate,r=e.onClick,i=(0,s.Z)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.Z)({},i,{onClick:function(e){try{r&&r(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),a())}});return u.ref=p!==g&&t||n,o.createElement("a",u)}));var h=g((function(e,t){var n=e.component,r=void 0===n?m:n,u=e.replace,h=e.to,b=e.innerRef,v=(0,s.Z)(e,["component","replace","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=e.history,a=f(d(h,e.location),e.location),s=a?n.createHref(a):"",m=(0,l.Z)({},v,{href:s,navigate:function(){var t=d(h,e.location),a=(0,i.Ep)(e.location)===(0,i.Ep)(f(t));(u||a?n.replace:n.push)(t)}});return p!==g?m.ref=t||b:m.innerRef=b,o.createElement(r,m)}))})),b=function(e){return e},v=o.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],r=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,p=e.activeStyle,g=e.className,m=e.exact,y=e.isActive,_=e.location,w=e.sensitive,k=e.strict,E=e.style,x=e.to,S=e.innerRef,T=(0,s.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=_||e.location,i=f(d(x,n),n),s=i.pathname,C=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=C?(0,a.LX)(n.pathname,{path:C,exact:m,sensitive:w,strict:k}):null,L=!!(y?y(A,n):A),P="function"==typeof g?g(L):g,N="function"==typeof E?E(L):E;L&&(P=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(P,u),N=(0,l.Z)({},N,p));var O=(0,l.Z)({"aria-current":L&&r||null,className:P,style:N,to:i},T);return b!==v?O.ref=t||S:O.innerRef=S,o.createElement(h,O)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>L,F0:()=>_,LX:()=>A,TH:()=>B,k6:()=>D,l_:()=>S,rs:()=>M,s6:()=>y});var a=n(5068),r=n(7294),o=n(5697),i=n.n(o),l=n(2358),s=n(8776),c=n(7462),u=n(9658),d=n.n(u),f=(n(9864),n(3366)),p=(n(8679),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};function m(e){var t=[];return{on:function(e){t.push(e)},off:function(e){t=t.filter((function(t){return t!==e}))},get:function(){return e},set:function(n,a){e=n,t.forEach((function(t){return t(e,a)}))}}}var h=r.createContext||function(e,t){var n,o,l="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).emitter=m(t.props.value),t}(0,a.Z)(n,e);var r=n.prototype;return r.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},r.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,a=this.props.value,r=e.value;((o=a)===(i=r)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(a,r):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},r.render=function(){return this.props.children},n}(r.Component);s.childContextTypes=((n={})[l]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t.call.apply(t,[this].concat(a))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,a.Z)(n,t);var r=n.prototype;return r.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},r.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},r.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},r.getValue=function(){return this.context[l]?this.context[l].get():e},r.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(r.Component);return c.contextTypes=((o={})[l]=i().object,o),{Provider:s,Consumer:c}},b=function(e){var t=h();return t.displayName=e,t},v=b("Router-History"),y=b("Router"),_=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,a.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return r.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},r.createElement(v.Provider,{children:this.props.children||null,value:this.props.history}))},t}(r.Component);r.Component;var w=function(e){function t(){return e.apply(this,arguments)||this}(0,a.Z)(t,e);var n=t.prototype;return n.componentDidMount=function(){this.props.onMount&&this.props.onMount.call(this,this)},n.componentDidUpdate=function(e){this.props.onUpdate&&this.props.onUpdate.call(this,this,e)},n.componentWillUnmount=function(){this.props.onUnmount&&this.props.onUnmount.call(this,this)},n.render=function(){return null},t}(r.Component);var k={},E=0;function x(e,t){return void 0===e&&(e="/"),void 0===t&&(t={}),"/"===e?e:function(e){if(k[e])return k[e];var t=d().compile(e);return E<1e4&&(k[e]=t,E++),t}(e)(t,{pretty:!0})}function S(e){var t=e.computedMatch,n=e.to,a=e.push,o=void 0!==a&&a;return r.createElement(y.Consumer,null,(function(e){e||(0,s.Z)(!1);var a=e.history,i=e.staticContext,u=o?a.push:a.replace,d=(0,l.ob)(t?"string"==typeof n?x(n,t.params):(0,c.Z)({},n,{pathname:x(n.pathname,t.params)}):n);return i?(u(d),null):r.createElement(w,{onMount:function(){u(d)},onUpdate:function(e,t){var n=(0,l.ob)(t.to);(0,l.Hp)(n,(0,c.Z)({},d,{key:n.key}))||u(d)},to:n})}))}var T={},C=0;function A(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,a=n.path,r=n.exact,o=void 0!==r&&r,i=n.strict,l=void 0!==i&&i,s=n.sensitive,c=void 0!==s&&s;return[].concat(a).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var a=function(e,t){var n=""+t.end+t.strict+t.sensitive,a=T[n]||(T[n]={});if(a[e])return a[e];var r=[],o={regexp:d()(e,r,t),keys:r};return C<1e4&&(a[e]=o,C++),o}(n,{end:o,strict:l,sensitive:c}),r=a.regexp,i=a.keys,s=r.exec(e);if(!s)return null;var u=s[0],f=s.slice(1),p=e===u;return o&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var L=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(y.Consumer,null,(function(t){t||(0,s.Z)(!1);var n=e.props.location||t.location,a=e.props.computedMatch?e.props.computedMatch:e.props.path?A(n.pathname,e.props):t.match,o=(0,c.Z)({},t,{location:n,match:a}),i=e.props,l=i.children,u=i.component,d=i.render;return Array.isArray(l)&&function(e){return 0===r.Children.count(e)}(l)&&(l=null),r.createElement(y.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:u?r.createElement(u,o):d?d(o):null:"function"==typeof l?l(o):null)}))},t}(r.Component);function P(e){return"/"===e.charAt(0)?e:"/"+e}function N(e,t){if(!e)return t;var n=P(e);return 0!==t.pathname.indexOf(n)?t:(0,c.Z)({},t,{pathname:t.pathname.substr(n.length)})}function O(e){return"string"==typeof e?e:(0,l.Ep)(e)}function R(e){return function(){(0,s.Z)(!1)}}function I(){}r.Component;var M=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(y.Consumer,null,(function(t){t||(0,s.Z)(!1);var n,a,o=e.props.location||t.location;return r.Children.forEach(e.props.children,(function(e){if(null==a&&r.isValidElement(e)){n=e;var i=e.props.path||e.props.from;a=i?A(o.pathname,(0,c.Z)({},e.props,{path:i})):t.match}})),a?r.cloneElement(n,{location:o,computedMatch:a}):null}))},t}(r.Component);var j=r.useContext;function D(){return j(v)}function B(){return j(y).location}},9658:(e,t,n)=>{var a=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var r=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,a=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=r.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],v=n[5],y=n[6],_=n[7];l&&(a.push(l),l="");var w=null!=m&&null!=g&&g!==m,k="+"===y||"*"===y,E="?"===y||"*"===y,x=n[2]||u,S=b||v;a.push({name:h||o++,prefix:m||"",delimiter:x,optional:E,repeat:k,partial:w,asterisk:!!_,pattern:S?c(S):_?".*":"[^"+s(x)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&a.push(l),a}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),r=0;r<e.length;r++)"object"==typeof e[r]&&(n[r]=new RegExp("^(?:"+e[r].pattern+")$",d(t)));return function(t,r){for(var o="",l=t||{},s=(r||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=l[u.name];if(null==f){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(a(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=s(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');o+=u.prefix+d}}else o+=u}return o}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){a(t)||(n=t||n,t=[]);for(var r=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var f=s(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var g=s(n.delimiter||"/"),m=i.slice(-g.length)===g;return r||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=o?"$":r&&m?"":"(?="+g+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return a(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var a=0;a<n.length;a++)t.push({name:a,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):a(e)?function(e,t,n){for(var a=[],r=0;r<e.length;r++)a.push(p(e[r],t,n).source);return u(new RegExp("(?:"+a.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},2408:(e,t,n)=>{"use strict";var a=n(7418),r=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,l=60110,s=60112;t.Suspense=60113;var c=60115,u=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;r=d("react.element"),o=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),l=d("react.context"),s=d("react.forward_ref"),t.Suspense=d("react.suspense"),c=d("react.memo"),u=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m={};function h(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,a(y,h.prototype),y.isPureReactComponent=!0;var _={current:null},w=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,n){var a,o={},i=null,l=null;if(null!=t)for(a in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)w.call(t,a)&&!k.hasOwnProperty(a)&&(o[a]=t[a]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(a in s=e.defaultProps)void 0===o[a]&&(o[a]=s[a]);return{$$typeof:r,type:e,key:i,ref:l,props:o,_owner:_.current}}function x(e){return"object"==typeof e&&null!==e&&e.$$typeof===r}var S=/\/+/g;function T(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function C(e,t,n,a,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case r:case o:s=!0}}if(s)return i=i(s=e),e=""===a?"."+T(s,0):a,Array.isArray(i)?(n="",null!=e&&(n=e.replace(S,"$&/")+"/"),C(i,t,n,"",(function(e){return e}))):null!=i&&(x(i)&&(i=function(e,t){return{$$typeof:r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(S,"$&/")+"/")+e)),t.push(i)),1;if(s=0,a=""===a?".":a+":",Array.isArray(e))for(var c=0;c<e.length;c++){var u=a+T(l=e[c],c);s+=C(l,t,n,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=C(l=l.value,t,n,u=a+T(l,c++),i);else if("object"===l)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return s}function A(e,t,n){if(null==e)return e;var a=[],r=0;return C(e,a,"","",(function(e){return t.call(n,e,r++)})),a}function L(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var P={current:null};function N(){var e=P.current;if(null===e)throw Error(p(321));return e}var O={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:_,IsSomeRendererActing:{current:!1},assign:a};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!x(e))throw Error(p(143));return e}},t.Component=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var o=a({},e.props),i=e.key,l=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(l=t.ref,s=_.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)w.call(t,u)&&!k.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){c=Array(u);for(var d=0;d<u;d++)c[d]=arguments[d+2];o.children=c}return{$$typeof:r,type:e.type,key:i,ref:l,props:o,_owner:s}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:l,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=E,t.createFactory=function(e){var t=E.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:s,render:e}},t.isValidElement=x,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:c,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return N().useCallback(e,t)},t.useContext=function(e,t){return N().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return N().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return N().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return N().useLayoutEffect(e,t)},t.useMemo=function(e,t){return N().useMemo(e,t)},t.useReducer=function(e,t,n){return N().useReducer(e,t,n)},t.useRef=function(e){return N().useRef(e)},t.useState=function(e){return N().useState(e)},t.version="17.0.2"},7294:(e,t,n)=>{"use strict";e.exports=n(2408)},53:(e,t)=>{"use strict";var n,a,r,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var c=null,u=null,d=function(){if(null!==c)try{var e=t.unstable_now();c(!0,e),c=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==c?setTimeout(n,0,e):(c=e,setTimeout(d,0))},a=function(e,t){u=setTimeout(e,t)},r=function(){clearTimeout(u)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var g=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof g&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,h=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):v=0<e?Math.floor(1e3/e):5};var _=new MessageChannel,w=_.port2;_.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?w.postMessage(null):(m=!1,h=null)}catch(n){throw w.postMessage(null),n}}else m=!1},n=function(e){h=e,m||(m=!0,w.postMessage(null))},a=function(e,n){b=f((function(){e(t.unstable_now())}),n)},r=function(){p(b),b=-1}}function k(e,t){var n=e.length;e.push(t);e:for(;;){var a=n-1>>>1,r=e[a];if(!(void 0!==r&&0<S(r,t)))break e;e[a]=t,e[n]=r,n=a}}function E(e){return void 0===(e=e[0])?null:e}function x(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var a=0,r=e.length;a<r;){var o=2*(a+1)-1,i=e[o],l=o+1,s=e[l];if(void 0!==i&&0>S(i,n))void 0!==s&&0>S(s,i)?(e[a]=s,e[l]=n,a=l):(e[a]=i,e[o]=n,a=o);else{if(!(void 0!==s&&0>S(s,n)))break e;e[a]=s,e[l]=n,a=l}}}return t}return null}function S(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var T=[],C=[],A=1,L=null,P=3,N=!1,O=!1,R=!1;function I(e){for(var t=E(C);null!==t;){if(null===t.callback)x(C);else{if(!(t.startTime<=e))break;x(C),t.sortIndex=t.expirationTime,k(T,t)}t=E(C)}}function M(e){if(R=!1,I(e),!O)if(null!==E(T))O=!0,n(j);else{var t=E(C);null!==t&&a(M,t.startTime-e)}}function j(e,n){O=!1,R&&(R=!1,r()),N=!0;var o=P;try{for(I(n),L=E(T);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=L.callback;if("function"==typeof i){L.callback=null,P=L.priorityLevel;var l=i(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?L.callback=l:L===E(T)&&x(T),I(n)}else x(T);L=E(T)}if(null!==L)var s=!0;else{var c=E(C);null!==c&&a(M,c.startTime-n),s=!1}return s}finally{L=null,P=o,N=!1}}var D=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){O||N||(O=!0,n(j))},t.unstable_getCurrentPriorityLevel=function(){return P},t.unstable_getFirstCallbackNode=function(){return E(T)},t.unstable_next=function(e){switch(P){case 1:case 2:case 3:var t=3;break;default:t=P}var n=P;P=t;try{return e()}finally{P=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=D,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=P;P=e;try{return t()}finally{P=n}},t.unstable_scheduleCallback=function(e,o,i){var l=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?l+i:l:i=l,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:A++,callback:o,priorityLevel:e,startTime:i,expirationTime:s=i+s,sortIndex:-1},i>l?(e.sortIndex=i,k(C,e),null===E(T)&&e===E(C)&&(R?r():R=!0,a(M,i-l))):(e.sortIndex=s,k(T,e),O||N||(O=!0,n(j))),e},t.unstable_wrapCallback=function(e){var t=P;return function(){var n=P;P=t;try{return e.apply(this,arguments)}finally{P=n}}}},3840:(e,t,n)=>{"use strict";e.exports=n(53)},6774:e=>{e.exports=function(e,t,n,a){var r=n?n.call(a,e,t):void 0;if(void 0!==r)return!!r;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var c=o[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(r=n?n.call(a,u,d,c):void 0)||void 0===r&&u!==d)return!1}return!0}},3250:(e,t,n)=>{"use strict";var a=n(7294);var r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=a.useState,i=a.useEffect,l=a.useLayoutEffect,s=a.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch(a){return!0}}var u="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),a=o({inst:{value:n,getSnapshot:t}}),r=a[0].inst,u=a[1];return l((function(){r.value=n,r.getSnapshot=t,c(r)&&u({inst:r})}),[e,n,t]),i((function(){return c(r)&&u({inst:r}),e((function(){c(r)&&u({inst:r})}))}),[e]),s(n),n};t.useSyncExternalStore=void 0!==a.useSyncExternalStore?a.useSyncExternalStore:u},1688:(e,t,n)=>{"use strict";e.exports=n(3250)},6809:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});const a={title:"GG",url:"https://greeng00se.github.io",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/duck.png",organizationName:"greeng00se",projectName:"greeng00se.github.io",trailingSlash:!1,i18n:{defaultLocale:"ko",locales:["ko"],path:"i18n",localeConfigs:{}},markdown:{mermaid:!0},themes:["@docusaurus/theme-mermaid"],presets:[["classic",{blog:{showReadingTime:!0,routeBasePath:"/",archiveBasePath:"/blog",postsPerPage:1,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/"},docs:{sidebarPath:"/home/runner/work/greeng00se.github.io/greeng00se.github.io/sidebars.js",showLastUpdateTime:!0,editUrl:"https://github.com/greeng00se/greeng00se.github.io/tree/main/"},theme:{customCss:"/home/runner/work/greeng00se.github.io/greeng00se.github.io/src/css/custom.css"},gtag:{trackingID:"G-17TREGCW4H",anonymizeIP:!0}}]],themeConfig:{navbar:{title:"greeng\xf6\xf6se",items:[{to:"/blog",label:"\ube14\ub85c\uadf8",position:"left"},{position:"left",type:"doc",label:"\ubb38\uc11c",docId:"intro"},{href:"https://github.com/greeng00se",position:"right",className:"header-github-link","aria-label":"GitHub repository"}],hideOnScroll:!1},algolia:{appId:"YSMNU47L51",apiKey:"16caa11a7af7bf5db56b5f640fa738cd",indexName:"gh",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["java","kotlin","groovy"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},metadata:[{name:"google-site-verification",content:"APK6j79LMymudgmQDTV8u_RYyncFYyuFUjY9A0hVPv4"}],colorMode:{defaultMode:"dark",respectPrefersColorScheme:!0,disableSwitch:!1},mermaid:{theme:{light:"neutral",dark:"dark"},options:{}},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],tagline:"",titleDelimiter:"|",noIndex:!1}},7462:(e,t,n)=>{"use strict";function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},a.apply(this,arguments)}n.d(t,{Z:()=>a})},5068:(e,t,n)=>{"use strict";function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,a(e,t)}n.d(t,{Z:()=>r})},3366:(e,t,n)=>{"use strict";function a(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}n.d(t,{Z:()=>a})},8776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var a="Invariant failed";function r(e,t){if(!e)throw new Error(a)}},7529:e=>{"use strict";e.exports=JSON.parse('{"theme.AnnouncementBar.closeButtonAriaLabel":"\ub2eb\uae30","theme.BackToTopButton.buttonAriaLabel":"\ub9e8 \uc704\ub85c \uc2a4\ud06c\ub864\ud558\uae30","theme.CodeBlock.copied":"\ubcf5\uc0ac\ud588\uc2b5\ub2c8\ub2e4","theme.CodeBlock.copy":"\ubcf5\uc0ac","theme.CodeBlock.copyButtonAriaLabel":"\ud074\ub9bd\ubcf4\ub4dc\uc5d0 \ucf54\ub4dc \ubcf5\uc0ac","theme.CodeBlock.wordWrapToggle":"\uc904 \ubc14\uafc8 \uc804\ud658","theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel":"\uc811\uc744 \uc218 \uc788\ub294 \uc0ac\uc774\ub4dc\ubc14 \ubd84\ub958 \'{label}\' \uc811\uae30(\ud3bc\uce58\uae30)","theme.ErrorPageContent.title":"\ud398\uc774\uc9c0\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4.","theme.ErrorPageContent.tryAgain":"\ub2e4\uc2dc \uc2dc\ub3c4\ud574 \ubcf4\uc138\uc694","theme.NavBar.navAriaLabel":"Main","theme.NotFound.p1":"\uc6d0\ud558\ub294 \ud398\uc774\uc9c0\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.","theme.NotFound.p2":"\uc0ac\uc774\ud2b8 \uad00\ub9ac\uc790\uc5d0\uac8c \ub9c1\ud06c\uac00 \uae68\uc9c4 \uac83\uc744 \uc54c\ub824\uc8fc\uc138\uc694.","theme.NotFound.title":"\ud398\uc774\uc9c0\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.","theme.TOCCollapsible.toggleButtonLabel":"\uc774 \ud398\uc774\uc9c0\uc5d0\uc11c","theme.admonition.caution":"\uc8fc\uc758","theme.admonition.danger":"\uc704\ud5d8","theme.admonition.info":"\uc815\ubcf4","theme.admonition.note":"\ub178\ud2b8","theme.admonition.tip":"\ud301","theme.blog.archive.description":"\uac8c\uc2dc\ubb3c \ubaa9\ub85d","theme.blog.archive.title":"\uac8c\uc2dc\ubb3c \ubaa9\ub85d","theme.blog.paginator.navAriaLabel":"\ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c \ubaa9\ub85d \ud0d0\uc0c9","theme.blog.paginator.newerEntries":"\uc774\uc804 \ud398\uc774\uc9c0","theme.blog.paginator.olderEntries":"\ub2e4\uc74c \ud398\uc774\uc9c0","theme.blog.post.paginator.navAriaLabel":"\ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c \ud0d0\uc0c9","theme.blog.post.paginator.newerPost":"\uc774\uc804 \uac8c\uc2dc\ubb3c","theme.blog.post.paginator.olderPost":"\ub2e4\uc74c \uac8c\uc2dc\ubb3c","theme.blog.post.plurals":"{count}\uac1c \uac8c\uc2dc\ubb3c","theme.blog.post.readMore":"\uc790\uc138\ud788 \ubcf4\uae30","theme.blog.post.readMoreLabel":"{title} \uc5d0 \ub300\ud574 \ub354 \uc77d\uc5b4\ubcf4\uae30","theme.blog.post.readingTime.plurals":"\uc57d {readingTime}\ubd84","theme.blog.sidebar.navAriaLabel":"\ucd5c\uadfc \ube14\ub85c\uadf8 \ubb38\uc11c \ub458\ub7ec\ubcf4\uae30","theme.blog.tagTitle":"\\"{tagName}\\" \ud0dc\uadf8\ub85c \uc5f0\uacb0\ub41c {nPosts}\uac1c\uc758 \uac8c\uc2dc\ubb3c\uc774 \uc788\uc2b5\ub2c8\ub2e4.","theme.colorToggle.ariaLabel":"\uc5b4\ub450\uc6b4 \ubaa8\ub4dc\uc640 \ubc1d\uc740 \ubaa8\ub4dc \uc804\ud658\ud558\uae30 (\ud604\uc7ac {mode})","theme.colorToggle.ariaLabel.mode.dark":"\uc5b4\ub450\uc6b4 \ubaa8\ub4dc","theme.colorToggle.ariaLabel.mode.light":"\ubc1d\uc740 \ubaa8\ub4dc","theme.common.editThisPage":"\ud398\uc774\uc9c0 \ud3b8\uc9d1","theme.common.headingLinkTitle":"{heading}\uc5d0 \ub300\ud55c \uc9c1\uc811 \ub9c1\ud06c","theme.common.skipToMainContent":"\ubcf8\ubb38\uc73c\ub85c \uac74\ub108\ub6f0\uae30","theme.docs.DocCard.categoryDescription":"{count} \ud56d\ubaa9","theme.docs.breadcrumbs.home":"\ud648","theme.docs.breadcrumbs.navAriaLabel":"Breadcrumbs","theme.docs.paginator.navAriaLabel":"\ubb38\uc11c \ud0d0\uc0c9","theme.docs.paginator.next":"\ub2e4\uc74c","theme.docs.paginator.previous":"\uc774\uc804","theme.docs.sidebar.closeSidebarButtonAriaLabel":"Close navigation bar","theme.docs.sidebar.collapseButtonAriaLabel":"\uc0ac\uc774\ub4dc\ubc14 \uc228\uae30\uae30","theme.docs.sidebar.collapseButtonTitle":"\uc0ac\uc774\ub4dc\ubc14 \uc228\uae30\uae30","theme.docs.sidebar.expandButtonAriaLabel":"\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30","theme.docs.sidebar.expandButtonTitle":"\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30","theme.docs.sidebar.navAriaLabel":"Docs sidebar","theme.docs.sidebar.toggleSidebarButtonAriaLabel":"Toggle navigation bar","theme.docs.tagDocListPageTitle":"{nDocsTagged} \\"{tagName}\\" \ud0dc\uadf8\uc5d0 \ubd84\ub958\ub418\uc5c8\uc2b5\ub2c8\ub2e4","theme.docs.tagDocListPageTitle.nDocsTagged":"{count}\uac1c \ubb38\uc11c\uac00","theme.docs.versionBadge.label":"\ubc84\uc804: {versionLabel}","theme.docs.versions.latestVersionLinkLabel":"\ucd5c\uc2e0 \ubc84\uc804","theme.docs.versions.latestVersionSuggestionLabel":"\ucd5c\uc2e0 \ubb38\uc11c\ub294 {latestVersionLink} ({versionLabel})\uc744 \ud655\uc778\ud558\uc138\uc694.","theme.docs.versions.unmaintainedVersionLabel":"{siteTitle} {versionLabel} \ubb38\uc11c\ub294 \ub354 \uc774\uc0c1 \uc5c5\ub370\uc774\ud2b8\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.","theme.docs.versions.unreleasedVersionLabel":"{siteTitle} {versionLabel} \ubb38\uc11c\ub294 \uc544\uc9c1 \uc815\uc2dd \uacf5\uac1c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.","theme.lastUpdated.atDate":" {date}\uc5d0","theme.lastUpdated.byUser":" {user}\uac00","theme.lastUpdated.lastUpdatedAtBy":"\ucd5c\uc885 \uc218\uc815: {atDate}{byUser}","theme.navbar.mobileLanguageDropdown.label":"\uc5b8\uc5b4","theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel":"\u2190 \uba54\uc778 \uba54\ub274\ub85c \ub3cc\uc544\uac00\uae30","theme.navbar.mobileVersionsDropdown.label":"\ubc84\uc804","theme.tags.tagsListLabel":"\ud0dc\uadf8:","theme.tags.tagsPageLink":"\ubaa8\ub4e0 \ud0dc\uadf8 \ubcf4\uae30","theme.tags.tagsPageTitle":"\ud0dc\uadf8","theme.SearchBar.label":"\uac80\uc0c9","theme.SearchBar.seeAll":"{count}\uac1c\uc758 \uacb0\uacfc \ud655\uc778\ud558\uae30","theme.SearchModal.errorScreen.helpText":"\uc778\ud130\ub137 \uc5f0\uacb0\uc744 \ub2e4\uc2dc \ud655\uc778\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.","theme.SearchModal.errorScreen.titleText":"\uacb0\uacfc\ub97c \ubd88\ub7ec\uc62c \uc218 \uc5c6\uc74c","theme.SearchModal.footer.closeKeyAriaLabel":"Esc \ud0a4","theme.SearchModal.footer.closeText":"\ub85c \uc885\ub8cc","theme.SearchModal.footer.navigateDownKeyAriaLabel":"\ud654\uc0b4\ud45c \uc544\ub798 \ud0a4","theme.SearchModal.footer.navigateText":"\ub85c \uc774\ub3d9","theme.SearchModal.footer.navigateUpKeyAriaLabel":"\ud654\uc0b4\ud45c \uc704 \ud0a4","theme.SearchModal.footer.searchByText":"\uac80\uc0c9 \uc81c\uacf5","theme.SearchModal.footer.selectKeyAriaLabel":"\uc5d4\ud130 \ud0a4","theme.SearchModal.footer.selectText":"\ub85c \uc120\ud0dd","theme.SearchModal.noResultsScreen.noResultsText":"\uac80\uc0c9 \uacb0\uacfc \uc5c6\uc74c","theme.SearchModal.noResultsScreen.reportMissingResultsLinkText":"\uc54c\ub824\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.","theme.SearchModal.noResultsScreen.reportMissingResultsText":"\uac80\uc0c9 \uacb0\uacfc\uac00 \uc5c6\ub294 \uac83\uc774 \uc624\ub958\ub77c\uace0 \uc0dd\uac01\ub418\uc2ed\ub2c8\uae4c?","theme.SearchModal.noResultsScreen.suggestedQueryText":"\ub2e4\ub978 \ucd94\ucc9c \uac80\uc0c9\uc5b4","theme.SearchModal.placeholder":"\ubb38\uc11c \uac80\uc0c9","theme.SearchModal.searchBox.cancelButtonText":"\ucde8\uc18c","theme.SearchModal.searchBox.resetButtonTitle":"\uac80\uc0c9\uc5b4 \ucd08\uae30\ud654","theme.SearchModal.startScreen.favoriteSearchesTitle":"\uc990\uaca8\ucc3e\uae30","theme.SearchModal.startScreen.noRecentSearchesText":"\ucd5c\uadfc \uac80\uc0c9\uc5b4 \uc5c6\uc74c","theme.SearchModal.startScreen.recentSearchesTitle":"\ucd5c\uadfc","theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle":"\uc774 \uac80\uc0c9\uc5b4\ub97c \uc990\uaca8\ucc3e\uae30\uc5d0\uc11c \uc0ad\uc81c","theme.SearchModal.startScreen.removeRecentSearchButtonTitle":"\uc774 \uac80\uc0c9\uc5b4\ub97c \ucd5c\uadfc \uac80\uc0c9\uc5b4\uc5d0\uc11c \uc0ad\uc81c","theme.SearchModal.startScreen.saveRecentSearchButtonTitle":"\uc774 \uac80\uc0c9\uc5b4\ub97c \uc800\uc7a5","theme.SearchPage.algoliaLabel":"Algolia\ub85c \uac80\uc0c9","theme.SearchPage.documentsFound.plurals":"{count}\uac1c\uc758 \ubb38\uc11c\ub97c \ucc3e\uc558\uc2b5\ub2c8\ub2e4.","theme.SearchPage.emptyResultsTitle":"\ubb38\uc11c\ub97c \uac80\uc0c9\ud569\ub2c8\ub2e4.","theme.SearchPage.existingResultsTitle":"\\"{query}\\" \uac80\uc0c9 \uacb0\uacfc","theme.SearchPage.fetchingNewResults":"\uc0c8\ub85c\uc6b4 \uac80\uc0c9 \uacb0\uacfc\ub97c \ubd88\ub7ec\uc624\ub294 \uc911\uc785\ub2c8\ub2e4.","theme.SearchPage.inputLabel":"\uac80\uc0c9","theme.SearchPage.inputPlaceholder":"\uac80\uc0c9\uc5b4\ub97c \uc785\ub825\ud558\uc138\uc694.","theme.SearchPage.noResultsText":"\uac80\uc0c9 \uacb0\uacfc\uac00 \uc5c6\uc2b5\ub2c8\ub2e4."}')},6887:e=>{"use strict";e.exports=JSON.parse('{"/1-fe7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1563fc8b"},"/10-440":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"a571ae8c"},"/11-74a":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1c74a8fd"},"/12-0c3":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"34a9e1b6"},"/13-bf5":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"0b2567db"},"/14-f02":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"d297da14"},"/15-e52":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"06ea9cd1"},"/16-b3b":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"b393c858"},"/17-cc2":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"d693e23c"},"/18-a45":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"92926477"},"/19-e8b":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"882ffb20"},"/2-4be":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"9f324683"},"/20-2a7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"49c232d6"},"/21-794":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"24214711"},"/22-8d6":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"5f785aa3"},"/23-8a8":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"0f9a8782"},"/24-312":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"397e7345"},"/25-922":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"c0a61fca"},"/26-5fd":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"b2e443b6"},"/27-a34":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"3f4fb381"},"/28-203":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"2e892090"},"/29-784":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"43f49b9e"},"/3-cf7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"b7811d78"},"/30-9f7":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"4413b451"},"/31-20a":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"899da081"},"/32-fa9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"0ecaa6ec"},"/33-e77":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"a0333b7c"},"/34-58f":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"3028ca57"},"/35-481":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"6600e5b0"},"/36-827":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"3216290d"},"/37-559":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"f619e31e"},"/38-068":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"d3752f11"},"/39-820":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"ae6a2dc6"},"/4-dd9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1c5d8736"},"/40-b09":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"1e4ebcd5"},"/5-b35":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"86863b3d"},"/6-5d9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"8e3d08a4"},"/7-374":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"4177cd87"},"/8-274":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"f20d36f2"},"/9-2e9":{"__comp":"ccc49370","__context":{"plugin":"509d519c"},"sidebar":"814f3328","content":"fd60e617"},"/blog-3d8":{"__comp":"9e4087bc","__context":{"plugin":"509d519c"},"archive":"b2b675dd"},"/docs/tags-820":{"__comp":"3720c009","__context":{"plugin":"dcf70953"},"tags":"55960ee5"},"/docs/tags/book-c20":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"f4c6e7e6"},"/docs/tags/etc-338":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"c189d18f"},"/docs/tags/jpa-f95":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"5ffd2c10"},"/docs/tags/monitoring-50f":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"1c93669b"},"/docs/tags/nginx-ecc":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"c60995f6"},"/docs/tags/pacakge-c10":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"c33ca104"},"/docs/tags/postmortem-4b0":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"7e4c1ed7"},"/docs/tags/test-b58":{"__comp":"df203c0f","__context":{"plugin":"dcf70953"},"tag":"9bbc65ac"},"/page/10-ce5":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0e9b73e4"}],"metadata":"f332d221"},"/page/11-eec":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0050401e"}],"metadata":"fbd57548"},"/page/12-77a":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0cb2f220"}],"metadata":"f4f49e13"},"/page/13-cae":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"8e9056ec"}],"metadata":"2832e534"},"/page/14-ff1":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ee00b37a"}],"metadata":"4959fc42"},"/page/15-764":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4aa09797"}],"metadata":"38d8699e"},"/page/16-cdf":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"33ae6a7e"}],"metadata":"09fbb6bd"},"/page/17-33e":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"dcfccecb"}],"metadata":"d1cef389"},"/page/18-102":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6c60e25f"}],"metadata":"9cfe8fd1"},"/page/19-1cc":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ab2128e5"}],"metadata":"96adae60"},"/page/2-033":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"456b5fae"}],"metadata":"0c071de2"},"/page/20-c45":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"2f7a5a88"}],"metadata":"35293ec4"},"/page/21-cbd":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b8de016f"}],"metadata":"80960b4b"},"/page/22-072":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"metadata":"ef5b2427"},"/page/23-609":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"metadata":"871c1e5a"},"/page/24-6df":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"metadata":"635a92d5"},"/page/25-009":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"87a22936"}],"metadata":"226700de"},"/page/26-f89":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"741df4e1"}],"metadata":"54cb095e"},"/page/27-a5b":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95dc859f"}],"metadata":"5f81b25c"},"/page/28-d28":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"76603d6f"}],"metadata":"270346fa"},"/page/29-658":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"d6c08822"}],"metadata":"12cbeba7"},"/page/3-749":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"686688fd"}],"metadata":"e4ebfe18"},"/page/30-943":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a5b179f0"}],"metadata":"00931cc3"},"/page/31-822":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6b90f600"}],"metadata":"d50fd269"},"/page/32-d7b":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f2b7d1a9"}],"metadata":"754fb852"},"/page/33-0eb":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4f3c73fd"}],"metadata":"f3e308ad"},"/page/34-5b3":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b73048db"}],"metadata":"6dd1c948"},"/page/35-837":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"3cc6ebf8"}],"metadata":"c29bedb9"},"/page/36-d24":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a1cea306"}],"metadata":"69c28c32"},"/page/37-143":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f1783c84"}],"metadata":"494882d1"},"/page/38-7b8":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f105176d"}],"metadata":"2e10a69c"},"/page/39-771":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"041ed4b0"}],"metadata":"64868a43"},"/page/4-b12":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b1d2ea98"}],"metadata":"7762a24e"},"/page/40-b7c":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e3a9c3a3"}],"metadata":"eec33099"},"/page/5-527":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0a7a6076"}],"metadata":"8d05b77c"},"/page/6-ee0":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"metadata":"7af1d52f"},"/page/7-ef0":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"268e20d0"}],"metadata":"d0e4cdf1"},"/page/8-cce":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"804ef369"}],"metadata":"f75a8651"},"/page/9-56d":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95c5de0b"}],"metadata":"6093f82b"},"/search-c1e":{"__comp":"1a4e3797","__context":{"plugin":"18c69d70"}},"/tags-4bf":{"__comp":"01a85c17","__context":{"plugin":"509d519c"},"sidebar":"814f3328","tags":"c573638f"},"/tags/async-1a2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"03e71e14"}],"tag":"8fbd512b","listMetadata":"a1877440"},"/tags/awt-f0a":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"456b5fae"}],"tag":"cf8e491a","listMetadata":"9b56b618"},"/tags/awt/page/2-284":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0a7a6076"}],"tag":"f0978ee1","listMetadata":"32397cb2"},"/tags/book-909":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b8de016f"}],"tag":"2d3b202f","listMetadata":"14164549"},"/tags/book/page/2-989":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f105176d"}],"tag":"2bfe7c0b","listMetadata":"c0cb7215"},"/tags/book/page/3-a75":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e3a9c3a3"}],"tag":"df862072","listMetadata":"ffb0fa11"},"/tags/class-3ca":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"741df4e1"}],"tag":"33736670","listMetadata":"8d7288fe"},"/tags/composite-737":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"8e9056ec"}],"tag":"255134d9","listMetadata":"ae1d6508"},"/tags/data-base-ab7":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"tag":"0a2eaa84","listMetadata":"309173fa"},"/tags/data-base/page/2-f0a":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"tag":"9dec6b67","listMetadata":"66d1c769"},"/tags/data-base/page/3-f63":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"tag":"02689328","listMetadata":"dfa84138"},"/tags/documentation-989":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"804ef369"}],"tag":"7bbc420e","listMetadata":"20e99c2a"},"/tags/dto-a68":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4aa09797"}],"tag":"5a6c6934","listMetadata":"d0277431"},"/tags/elastic-beanstalk-a4b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ab2128e5"}],"tag":"28a1570f","listMetadata":"0746167d"},"/tags/event-6b5":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"03e71e14"}],"tag":"0cb009d1","listMetadata":"8dc09bac"},"/tags/grasp-efe":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a5b179f0"}],"tag":"b9bcab37","listMetadata":"2f43e44a"},"/tags/image-7cc":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"456b5fae"}],"tag":"75121fd5","listMetadata":"d368e73e"},"/tags/image/page/2-3e2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"686688fd"}],"tag":"562496aa","listMetadata":"b474adfe"},"/tags/image/page/3-bcb":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0a7a6076"}],"tag":"d6a3d698","listMetadata":"4b2fba3e"},"/tags/inno-db-ea2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"tag":"49b8d9dd","listMetadata":"a9221bd5"},"/tags/intelli-j-0f1":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"3cc6ebf8"}],"tag":"fe8cce0a","listMetadata":"db7928b3"},"/tags/isolation-869":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"tag":"c3ea66fe","listMetadata":"d2935d14"},"/tags/java-75d":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"tag":"274c9143","listMetadata":"fe273484"},"/tags/java/page/2-e04":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"741df4e1"}],"tag":"1893cb59","listMetadata":"54150be7"},"/tags/java/page/3-fb9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95dc859f"}],"tag":"8e498bb6","listMetadata":"198f8d8a"},"/tags/java/page/4-de0":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b73048db"}],"tag":"a3dddb77","listMetadata":"08726fcf"},"/tags/java/page/5-6c2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f1783c84"}],"tag":"e2de2dbb","listMetadata":"35b2eb5a"},"/tags/jdbc-c84":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95dc859f"}],"tag":"a85e626a","listMetadata":"d40f51e1"},"/tags/jenkins-9e9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ab2128e5"}],"tag":"3b0f99e8","listMetadata":"0281109c"},"/tags/kotlin-27e":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a1cea306"}],"tag":"633582b9","listMetadata":"9fae68e2"},"/tags/lock-092":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"96b08d81"}],"tag":"6a19354d","listMetadata":"5eed1665"},"/tags/lock/page/2-cc1":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"tag":"9ca52986","listMetadata":"492a6565"},"/tags/mock-31b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"87a22936"}],"tag":"1d81daa1","listMetadata":"c6004f62"},"/tags/mockito-60c":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b1d2ea98"}],"tag":"3b18521e","listMetadata":"2b479afe"},"/tags/my-sql-c5a":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"9a859616"}],"tag":"e0e4666e","listMetadata":"bf933b37"},"/tags/oop-544":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a5b179f0"}],"tag":"9d8ee3a8","listMetadata":"d202e2c5"},"/tags/pattern-433":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"8e9056ec"}],"tag":"2d9296e4","listMetadata":"e9ff60ad"},"/tags/python-5b4":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"686688fd"}],"tag":"c7015929","listMetadata":"f580a9d0"},"/tags/retrospective-5d6":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95c5de0b"}],"tag":"8c6c0796","listMetadata":"a4a1e915"},"/tags/retrospective/page/10-581":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"76603d6f"}],"tag":"bbc01ba0","listMetadata":"9dc4119a"},"/tags/retrospective/page/11-be6":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"d6c08822"}],"tag":"e073eb07","listMetadata":"7405ea58"},"/tags/retrospective/page/12-2c3":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6b90f600"}],"tag":"3c5aea38","listMetadata":"e0d68441"},"/tags/retrospective/page/13-5eb":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f2b7d1a9"}],"tag":"d88bdb28","listMetadata":"e9624b4f"},"/tags/retrospective/page/14-d3f":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4f3c73fd"}],"tag":"7fd9a574","listMetadata":"21e890b0"},"/tags/retrospective/page/15-4e0":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"041ed4b0"}],"tag":"16cc6f3a","listMetadata":"b5f3dcc5"},"/tags/retrospective/page/2-120":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0e9b73e4"}],"tag":"abc83b7f","listMetadata":"533bfc57"},"/tags/retrospective/page/3-ac5":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0050401e"}],"tag":"bd2d06b5","listMetadata":"2b22d492"},"/tags/retrospective/page/4-ae9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0cb2f220"}],"tag":"303c1e60","listMetadata":"d126aabd"},"/tags/retrospective/page/5-57b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ee00b37a"}],"tag":"ee92877e","listMetadata":"43a97218"},"/tags/retrospective/page/6-080":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"33ae6a7e"}],"tag":"e8d6e7ce","listMetadata":"6bc709ad"},"/tags/retrospective/page/7-a0b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"dcfccecb"}],"tag":"a0410ab5","listMetadata":"564337ec"},"/tags/retrospective/page/8-8f0":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6c60e25f"}],"tag":"e21c8cc4","listMetadata":"05b907fc"},"/tags/retrospective/page/9-e54":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"2f7a5a88"}],"tag":"8b79a48d","listMetadata":"7e59392d"},"/tags/spring-5ac":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"tag":"3ed04b60","listMetadata":"7fbacf84"},"/tags/spring-boot-9b9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"e5f297b0"}],"tag":"087c46fa","listMetadata":"41b4728f"},"/tags/static-0f7":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"b1d2ea98"}],"tag":"269a2f75","listMetadata":"70a12cc4"},"/tags/teco-chat-789":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0cb2f220"}],"tag":"af81a133","listMetadata":"f042b56c"},"/tags/teco-chat/page/2-bb6":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6c60e25f"}],"tag":"c60ea0ff","listMetadata":"d5dfecc2"},"/tags/teco-chat/page/3-c60":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"2f7a5a88"}],"tag":"1a6b9123","listMetadata":"d09f7e4b"},"/tags/test-900":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"87a22936"}],"tag":"2a8faff0","listMetadata":"1a665c6f"},"/tags/time-667":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f1783c84"}],"tag":"f156dfb9","listMetadata":"fd5d2408"},"/tags/transaction-a90":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"a413785b"}],"tag":"d0840b01","listMetadata":"c037d168"},"/tags/web-socket-852":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"268e20d0"}],"tag":"489347ff","listMetadata":"3972c49f"},"/tags/woowahan-techcourse-83c":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"95c5de0b"}],"tag":"39ee6679","listMetadata":"5a29fbab"},"/tags/woowahan-techcourse/page/10-d7f":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"f2b7d1a9"}],"tag":"5c38e66e","listMetadata":"21d253a0"},"/tags/woowahan-techcourse/page/11-6ea":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"4f3c73fd"}],"tag":"d2770bf7","listMetadata":"64f377d6"},"/tags/woowahan-techcourse/page/2-ae2":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0e9b73e4"}],"tag":"86b4da3d","listMetadata":"e7d2a655"},"/tags/woowahan-techcourse/page/3-a3b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"0050401e"}],"tag":"dab4c683","listMetadata":"ac23d7ee"},"/tags/woowahan-techcourse/page/4-2ef":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"ee00b37a"}],"tag":"8da65e83","listMetadata":"6425a984"},"/tags/woowahan-techcourse/page/5-06b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"33ae6a7e"}],"tag":"fed8bc04","listMetadata":"bbceb8f1"},"/tags/woowahan-techcourse/page/6-046":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"dcfccecb"}],"tag":"a896be03","listMetadata":"f078e301"},"/tags/woowahan-techcourse/page/7-7e9":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"76603d6f"}],"tag":"f63a747b","listMetadata":"abb0816f"},"/tags/woowahan-techcourse/page/8-c0b":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"d6c08822"}],"tag":"672a376b","listMetadata":"ddf9e0bd"},"/tags/woowahan-techcourse/page/9-d99":{"__comp":"6875c492","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"6b90f600"}],"tag":"43fcf0e9","listMetadata":"7c660760"},"/docs-71c":{"__comp":"1be78505","__context":{"plugin":"dcf70953"},"versionMetadata":"935f2afb"},"/docs-818":{"__comp":"17896441","content":"f8409a7e"},"/docs/JPA/\uae30\ubcf8_\ud0a4_\ub9e4\ud551-8a6":{"__comp":"17896441","content":"3b0d95bc"},"/docs/Nginx/\uad6c\uc870_\ubc0f_\uba85\ub839\uc5b4-594":{"__comp":"17896441","content":"c55d205b"},"/docs/Nginx/\uc815\uc801_\ucee8\ud150\uce20_\uc81c\uacf5-90a":{"__comp":"17896441","content":"d86f7a37"},"/docs/\uae30\ud0c0/\uac74\uac15\ud558\uac8c_\ub098\uc544\uc9c0\uae30-ec3":{"__comp":"17896441","content":"459bd227"},"/docs/\ub3c4\uc11c/\uc0c1\uc790_\ubc16\uc73c\ub85c_\ud0c8\ucd9c\ud558\uae30-1b0":{"__comp":"17896441","content":"3fc16fd0"},"/docs/\ub9ac\ub205\uc2a4/Swap_\uba54\ubaa8\ub9ac_\uc124\uc815-c04":{"__comp":"17896441","content":"29476979"},"/docs/\ub9ac\ub205\uc2a4/\ud130\ubbf8\ub110_\uc258_\ud504\ub86c\ud504\ud2b8_\uc124\uc815-9d4":{"__comp":"17896441","content":"fcb446a5"},"/docs/\ubaa8\ub2c8\ud130\ub9c1/\ubaa8\ub2c8\ud130\ub9c1_\ud658\uacbd_\uad6c\uc131-94d":{"__comp":"17896441","content":"0d47646f"},"/docs/\ubb38\ud654/\ud3ec\uc2a4\ud2b8_\ubaa8\ud15c-644":{"__comp":"17896441","content":"9e477a5e"},"/docs/\uc124\uacc4/\ud328\ud0a4\uc9c0-f6b":{"__comp":"17896441","content":"981f7647"},"/docs/\ud14c\uc2a4\ud2b8/\uacc4\ub2e8_\ud14c\uc2a4\ud2b8-bef":{"__comp":"17896441","content":"a43f2942"},"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\uc8fc\ub3c4_\uac1c\ubc1c_\uaddc\uce59-06a":{"__comp":"17896441","content":"48bd1d32"},"/docs/\ud14c\uc2a4\ud2b8/\ud14c\uc2a4\ud2b8_\ucf54\ub4dc\uac00_\uc8fc\ub294_\ud61c\ud0dd-c2c":{"__comp":"17896441","content":"0462f8fc"},"/-3ce":{"__comp":"c4f5d8e4","__context":{"plugin":"ae3384b2"},"config":"5e9f5e1a"},"/-43c":{"__comp":"a6aa9e1f","__context":{"plugin":"509d519c"},"sidebar":"814f3328","items":[{"content":"03e71e14"}],"metadata":"a5557bb9"}}')}},e=>{e.O(0,[532],(()=>{return t=9383,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/runtime~main.51b0695a.js b/assets/js/runtime~main.51b0695a.js deleted file mode 100644 index e1547f2d4..000000000 --- a/assets/js/runtime~main.51b0695a.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i<e.length;i++){f=e[i][0],d=e[i][1],c=e[i][2];for(var t=!0,o=0;o<f.length;o++)(!1&c||b>=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c<b&&(b=c));if(t){e.splice(i--,1);var n=d();void 0!==n&&(a=n)}}return a}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({16:"fd60e617",31:"f4c6e7e6",53:"935f2afb",63:"ee00b37a",96:"087c46fa",100:"d50fd269",104:"a43f2942",116:"0cb009d1",172:"96adae60",240:"4959fc42",280:"741df4e1",286:"1893cb59",297:"9fae68e2",311:"1e4ebcd5",321:"0c071de2",328:"4b2fba3e",344:"c0a61fca",372:"35b2eb5a",418:"87a22936",422:"0281109c",425:"16cc6f3a",448:"28a1570f",454:"1a665c6f",471:"38d8699e",475:"a3dddb77",497:"5f785aa3",533:"b2b675dd",548:"32397cb2",573:"b474adfe",628:"e0d68441",653:"bbceb8f1",693:"6a19354d",732:"64f377d6",734:"05b907fc",743:"509d519c",782:"0f9a8782",843:"d2770bf7",846:"d0277431",893:"8e9056ec",952:"86b4da3d",955:"fe8cce0a",964:"c573638f",970:"3b0d95bc",988:"754fb852",1065:"69c28c32",1103:"49b8d9dd",1113:"0746167d",1196:"2d3b202f",1329:"a571ae8c",1434:"dfa84138",1436:"8e498bb6",1501:"64868a43",1560:"2e892090",1653:"7e4c1ed7",1675:"d126aabd",1677:"d5dfecc2",1761:"dcf70953",1762:"2bfe7c0b",1793:"309173fa",1853:"21d253a0",1865:"456b5fae",1892:"397e7345",1926:"f078e301",1994:"269a2f75",2007:"1c74a8fd",2048:"4413b451",2087:"7c660760",2100:"5ffd2c10",2181:"ae1d6508",2215:"abc83b7f",2334:"7af1d52f",2342:"0d47646f",2345:"7405ea58",2382:"f2b7d1a9",2448:"633582b9",2476:"2832e534",2526:"a896be03",2530:"e9ff60ad",2535:"814f3328",2542:"ddf9e0bd",2656:"303c1e60",2678:"d6c08822",2717:"f332d221",2727:"8e3d08a4",2742:"33736670",2753:"7762a24e",2756:"6c60e25f",2773:"3b18521e",2793:"489347ff",2816:"8c6c0796",2889:"7fd9a574",2890:"d6a3d698",2901:"b2e443b6",2947:"981f7647",2965:"ae3384b2",3009:"bbc01ba0",3085:"c60ea0ff",3089:"a6aa9e1f",3095:"bf933b37",3098:"d09f7e4b",3206:"f8409a7e",3211:"3028ca57",3213:"ac23d7ee",3259:"d2935d14",3306:"4aa09797",3307:"95dc859f",3359:"86863b3d",3392:"d86f7a37",3438:"c55d205b",3440:"fcb446a5",3483:"2d9296e4",3490:"9ca52986",3530:"20e99c2a",3553:"3b0f99e8",3578:"0b2567db",3608:"9e4087bc",3614:"fd5d2408",3671:"a4a1e915",3751:"3720c009",3886:"3fc16fd0",3910:"882ffb20",3912:"e8d6e7ce",4013:"01a85c17",4030:"29476979",4041:"24214711",4044:"804ef369",4109:"e5f297b0",4121:"55960ee5",4149:"8d05b77c",4174:"abb0816f",4185:"c7015929",4195:"c4f5d8e4",4212:"492a6565",4311:"7bbc420e",4371:"03e71e14",4435:"96b08d81",4471:"494882d1",4481:"0462f8fc",4560:"76603d6f",4564:"e9624b4f",4659:"6b90f600",4665:"e0e4666e",4670:"43f49b9e",4801:"8d7288fe",4815:"43a97218",4819:"d3752f11",4889:"5f81b25c",4953:"eec33099",4962:"c189d18f",5005:"33ae6a7e",5046:"db7928b3",5088:"54150be7",5094:"f105176d",5100:"533bfc57",5131:"f63a747b",5142:"a413785b",5164:"268e20d0",5212:"0a7a6076",5335:"75121fd5",5356:"3f4fb381",5465:"d0e4cdf1",5467:"6425a984",5487:"08726fcf",5507:"a9221bd5",5521:"5c38e66e",5602:"f156dfb9",5649:"564337ec",5669:"00931cc3",5682:"70a12cc4",5686:"95c5de0b",5696:"c33ca104",5717:"39ee6679",5753:"672a376b",5797:"7fbacf84",5819:"e073eb07",5841:"dcfccecb",5870:"cf8e491a",5873:"8fbd512b",5888:"f619e31e",5892:"c6004f62",5912:"b73048db",5953:"5a6c6934",5962:"9d8ee3a8",5964:"09fbb6bd",5966:"871c1e5a",5991:"a5557bb9",6017:"6093f82b",6035:"226700de",6049:"e21c8cc4",6058:"dab4c683",6080:"92926477",6103:"ccc49370",6123:"f3e308ad",6161:"562496aa",6199:"c60995f6",6250:"3c5aea38",6304:"0ecaa6ec",6346:"02689328",6468:"43fcf0e9",6490:"9dc4119a",6508:"12cbeba7",6526:"1c93669b",6587:"c037d168",6629:"3972c49f",6697:"d693e23c",6698:"c3ea66fe",6710:"e2de2dbb",6743:"2f43e44a",6799:"3216290d",6837:"fbd57548",6847:"041ed4b0",6887:"f4f49e13",6984:"274c9143",7008:"b7811d78",7009:"54cb095e",7011:"1c5d8736",7064:"6dd1c948",7157:"3ed04b60",7175:"d202e2c5",7176:"49c232d6",7210:"9bbc65ac",7268:"14164549",7281:"7e59392d",7306:"a0333b7c",7340:"b8de016f",7374:"ae6a2dc6",7381:"34a9e1b6",7400:"ffb0fa11",7450:"4177cd87",7465:"f1783c84",7474:"df862072",7476:"66d1c769",7528:"899da081",7581:"2e10a69c",7599:"80960b4b",7648:"a1877440",7652:"2b22d492",7681:"1d81daa1",7688:"b9bcab37",7689:"f20d36f2",7697:"35293ec4",7704:"d297da14",7723:"b5f3dcc5",7725:"9cfe8fd1",7740:"f0978ee1",7787:"af81a133",7843:"a0410ab5",7857:"5a29fbab",7891:"635a92d5",7901:"2a8faff0",7918:"17896441",7920:"1a4e3797",7921:"ab2128e5",7954:"d368e73e",7966:"c0cb7215",7974:"9f324683",7975:"270346fa",8037:"d0840b01",8110:"fed8bc04",8142:"5eed1665",8151:"255134d9",8188:"0cb2f220",8193:"686688fd",8288:"21e890b0",8296:"06ea9cd1",8312:"9e477a5e",8338:"8dc09bac",8355:"fe273484",8405:"3cc6ebf8",8492:"9a859616",8524:"9dec6b67",8533:"b1d2ea98",8610:"6875c492",8628:"41b4728f",8652:"e7d2a655",8716:"ee92877e",8855:"e3a9c3a3",8876:"4f3c73fd",8882:"f75a8651",8919:"f042b56c",8927:"2f7a5a88",8942:"0a2eaa84",9059:"198f8d8a",9092:"a85e626a",9094:"459bd227",9171:"18c69d70",9242:"c29bedb9",9287:"8b79a48d",9310:"d1cef389",9393:"6bc709ad",9427:"8da65e83",9514:"1be78505",9537:"a1cea306",9538:"9b56b618",9563:"48bd1d32",9572:"6600e5b0",9591:"2b479afe",9606:"ef5b2427",9633:"d40f51e1",9690:"1563fc8b",9735:"0050401e",9761:"a5b179f0",9763:"bd2d06b5",9788:"d88bdb28",9823:"0e9b73e4",9874:"1a6b9123",9887:"f580a9d0",9922:"b393c858",9924:"df203c0f",9940:"e4ebfe18"}[e]||e)+"."+{16:"c3b64779",31:"f66033e9",53:"74386145",63:"c8d04366",96:"7825b8cb",100:"ec047294",104:"1ae0a8ca",116:"3f4526e3",172:"ea4a0881",240:"a24e9fce",280:"cacbfebd",286:"eba2db5b",297:"b3110e72",311:"aa2c23a6",321:"e695d97e",328:"06976912",344:"4dff8159",372:"5a1d68a7",418:"ee0bd36a",422:"3e72a180",425:"9aaf08be",448:"586865ca",454:"1921d234",471:"6d730b30",475:"2dd61ce3",497:"da498f81",533:"19bf6f8c",548:"acf73335",573:"b31e9691",628:"17644c25",653:"fd1ed8b7",693:"3f26fdc4",732:"1563f3a3",734:"1adac84e",743:"a26c94c2",782:"2f044698",843:"41309e83",846:"0c6e8615",893:"9c533161",952:"bf0a0d2a",955:"4603547c",964:"4b02c3a3",970:"8909d704",988:"a35a94a7",1065:"b75a4f92",1103:"b3e617c2",1113:"63ebf32c",1196:"ab493f73",1329:"e0419b3c",1434:"c05af37e",1436:"88346cb4",1501:"60adcc49",1560:"2a2c3e38",1653:"d24583e9",1675:"a102f265",1677:"0a00693c",1761:"d8ef38cb",1762:"247f4dec",1793:"e0abcecd",1853:"2b7ad81c",1865:"5b386dbb",1892:"1ada09b5",1926:"bf46e07b",1994:"03ef05b2",2007:"a7647166",2048:"e29d2d91",2087:"8252ae94",2100:"18750ca4",2181:"7207778d",2215:"8d550c09",2334:"e3286093",2342:"f43e043a",2345:"e8338c65",2382:"b8614e66",2448:"2de1e802",2476:"6a921631",2526:"e9f0961e",2530:"e030dcb0",2535:"a85c80fe",2542:"91fd0166",2656:"a06a11f0",2678:"bd47217d",2717:"084f6ccb",2727:"d81d9bf2",2742:"5fac410b",2753:"1ffbe0b7",2756:"6fed07ac",2773:"c7777a60",2793:"6c7f25ae",2816:"1dee3fc7",2889:"29fa3a42",2890:"93c4b199",2901:"e6e6924a",2947:"1bc01fec",2965:"0c83fa76",3009:"7dffe8aa",3085:"a51f7940",3089:"b3e1566e",3095:"a8add082",3098:"c7713e01",3206:"d0d09c6d",3211:"e393ded3",3213:"e12a8152",3259:"1868a9df",3306:"93086bbd",3307:"c2500b74",3359:"c9095d16",3392:"080d5db2",3438:"4417145d",3440:"8d1c9dd3",3483:"a57ec288",3490:"09e3d8d5",3530:"6847aa4d",3553:"e32670da",3578:"5ea6f952",3608:"dc541821",3614:"a13ff87c",3671:"221e2a42",3751:"9a58b73e",3886:"312bbaa9",3910:"48c99e14",3912:"a32d1fb3",4013:"97ec86b3",4030:"3e44be9d",4041:"e04b839f",4044:"dc46ee9d",4109:"70a71e63",4121:"551a9f19",4149:"f8f6cfb8",4174:"02d8af89",4185:"683ff471",4195:"1db57317",4212:"a55b3cb2",4311:"15f17251",4371:"492c1594",4435:"1ec58c7f",4471:"b7db3ed7",4481:"d30e14d1",4560:"95d19896",4564:"ef44d25f",4659:"02ed3c6f",4665:"cf786395",4670:"a236905f",4801:"86a4d820",4815:"a079467f",4819:"3e74a639",4889:"eaba0893",4953:"ddb03140",4962:"5ea2bf4a",4972:"6f1a8649",5005:"2e88b883",5046:"44ffe430",5088:"bae7104b",5094:"3d9a557f",5100:"02386620",5131:"48a42935",5142:"4378f941",5164:"28416a83",5212:"c55b1324",5335:"e44110ee",5356:"afa64519",5465:"02c122d8",5467:"5e3d9675",5487:"bf8438e4",5507:"1e1fec7d",5521:"0da28f48",5602:"fd070313",5649:"11785d93",5669:"8dc43f44",5682:"c3288285",5686:"ccd5c25d",5696:"63a2cd60",5717:"999a40fe",5753:"e434ebc5",5797:"e392db8f",5819:"90dbe5d6",5841:"43b9686d",5870:"1c0e17dc",5873:"27bf5da5",5888:"40a5b40c",5892:"5bf31f92",5912:"6c32de44",5953:"e9ceaffa",5962:"f1ab8b54",5964:"18013175",5966:"c8ef8df6",5991:"912b4b2f",6017:"264aba6a",6035:"0c8f4048",6048:"afc89c49",6049:"331f903f",6058:"075bdb11",6080:"2bd619e2",6103:"cd536bca",6123:"bc5f4544",6161:"049bf272",6199:"5cb96803",6250:"b978afb2",6304:"c709cdd9",6346:"091cac7e",6468:"999ae75e",6490:"fab1ef8d",6508:"3e9be6a2",6526:"2c87ec5f",6587:"1ed5ba36",6629:"cb768b45",6697:"05708b3c",6698:"dd5762e3",6710:"b339d4ea",6743:"3ee3a127",6780:"fc914bdb",6799:"7f152de2",6837:"f07ae534",6847:"2cd713e4",6887:"dbbd6b3d",6945:"94f4a660",6984:"29a9f319",7008:"ea18260b",7009:"6cd97186",7011:"87b3f575",7064:"5c7909ff",7157:"66eaad96",7175:"1343f229",7176:"98017ff7",7210:"8cabc0cf",7268:"19fdb006",7281:"378558d6",7306:"11cac6ed",7340:"a35bb9b6",7374:"e92617ec",7381:"4c3c8c26",7400:"99af157c",7450:"3a97e607",7465:"2149eb01",7474:"ef651fec",7476:"3685429a",7528:"defb4665",7581:"2fcc65e8",7599:"451bf08a",7648:"cebbc169",7652:"0b05329f",7681:"6ca0dfe3",7688:"0fb141a9",7689:"ed110c7d",7697:"488f144f",7704:"a7c47b77",7723:"37c24d94",7725:"62a95eb9",7740:"26aeaeb0",7787:"368d17fb",7843:"0ed80b02",7857:"e6e82d04",7891:"209b3f46",7901:"18631039",7918:"9546f07c",7920:"6f43a2a9",7921:"4f40f26a",7954:"db47481c",7966:"9bf2d1f6",7974:"bc18c704",7975:"163d0510",8037:"5f5aa788",8110:"67dc7606",8126:"0a7b9cc2",8142:"11fbf497",8151:"ec767e97",8188:"b257b827",8193:"eed53db1",8288:"2d5b306d",8296:"0417406e",8312:"86e2c4e6",8338:"d7398399",8355:"948d4238",8405:"9e81eace",8492:"9498815f",8524:"18554824",8533:"60d02b1b",8610:"433b927f",8628:"ee287de5",8652:"cb5424b7",8716:"3aa09934",8855:"af4511cc",8876:"748e6cfa",8882:"58849463",8894:"91734414",8919:"ba47ed4b",8927:"3876177c",8942:"799729e8",9059:"14616afb",9092:"9c3a5752",9094:"21873721",9171:"7e0e9cbb",9242:"a519e409",9287:"df968c86",9310:"280b862f",9393:"d993e681",9427:"290293a4",9514:"2b90426b",9537:"2441f096",9538:"545f8d38",9563:"aa5508b4",9572:"1d72ae8f",9591:"08c2d69e",9606:"dc74b19d",9633:"14bda7cc",9690:"e1b4fa1d",9735:"14bb3b4a",9761:"4d2e8fd3",9763:"199371d9",9788:"15c240b5",9823:"b903d938",9874:"76699387",9887:"1c9d5285",9922:"d7958369",9924:"e4f37724",9940:"102e5809"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="my-website:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var l=n[i];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==c+f){t=l;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",c+f),t.src=e),d[e]=[a];var u=(a,f)=>{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={14164549:"7268",17896441:"7918",24214711:"4041",29476979:"4030",33736670:"2742",92926477:"6080",fd60e617:"16",f4c6e7e6:"31","935f2afb":"53",ee00b37a:"63","087c46fa":"96",d50fd269:"100",a43f2942:"104","0cb009d1":"116","96adae60":"172","4959fc42":"240","741df4e1":"280","1893cb59":"286","9fae68e2":"297","1e4ebcd5":"311","0c071de2":"321","4b2fba3e":"328",c0a61fca:"344","35b2eb5a":"372","87a22936":"418","0281109c":"422","16cc6f3a":"425","28a1570f":"448","1a665c6f":"454","38d8699e":"471",a3dddb77:"475","5f785aa3":"497",b2b675dd:"533","32397cb2":"548",b474adfe:"573",e0d68441:"628",bbceb8f1:"653","6a19354d":"693","64f377d6":"732","05b907fc":"734","509d519c":"743","0f9a8782":"782",d2770bf7:"843",d0277431:"846","8e9056ec":"893","86b4da3d":"952",fe8cce0a:"955",c573638f:"964","3b0d95bc":"970","754fb852":"988","69c28c32":"1065","49b8d9dd":"1103","0746167d":"1113","2d3b202f":"1196",a571ae8c:"1329",dfa84138:"1434","8e498bb6":"1436","64868a43":"1501","2e892090":"1560","7e4c1ed7":"1653",d126aabd:"1675",d5dfecc2:"1677",dcf70953:"1761","2bfe7c0b":"1762","309173fa":"1793","21d253a0":"1853","456b5fae":"1865","397e7345":"1892",f078e301:"1926","269a2f75":"1994","1c74a8fd":"2007","4413b451":"2048","7c660760":"2087","5ffd2c10":"2100",ae1d6508:"2181",abc83b7f:"2215","7af1d52f":"2334","0d47646f":"2342","7405ea58":"2345",f2b7d1a9:"2382","633582b9":"2448","2832e534":"2476",a896be03:"2526",e9ff60ad:"2530","814f3328":"2535",ddf9e0bd:"2542","303c1e60":"2656",d6c08822:"2678",f332d221:"2717","8e3d08a4":"2727","7762a24e":"2753","6c60e25f":"2756","3b18521e":"2773","489347ff":"2793","8c6c0796":"2816","7fd9a574":"2889",d6a3d698:"2890",b2e443b6:"2901","981f7647":"2947",ae3384b2:"2965",bbc01ba0:"3009",c60ea0ff:"3085",a6aa9e1f:"3089",bf933b37:"3095",d09f7e4b:"3098",f8409a7e:"3206","3028ca57":"3211",ac23d7ee:"3213",d2935d14:"3259","4aa09797":"3306","95dc859f":"3307","86863b3d":"3359",d86f7a37:"3392",c55d205b:"3438",fcb446a5:"3440","2d9296e4":"3483","9ca52986":"3490","20e99c2a":"3530","3b0f99e8":"3553","0b2567db":"3578","9e4087bc":"3608",fd5d2408:"3614",a4a1e915:"3671","3720c009":"3751","3fc16fd0":"3886","882ffb20":"3910",e8d6e7ce:"3912","01a85c17":"4013","804ef369":"4044",e5f297b0:"4109","55960ee5":"4121","8d05b77c":"4149",abb0816f:"4174",c7015929:"4185",c4f5d8e4:"4195","492a6565":"4212","7bbc420e":"4311","03e71e14":"4371","96b08d81":"4435","494882d1":"4471","0462f8fc":"4481","76603d6f":"4560",e9624b4f:"4564","6b90f600":"4659",e0e4666e:"4665","43f49b9e":"4670","8d7288fe":"4801","43a97218":"4815",d3752f11:"4819","5f81b25c":"4889",eec33099:"4953",c189d18f:"4962","33ae6a7e":"5005",db7928b3:"5046","54150be7":"5088",f105176d:"5094","533bfc57":"5100",f63a747b:"5131",a413785b:"5142","268e20d0":"5164","0a7a6076":"5212","75121fd5":"5335","3f4fb381":"5356",d0e4cdf1:"5465","6425a984":"5467","08726fcf":"5487",a9221bd5:"5507","5c38e66e":"5521",f156dfb9:"5602","564337ec":"5649","00931cc3":"5669","70a12cc4":"5682","95c5de0b":"5686",c33ca104:"5696","39ee6679":"5717","672a376b":"5753","7fbacf84":"5797",e073eb07:"5819",dcfccecb:"5841",cf8e491a:"5870","8fbd512b":"5873",f619e31e:"5888",c6004f62:"5892",b73048db:"5912","5a6c6934":"5953","9d8ee3a8":"5962","09fbb6bd":"5964","871c1e5a":"5966",a5557bb9:"5991","6093f82b":"6017","226700de":"6035",e21c8cc4:"6049",dab4c683:"6058",ccc49370:"6103",f3e308ad:"6123","562496aa":"6161",c60995f6:"6199","3c5aea38":"6250","0ecaa6ec":"6304","02689328":"6346","43fcf0e9":"6468","9dc4119a":"6490","12cbeba7":"6508","1c93669b":"6526",c037d168:"6587","3972c49f":"6629",d693e23c:"6697",c3ea66fe:"6698",e2de2dbb:"6710","2f43e44a":"6743","3216290d":"6799",fbd57548:"6837","041ed4b0":"6847",f4f49e13:"6887","274c9143":"6984",b7811d78:"7008","54cb095e":"7009","1c5d8736":"7011","6dd1c948":"7064","3ed04b60":"7157",d202e2c5:"7175","49c232d6":"7176","9bbc65ac":"7210","7e59392d":"7281",a0333b7c:"7306",b8de016f:"7340",ae6a2dc6:"7374","34a9e1b6":"7381",ffb0fa11:"7400","4177cd87":"7450",f1783c84:"7465",df862072:"7474","66d1c769":"7476","899da081":"7528","2e10a69c":"7581","80960b4b":"7599",a1877440:"7648","2b22d492":"7652","1d81daa1":"7681",b9bcab37:"7688",f20d36f2:"7689","35293ec4":"7697",d297da14:"7704",b5f3dcc5:"7723","9cfe8fd1":"7725",f0978ee1:"7740",af81a133:"7787",a0410ab5:"7843","5a29fbab":"7857","635a92d5":"7891","2a8faff0":"7901","1a4e3797":"7920",ab2128e5:"7921",d368e73e:"7954",c0cb7215:"7966","9f324683":"7974","270346fa":"7975",d0840b01:"8037",fed8bc04:"8110","5eed1665":"8142","255134d9":"8151","0cb2f220":"8188","686688fd":"8193","21e890b0":"8288","06ea9cd1":"8296","9e477a5e":"8312","8dc09bac":"8338",fe273484:"8355","3cc6ebf8":"8405","9a859616":"8492","9dec6b67":"8524",b1d2ea98:"8533","6875c492":"8610","41b4728f":"8628",e7d2a655:"8652",ee92877e:"8716",e3a9c3a3:"8855","4f3c73fd":"8876",f75a8651:"8882",f042b56c:"8919","2f7a5a88":"8927","0a2eaa84":"8942","198f8d8a":"9059",a85e626a:"9092","459bd227":"9094","18c69d70":"9171",c29bedb9:"9242","8b79a48d":"9287",d1cef389:"9310","6bc709ad":"9393","8da65e83":"9427","1be78505":"9514",a1cea306:"9537","9b56b618":"9538","48bd1d32":"9563","6600e5b0":"9572","2b479afe":"9591",ef5b2427:"9606",d40f51e1:"9633","1563fc8b":"9690","0050401e":"9735",a5b179f0:"9761",bd2d06b5:"9763",d88bdb28:"9788","0e9b73e4":"9823","1a6b9123":"9874",f580a9d0:"9887",b393c858:"9922",df203c0f:"9924",e4ebfe18:"9940"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n<b.length;n++)c=b[n],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return r.O(i)},f=self.webpackChunkmy_website=self.webpackChunkmy_website||[];f.forEach(a.bind(null,0)),f.push=a.bind(null,f.push.bind(f))})()})(); \ No newline at end of file diff --git a/assets/js/runtime~main.e2fc3265.js b/assets/js/runtime~main.e2fc3265.js new file mode 100644 index 000000000..4983e02cd --- /dev/null +++ b/assets/js/runtime~main.e2fc3265.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i<e.length;i++){f=e[i][0],d=e[i][1],c=e[i][2];for(var t=!0,o=0;o<f.length;o++)(!1&c||b>=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c<b&&(b=c));if(t){e.splice(i--,1);var n=d();void 0!==n&&(a=n)}}return a}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({16:"fd60e617",31:"f4c6e7e6",53:"935f2afb",63:"ee00b37a",80:"5088fe06",96:"087c46fa",100:"d50fd269",104:"a43f2942",116:"0cb009d1",172:"96adae60",240:"4959fc42",280:"741df4e1",286:"1893cb59",297:"9fae68e2",311:"1e4ebcd5",321:"0c071de2",328:"4b2fba3e",344:"c0a61fca",372:"35b2eb5a",418:"87a22936",422:"0281109c",425:"16cc6f3a",448:"28a1570f",454:"1a665c6f",471:"38d8699e",475:"a3dddb77",497:"5f785aa3",533:"b2b675dd",548:"32397cb2",573:"b474adfe",628:"e0d68441",653:"bbceb8f1",693:"6a19354d",732:"64f377d6",734:"05b907fc",743:"509d519c",782:"0f9a8782",795:"72367227",843:"d2770bf7",846:"d0277431",893:"8e9056ec",952:"86b4da3d",955:"fe8cce0a",964:"c573638f",970:"32b2299c",988:"754fb852",1065:"69c28c32",1103:"49b8d9dd",1113:"0746167d",1196:"2d3b202f",1329:"a571ae8c",1434:"dfa84138",1436:"8e498bb6",1501:"64868a43",1560:"2e892090",1653:"7e4c1ed7",1675:"d126aabd",1677:"d5dfecc2",1761:"dcf70953",1762:"2bfe7c0b",1793:"309173fa",1853:"21d253a0",1865:"456b5fae",1892:"397e7345",1926:"f078e301",1994:"269a2f75",2007:"1c74a8fd",2048:"4413b451",2087:"7c660760",2100:"5ffd2c10",2181:"ae1d6508",2215:"abc83b7f",2334:"7af1d52f",2342:"0d47646f",2345:"7405ea58",2382:"f2b7d1a9",2448:"633582b9",2476:"2832e534",2526:"a896be03",2530:"e9ff60ad",2535:"814f3328",2542:"ddf9e0bd",2656:"303c1e60",2678:"d6c08822",2717:"f332d221",2727:"8e3d08a4",2742:"33736670",2753:"7762a24e",2756:"6c60e25f",2773:"3b18521e",2793:"489347ff",2816:"8c6c0796",2889:"7fd9a574",2890:"d6a3d698",2901:"b2e443b6",2947:"981f7647",2965:"ae3384b2",3009:"bbc01ba0",3085:"c60ea0ff",3089:"a6aa9e1f",3095:"bf933b37",3098:"d09f7e4b",3206:"f8409a7e",3211:"3028ca57",3213:"ac23d7ee",3259:"d2935d14",3306:"4aa09797",3307:"95dc859f",3359:"86863b3d",3392:"d86f7a37",3438:"c55d205b",3440:"fcb446a5",3483:"2d9296e4",3490:"9ca52986",3530:"20e99c2a",3553:"3b0f99e8",3578:"0b2567db",3608:"9e4087bc",3614:"fd5d2408",3671:"a4a1e915",3751:"3720c009",3886:"3fc16fd0",3910:"882ffb20",3912:"e8d6e7ce",4013:"01a85c17",4030:"29476979",4041:"24214711",4044:"804ef369",4109:"e5f297b0",4121:"55960ee5",4149:"8d05b77c",4174:"abb0816f",4185:"c7015929",4195:"c4f5d8e4",4212:"492a6565",4311:"7bbc420e",4371:"03e71e14",4435:"96b08d81",4471:"494882d1",4481:"0462f8fc",4560:"76603d6f",4564:"e9624b4f",4659:"6b90f600",4665:"e0e4666e",4670:"43f49b9e",4801:"8d7288fe",4815:"43a97218",4819:"d3752f11",4889:"5f81b25c",4953:"eec33099",4962:"c189d18f",5005:"33ae6a7e",5046:"db7928b3",5088:"54150be7",5094:"f105176d",5100:"533bfc57",5131:"f63a747b",5140:"3b0d95bc",5142:"a413785b",5164:"268e20d0",5212:"0a7a6076",5319:"6cfe3a99",5335:"75121fd5",5356:"3f4fb381",5465:"d0e4cdf1",5467:"6425a984",5487:"08726fcf",5507:"a9221bd5",5521:"5c38e66e",5602:"f156dfb9",5649:"564337ec",5669:"00931cc3",5682:"70a12cc4",5686:"95c5de0b",5696:"c33ca104",5717:"39ee6679",5753:"672a376b",5797:"7fbacf84",5819:"e073eb07",5841:"dcfccecb",5870:"cf8e491a",5873:"8fbd512b",5888:"f619e31e",5892:"c6004f62",5912:"b73048db",5953:"5a6c6934",5962:"9d8ee3a8",5964:"09fbb6bd",5966:"871c1e5a",5991:"a5557bb9",6017:"6093f82b",6035:"226700de",6049:"e21c8cc4",6058:"dab4c683",6080:"92926477",6103:"ccc49370",6123:"f3e308ad",6161:"562496aa",6199:"c60995f6",6250:"3c5aea38",6304:"0ecaa6ec",6346:"02689328",6468:"43fcf0e9",6490:"9dc4119a",6508:"12cbeba7",6526:"1c93669b",6587:"c037d168",6629:"3972c49f",6697:"d693e23c",6698:"c3ea66fe",6710:"e2de2dbb",6743:"2f43e44a",6799:"3216290d",6837:"fbd57548",6847:"041ed4b0",6887:"f4f49e13",6984:"274c9143",7008:"b7811d78",7009:"54cb095e",7011:"1c5d8736",7064:"6dd1c948",7153:"b7d33121",7157:"3ed04b60",7175:"d202e2c5",7176:"49c232d6",7210:"9bbc65ac",7268:"14164549",7281:"7e59392d",7306:"a0333b7c",7340:"b8de016f",7374:"ae6a2dc6",7381:"34a9e1b6",7400:"ffb0fa11",7450:"4177cd87",7465:"f1783c84",7474:"df862072",7476:"66d1c769",7528:"899da081",7581:"2e10a69c",7599:"80960b4b",7648:"a1877440",7652:"2b22d492",7681:"1d81daa1",7688:"b9bcab37",7689:"f20d36f2",7697:"35293ec4",7704:"d297da14",7723:"b5f3dcc5",7725:"9cfe8fd1",7740:"f0978ee1",7787:"af81a133",7843:"a0410ab5",7857:"5a29fbab",7891:"635a92d5",7901:"2a8faff0",7918:"17896441",7920:"1a4e3797",7921:"ab2128e5",7954:"d368e73e",7966:"c0cb7215",7974:"9f324683",7975:"270346fa",8037:"d0840b01",8110:"fed8bc04",8142:"5eed1665",8151:"255134d9",8161:"19f4ae8e",8188:"0cb2f220",8193:"686688fd",8243:"1fbde614",8288:"21e890b0",8296:"06ea9cd1",8312:"9e477a5e",8338:"8dc09bac",8355:"fe273484",8405:"3cc6ebf8",8492:"9a859616",8509:"3d6c40c1",8524:"9dec6b67",8533:"b1d2ea98",8610:"6875c492",8628:"41b4728f",8652:"e7d2a655",8716:"ee92877e",8855:"e3a9c3a3",8876:"4f3c73fd",8882:"f75a8651",8919:"f042b56c",8927:"2f7a5a88",8942:"0a2eaa84",9059:"198f8d8a",9092:"a85e626a",9094:"459bd227",9171:"18c69d70",9242:"c29bedb9",9287:"8b79a48d",9310:"d1cef389",9393:"6bc709ad",9427:"8da65e83",9514:"1be78505",9537:"a1cea306",9538:"9b56b618",9563:"48bd1d32",9572:"6600e5b0",9591:"2b479afe",9606:"ef5b2427",9607:"f14eea08",9633:"d40f51e1",9690:"1563fc8b",9735:"0050401e",9761:"a5b179f0",9763:"bd2d06b5",9788:"d88bdb28",9823:"0e9b73e4",9874:"1a6b9123",9887:"f580a9d0",9922:"b393c858",9924:"df203c0f",9940:"e4ebfe18"}[e]||e)+"."+{16:"80f0ac19",31:"b08f8526",53:"74386145",63:"87d26226",80:"2cc977cf",96:"efcd5e69",100:"79a6cf20",104:"31658ee0",116:"ddadf169",172:"2023ae8b",240:"cda7d2f0",280:"88e7c4ed",286:"8a4bc4b2",297:"72dfd56d",311:"8671725c",321:"b57ad227",328:"ee7b0442",344:"7cbdf820",372:"9ac55f69",418:"e115b74d",422:"094422e8",425:"1d0d6548",448:"0cae8263",454:"9a808da6",471:"572462f2",475:"2dd61ce3",497:"a49be2fc",533:"bce3d397",548:"79ba529e",573:"859d75dc",628:"71269803",653:"40f1e732",693:"c2212a44",732:"4b09d9ac",734:"81878d39",743:"caf52cd9",782:"91c52f55",795:"68ed5e05",843:"ed9f3c3a",846:"0c6e8615",893:"d8176654",952:"705abb3b",955:"5b81fa8f",964:"9b4b64b6",970:"d11c3a7d",988:"6fce7204",1065:"2f49e48f",1103:"ce03beac",1113:"afac0769",1196:"fad40be0",1329:"f11626e0",1434:"4493a1cc",1436:"a1dd0c3d",1501:"2ca5a4da",1560:"966a9a04",1653:"2b32cc3e",1675:"a102f265",1677:"ea44f851",1761:"d0be48ac",1762:"417a3763",1793:"f6e5e77a",1853:"843456ee",1865:"1425c1d5",1892:"531aff95",1926:"b35d52d8",1994:"5474eea4",2007:"fab7ed2c",2048:"4040184d",2087:"b4a54ec4",2100:"c592d621",2181:"f635198e",2215:"8d550c09",2334:"3a3f4216",2342:"f3a0b915",2345:"f6a4eb7a",2382:"e6ee1f04",2448:"05e73941",2476:"cbb20739",2526:"6e674e35",2530:"6425d7c1",2535:"4c5abdb2",2542:"6ea3fc88",2656:"db6eb0ad",2678:"bc017d98",2717:"a1b5a06f",2727:"d29e5c5f",2742:"01b3f5e5",2753:"8a98485a",2756:"71f33762",2773:"c7777a60",2793:"b84e267c",2816:"d37112d9",2889:"29fa3a42",2890:"f4578e6a",2901:"ca59c9b2",2947:"2ae342dd",2965:"95cb14ea",3009:"8f5af35b",3085:"881f4c53",3089:"7b54bae2",3095:"56ca3009",3098:"eacc75cd",3206:"faea8bc7",3211:"d6772d07",3213:"7ae18010",3259:"fe55055e",3306:"89d260fe",3307:"4c9f81cc",3359:"6f6381e4",3392:"17195363",3438:"5245fecd",3440:"0568607d",3483:"a52c556a",3490:"08ff34b4",3530:"90a43ac9",3553:"c4d5d643",3578:"68923e22",3608:"1da97dda",3614:"f64b5f70",3671:"0fc33612",3751:"bcd87bc4",3886:"9b18a836",3910:"1fdacee7",3912:"e2dc4ae6",4013:"76b4ff2a",4030:"4cc23032",4041:"55f6e51c",4044:"023757eb",4109:"fbff669c",4121:"b42099f7",4149:"55e18bb1",4174:"f85866a6",4185:"683ff471",4195:"d37ba840",4212:"675baf13",4311:"82f9788b",4371:"07b9fcbf",4435:"88e407aa",4471:"972ab65e",4481:"f94ff9b8",4560:"186659cf",4564:"8aa89eac",4659:"7ad50e48",4665:"a51bac0c",4670:"433b686b",4801:"5f0bac2d",4815:"a25b5b23",4819:"31066cbd",4889:"772ab286",4953:"b1f24980",4962:"5ea2bf4a",4972:"8947662a",5005:"bd927f0f",5046:"2a9c0fe1",5088:"a4cc9618",5094:"7dafd1f9",5100:"02386620",5131:"526c749a",5140:"11787215",5142:"bd413362",5164:"9a248619",5212:"2d512b65",5319:"f51506e7",5335:"27699af6",5356:"bbf99073",5465:"1fd4ca7e",5467:"32c0a357",5487:"b0eaf3bf",5507:"3bfa9f2c",5521:"d3b442bf",5602:"5680e4f0",5649:"11785d93",5669:"6ebd0500",5682:"2db653db",5686:"95f0db72",5696:"f1e18c9a",5717:"0e49477c",5753:"4e738ca5",5797:"c4fc60f8",5819:"c906eab1",5841:"fbd7db9c",5870:"20189b57",5873:"27bf5da5",5888:"18ccdac9",5892:"8257704e",5912:"8ac66e18",5953:"8a355bab",5962:"3e89b3f5",5964:"44263ee4",5966:"b7cf75b8",5991:"d0f17dfb",6017:"0af44a03",6035:"6396719e",6048:"a886985f",6049:"a787cf7b",6058:"0a4d1c99",6080:"36896f2d",6103:"7af2b68e",6123:"35ece12d",6161:"a42c37e7",6199:"fb18c9be",6250:"4a5515e4",6304:"1c7c46fb",6346:"091cac7e",6468:"72093a68",6490:"fab1ef8d",6508:"dd36b7ee",6526:"ba188e36",6587:"96f06126",6629:"411ee9ac",6697:"33f1813d",6698:"73186556",6710:"9ac0053b",6743:"31f6617e",6780:"71665265",6799:"1d046dd8",6837:"2041a289",6847:"0fdc0f2b",6887:"ef1b692b",6945:"52e6a492",6984:"f313ce06",7008:"76646830",7009:"924e1a0b",7011:"da315bad",7064:"dce02465",7153:"17983764",7157:"f8fa3b6d",7175:"1343f229",7176:"18360dd6",7210:"1299733d",7268:"7a0bdef8",7281:"02e772b6",7306:"d4f32a9d",7340:"3395513f",7374:"1f9afce8",7381:"d43251bc",7400:"e327857d",7450:"904755c2",7465:"d136e81e",7474:"cebd22e7",7476:"0554fad1",7528:"3e16d702",7581:"0f41a7b3",7599:"813f7ad2",7648:"7a23249c",7652:"6a8444b5",7681:"821e44e6",7688:"2fcdcd9c",7689:"5a75fd76",7697:"9c9fbde9",7704:"a1964598",7723:"3594b25d",7725:"5bf3edc4",7740:"fc391fa7",7787:"7821cdd8",7843:"64383bba",7857:"d8c93ec9",7891:"8b6d852a",7901:"18631039",7918:"d467f5c1",7920:"d4af1946",7921:"aa615b26",7954:"9d264eba",7966:"c03bc365",7974:"5c982203",7975:"dbc966c2",8037:"850cded6",8110:"00e51af4",8126:"c500ccde",8142:"92b60a91",8151:"a1e74e37",8161:"f32f8930",8188:"02c96c56",8193:"84639f0c",8243:"de74c976",8288:"2d5b306d",8296:"97756b06",8312:"f9b39139",8338:"44e33d7b",8355:"6eaec45f",8405:"9f67cf37",8492:"b4d8dc24",8509:"6216fe06",8524:"a1bd30cc",8533:"5e1fa5d1",8610:"e43a4554",8628:"0a266023",8652:"8f244c74",8716:"2407f4c9",8855:"df912e5c",8876:"3f344332",8882:"8526f68b",8894:"f447a143",8919:"2fd3c78c",8927:"c8dbab0e",8942:"338d4c36",9059:"246f1a7e",9092:"14258449",9094:"af578946",9171:"7e0e9cbb",9242:"96d9dc0d",9287:"a2f3ed79",9310:"4c8a243a",9393:"6993e653",9427:"290293a4",9514:"145589fb",9537:"b8a75a51",9538:"5822f5e9",9563:"c6f0690c",9572:"26e63c3c",9591:"31ea2b46",9606:"f5881651",9607:"87f77a96",9633:"14bda7cc",9690:"e56f65f4",9735:"6d327cbb",9761:"9026f1ba",9763:"4060203d",9788:"55b34781",9823:"cc55e086",9874:"2138ce03",9887:"ff66fa3d",9922:"857a7783",9924:"7c6ea5cb",9940:"5f539aea"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="my-website:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var l=n[i];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==c+f){t=l;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",c+f),t.src=e),d[e]=[a];var u=(a,f)=>{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={14164549:"7268",17896441:"7918",24214711:"4041",29476979:"4030",33736670:"2742",72367227:"795",92926477:"6080",fd60e617:"16",f4c6e7e6:"31","935f2afb":"53",ee00b37a:"63","5088fe06":"80","087c46fa":"96",d50fd269:"100",a43f2942:"104","0cb009d1":"116","96adae60":"172","4959fc42":"240","741df4e1":"280","1893cb59":"286","9fae68e2":"297","1e4ebcd5":"311","0c071de2":"321","4b2fba3e":"328",c0a61fca:"344","35b2eb5a":"372","87a22936":"418","0281109c":"422","16cc6f3a":"425","28a1570f":"448","1a665c6f":"454","38d8699e":"471",a3dddb77:"475","5f785aa3":"497",b2b675dd:"533","32397cb2":"548",b474adfe:"573",e0d68441:"628",bbceb8f1:"653","6a19354d":"693","64f377d6":"732","05b907fc":"734","509d519c":"743","0f9a8782":"782",d2770bf7:"843",d0277431:"846","8e9056ec":"893","86b4da3d":"952",fe8cce0a:"955",c573638f:"964","32b2299c":"970","754fb852":"988","69c28c32":"1065","49b8d9dd":"1103","0746167d":"1113","2d3b202f":"1196",a571ae8c:"1329",dfa84138:"1434","8e498bb6":"1436","64868a43":"1501","2e892090":"1560","7e4c1ed7":"1653",d126aabd:"1675",d5dfecc2:"1677",dcf70953:"1761","2bfe7c0b":"1762","309173fa":"1793","21d253a0":"1853","456b5fae":"1865","397e7345":"1892",f078e301:"1926","269a2f75":"1994","1c74a8fd":"2007","4413b451":"2048","7c660760":"2087","5ffd2c10":"2100",ae1d6508:"2181",abc83b7f:"2215","7af1d52f":"2334","0d47646f":"2342","7405ea58":"2345",f2b7d1a9:"2382","633582b9":"2448","2832e534":"2476",a896be03:"2526",e9ff60ad:"2530","814f3328":"2535",ddf9e0bd:"2542","303c1e60":"2656",d6c08822:"2678",f332d221:"2717","8e3d08a4":"2727","7762a24e":"2753","6c60e25f":"2756","3b18521e":"2773","489347ff":"2793","8c6c0796":"2816","7fd9a574":"2889",d6a3d698:"2890",b2e443b6:"2901","981f7647":"2947",ae3384b2:"2965",bbc01ba0:"3009",c60ea0ff:"3085",a6aa9e1f:"3089",bf933b37:"3095",d09f7e4b:"3098",f8409a7e:"3206","3028ca57":"3211",ac23d7ee:"3213",d2935d14:"3259","4aa09797":"3306","95dc859f":"3307","86863b3d":"3359",d86f7a37:"3392",c55d205b:"3438",fcb446a5:"3440","2d9296e4":"3483","9ca52986":"3490","20e99c2a":"3530","3b0f99e8":"3553","0b2567db":"3578","9e4087bc":"3608",fd5d2408:"3614",a4a1e915:"3671","3720c009":"3751","3fc16fd0":"3886","882ffb20":"3910",e8d6e7ce:"3912","01a85c17":"4013","804ef369":"4044",e5f297b0:"4109","55960ee5":"4121","8d05b77c":"4149",abb0816f:"4174",c7015929:"4185",c4f5d8e4:"4195","492a6565":"4212","7bbc420e":"4311","03e71e14":"4371","96b08d81":"4435","494882d1":"4471","0462f8fc":"4481","76603d6f":"4560",e9624b4f:"4564","6b90f600":"4659",e0e4666e:"4665","43f49b9e":"4670","8d7288fe":"4801","43a97218":"4815",d3752f11:"4819","5f81b25c":"4889",eec33099:"4953",c189d18f:"4962","33ae6a7e":"5005",db7928b3:"5046","54150be7":"5088",f105176d:"5094","533bfc57":"5100",f63a747b:"5131","3b0d95bc":"5140",a413785b:"5142","268e20d0":"5164","0a7a6076":"5212","6cfe3a99":"5319","75121fd5":"5335","3f4fb381":"5356",d0e4cdf1:"5465","6425a984":"5467","08726fcf":"5487",a9221bd5:"5507","5c38e66e":"5521",f156dfb9:"5602","564337ec":"5649","00931cc3":"5669","70a12cc4":"5682","95c5de0b":"5686",c33ca104:"5696","39ee6679":"5717","672a376b":"5753","7fbacf84":"5797",e073eb07:"5819",dcfccecb:"5841",cf8e491a:"5870","8fbd512b":"5873",f619e31e:"5888",c6004f62:"5892",b73048db:"5912","5a6c6934":"5953","9d8ee3a8":"5962","09fbb6bd":"5964","871c1e5a":"5966",a5557bb9:"5991","6093f82b":"6017","226700de":"6035",e21c8cc4:"6049",dab4c683:"6058",ccc49370:"6103",f3e308ad:"6123","562496aa":"6161",c60995f6:"6199","3c5aea38":"6250","0ecaa6ec":"6304","02689328":"6346","43fcf0e9":"6468","9dc4119a":"6490","12cbeba7":"6508","1c93669b":"6526",c037d168:"6587","3972c49f":"6629",d693e23c:"6697",c3ea66fe:"6698",e2de2dbb:"6710","2f43e44a":"6743","3216290d":"6799",fbd57548:"6837","041ed4b0":"6847",f4f49e13:"6887","274c9143":"6984",b7811d78:"7008","54cb095e":"7009","1c5d8736":"7011","6dd1c948":"7064",b7d33121:"7153","3ed04b60":"7157",d202e2c5:"7175","49c232d6":"7176","9bbc65ac":"7210","7e59392d":"7281",a0333b7c:"7306",b8de016f:"7340",ae6a2dc6:"7374","34a9e1b6":"7381",ffb0fa11:"7400","4177cd87":"7450",f1783c84:"7465",df862072:"7474","66d1c769":"7476","899da081":"7528","2e10a69c":"7581","80960b4b":"7599",a1877440:"7648","2b22d492":"7652","1d81daa1":"7681",b9bcab37:"7688",f20d36f2:"7689","35293ec4":"7697",d297da14:"7704",b5f3dcc5:"7723","9cfe8fd1":"7725",f0978ee1:"7740",af81a133:"7787",a0410ab5:"7843","5a29fbab":"7857","635a92d5":"7891","2a8faff0":"7901","1a4e3797":"7920",ab2128e5:"7921",d368e73e:"7954",c0cb7215:"7966","9f324683":"7974","270346fa":"7975",d0840b01:"8037",fed8bc04:"8110","5eed1665":"8142","255134d9":"8151","19f4ae8e":"8161","0cb2f220":"8188","686688fd":"8193","1fbde614":"8243","21e890b0":"8288","06ea9cd1":"8296","9e477a5e":"8312","8dc09bac":"8338",fe273484:"8355","3cc6ebf8":"8405","9a859616":"8492","3d6c40c1":"8509","9dec6b67":"8524",b1d2ea98:"8533","6875c492":"8610","41b4728f":"8628",e7d2a655:"8652",ee92877e:"8716",e3a9c3a3:"8855","4f3c73fd":"8876",f75a8651:"8882",f042b56c:"8919","2f7a5a88":"8927","0a2eaa84":"8942","198f8d8a":"9059",a85e626a:"9092","459bd227":"9094","18c69d70":"9171",c29bedb9:"9242","8b79a48d":"9287",d1cef389:"9310","6bc709ad":"9393","8da65e83":"9427","1be78505":"9514",a1cea306:"9537","9b56b618":"9538","48bd1d32":"9563","6600e5b0":"9572","2b479afe":"9591",ef5b2427:"9606",f14eea08:"9607",d40f51e1:"9633","1563fc8b":"9690","0050401e":"9735",a5b179f0:"9761",bd2d06b5:"9763",d88bdb28:"9788","0e9b73e4":"9823","1a6b9123":"9874",f580a9d0:"9887",b393c858:"9922",df203c0f:"9924",e4ebfe18:"9940"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n<b.length;n++)c=b[n],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return r.O(i)},f=self.webpackChunkmy_website=self.webpackChunkmy_website||[];f.forEach(a.bind(null,0)),f.push=a.bind(null,f.push.bind(f))})()})(); \ No newline at end of file diff --git a/atom.xml b/atom.xml index 877785297..518d1f50c 100644 --- a/atom.xml +++ b/atom.xml @@ -2,11 +2,41 @@ <feed xmlns="http://www.w3.org/2005/Atom"> <id>https://greeng00se.github.io/</id> <title>GG Blog - 2023-08-13T00:00:00.000Z + 2023-08-17T00:00:00.000Z https://github.com/jpmonette/feed GG Blog https://greeng00se.github.io/img/duck.png + + <![CDATA[CloudWatch를 이용한 로깅, 메트릭 모니터링 환경 구성]]> + https://greeng00se.github.io/41 + + 2023-08-17T00:00:00.000Z + + CloudWatch

AWS 리소스와 애플리케이션의 지표와 로그에 대한 모니터링을 제공하는 서비스다.
+지표를 감시하여 알림을 보내는 기능도 제공한다.
+프리티어를 사용하지 않는 경우 대시보드당 3$/M 의 비용이 청구되고, 지표나 로그의 양에 따라 비용이 추가적으로 청구된다.
+요금 정보에 대한 자세한 정보는 다음 링크에서 확인할 수 있다.

CloudWatch Metrics

기본적으로 5분마다 지표에 대한 정보가 수집된다.
+세부 모니터링(Detailed Monitoring)을 활성화하면 1분마다 지표를 수집한다.
+대시보드에서 InstanceId로 검색하여 수집된 지표를 확인할 수 있다.

./cloudwatch1.png

CPUUtilization, NetworkIn, NetworkOut과 같은 기본적인 지표를 제공하고, 메모리, 디스크 공간과 같은 지표를 확인하려면 사용자 지정 지표를 설정해야 한다.

CloudWatch Agent 설치

CloudWatch Agent 사용자 지정 지표와 로그를 수집할 수 있다.

IAM 역할 설정

기본적으로 EC2 인스턴스가 CloudWatchAgentServerPolicy에 대한 권한이 있어야 한다.
+IAM → 역할에서 역할 생성을 클릭한다.

./cloudwatch2.png

CloudWatchAgentServerPolicy 권한 정책을 선택하고, 적당한 역할 이름을 입력해서 역할을 생성한다.

./cloudwatch3.png

EC2 인스턴스 목록으로 들어가서, CloudWatch Agent를 설치할 EC2 인스턴스를 클릭한다.
+작업 → 보안 → IAM 역할 수정에서 이전에 생성한 역할을 지정한다.

./cloudwatch4.png

설치

환경은 다음과 같다.

OS: ubuntu 22.04
+인스턴스 유형: t4g.small (ARM64)

아래 명령어를 입력하여 설치한다.

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

사용 설명서에 각 인스턴스 유형마다 다운로드 링크가 자세하게 안내되어 있다.

Wizard

CloudWatch Wizard를 사용하면 간단하게 설정 파일 생성할 수 있다.
+로그를 수집하도록 설정하는 경우 Wizard 실행 명령어 입력 전 log 파일의 절대 경로를 복사해두는 것이 좋다.
+아래의 명령어를 입력하여 Wizard를 실행할 수 있다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

설정을 진행하다 보면 설정 파일이 어떻게 구성될지 확인할 수 있다.
+로그를 추가할 것이냐고 물어보는 입력창이 나오면 준비해뒀던 로그 파일의 절대 경로를 입력한다.

./cloudwatch5.png

중간에 SSM parameter store에 설정 파일을 저장할 것이냐고 물어보는 창이 나온다.

Do you want to store the config in the SSM parameter store?
1. yes
2. no

추가적으로 설정하지 않는 경우 2번을 선택한다.
+Parameter Store 관리에 대한 내용은 다음의 문서를 참고하면 좋을 거 같다.
+설정이 완료되면 /opt/aws/amazon-cloudwatch-agent/bin/config.json 에 설정에 대한 내용이 저장된다.

설정 파일 적용

아래의 명령어를 입력하여 설정파일을 적용할 수 있다.
+file 뒤에는 설정 파일에 대한 절대경로(아래 명령어 기준 기본 생성 위치)를 입력하면 된다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

types.db: no such file or directory 에러

다음과 같은 에러가 발생한다면 types.db 파일을 생성해서 문제를 해결할 수 있다.

Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory

types.db 파일 생성

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

지표 확인

CloudWatch Metrics에 가보면 CWAgent라는 사용자 지정 네임스페이스가 추가된 것을 볼 수 있다.
+설정 파일에 네임스페이스를 추가하는 방법도 있다.

./cloudwatch6.png

로그

CloudWatch → 로그 그룹으로 가면 Wizard로 추가한 로그를 확인할 수 있다.

./cloudwatch7.png

참고 자료

CloudWatch란 무엇입니까?
+Amazon CloudWatch 요금
+Linux 인스턴스 지표
+서버에 CloudWatch 에이전트 설치 및 실행
+CloudWatch Agent를 Parameter Store에서 관리해 보기

]]>
+ + + +
<![CDATA[경로 이미지 생성하기 - 비동기 처리]]> https://greeng00se.github.io/40 diff --git a/blog.html b/blog.html index fa6eed4ce..046706c75 100644 --- a/blog.html +++ b/blog.html @@ -13,13 +13,13 @@ - - + +
-

게시물 목록

게시물 목록

2023

- - +

게시물 목록

게시물 목록

2023

+ + \ No newline at end of file diff --git a/docs.html b/docs.html index 0f0958a6e..376de1cf1 100644 --- a/docs.html +++ b/docs.html @@ -13,13 +13,13 @@ - - + + - - +
+ + \ No newline at end of file diff --git "a/docs/JPA/\352\270\260\353\263\270_\355\202\244_\353\247\244\355\225\221.html" "b/docs/JPA/\352\270\260\353\263\270_\355\202\244_\353\247\244\355\225\221.html" index 48e551d02..905b36650 100644 --- "a/docs/JPA/\352\270\260\353\263\270_\355\202\244_\353\247\244\355\225\221.html" +++ "b/docs/JPA/\352\270\260\353\263\270_\355\202\244_\353\247\244\355\225\221.html" @@ -13,8 +13,8 @@ - - + +
@@ -29,8 +29,8 @@ MySQL의 경우 IDENTITY Oracle의 경우 SEQUENCE를 선택한다.

UUID

JPA 3.1.0 UUID 생성 전략이 추가되었다.
Hibernate 6.2부터 JPA 3.1.0을 지원하기 때문에 스프링 부트 3.1 이상인 경우 사용할 수 있다.

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member {

@Id
@GeneratedValue(strategy = GenerationType.UUID)
@UuidGenerator(style = Style.RANDOM)
private Long id;
}

UuidGenerator를 이용하여 UUID 생성 방식도 설정할 수 있다.
생성 방식은 3가지가 있다.

  • RANDOM - 난수 기반 UUID 생성(uuid v4)
  • TIME – 시간 기반 UUID 생성(uuid v1)
  • AUTO – 기본 옵션, RANDOM과 동일

UUID의 경우 많은 양의 저장 공간을 필요로 하고, 성능 문제가 발생할 수 있기에 UUID를 사용해야 하는 경우 TSID를 고려할 수 있을 것 같다.

참고 자료

자바 ORM 표준 JPA 프로그래밍, 김영한 p.131 ~ p.144
-Generate UUIDs as Primary Keys With Hibernate

- - +Generate UUIDs as Primary Keys With Hibernate

+ + \ No newline at end of file diff --git "a/docs/Nginx/\352\265\254\354\241\260_\353\260\217_\353\252\205\353\240\271\354\226\264.html" "b/docs/Nginx/\352\265\254\354\241\260_\353\260\217_\353\252\205\353\240\271\354\226\264.html" index 2a5e55680..8f0e8ab5d 100644 --- "a/docs/Nginx/\352\265\254\354\241\260_\353\260\217_\353\252\205\353\240\271\354\226\264.html" +++ "b/docs/Nginx/\352\265\254\354\241\260_\353\260\217_\353\252\205\353\240\271\354\226\264.html" @@ -13,8 +13,8 @@ - - + +
@@ -24,8 +24,8 @@ conf.d 디렉터리 대신 site-enabled 디렉터리와 symlink를 통해 설정 파일을 연결하는 방법은 더 이상 사용하지 않는다.

NIGNX 설정

nginx 설정의 경우 include 구문을 활용해 구조화하여 설정 파일을 간결하게 유지하는 것이 좋다.

/var/log/nginx/

엔진엑스 로그가 저장되는 디렉터리로 access 로그와 error 로그를 확인할 수 있다.
로그 형식의 경우 설정 파일의 log_format 구문을 이용해서 변경할 수 있다.

명령어

nginx -t

nginx 설정이 정상인지 확인한다.

nginx -T

nginx 설정 확인의 결과를 조금 더 자세하게 출력해준다.

nginx -s <SIGNAL>

여기서 SIGNAL은 다음 중 하나를 선택할 수 있다.

  • quit: 정상적으로 종료(SIGQUIT)
  • reload: 설정 파일 리로드(SIGHUP)
  • reopen: 로그 파일을 다시 열도록 요청(SIGUSR1)
  • stop: 종료 요청(SIGTERM)

여기서 SIGQUIT & SIGTREM 모두 graceful shutdown을 수행한다.

참고 자료

NGINX 쿡북, 데릭 디용기 p.22 ~ p.23
https://docs.nginx.com/
-https://docs.nginx.com/nginx/admin-guide/monitoring/logging/

- - +https://docs.nginx.com/nginx/admin-guide/monitoring/logging/

+ + \ No newline at end of file diff --git "a/docs/Nginx/\354\240\225\354\240\201_\354\273\250\355\205\220\354\270\240_\354\240\234\352\263\265.html" "b/docs/Nginx/\354\240\225\354\240\201_\354\273\250\355\205\220\354\270\240_\354\240\234\352\263\265.html" index 51afce41f..465025cbb 100644 --- "a/docs/Nginx/\354\240\225\354\240\201_\354\273\250\355\205\220\354\270\240_\354\240\234\352\263\265.html" +++ "b/docs/Nginx/\354\240\225\354\240\201_\354\273\250\355\205\220\354\270\240_\354\240\234\352\263\265.html" @@ -13,15 +13,15 @@ - - + +

정적 컨텐츠 제공

root

클라이언트에게 파일을 제공할 때 사용되는 경로를 지정하는 데 사용한다.
root의 경우 locaiton으로 넘어온 경로를 root 경로 뒤에 추가한다.

root
# localhost/images/1.png 호출 /var/www/images/images/1.png 검색
location /images/ {
root /var/www/images;
}

alias

location으로 매칭된 부분을 제거한다.

alias
# localhost/images/1.png 호출 /var/www/images/1.png 검색
location /images/ {
alias /var/www/images;
}

try_files

try_files 디렉티브를 이용해서 파일이 존재하지 않으면 적절한 값을 반환할 수 있다.
-설정하지 않으면 기본으로 404를 반환한다.

location /images/ {
alias /var/www/images;
try_files $uri $uri/ =404;
}

다음과 같이 proxy 설정으로도 구성할 수도 있다.

location /images/ {
root /root;
try_files $uri $uri/ default-image;
}

location default-image {
proxy_pass http://localhost/images/default_image.jpg;
}

참고 자료

Serving Static Content

- - +설정하지 않으면 기본으로 404를 반환한다.

location /images/ {
alias /var/www/images;
try_files $uri $uri/ =404;
}

다음과 같이 proxy 설정으로도 구성할 수도 있다.

location /images/ {
root /root;
try_files $uri $uri/ default-image;
}

location default-image {
proxy_pass http://localhost/images/default_image.jpg;
}

참고 자료

Serving Static Content

+ + \ No newline at end of file diff --git a/docs/tags.html b/docs/tags.html index 9c61d6e82..4a50b6df5 100644 --- a/docs/tags.html +++ b/docs/tags.html @@ -13,13 +13,13 @@ - - + + - - + + \ No newline at end of file diff --git a/docs/tags/book.html b/docs/tags/book.html index f08147ddc..671df94c0 100644 --- a/docs/tags/book.html +++ b/docs/tags/book.html @@ -13,13 +13,13 @@ - - + +

1개 문서가 "book" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git a/docs/tags/etc.html b/docs/tags/etc.html index d1e8e089a..ff3adfaa7 100644 --- a/docs/tags/etc.html +++ b/docs/tags/etc.html @@ -13,13 +13,13 @@ - - + +

1개 문서가 "etc" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git a/docs/tags/jpa.html b/docs/tags/jpa.html index c662177e1..3a5b32750 100644 --- a/docs/tags/jpa.html +++ b/docs/tags/jpa.html @@ -13,13 +13,13 @@ - - + +

1개 문서가 "JPA" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git a/docs/tags/monitoring.html b/docs/tags/monitoring.html index 64580e167..d9f2746cf 100644 --- a/docs/tags/monitoring.html +++ b/docs/tags/monitoring.html @@ -13,13 +13,13 @@ - - + +

1개 문서가 "monitoring" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git a/docs/tags/nginx.html b/docs/tags/nginx.html index cd2a794c8..f8c6d0250 100644 --- a/docs/tags/nginx.html +++ b/docs/tags/nginx.html @@ -13,13 +13,13 @@ - - + +

2개 문서가 "nginx" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git a/docs/tags/pacakge.html b/docs/tags/pacakge.html index 7527399fc..1c10ae90e 100644 --- a/docs/tags/pacakge.html +++ b/docs/tags/pacakge.html @@ -13,13 +13,13 @@ - - + +

1개 문서가 "pacakge" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git a/docs/tags/postmortem.html b/docs/tags/postmortem.html index e8e787e76..79e4c2b33 100644 --- a/docs/tags/postmortem.html +++ b/docs/tags/postmortem.html @@ -13,13 +13,13 @@ - - + +

1개 문서가 "postmortem" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git a/docs/tags/test.html b/docs/tags/test.html index d63fc53ef..0f219e766 100644 --- a/docs/tags/test.html +++ b/docs/tags/test.html @@ -13,13 +13,13 @@ - - + +

3개 문서가 "test" 태그에 분류되었습니다

모든 태그 보기
- - + + \ No newline at end of file diff --git "a/docs/\352\270\260\355\203\200/\352\261\264\352\260\225\355\225\230\352\262\214_\353\202\230\354\225\204\354\247\200\352\270\260.html" "b/docs/\352\270\260\355\203\200/\352\261\264\352\260\225\355\225\230\352\262\214_\353\202\230\354\225\204\354\247\200\352\270\260.html" index d6f186125..ad6673138 100644 --- "a/docs/\352\270\260\355\203\200/\352\261\264\352\260\225\355\225\230\352\262\214_\353\202\230\354\225\204\354\247\200\352\270\260.html" +++ "b/docs/\352\270\260\355\203\200/\352\261\264\352\260\225\355\225\230\352\262\214_\353\202\230\354\225\204\354\247\200\352\270\260.html" @@ -13,8 +13,8 @@ - - + +
@@ -36,8 +36,8 @@ 커뮤니케이션 방법, 신뢰 자산을 확보하는 방법, 문화를 만들어가는 방법, 결정의 기준과 같은 부분을 학습할 수 있다.

보상

시련 뒤에는 항상 보물이 기다리고 있다.
보상을 통해 꾸준함을 유지할 수 있도록 만들어라.

남을 설득하는 방법 배우기

팀원들이 매번 내 의견을 반대한다면 완벽한 논리가 중요한게 아니다.
어떻게 하면 신뢰 자산을 확보할 수 있는가?
-커뮤니케이션, 협업, 소프트 스킬에서 부족함이 있으면 안된다.

- - +커뮤니케이션, 협업, 소프트 스킬에서 부족함이 있으면 안된다.

+ + \ No newline at end of file diff --git "a/docs/\353\217\204\354\204\234/\354\203\201\354\236\220_\353\260\226\354\234\274\353\241\234_\355\203\210\354\266\234\355\225\230\352\270\260.html" "b/docs/\353\217\204\354\204\234/\354\203\201\354\236\220_\353\260\226\354\234\274\353\241\234_\355\203\210\354\266\234\355\225\230\352\270\260.html" index 9ac4e19dc..1b6b5521f 100644 --- "a/docs/\353\217\204\354\204\234/\354\203\201\354\236\220_\353\260\226\354\234\274\353\241\234_\355\203\210\354\266\234\355\225\230\352\270\260.html" +++ "b/docs/\353\217\204\354\204\234/\354\203\201\354\236\220_\353\260\226\354\234\274\353\241\234_\355\203\210\354\266\234\355\225\230\352\270\260.html" @@ -13,13 +13,13 @@ - - + +
-

상자 밖으로 탈출하기

⚠️ 자기배반의 원리

  1. 다른 사람을 위해 내가 무엇인가 해야만 한다는 생각과 느낌에 대해 반하는 행위를 자기배반이라고 한다.
  2. 내가 자기배반할 때, 나는 자기배반을 정당화시키는 방식으로 세상을 보기 시작한다.
  3. 자신을 정당화시키는 방식으로 세상을 볼 때, 사실을 보는 나의 시각은 왜곡된다.
  4. 자기배반할 때, 나는 상자 안에 들어가게 된다.
  5. 시간이 지나면서 어떤 상자들은 나의 특성이 되고 일상적으로 나는 그 상자들을 지니고 다닌다.
  6. 내가 상자 안에 있음으로 인하여, 나는 다른 사람들도 상자 안에 들어가도록 이끌게 된다.
  7. 상자 안에서 우리는 서로 잘못 대하는 것을 부추기고 상호 정당화를 얻게 된다. 우리는 서로에게 상자 안에 머물기 위한 이유를 주도록 공모한다.

❌ 상자 안에서 소용없는 일

  1. 다른 사람들을 변화시키려고 하는 것
  2. 다른 사람들에게 "맞춰주기" 위해 최선을 다하기
  3. 두고 떠나기
  4. 커뮤니케이션
  5. 새로운 기술이나 테크닉 활용하기
  6. 나의 행동을 변화시키는 것

📖 학습자료

  1. 자기배반은 자기기만과 "상자"안으로 이끈다.
  2. 상자 안에 있을 때, 당신은 결과(성과)에 집중할 수 없다.
  3. 당신의 영향력과 성공의 크기는 얼마나 상자 밖에 존재하느냐에 달려있다.
  4. 다른 사람들에게 저항하는 것을 그만둘 때 당신은 상자 밖에 있게 된다.

🏃 실천하기

  1. 완벽해지려고 노력하지 말고, 지금보다 더 좋아지려고 노력하라.
  2. 아직 학습내용을 알지 못하는 사람들에게 '상자'나 기타 단어들을 사용하지 마라. 다만 당신 자신의 삶에서 그 원리들을 적용하라.
  3. 다른 사람들의 상자를 찾지 말고, 먼저 당신 자신의 상자를 찾아라.
  4. 다른 사람들이 상자 안에 있다고 힐난하지 말고, 당신이 상자 밖에 있도록 노력하라.
  5. 당신이 상자 안에 있다는 것을 발견했을 때 자신에 대해 포기하지 마라. 계속 노력하라.
  6. 당신이 상자 안에 있다는 것을 부인하지 마라. 사과하고, 계속해서 전진하라. 미래에 다른 사람에게 더 도움이 되도록 노력하라.
  7. 다른 사람들이 잘못하고 있는 것에 초점을 맞추지 마라. 그들을 돕기 위해 당신이 올바르게 행할 수 있는 일에 초점을 맞춰라.
  8. 다른 사람들이 당신을 돕고 있는지에 대해 염려하지 마라. 당신이 다른 사람들을 돕고 있는지에 대해 걱정하라.

참고 자료

상자 밖에 있는 사람, 아빈저연구소

- - +

상자 밖으로 탈출하기

⚠️ 자기배반의 원리

  1. 다른 사람을 위해 내가 무엇인가 해야만 한다는 생각과 느낌에 대해 반하는 행위를 자기배반이라고 한다.
  2. 내가 자기배반할 때, 나는 자기배반을 정당화시키는 방식으로 세상을 보기 시작한다.
  3. 자신을 정당화시키는 방식으로 세상을 볼 때, 사실을 보는 나의 시각은 왜곡된다.
  4. 자기배반할 때, 나는 상자 안에 들어가게 된다.
  5. 시간이 지나면서 어떤 상자들은 나의 특성이 되고 일상적으로 나는 그 상자들을 지니고 다닌다.
  6. 내가 상자 안에 있음으로 인하여, 나는 다른 사람들도 상자 안에 들어가도록 이끌게 된다.
  7. 상자 안에서 우리는 서로 잘못 대하는 것을 부추기고 상호 정당화를 얻게 된다. 우리는 서로에게 상자 안에 머물기 위한 이유를 주도록 공모한다.

❌ 상자 안에서 소용없는 일

  1. 다른 사람들을 변화시키려고 하는 것
  2. 다른 사람들에게 "맞춰주기" 위해 최선을 다하기
  3. 두고 떠나기
  4. 커뮤니케이션
  5. 새로운 기술이나 테크닉 활용하기
  6. 나의 행동을 변화시키는 것

📖 학습자료

  1. 자기배반은 자기기만과 "상자"안으로 이끈다.
  2. 상자 안에 있을 때, 당신은 결과(성과)에 집중할 수 없다.
  3. 당신의 영향력과 성공의 크기는 얼마나 상자 밖에 존재하느냐에 달려있다.
  4. 다른 사람들에게 저항하는 것을 그만둘 때 당신은 상자 밖에 있게 된다.

🏃 실천하기

  1. 완벽해지려고 노력하지 말고, 지금보다 더 좋아지려고 노력하라.
  2. 아직 학습내용을 알지 못하는 사람들에게 '상자'나 기타 단어들을 사용하지 마라. 다만 당신 자신의 삶에서 그 원리들을 적용하라.
  3. 다른 사람들의 상자를 찾지 말고, 먼저 당신 자신의 상자를 찾아라.
  4. 다른 사람들이 상자 안에 있다고 힐난하지 말고, 당신이 상자 밖에 있도록 노력하라.
  5. 당신이 상자 안에 있다는 것을 발견했을 때 자신에 대해 포기하지 마라. 계속 노력하라.
  6. 당신이 상자 안에 있다는 것을 부인하지 마라. 사과하고, 계속해서 전진하라. 미래에 다른 사람에게 더 도움이 되도록 노력하라.
  7. 다른 사람들이 잘못하고 있는 것에 초점을 맞추지 마라. 그들을 돕기 위해 당신이 올바르게 행할 수 있는 일에 초점을 맞춰라.
  8. 다른 사람들이 당신을 돕고 있는지에 대해 염려하지 마라. 당신이 다른 사람들을 돕고 있는지에 대해 걱정하라.

참고 자료

상자 밖에 있는 사람, 아빈저연구소

+ + \ No newline at end of file diff --git "a/docs/\353\246\254\353\210\205\354\212\244/Swap_\353\251\224\353\252\250\353\246\254_\354\204\244\354\240\225.html" "b/docs/\353\246\254\353\210\205\354\212\244/Swap_\353\251\224\353\252\250\353\246\254_\354\204\244\354\240\225.html" index 1396871a7..76f697716 100644 --- "a/docs/\353\246\254\353\210\205\354\212\244/Swap_\353\251\224\353\252\250\353\246\254_\354\204\244\354\240\225.html" +++ "b/docs/\353\246\254\353\210\205\354\212\244/Swap_\353\251\224\353\252\250\353\246\254_\354\204\244\354\240\225.html" @@ -13,8 +13,8 @@ - - + +
@@ -24,7 +24,7 @@ /etc/fstab 파일을 수정하여 Swap 메모리를 영구적으로 적용할 수 있다.

  • 해당 파일은 리눅스 부팅시 마운트정보를 저장하고 있다.
# vim을 이용하여 해당 파일을 수정한다.
sudo vim /etc/fstab
# 최하단에 다음과 같이 설정하면 된다.
/swapfile swap swap defaults 0 0

Swap 메모리 적용되었는지 확인

리눅스에서는 free 명령어를 통해 메모리를 확인할 수 있다.
-h 옵션을 주면 좀 더 읽기 편한 형태로 출력된다.

free -h
total used free shared buff/cache available
Mem: 905Mi 570Mi 65Mi 0.0Ki 270Mi 186Mi
Swap: 2.0Gi 626Mi 1.4Gi

아래에 Swap 메모리가 적용되어있는 것을 확인할 수 있다.
추가로 swapon 명령어로도 확인할 수 있다.

Swap 메모리 비활성화

swapoff 명령어를 사용하여 비활성화 한 후 파일을 삭제하면 된다.

# swap 설정한 파일 비활성화
sudo swapoff -v /swapfile
# 삭제
sudo rm /swapfile

만약 /etc/fstab에 값을 설정했을 경우 해당 값을 지워야한다.

참고 자료

How to Add Swap Space on Ubuntu 20.04, Lunuxize

- - + + \ No newline at end of file diff --git "a/docs/\353\246\254\353\210\205\354\212\244/\355\204\260\353\257\270\353\204\220_\354\211\230_\355\224\204\353\241\254\355\224\204\355\212\270_\354\204\244\354\240\225.html" "b/docs/\353\246\254\353\210\205\354\212\244/\355\204\260\353\257\270\353\204\220_\354\211\230_\355\224\204\353\241\254\355\224\204\355\212\270_\354\204\244\354\240\225.html" index d794a6cb2..d4e64408c 100644 --- "a/docs/\353\246\254\353\210\205\354\212\244/\355\204\260\353\257\270\353\204\220_\354\211\230_\355\224\204\353\241\254\355\224\204\355\212\270_\354\204\244\354\240\225.html" +++ "b/docs/\353\246\254\353\210\205\354\212\244/\355\204\260\353\257\270\353\204\220_\354\211\230_\355\224\204\353\241\254\355\224\204\355\212\270_\354\204\244\354\240\225.html" @@ -13,8 +13,8 @@ - - + +
@@ -23,7 +23,7 @@ ~/.bashrc 파일에 PS1에 대한 값을 설정하여 동일한 계정으로 재접속하여도 설정을 유지할 수 있다.

이스케이프 문자

이스케이프 문자를 사용하여 쉘 프롬프트에 서버에 대한 정보를 추가할 수 있다.

이스케이프 문자설명
\u사용자 이름
\h호스트 이름
\w현재 작업 디렉토리 (전체 경로)
\W현재 작업 디렉토리 (디렉토리 이름)
\d현재 날짜 (YYYY-MM-DD)
\t현재 시간 (HH:MM:SS)
\n줄 바꿈 문자
\$일반 사용자 $ root의 경우 #

색상 설정

\e[ - 색상 변경을 시작하고 싶을 때 사용한다.
색상코드m - 색상을 선택한다.
\e[0m - 색상 변경을 종료하고 싶을 때 사용한다.

빨간색 hello world → "\e[31mhello world!\e[0m"

echo -e 옵션을 사용하여 색상이 정상적으로 적용되었는지 확인할 수 있다.

echo -e "\e[31mhello world! \e[0m"

색상표

색상글자색배경색
Black3040
Red3141
Green3242
Yellow3343
Blue3444
Purple3545
Cyan3646
White3747

~/.bashrc 파일에 적용

sudo vim ~/.bashrc 을 입력하여 설정 파일을 연 후에 적용하고 싶은 문자를 PS1 환경변수에 할당하고 저장한다.

~/.bashrc
PS1="\e[32m[\t TRIPDRAW-DEV \u]\$ \e[0m"

적용은 source 명령어를 이용하면 된다.

source ~/.bashrc

참고 자료

Linux Hint

- - + + \ No newline at end of file diff --git "a/docs/\353\252\250\353\213\210\355\204\260\353\247\201/\353\252\250\353\213\210\355\204\260\353\247\201_\355\231\230\352\262\275_\352\265\254\354\204\261.html" "b/docs/\353\252\250\353\213\210\355\204\260\353\247\201/\353\252\250\353\213\210\355\204\260\353\247\201_\355\231\230\352\262\275_\352\265\254\354\204\261.html" index 382164504..e4cecb394 100644 --- "a/docs/\353\252\250\353\213\210\355\204\260\353\247\201/\353\252\250\353\213\210\355\204\260\353\247\201_\355\231\230\352\262\275_\352\265\254\354\204\261.html" +++ "b/docs/\353\252\250\353\213\210\355\204\260\353\247\201/\353\252\250\353\213\210\355\204\260\353\247\201_\355\231\230\352\262\275_\352\265\254\354\204\261.html" @@ -13,8 +13,8 @@ - - + +
@@ -26,8 +26,8 @@ 핀포인트, 스카우트, 와탭, 제니퍼

로그

가장 세세한 추적
같은 HTTP 요청을 묶어서 확인할 수 있는 방법이 중요하다.
MDC(Mapped Diagnostic Context) 적용

파일로 직접 로그를 남기는 경우 → 일반 로그와 에러 로그 파일을 구분해서 남겨야 한다.
-클라우드에 저장하는 경우 → 검색이 잘 되도록 구분한다.

모니터링

관찰의 경우 전체 → 좁게

알람

알람의 경우 2가지 종류(경고, 심각)로 구분해서 관리한다.

참고 자료

스프링 부트 핵심 원리와 활용, 김영한

- - +클라우드에 저장하는 경우 → 검색이 잘 되도록 구분한다.

모니터링

관찰의 경우 전체 → 좁게

알람

알람의 경우 2가지 종류(경고, 심각)로 구분해서 관리한다.

참고 자료

스프링 부트 핵심 원리와 활용, 김영한

+ + \ No newline at end of file diff --git "a/docs/\353\254\270\355\231\224/\355\217\254\354\212\244\355\212\270_\353\252\250\355\205\234.html" "b/docs/\353\254\270\355\231\224/\355\217\254\354\212\244\355\212\270_\353\252\250\355\205\234.html" index 28bc62f21..46e762007 100644 --- "a/docs/\353\254\270\355\231\224/\355\217\254\354\212\244\355\212\270_\353\252\250\355\205\234.html" +++ "b/docs/\353\254\270\355\231\224/\355\217\254\354\212\244\355\212\270_\353\252\250\355\205\234.html" @@ -13,8 +13,8 @@ - - + +
@@ -25,8 +25,8 @@ 문제를 즉시 해결하기 위한 조치 항목(소유자 명시)
개발 방지를 위한 조치 항목
해당 경험에서 얻은 교훈

참고 자료

구글 엔지니어는 이렇게 일한다, 타이터스 윈터스, 톰 맨쉬렉, 하이럼 라이트 p.86
-우아한 장애대응

- - +우아한 장애대응

+ + \ No newline at end of file diff --git "a/docs/\354\204\244\352\263\204/\355\214\250\355\202\244\354\247\200.html" "b/docs/\354\204\244\352\263\204/\355\214\250\355\202\244\354\247\200.html" index bf1498bf4..fd3b47758 100644 --- "a/docs/\354\204\244\352\263\204/\355\214\250\355\202\244\354\247\200.html" +++ "b/docs/\354\204\244\352\263\204/\355\214\250\355\202\244\354\247\200.html" @@ -13,15 +13,15 @@ - - + +

패키지

계층 기반 패키지

전통적인 수평 계층형 아키텍처
기술적인 관점에서 해당 코드가 하는 일에 기반해 코드를 분할

기능 기반 패키지

서로 연관된 기능, 도메인 개념, 또는 Aggregate Root에 기반하여 수직의 얇은 조각으로 코드를 나누는 방식

포트와 어댑터

업무/도메인에 초점을 둔 코드가 프레임워크 데이터베이스 같은 기술적인 세부 구현과 독립적이며 분리된 아키텍처를 만들기 위해 사용

컴포넌트 기반 패키지

큰 단위의 단일 컴포넌트와 관련된 모든 책임을 하나의 자바 패키지로 묶는 데 주안점을 둠
-모노리틱 애플리케이션에서 컴포넌트를 잘 정의하면 MSA로 가기 위한 발판으로 삼을 수 있음

참고 자료

클린 아키텍처, 로버트 C. 마틴 p.316

- - +모노리틱 애플리케이션에서 컴포넌트를 잘 정의하면 MSA로 가기 위한 발판으로 삼을 수 있음

참고 자료

클린 아키텍처, 로버트 C. 마틴 p.316

+ + \ No newline at end of file diff --git "a/docs/\355\205\214\354\212\244\355\212\270/\352\263\204\353\213\250_\355\205\214\354\212\244\355\212\270.html" "b/docs/\355\205\214\354\212\244\355\212\270/\352\263\204\353\213\250_\355\205\214\354\212\244\355\212\270.html" index 88d3f7687..c689b2adf 100644 --- "a/docs/\355\205\214\354\212\244\355\212\270/\352\263\204\353\213\250_\355\205\214\354\212\244\355\212\270.html" +++ "b/docs/\355\205\214\354\212\244\355\212\270/\352\263\204\353\213\250_\355\205\214\354\212\244\355\212\270.html" @@ -13,15 +13,15 @@ - - + +

계단 테스트

계단 테스트(Stairstep Test)

추후에 필요로 할 클래스, 함수, 다른 구조를 만들도록 강제하기 위해 작성하는 테스트
아무런 단정문이 없을 수도 있고, 기능이 조금 더 구현된다면 제거하고 포괄적인 테스트로 대신할 수 있다.
-복잡도를 필요한 수준까지 점진적으로 증가시킬 수 있게 도와주는 계단 역할을 하기 때문에 계단 테스트라고 부른다.

참고 자료

소프트웨어 장인 정신 이야기, 로버트 C. 마틴 p.74

- - +복잡도를 필요한 수준까지 점진적으로 증가시킬 수 있게 도와주는 계단 역할을 하기 때문에 계단 테스트라고 부른다.

참고 자료

소프트웨어 장인 정신 이야기, 로버트 C. 마틴 p.74

+ + \ No newline at end of file diff --git "a/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\243\274\353\217\204_\352\260\234\353\260\234_\352\267\234\354\271\231.html" "b/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\243\274\353\217\204_\352\260\234\353\260\234_\352\267\234\354\271\231.html" index 78485113e..e4bb93f23 100644 --- "a/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\243\274\353\217\204_\352\260\234\353\260\234_\352\267\234\354\271\231.html" +++ "b/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\243\274\353\217\204_\352\260\234\353\260\234_\352\267\234\354\271\231.html" @@ -13,13 +13,13 @@ - - + +
-

TDD heuristics

TDD heuristics

  1. 여러분이 작성하고 싶은 코드를 작성하도록 만드는 테스트를 작성하라.
  2. 실패시켜라. 통과시켜라. 그리고 정리하라.
  3. 최상의 결과를 추구하지 말라.
  4. 실패하는 가장 간단하고, 가장 구체적이며, 가장 퇴화한 테스트를 작성하라.
  5. 가능하면 일반화하라.
  6. 코드가 틀렸다고 느껴지면 잠시 멈춰서 설계를 고쳐라.
  7. 더 복잡한 다음 경우로 넘어가기 전, 지금 다루고 있는 더 단순한 경우를 모조리 테스트하라.
  8. 현재 테스트를 통과시키기 위해 너무 많은 구현을 해야 한다면, 테스트를 지우고 더 쉽게 통과할 수 있는 더 단순한 테스트를 작성하라.
  9. 테스트 공간(test space)을 전부 포괄하는 신중하고 점진적인 패턴을 따르라.
  10. 필요 없는 것을 여러분의 테스트에 넣지 말라.
  11. 테스트에 실제 서비스 데이터를 사용하지 말라.
  12. 테스트 구조를 제품 코드 구조로부터 분리하라.
  13. 테스트가 구체적(specific)이 될수록 코드는 일반적(generic)이 된다.
  14. 변환을 적용한 결과 최적이 아닌 해답에 도달했다면 다른 변환을 시도해보라.
  15. 디버거 사용을 피하라

참고 자료

소프트웨어 장인 정신 이야기, 로버트 C. 마틴 p.44 ~ p.209

- - +

TDD heuristics

TDD heuristics

  1. 여러분이 작성하고 싶은 코드를 작성하도록 만드는 테스트를 작성하라.
  2. 실패시켜라. 통과시켜라. 그리고 정리하라.
  3. 최상의 결과를 추구하지 말라.
  4. 실패하는 가장 간단하고, 가장 구체적이며, 가장 퇴화한 테스트를 작성하라.
  5. 가능하면 일반화하라.
  6. 코드가 틀렸다고 느껴지면 잠시 멈춰서 설계를 고쳐라.
  7. 더 복잡한 다음 경우로 넘어가기 전, 지금 다루고 있는 더 단순한 경우를 모조리 테스트하라.
  8. 현재 테스트를 통과시키기 위해 너무 많은 구현을 해야 한다면, 테스트를 지우고 더 쉽게 통과할 수 있는 더 단순한 테스트를 작성하라.
  9. 테스트 공간(test space)을 전부 포괄하는 신중하고 점진적인 패턴을 따르라.
  10. 필요 없는 것을 여러분의 테스트에 넣지 말라.
  11. 테스트에 실제 서비스 데이터를 사용하지 말라.
  12. 테스트 구조를 제품 코드 구조로부터 분리하라.
  13. 테스트가 구체적(specific)이 될수록 코드는 일반적(generic)이 된다.
  14. 변환을 적용한 결과 최적이 아닌 해답에 도달했다면 다른 변환을 시도해보라.
  15. 디버거 사용을 피하라

참고 자료

소프트웨어 장인 정신 이야기, 로버트 C. 마틴 p.44 ~ p.209

+ + \ No newline at end of file diff --git "a/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\275\224\353\223\234\352\260\200_\354\243\274\353\212\224_\355\230\234\355\203\235.html" "b/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\275\224\353\223\234\352\260\200_\354\243\274\353\212\224_\355\230\234\355\203\235.html" index 52a610dda..4da4bf5e8 100644 --- "a/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\275\224\353\223\234\352\260\200_\354\243\274\353\212\224_\355\230\234\355\203\235.html" +++ "b/docs/\355\205\214\354\212\244\355\212\270/\355\205\214\354\212\244\355\212\270_\354\275\224\353\223\234\352\260\200_\354\243\274\353\212\224_\355\230\234\355\203\235.html" @@ -13,8 +13,8 @@ - - + +
@@ -24,8 +24,8 @@ 리팩터링할 때 자신감을 가지고 변경 사항을 반영할 수 있다.

더 나은 문서 자료

하나의 행위만 집중해 검증하는 테스트는 실행 가능한 문서와 같다.
이 때 테스트는 명확하고 간결해야지만 문서 자료로서의 역할을 훌륭히 수행할 수 있다.

더 단순한 리뷰

정확성, 극단 상황, 오류 상황 등의 다양한 측면에서 코드를 검사해주는 테스트가 준비되어 있다면 리뷰어가 검증하는 시간을 크게 줄여준다.

사려 깊은 설계

새로 작성한 코드의 테스트를 작성하는 일은 실질적으로 해당 코드의 API가 잘 설계되어 있는지를 시험하는 행위다.
테스트하기 어려운 코드는 너무 많은 책임을 가지고 있거나, 의존성이 복잡한 경우가 많다.
-잘 설계된 코드라면 모듈화가 잘 되어있어야 한다.

고품질의 릴리스를 빠르게

자동화된 테스트를 갖춘다면 새로운 버전을 릴리스할 때 불안에 떨지 않아도 된다.

참고 자료

구글 엔지니어는 이렇게 일한다, 타이터스 윈터스, 톰 맨쉬렉, 하이럼 라이트 p.288

- - +잘 설계된 코드라면 모듈화가 잘 되어있어야 한다.

고품질의 릴리스를 빠르게

자동화된 테스트를 갖춘다면 새로운 버전을 릴리스할 때 불안에 떨지 않아도 된다.

참고 자료

구글 엔지니어는 이렇게 일한다, 타이터스 윈터스, 톰 맨쉬렉, 하이럼 라이트 p.288

+ + \ No newline at end of file diff --git a/index.html b/index.html index 9a415f49e..c8b2c7228 100644 --- a/index.html +++ b/index.html @@ -13,13 +13,13 @@ - - + +
- - + + \ No newline at end of file diff --git a/page/10.html b/page/10.html index 0ad5f7604..c69e15b3e 100644 --- a/page/10.html +++ b/page/10.html @@ -13,25 +13,23 @@ - - + +
-
본문으로 건너뛰기

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
-따라서 레벨 1 레벨 인터뷰 회고는 레벨 1 회고를 작성할 때 끼워넣었다.
-이번에는 범위도 제한되어 있어 어떻게 준비해야 할지 당황했고, 답변에도 부족한 부분이 많았었다.
-기억이 사라지기 전에 큰 문제 없이 답변한 내용을 제외하고, 기억 남는 것 위주로 작성해 보려고 한다.

API 문서 도구 선택

큰 문제 없이 답변을 했는데 앞으로도 팀 프로젝트를 하면서 도움 될 것 같은 내용이 있어서 남겨두려고 한다.
-백엔드 팀원이 함께 의사결정을 했고, 미션 기간이 짧은 만큼 팀 차원에서 비교적 학습하기 쉬운 Swagger를 선택했다.
-추가로 들어가는 시간 대비 하이 리턴이라고 생각했다고 답변했다.

팀 차원의 학습 비용을 언급해서, 다음과 같은 좋은 피드백을 받았다.

특히 팀으로 의사결정하는 과정을 공유해 준 점이 좋았고 기술적 의사결정 과정에서 팀의 학습비용을 고려한 점이 좋았음.
-앞으로도 학습 비용은 주요하게 고려해야 할 사항

PUT과 PATCH & 토큰과 세션

PUT과 PATCH 차이를 설명하는 부분에서는 PATCH를 사용할 때 페이로드가 적어진다는 내용을 빼먹고 답변을 했다.
-토큰과 세션의 경우 기술을 잘 모르는 사람에게 설명해달라는 제약조건이 추가되었다.

해당 내용을 답변하면서 기술적인 깊이가 많이 부족했다는 생각이 든다.
-실제로 레벨 2 때 이론적인 학습 시간이 매우 적었고, 집중력도 많이 부족했다.
-앞으로 어떻게 깊이를 채울지 고민을 할 수 있는 질문들이었다.

추가로 기술을 잘 모르는 사람에게 설명하는 가정을 두고 학습을 한다면 큰 도움이 될 거라는 피드백을 받았다.

그 외 개선할 점

인터뷰할 때 특유의 말버릇을 개선하기
-생각할 시간을 가졌을 때 "다시 말씀드려도 될까요?"라고 말하고 답변을 이어나가기
-기술적으로 깊이가 부족하다고 생각이 많이 들어서 조금 더 깊게 공부하고 정리하기
-이전에 공부했던거 되돌아 보는 시간 가지기

- - +
본문으로 건너뛰기

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
+빠르게 지나가서 조금 아쉽다.

학습

회고를 작성하기 전에 레벨 2 동안 보냈던 PR과 회고를 쭉 읽어봤다.
+항상 아쉬운 곳은 있기 마련이지만, 잘 학습한 것 같다.
+미션을 하면서 기술을 어떻게 선택하고, 적용할 것인지 고민하는 과정에서 꽤나 많은 성장을 한 것 같다.

고민은 깊었지만 이론적인 학습이 부족한 레벨 2였다.
+방학 그리고 레벨 3 때는 조금 더 이론적인 부분을 학습하는데 집중해야겠다.

점차 학습 범위가 넓어지면서 자연스럽게 모르는 내용이 쌓여간다.
+필요한 내용은 앞으로 천천히 학습하면 되니까 조급해지지 말아야겠다.

수면

레벨 2를 진행하는 동안 수면이 많이 부족했었고, 결과적으로는 그날의 컨디션을 많이 좌우했던 것 같다.
+앞으로 수면 시간을 늘리고, 좋은 수면 습관을 가지도록 노력해야겠다.

협업

레벨 2 마지막에 협업 미션이 있었다.
+지금까지는 백엔드 크루들과 페어 프로그래밍을 하면서 협업을 경험했다.
+이번에는 프런트엔드 크루와 협업을 했다. 소통은 잘 된 것 같지만 API 명세를 정하는 부분이 아직 미숙한 것 같다.

레벨 3 때부터 본격적으로 프로젝트가 시작된다.
+팀을 위해 어떤 것을 할 수 있을지 고민을 많이 해봐야겠다.

레벨 2를 마무리하며

회고 작성하면서 레벨 2에서 했던 것들을 반추해 봤는데 부족한 점은 많았어도 좋은 방향으로 가고 있는 것 같다. +읽고 싶은 책도 읽고, 부족한 부분 채우면서 쉬어야겠다.

+ + \ No newline at end of file diff --git a/page/11.html b/page/11.html index a3611281b..cdac969bf 100644 --- a/page/11.html +++ b/page/11.html @@ -13,29 +13,25 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
-마코, 우가, 우코, 우스 그리고 나까지 합쳐서 5명이 한 팀이 되었다.

배포

이전 미션들과 달리 AWS를 이용해 배포를 해야 했다.
-각자 하나의 EC2 인스턴스를 제공받을 수 있었고, 팀 별로 DB를 위한 추가 인스턴스를 제공받았다.
-배포 스크립트를 작성하는 경험을 해볼 수 있었다.
-배포 스크립트에 시간을 많이 투자하진 않았고, 다음과 같이 간단하게 작성했다.

echo "Start Deploy Script"
REPOSITORY_NAME=/home/ubuntu/jwp-shopping-order
PROJECT_NAME=jwp-shopping-order

echo "Change Directory"
cd $REPOSITORY_NAME

echo "Git Pull"
git pull origin step2

echo "Build"
./gradlew bootJar

echo "Copy, Start Server"
mv ./build/libs/$PROJECT_NAME.jar .

PID=$(pgrep -f $PROJECT_NAME)

if [ -n $PID ]; then
kill -9 $PID
sleep 5
fi

nohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &

협업

일단 우스랑 우코가 먼저 잠실로 와줘서 너무 감사했다.
-백엔드가 아닌 다른 크루들과 해보는 첫 협업이라 약간 두근거렸다.
-예상외로 대화가 잘 되어서, 빠르게 명세를 정할 수 있었다.

부족했던 부분

여러가지 방법에 대한 장단점을 고려해보기

백엔드와 테이블 명세나 쿠폰 구현에 대해서 이야기할 때 장단에 대해 많이 고려하지 못한 것 같다.
-조금 더 시간을 많이 들여서 장단점을 고려했다면 더 좋은 결과물이 나오지 않았을까?
-앞으로 선택의 순간에서 조금 더 시간을 들여보는 것도 좋을 것 같다.

새로 배운 부분

expose headers

웹 페이지에서 Location 헤더를 받을 수 없는 문제가 있었다.
-기본적으로 허용 목록에 존재하는 응답헤더만 반환한다는 것을 모르고 있었다.
-이를 expose headers 설정을 통해 해결할 수 있었다.
-nginx 설정에 다음과 같이 추가해 주었다.

add_header 'Access-Control-Expose-Headers' 'Location'

읽기 전용 트랜잭션

단순 조회 요청에 대한 성능을 향상시켜준다는 것이라고 간단히만 알고 있었다.
-이번에 코멘트가 달려서 조금 더 자세히 공부해 보기로 했다.
-Transactional(readOnly = true)를 사용하는 경우 다음과 같이 동작한다.

setReadOnly(true) 설정이 된 Connection으로 연결을 시도를 한다. 이 설정을 하는 경우 DB마다 다르게 동작한다.

  • h2의 Connection 구현체는 readOnly 설정을 무시하는 방향으로 구현되어 Transactional 적용되지 않는다.
  • MySQL 8.0(InnoDB 사용 시)의 경우 읽기 전용으로 알려진 트랜잭션의 경우 트랜잭션 ID를 설정하지 않기 때문에 조회 속도가 더 빨라진다.

ORM 프레임워크를 사용한다면 prepareTransactionalConnection를 호출한다고 한다.
-추가로 현업에서는 고가용성 내결함성 등을 위하여 클러스터를 구성하여 사용하는 경우가 많고, 이 경우 readOnly 설정이 되어있다면 읽기 전용 DB로 질의가 들어가서 부하 분산의 효과가 있다고 한다.

DAO에 @Transactional 적용

DAO에 트랜잭션을 보장해 보는 건 어떻겠냐고 리뷰가 달려서 고민을 많이 했다.
-Service 계층에 이미 트랜잭션을 보장해 주고 있기에 필요 없지 않을까 생각했었다.
-DAO를 다른 곳에서 사용하더라도 트랜잭션을 보장하기 위해(확장성 고려) @Transactional을 적용하는 것도 괜찮은 것 같다.

- - +
본문으로 건너뛰기

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
+따라서 레벨 1 레벨 인터뷰 회고는 레벨 1 회고를 작성할 때 끼워넣었다.
+이번에는 범위도 제한되어 있어 어떻게 준비해야 할지 당황했고, 답변에도 부족한 부분이 많았었다.
+기억이 사라지기 전에 큰 문제 없이 답변한 내용을 제외하고, 기억 남는 것 위주로 작성해 보려고 한다.

API 문서 도구 선택

큰 문제 없이 답변을 했는데 앞으로도 팀 프로젝트를 하면서 도움 될 것 같은 내용이 있어서 남겨두려고 한다.
+백엔드 팀원이 함께 의사결정을 했고, 미션 기간이 짧은 만큼 팀 차원에서 비교적 학습하기 쉬운 Swagger를 선택했다.
+추가로 들어가는 시간 대비 하이 리턴이라고 생각했다고 답변했다.

팀 차원의 학습 비용을 언급해서, 다음과 같은 좋은 피드백을 받았다.

특히 팀으로 의사결정하는 과정을 공유해 준 점이 좋았고 기술적 의사결정 과정에서 팀의 학습비용을 고려한 점이 좋았음.
+앞으로도 학습 비용은 주요하게 고려해야 할 사항

PUT과 PATCH & 토큰과 세션

PUT과 PATCH 차이를 설명하는 부분에서는 PATCH를 사용할 때 페이로드가 적어진다는 내용을 빼먹고 답변을 했다.
+토큰과 세션의 경우 기술을 잘 모르는 사람에게 설명해달라는 제약조건이 추가되었다.

해당 내용을 답변하면서 기술적인 깊이가 많이 부족했다는 생각이 든다.
+실제로 레벨 2 때 이론적인 학습 시간이 매우 적었고, 집중력도 많이 부족했다.
+앞으로 어떻게 깊이를 채울지 고민을 할 수 있는 질문들이었다.

추가로 기술을 잘 모르는 사람에게 설명하는 가정을 두고 학습을 한다면 큰 도움이 될 거라는 피드백을 받았다.

그 외 개선할 점

인터뷰할 때 특유의 말버릇을 개선하기
+생각할 시간을 가졌을 때 "다시 말씀드려도 될까요?"라고 말하고 답변을 이어나가기
+기술적으로 깊이가 부족하다고 생각이 많이 들어서 조금 더 깊게 공부하고 정리하기
+이전에 공부했던거 되돌아 보는 시간 가지기

+ + \ No newline at end of file diff --git a/page/12.html b/page/12.html index bd264d052..2f643b363 100644 --- a/page/12.html +++ b/page/12.html @@ -13,26 +13,29 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
-레벨 2가 거의 끝나가는 시점, 그동안 했던 것을 정리해 보려고 한다.

나의 채팅 확인하고 이어하는 기능

GPT에도 있는 기능인데, 내가 이전에 했던 채팅을 이어할 수 있는 기능을 추가했다.
-예전에 어떤 질문을 남겼는지, 또한 해당 채팅을 이어서 할 수 있다.

chat1

좋아요와 댓글 기능

다른 사람들이 질문한 내용에 반응할 수 있는 무언가가 있었으면 좋겠다는 의견들이 많았다.
-누가 좋아요를 눌렀는지, 어떤 채팅이 좋아요를 가장 많이 받았는지 확인할 수 있는 기능을 추가했다.
-또한 댓글 추가 및 삭제 기능도 추가했다.

키워드 추출

어떻게 키워드 추출을 할지 고민을 많이 했는데, 일단 GPT를 이용해서 키워드를 추출하기로 했다.
-해당 부분은 첫 질문에 대한 키워드만 추출하도록 했다.
-백엔드에선 말랑이 이벤트 이용해서 첫 채팅 요청이 이루어지면, 비동기로 키워드를 추출하는 질문을 추가로 날리도록 구현하였다.
-CSV 형식으로 GPT에게 답변을 입력해달라고 요청받는데, 이 부분이 문제(프롬프트 엔지니어링 부분이 반환된다.)가 좀 있는 것 같아서 개선이 필요한 것 같다.

chat2

다른 크루의 채팅 복사해서 이어하는 기능

다른 크루들의 채팅을 읽다가 궁금한 점이 있다면 복사해서 바로 질문을 할 수 있는 기능을 추가했다.
-채팅이 복사된 후 바로 GPT와 대화를 할 수 있는 메인 화면으로 이동한다.

사용성 고려하기

chat3

위 화면은 회원가입 창이다.
-사실 가장 마음에 드는 부분이고, 회원가입(닉네임만 입력하지만)할 때 익명을 원하는 사람들의 고민을 도와주게 끔 음식, 과일, 과자 등의 요소들을 입력하도록 유도했다! -추가로 GPT의 답변이 오면 자동으로 화면을 스크롤 해주는 것과 같이 사용성을 개선해 보려고 노력했지만 쉽지 않았다.
-제일 하고 싶은 것은 실제 GPT를 사용하는 것처럼 stream/text 값을 처리하고 싶은데 이 부분은 방학 때 기회가 되면 도전해 봐야겠다.

향후 계획

실제 크루들이 사용해 주는 서비스를 직접 만들어보면서 사용자의 입장에서 고민도 하게 되는 것 같다.
-크루들이 직접 사용해 주니까 너무 고맙고, 한편으로는 신기하다.
-일단 방학 때 stream/text 관련된 부분 동작되도록 구현해보려고 하고, 그 외의 부분은 조금 더 고민해야될 것 같다.

- - +
본문으로 건너뛰기

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
+마코, 우가, 우코, 우스 그리고 나까지 합쳐서 5명이 한 팀이 되었다.

배포

이전 미션들과 달리 AWS를 이용해 배포를 해야 했다.
+각자 하나의 EC2 인스턴스를 제공받을 수 있었고, 팀 별로 DB를 위한 추가 인스턴스를 제공받았다.
+배포 스크립트를 작성하는 경험을 해볼 수 있었다.
+배포 스크립트에 시간을 많이 투자하진 않았고, 다음과 같이 간단하게 작성했다.

echo "Start Deploy Script"
REPOSITORY_NAME=/home/ubuntu/jwp-shopping-order
PROJECT_NAME=jwp-shopping-order

echo "Change Directory"
cd $REPOSITORY_NAME

echo "Git Pull"
git pull origin step2

echo "Build"
./gradlew bootJar

echo "Copy, Start Server"
mv ./build/libs/$PROJECT_NAME.jar .

PID=$(pgrep -f $PROJECT_NAME)

if [ -n $PID ]; then
kill -9 $PID
sleep 5
fi

nohup java -Dspring.profiles.active=prod -jar $PROJECT_NAME.jar 1>stdout.txt 2>err.txt &

협업

일단 우스랑 우코가 먼저 잠실로 와줘서 너무 감사했다.
+백엔드가 아닌 다른 크루들과 해보는 첫 협업이라 약간 두근거렸다.
+예상외로 대화가 잘 되어서, 빠르게 명세를 정할 수 있었다.

부족했던 부분

여러가지 방법에 대한 장단점을 고려해보기

백엔드와 테이블 명세나 쿠폰 구현에 대해서 이야기할 때 장단에 대해 많이 고려하지 못한 것 같다.
+조금 더 시간을 많이 들여서 장단점을 고려했다면 더 좋은 결과물이 나오지 않았을까?
+앞으로 선택의 순간에서 조금 더 시간을 들여보는 것도 좋을 것 같다.

새로 배운 부분

expose headers

웹 페이지에서 Location 헤더를 받을 수 없는 문제가 있었다.
+기본적으로 허용 목록에 존재하는 응답헤더만 반환한다는 것을 모르고 있었다.
+이를 expose headers 설정을 통해 해결할 수 있었다.
+nginx 설정에 다음과 같이 추가해 주었다.

add_header 'Access-Control-Expose-Headers' 'Location'

읽기 전용 트랜잭션

단순 조회 요청에 대한 성능을 향상시켜준다는 것이라고 간단히만 알고 있었다.
+이번에 코멘트가 달려서 조금 더 자세히 공부해 보기로 했다.
+Transactional(readOnly = true)를 사용하는 경우 다음과 같이 동작한다.

setReadOnly(true) 설정이 된 Connection으로 연결을 시도를 한다. 이 설정을 하는 경우 DB마다 다르게 동작한다.

  • h2의 Connection 구현체는 readOnly 설정을 무시하는 방향으로 구현되어 Transactional 적용되지 않는다.
  • MySQL 8.0(InnoDB 사용 시)의 경우 읽기 전용으로 알려진 트랜잭션의 경우 트랜잭션 ID를 설정하지 않기 때문에 조회 속도가 더 빨라진다.

ORM 프레임워크를 사용한다면 prepareTransactionalConnection를 호출한다고 한다.
+추가로 현업에서는 고가용성 내결함성 등을 위하여 클러스터를 구성하여 사용하는 경우가 많고, 이 경우 readOnly 설정이 되어있다면 읽기 전용 DB로 질의가 들어가서 부하 분산의 효과가 있다고 한다.

DAO에 @Transactional 적용

DAO에 트랜잭션을 보장해 보는 건 어떻겠냐고 리뷰가 달려서 고민을 많이 했다.
+Service 계층에 이미 트랜잭션을 보장해 주고 있기에 필요 없지 않을까 생각했었다.
+DAO를 다른 곳에서 사용하더라도 트랜잭션을 보장하기 위해(확장성 고려) @Transactional을 적용하는 것도 괜찮은 것 같다.

+ + \ No newline at end of file diff --git a/page/13.html b/page/13.html index 47efa998f..9655038fa 100644 --- a/page/13.html +++ b/page/13.html @@ -13,25 +13,26 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
-요금을 계산하는 메서드는 최단 경로 계산의 결과, 사용자의 정보, 요금을 받아 요금을 계산한다.

public interface FarePolicy {
int calculate(Path path, Passenger passenger, int fare);
}

public class BaseFarePolicy implements FarePolicy { ... }
public class DistanceFarePolicy implements FarePolicy { ... }
public class AgeDiscountFarePolicy implements FarePolicy { ... }

composite1

모든 요금 정책을 포함하는 새로운 요금 정책 만들기

나머지 구현체를 모두 가지고 있는 하나의 구현체를 만들었다.
-이 또한 FarePolicy를 구현한 형태가 되고, 필드로는 나머지 구현체들을 가지고 있다.

public class SubwayFarePolicy implements FarePolicy {

private final List<FarePolicy> farePolicies;

public SubwayFarePolicy(final List<FarePolicy> farePolicies) {
this.farePolicies = farePolicies;
}

@Override
public int calculate(final Path path, final Passenger passenger, final int fare) {
int calculatedFare = fare;
for (FarePolicy farePolicy : farePolicies) {
calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);
}
return calculatedFare;
}
}

따라서 그림으로 본다면 다음과 같은 구조가 된다.

composite2

정책의 순서

지하철 요구사항은 순서가 중요했다.
-금액의 총합을 구하고, 그 후에 할인 정책이 들어가야했다.
-따라서 자식들의 순서를 관리할 때 주의를 기울여야 했다.
-Configuration 클래스에 다음과 같이 순서를 직접 적용시켰다.

@Configuration
public class FareConfiguration {

@Bean
public FarePolicy farePolicy() {
return new SubwayFarePolicy(List.of(
new BaseFarePolicy(),
new DistanceFarePolicy(),
new AgeDiscountFarePolicy()
));
}
}

컴포지트 패턴이란?

composite3

GOF의 디자인 패턴 책에서는 컴포지트 패턴을 다음과 같이 설명하고 있다.

부분과 전체의 계층을 표현하기 위해 객체들을 모아 트리 구조로 구성합니다.
-사용자로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있도록 하는 패턴입니다.

컴포지트 패턴은 인터페이스를 구현한 개별 객체가 존재하고, 그 개별 객체들을 포함하는 하나의 구현체가 따로 존재하는 패턴이다.
-이 때 사용자는 개별 객체와 합성 객체(개별 객체들을 포함하고 있는)를 똑같이 사용할 수 있다.

컴포지트 패턴의 구성요소

Component

  • 집합 관계에 정의될 모든 객체에 대한 인터페이스
  • ex) 요금 정책(FarePolicy)

Leaf

  • 개별 객체, 객체 합성에 기본이 되는 객체의 행동
  • ex) 거리 별 요금 정책(DistanceFarePolicy)

Composite

  • 여러 개의 개발 객체를 포함하는 합성 객체
  • ex) 지하철 요금 정책(SubwayFarePolicy)

Client

  • 인터페이스를 사용하는 클라이언트

컴포지트 패턴의 사용과 주요 목표

부분 - 전체의 관계를 표현하고 싶을 때
-Client 기준으로 Composite와 Leaf의 차이를 알지 못해도 잘 사용할 수 있도록 해야될 때

패턴 사용시 주의해야할 부분

패턴은 공통으로 사용 가능한 역할, 책임, 협력의 템플릿이다.
-반복되는 문제를 효율적으로 해결할 수 있지만 패턴에 매몰되서는 안된다.
-패턴을 맹목적으로 사용해서는 안되고, 현재의 요구사항에 따라 패턴을 유동적으로 수정해가면서 적용하는 것이 좋다.
-항상 트레이드오프를 생각하자!

참고 자료

컴포지트 패턴, GoF의 디자인 패턴
-디자인 패턴과 프레임워크, 오브젝트

- - +
본문으로 건너뛰기

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
+레벨 2가 거의 끝나가는 시점, 그동안 했던 것을 정리해 보려고 한다.

나의 채팅 확인하고 이어하는 기능

GPT에도 있는 기능인데, 내가 이전에 했던 채팅을 이어할 수 있는 기능을 추가했다.
+예전에 어떤 질문을 남겼는지, 또한 해당 채팅을 이어서 할 수 있다.

chat1

좋아요와 댓글 기능

다른 사람들이 질문한 내용에 반응할 수 있는 무언가가 있었으면 좋겠다는 의견들이 많았다.
+누가 좋아요를 눌렀는지, 어떤 채팅이 좋아요를 가장 많이 받았는지 확인할 수 있는 기능을 추가했다.
+또한 댓글 추가 및 삭제 기능도 추가했다.

키워드 추출

어떻게 키워드 추출을 할지 고민을 많이 했는데, 일단 GPT를 이용해서 키워드를 추출하기로 했다.
+해당 부분은 첫 질문에 대한 키워드만 추출하도록 했다.
+백엔드에선 말랑이 이벤트 이용해서 첫 채팅 요청이 이루어지면, 비동기로 키워드를 추출하는 질문을 추가로 날리도록 구현하였다.
+CSV 형식으로 GPT에게 답변을 입력해달라고 요청받는데, 이 부분이 문제(프롬프트 엔지니어링 부분이 반환된다.)가 좀 있는 것 같아서 개선이 필요한 것 같다.

chat2

다른 크루의 채팅 복사해서 이어하는 기능

다른 크루들의 채팅을 읽다가 궁금한 점이 있다면 복사해서 바로 질문을 할 수 있는 기능을 추가했다.
+채팅이 복사된 후 바로 GPT와 대화를 할 수 있는 메인 화면으로 이동한다.

사용성 고려하기

chat3

위 화면은 회원가입 창이다.
+사실 가장 마음에 드는 부분이고, 회원가입(닉네임만 입력하지만)할 때 익명을 원하는 사람들의 고민을 도와주게 끔 음식, 과일, 과자 등의 요소들을 입력하도록 유도했다! +추가로 GPT의 답변이 오면 자동으로 화면을 스크롤 해주는 것과 같이 사용성을 개선해 보려고 노력했지만 쉽지 않았다.
+제일 하고 싶은 것은 실제 GPT를 사용하는 것처럼 stream/text 값을 처리하고 싶은데 이 부분은 방학 때 기회가 되면 도전해 봐야겠다.

향후 계획

실제 크루들이 사용해 주는 서비스를 직접 만들어보면서 사용자의 입장에서 고민도 하게 되는 것 같다.
+크루들이 직접 사용해 주니까 너무 고맙고, 한편으로는 신기하다.
+일단 방학 때 stream/text 관련된 부분 동작되도록 구현해보려고 하고, 그 외의 부분은 조금 더 고민해야될 것 같다.

+ + \ No newline at end of file diff --git a/page/14.html b/page/14.html index 9d56b70ac..bf8580fbf 100644 --- a/page/14.html +++ b/page/14.html @@ -13,33 +13,25 @@ - - + +
-
본문으로 건너뛰기

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
-지하철 미션은 밀리랑 페어를 진행했다.
-간단한 CRUD만 있던 이전 미션들과 달리, 조금 복잡한 도메인 요구사항이 있었다.
-이때 API, 테이블, 도메인 설계를 해야 했는데 어떤 것부터 해야 할지 고민을 많이 했다.
-API와 테이블 구조를 우리가 정할 수 있는 상황이었고, 도메인 로직이 복잡했기 때문에 도메인을 먼저 구현했다.

노선의 구간 추가 및 삭제

노선을 저장하는 방법에 대해서 밀리와 이야기를 나눴다.

  1. 구간을 데이터베이스에서 전부 제거하고 전부 추가하는 방법
  2. 변경된 요소만 데이터베이스에 반영하는 방법

페어 시간이 짧아서 더욱 간단한 1번을 선택했고, 시간 내 요구사항을 만족시키기 위해 더 간단하게 구현하는 방법을 선택하는 것도 좋은 트레이드오프였던 것 같다.
-추후 페어가 끝나고 리뷰어인 서브웨이가 일부분만 반영하는 것으로 개선해 보는 것도 좋을 것 같다고 코멘트를 남겨주셔서 추가 및 제거된 요소만 반영하도록 변경했다.

부족했던 부분

미션의 난이도가 올라간 만큼, 페어 할 땐 컨디션 관리도 잘하려고 노력하고 미션 할 때도 집중해서 잘 끝낸 것 같다.
-우아한테크코스를 진행하면서 알아야 하는 게 많아지면서 가끔 조바심을 가질 때가 있는 것 같은데, 조바심을 경계할 필요가 있을 것 같다.
-부족한 부분은 인정하고, 앞으로 나아가야겠다.

새로 학습한 부분

컴포지트 패턴으로 요금 정책 추상화

요금 정책은 기본요금 정책, 거리별 요금 정책, 연령별 할인 정책이 있었다.
-요금을 더하는 부분과, 할인하는 부분이 있어서 이 둘을 분리할까 생각했지만, 이 정도 크기의 애플리케이션에서는 오히려 분리하지 않고 하나로 합치는 게 더 좋다고 생각했다.
-또한 분리하지 않는다면 정책의 순서가 중요한데, 연령별 할인 정책을 마지막에 두어야 했기 때문에 책임 연쇄 패턴도 고려를 했지만 조금 더 간결해 보이는 컴포지트 패턴을 선택했다.

도메인에 특정 기술의 의존성을 분리

처음에 도메인 패키지에 jgrapht 라이브러리를 의존하고 있는 클래스를 두어서 도메인 패키지가 jgrapht와 강결합이 되어버렸다.
-따라서 도메인 패키지 내에는 경로 검색에 대한 인터페이스를 두고, 세부 구현은 도메인 패키지 외부로 분리했다.
-최대한 간결하게 구현한다고 생각을 해도, 이런 부분은 인터페이스를 두어 결합을 피하는 것이 좋을 것 같다.

컴포지트 패턴

컴포지트 패턴은 인터페이스를 구현한 개별 객체가 존재하고, 그 개별 객체들을 포함하는 하나의 구현체가 따로 존재하는 패턴이다.
-이때 사용자는 개별 객체와 합성 객체(개별 객체들을 포함하고 있는)를 똑같이 사용할 수 있다.

인수 테스트 작성

인수 테스트는 사용자 스토리 시나리오 기반 테스트다.
-브라운이 해주신 강의 + 유튜브에 있는 브라운의 강의를 보고 지하철 미션에 인수 테스트를 적용해 보았다.
-메서드, 변수명을 전부 한글로 작성했는데 전체적인 흐름을 알기 편하고 읽기도 좋았다.
-그리고 인수 테스트에 필요한 Steps를 만드는 과정이 너무 재밌었다.

결과는 아래와 같다.

@Nested
public class 노선을_전체_조회할_때 {

@Test
void 상행종점역_부터_하행종점역으로_정렬된_결과를_반환한다() {
// given
노선_생성_요청("2호선", "초록", 0);
노선에_구간이_존재하지_않을_때_초기_구간_생성_요청("2호선", "잠실", "잠실새내", 5);
구간_생성_요청("2호선", "잠실새내", "종합운동장", 오른쪽, 5);

노선_생성_요청("9호선", "고동", 0);
노선에_구간이_존재하지_않을_때_초기_구간_생성_요청("9호선", "봉은사", "종합운동장", 3);
구간_생성_요청("9호선", "종합운동장", "삼전", 오른쪽, 7);

// when
final var 조회_결과 = 노선_전체_조회_요청();

// then
요청_결과의_상태를_검증한다(조회_결과, 정상_요청);
노선_전체_조회_결과를_확인한다(
조회_결과,
노선_정보("2호선", "초록", 0, "잠실", "잠실새내", "종합운동장"),
노선_정보("9호선", "고동", 0, "봉은사", "종합운동장", "삼전")
);
}
}

페어에게 배울 부분

의견 조율하기

밀리가 필요한 부분에서 의견을 적극적으로 내줘서 진행이 수월했다.
-의사소통이 매우 잘 돼서 좋았고 덕분에 시간 내에 요구사항을 만족해 미션을 제출할 수 있었던 것 같다.

꼼꼼하게 코딩하기

밀리는 코딩을 엄청 꼼꼼하게 하는 것 같다.
-변수명, 메서드명을 중요하게 생각했고, 좋은 변수명을 잘 짓는 것 같다.
-또한 코딩할 때 내가 평소에 사용하는 코딩 컨벤션에 맞춰주는 것 같아서 페어 할 때 편했다!

편한 분위기

전체적으로 페어 할 때 편하게 진행했던 것 같다.
-일정도 그렇고, 페어 진행할 때도 그렇고 큰 문제가 없었던 것 같아서 좋았다.
-나는 과연 다른 사람들에게 편한 사람일까?

- - +
본문으로 건너뛰기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
+요금을 계산하는 메서드는 최단 경로 계산의 결과, 사용자의 정보, 요금을 받아 요금을 계산한다.

public interface FarePolicy {
int calculate(Path path, Passenger passenger, int fare);
}

public class BaseFarePolicy implements FarePolicy { ... }
public class DistanceFarePolicy implements FarePolicy { ... }
public class AgeDiscountFarePolicy implements FarePolicy { ... }

composite1

모든 요금 정책을 포함하는 새로운 요금 정책 만들기

나머지 구현체를 모두 가지고 있는 하나의 구현체를 만들었다.
+이 또한 FarePolicy를 구현한 형태가 되고, 필드로는 나머지 구현체들을 가지고 있다.

public class SubwayFarePolicy implements FarePolicy {

private final List<FarePolicy> farePolicies;

public SubwayFarePolicy(final List<FarePolicy> farePolicies) {
this.farePolicies = farePolicies;
}

@Override
public int calculate(final Path path, final Passenger passenger, final int fare) {
int calculatedFare = fare;
for (FarePolicy farePolicy : farePolicies) {
calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);
}
return calculatedFare;
}
}

따라서 그림으로 본다면 다음과 같은 구조가 된다.

composite2

정책의 순서

지하철 요구사항은 순서가 중요했다.
+금액의 총합을 구하고, 그 후에 할인 정책이 들어가야했다.
+따라서 자식들의 순서를 관리할 때 주의를 기울여야 했다.
+Configuration 클래스에 다음과 같이 순서를 직접 적용시켰다.

@Configuration
public class FareConfiguration {

@Bean
public FarePolicy farePolicy() {
return new SubwayFarePolicy(List.of(
new BaseFarePolicy(),
new DistanceFarePolicy(),
new AgeDiscountFarePolicy()
));
}
}

컴포지트 패턴이란?

composite3

GOF의 디자인 패턴 책에서는 컴포지트 패턴을 다음과 같이 설명하고 있다.

부분과 전체의 계층을 표현하기 위해 객체들을 모아 트리 구조로 구성합니다.
+사용자로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있도록 하는 패턴입니다.

컴포지트 패턴은 인터페이스를 구현한 개별 객체가 존재하고, 그 개별 객체들을 포함하는 하나의 구현체가 따로 존재하는 패턴이다.
+이 때 사용자는 개별 객체와 합성 객체(개별 객체들을 포함하고 있는)를 똑같이 사용할 수 있다.

컴포지트 패턴의 구성요소

Component

  • 집합 관계에 정의될 모든 객체에 대한 인터페이스
  • ex) 요금 정책(FarePolicy)

Leaf

  • 개별 객체, 객체 합성에 기본이 되는 객체의 행동
  • ex) 거리 별 요금 정책(DistanceFarePolicy)

Composite

  • 여러 개의 개발 객체를 포함하는 합성 객체
  • ex) 지하철 요금 정책(SubwayFarePolicy)

Client

  • 인터페이스를 사용하는 클라이언트

컴포지트 패턴의 사용과 주요 목표

부분 - 전체의 관계를 표현하고 싶을 때
+Client 기준으로 Composite와 Leaf의 차이를 알지 못해도 잘 사용할 수 있도록 해야될 때

패턴 사용시 주의해야할 부분

패턴은 공통으로 사용 가능한 역할, 책임, 협력의 템플릿이다.
+반복되는 문제를 효율적으로 해결할 수 있지만 패턴에 매몰되서는 안된다.
+패턴을 맹목적으로 사용해서는 안되고, 현재의 요구사항에 따라 패턴을 유동적으로 수정해가면서 적용하는 것이 좋다.
+항상 트레이드오프를 생각하자!

참고 자료

컴포지트 패턴, GoF의 디자인 패턴
+디자인 패턴과 프레임워크, 오브젝트

+ + \ No newline at end of file diff --git a/page/15.html b/page/15.html index 3e30201b4..33561f760 100644 --- a/page/15.html +++ b/page/15.html @@ -13,26 +13,33 @@ - - + +
-
본문으로 건너뛰기

· 약 8분

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.
-요청에 담긴 Body를 통해 전달받은 값을 DTO로 매핑하여 추가와 수정을 했다.

장바구니 미션에서의 상품 추가 및 수정

중복1

클래스명을 제외하고 필드와 검증로직 그 외 모든게 같은 DTO를 보며 중복이라고 생각했다.
-하지만 반대로 용도가 다르기 때문에 중복이 아니라고 생각하기도 했다.
-위 경우는 중복일까? 중복이 아닐까?

이 부분에 대해서 다음과 같은 리뷰를 받았다.

ProductSaveRequestProductUpdateRequest가 완전히 동일한데, 재사용할 수 없을까? 라는 리뷰를 남겼었어요. 사실 생성과 수정은 서로 달라질 개연성이 높아서 미리 분리해놓는 게 더 좋은 방법이긴 한데, 그래도 중복은 싫어서 저도 요즘 이런저런 방법들을 시도해보는 중 입니다. 허브는 이 부분에 대해 어떤 생각을 가지고 있을지 궁금하네요 ㅎㅎ

질문에 대해 아래와 같이 답변을 했다.

저장과 수정할 때 필요한 필드값이 동일하여 현재 구조에서는 하나로 사용해도 된다고 생각을 하지만, 말씀해주신대로 요구사항이 변경된다면 달라질 가능성이 높다고 판단하였습니다!

중복과 우발적 중복

로버트 마틴님이 집필하신 클린 아키텍처는 아래와 같이 중복을 여러가지 종류로 나누어 설명하고 있다.

  • 진짜 중복: 한 인스턴스가 변경되면, 동일한 변경을 그 인스턴스의 모드 복사본에 반드시 적용해야 한다.
  • 거짓된 중복, 우발적 중복: 중복으로 보이는 두 코드 영역이 각자의 경로로 발전한다면, 즉 서로 다른 속도와 다른 이유로 변경된다면 이 두 코드는 진짜 중복이 아니다.

추가와 수정은 초기에는 중복으로 보이지만 초기 생성시에만 기입하는 데이터들이 추가되거나, 시간이 지나면서 서로 달라질 가능성이 높아진다. -그렇기 때문에 위 상황은 우발적 중복으로 보인다. 그래도 중복을 제거해볼 수 있지 않을까?

하나로 사용하는 건 안좋아보이고, 중복은 제거하고 싶은 마음

지금은 추가, 수정 2가지 경우 밖에 없지만 조금 더 복잡한 요구사항이 주어져서 10가지 경우로 입력을 받으면 어떻게 해야할까?
-서비스 계층에서도 계층의 분리를 위해서 다른 DTO를 사용하고 있다면 20개의 DTO를 만들어야 할까?
-리뷰어가 알려준 의존 역전을 이용한 방법을 통해 이를 해결해보자!

중복 제거 전 코드

현재 코드에서는 아래와 같은 구조로 되어있다.
-Controller와 Service에서 저장, 수정할 때 각각의 DTO를 사용하고 있다. -현재 DTO는 controller, service 패키지 내에 있는 것이 아니라 dto라는 패키지에 위치하고 있다.

├── controller
│   └── ProductController
├── service
│   └── ProductService
├── dto
│   ├── ProductSaveRequest
│   └── ProductUpdateRequest

중복2

인터페이스 작성하기

중복3

서비스 레이어에서 필요로 하는 값들을 인터페이스로 정의한다.
-해당 인터페이스는 서비스에서 사용하기 때문에 service 패키지 내부로 옮겨준다.

├── controller
│   └── ProductController
├── service
│   ├── ProductService
│   ├── ProductSaveRequest
│   └── ProductUpdateRequest
public interface ProductSaveRequest {

String getName();

String getImage();

Long getPrice();
}

// ProductService
public Long save(final ProductSaveRequest request) {
final Product product = new Product(request.getName(), request.getImage(), request.getPrice());
return productDao.saveAndGetId(product);
}

구현체 작성하기

중복4

위에서 작성한 인터페이스를 구현하는 클래스를 작성한다.
-요청은 ProductRequest 클래스로 받고, 서비스에 전달할 땐 해당 인터페이스의 명세만 맞추면 문제없이 사용할 수 있다.

├── controller
│   ├── ProductController
│   └── ProductRequest
├── service
│   ├── ProductService
│   ├── ProductSaveRequest
│   └── ProductUpdateRequest
public class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {

@NotBlank(message = "이름은 공백일 수 없습니다.")
@Size(min = 1, max = 100, message = "이름은 최소 {min}자 이상, {max}자 이하여야 합니다.")
private final String name;

@NotBlank(message = "이미지는 공백일 수 없습니다.")
private final String image;

@Range(message = "가격은 최소 {min}원 이상, {max}원 이하여야 합니다.")
private final long price;

public ProductRequest(final String name, final String image, final long price) {
this.name = name;
this.image = image;
this.price = price;
}

@Override
public String getName() {
return name;
}

@Override
public String getImage() {
return image;
}

@Override
public long getPrice() {
return price;
}
}

// ProductController
@PostMapping("/products")
public ResponseEntity<Void> save(@Valid @RequestBody final ProductRequest request) {
final Long id = productService.save(request);
return ResponseEntity.created(URI.create("/products/" + id)).build();
}

정리

위와 같이 구현한다면 다음과 같은 장점을 얻을 수 있다.

  1. Service에서 모든 클라이언트 요청에 대한 DTO를 알지 않아도 된다.
  2. 공통적으로 사용하는 DTO를 제외하고 DTO 패키지에 대한 결합도가 낮아지고, 각 레이어의 응집도가 증가한다.
  3. 요청 객체만 다르고 서비스에서 동일한 행위를 수행하는 경우 중복을 제거할 수 있다.

위 방법을 지금 미션에서 바로 적용할까 하다가, 나중에 필요할 때 적용하면 더 좋을 것 같아서 미션에는 적용하지 않았다.
-상황에 맞춰 적재적소에 의존 역전을 이용해보는 것도 좋을 것 같다.

참고 자료

클린 아키텍처 16장 독립성, 로버트 C. 마틴
-https://techblog.woowahan.com/2647/
-https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/

- - +
본문으로 건너뛰기

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
+지하철 미션은 밀리랑 페어를 진행했다.
+간단한 CRUD만 있던 이전 미션들과 달리, 조금 복잡한 도메인 요구사항이 있었다.
+이때 API, 테이블, 도메인 설계를 해야 했는데 어떤 것부터 해야 할지 고민을 많이 했다.
+API와 테이블 구조를 우리가 정할 수 있는 상황이었고, 도메인 로직이 복잡했기 때문에 도메인을 먼저 구현했다.

노선의 구간 추가 및 삭제

노선을 저장하는 방법에 대해서 밀리와 이야기를 나눴다.

  1. 구간을 데이터베이스에서 전부 제거하고 전부 추가하는 방법
  2. 변경된 요소만 데이터베이스에 반영하는 방법

페어 시간이 짧아서 더욱 간단한 1번을 선택했고, 시간 내 요구사항을 만족시키기 위해 더 간단하게 구현하는 방법을 선택하는 것도 좋은 트레이드오프였던 것 같다.
+추후 페어가 끝나고 리뷰어인 서브웨이가 일부분만 반영하는 것으로 개선해 보는 것도 좋을 것 같다고 코멘트를 남겨주셔서 추가 및 제거된 요소만 반영하도록 변경했다.

부족했던 부분

미션의 난이도가 올라간 만큼, 페어 할 땐 컨디션 관리도 잘하려고 노력하고 미션 할 때도 집중해서 잘 끝낸 것 같다.
+우아한테크코스를 진행하면서 알아야 하는 게 많아지면서 가끔 조바심을 가질 때가 있는 것 같은데, 조바심을 경계할 필요가 있을 것 같다.
+부족한 부분은 인정하고, 앞으로 나아가야겠다.

새로 학습한 부분

컴포지트 패턴으로 요금 정책 추상화

요금 정책은 기본요금 정책, 거리별 요금 정책, 연령별 할인 정책이 있었다.
+요금을 더하는 부분과, 할인하는 부분이 있어서 이 둘을 분리할까 생각했지만, 이 정도 크기의 애플리케이션에서는 오히려 분리하지 않고 하나로 합치는 게 더 좋다고 생각했다.
+또한 분리하지 않는다면 정책의 순서가 중요한데, 연령별 할인 정책을 마지막에 두어야 했기 때문에 책임 연쇄 패턴도 고려를 했지만 조금 더 간결해 보이는 컴포지트 패턴을 선택했다.

도메인에 특정 기술의 의존성을 분리

처음에 도메인 패키지에 jgrapht 라이브러리를 의존하고 있는 클래스를 두어서 도메인 패키지가 jgrapht와 강결합이 되어버렸다.
+따라서 도메인 패키지 내에는 경로 검색에 대한 인터페이스를 두고, 세부 구현은 도메인 패키지 외부로 분리했다.
+최대한 간결하게 구현한다고 생각을 해도, 이런 부분은 인터페이스를 두어 결합을 피하는 것이 좋을 것 같다.

컴포지트 패턴

컴포지트 패턴은 인터페이스를 구현한 개별 객체가 존재하고, 그 개별 객체들을 포함하는 하나의 구현체가 따로 존재하는 패턴이다.
+이때 사용자는 개별 객체와 합성 객체(개별 객체들을 포함하고 있는)를 똑같이 사용할 수 있다.

인수 테스트 작성

인수 테스트는 사용자 스토리 시나리오 기반 테스트다.
+브라운이 해주신 강의 + 유튜브에 있는 브라운의 강의를 보고 지하철 미션에 인수 테스트를 적용해 보았다.
+메서드, 변수명을 전부 한글로 작성했는데 전체적인 흐름을 알기 편하고 읽기도 좋았다.
+그리고 인수 테스트에 필요한 Steps를 만드는 과정이 너무 재밌었다.

결과는 아래와 같다.

@Nested
public class 노선을_전체_조회할_때 {

@Test
void 상행종점역_부터_하행종점역으로_정렬된_결과를_반환한다() {
// given
노선_생성_요청("2호선", "초록", 0);
노선에_구간이_존재하지_않을_때_초기_구간_생성_요청("2호선", "잠실", "잠실새내", 5);
구간_생성_요청("2호선", "잠실새내", "종합운동장", 오른쪽, 5);

노선_생성_요청("9호선", "고동", 0);
노선에_구간이_존재하지_않을_때_초기_구간_생성_요청("9호선", "봉은사", "종합운동장", 3);
구간_생성_요청("9호선", "종합운동장", "삼전", 오른쪽, 7);

// when
final var 조회_결과 = 노선_전체_조회_요청();

// then
요청_결과의_상태를_검증한다(조회_결과, 정상_요청);
노선_전체_조회_결과를_확인한다(
조회_결과,
노선_정보("2호선", "초록", 0, "잠실", "잠실새내", "종합운동장"),
노선_정보("9호선", "고동", 0, "봉은사", "종합운동장", "삼전")
);
}
}

페어에게 배울 부분

의견 조율하기

밀리가 필요한 부분에서 의견을 적극적으로 내줘서 진행이 수월했다.
+의사소통이 매우 잘 돼서 좋았고 덕분에 시간 내에 요구사항을 만족해 미션을 제출할 수 있었던 것 같다.

꼼꼼하게 코딩하기

밀리는 코딩을 엄청 꼼꼼하게 하는 것 같다.
+변수명, 메서드명을 중요하게 생각했고, 좋은 변수명을 잘 짓는 것 같다.
+또한 코딩할 때 내가 평소에 사용하는 코딩 컨벤션에 맞춰주는 것 같아서 페어 할 때 편했다!

편한 분위기

전체적으로 페어 할 때 편하게 진행했던 것 같다.
+일정도 그렇고, 페어 진행할 때도 그렇고 큰 문제가 없었던 것 같아서 좋았다.
+나는 과연 다른 사람들에게 편한 사람일까?

+ + \ No newline at end of file diff --git a/page/16.html b/page/16.html index 64500046d..73effe7de 100644 --- a/page/16.html +++ b/page/16.html @@ -13,26 +13,26 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
-요구사항이 엄청 복잡한 미션은 아니었고, 스프링을 사용하여 기본적인 CRUD를 구현하는 미션이었다.
-2단계에서는 Basic 인증을 통해 자신의 장바구니에만 상품을 담고, 제거할 수 있도록 구현하는 요구사항이 추가되었다.
-Interceptor나 Argument Resolver에 대한 이해도가 높지 않았는데, 이번 미션을 통해 조금 더 알아간 느낌이다.
-이전에 스프링 사용할 때는 아무 생각 없이 코드를 작성하는 경우가 많았는데, 코드를 작성할 때 근거가 생기고 있는 것 같다.

새로 학습한 부분

DTO 우발적 중복

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.

dto1

클래스명을 제외하고 필드와 검증 로직 그 외 모든 게 같은 DTO를 보며 중복이라고 생각을 했고, 반대로 용도가 다르기 때문에 중복이 아니라고 생각하기도 했다.
-로버트 마틴님이 집필하신 클린 아키텍처는 아래와 같이 중복을 여러 가지 종류로 나누어 설명하고 있다.

  • 진짜 중복: 한 인스턴스가 변경되면, 동일한 변경을 그 인스턴스의 모드 복사본에 반드시 적용해야 한다.
  • 우발적 중복: 중복으로 보이는 두 코드 영역이 각자의 경로로 발전한다면, 즉 서로 다른 속도와 다른 이유로 변경된다면 이 두 코드는 진짜 중복이 아니다.

추가와 수정은 초기에는 중복으로 보이지만 초기 생성 시에만 기입하는 데이터들이 추가되거나, 시간이 지나면서 서로 달라질 가능성이 높아진다.
-따라서 리뷰어 웨지가 아래와 같이 의존 역전을 이용하는 방법도 있다고 알려주셨다.

dto2

Interceptor에서 인증한 값 재사용

사실 조회를 두 번 하기 싫어서 다양한 방법을 생각했었는데 이번 미션에서는 ThreadLocal을 사용했다.
-일단 Tomcat은 요청마다 다른 스레드를 사용하고, Interceptor에서 조회해서 만든 Credential을 ThreadLocal에 넣어두었다가 ArgumentResolver에서 꺼낸 다음 ThreadLocal을 clear 하면 문제가 없을 거라 판단했다.

리뷰어인 웨지에게도 어떤 방법을 사용할지 궁금증을 작성했었다.
-웨지는 email에 index를 걸어두고 dao 재조회를 사용할 것이라고 했다.
-재사용하지 않고 db에 인덱스를 걸 생각은 하지 못했는데, 제일 직관적이고 좋은 방법이라고 생각했다.

페어에게 배울 부분

기록

블랙캣은 기록을 굉장히 잘 하는 크루였다.
-노션에 페어를 진행하면서 했던 내용 + 고민했던 부분 + 회고를 꼼꼼하게 기록해서 공유해 주었다.
-추가적으로 이모지를 적극적으로 사용하여 더욱 좋았다!

의견 일치시키기

페어 시간은 한정되어 있고, 기간 내 요구사항을 만족해야 한다.
-따라서 적당히 타협을 봐서 의견을 빠르게 수용해 데드라인을 맞추는 것도 중요하다고 생각한다.
-블랙캣은 내 의견을 잘 들어줬고, 덕분에 막히는 부분 없이 빠르게 미션을 진행할 수 있었다.

빨리 친해졌고, 의사소통이 잘 돼서 재밌게 코딩할 수 있었다!

- - +
본문으로 건너뛰기

· 약 8분

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.
+요청에 담긴 Body를 통해 전달받은 값을 DTO로 매핑하여 추가와 수정을 했다.

장바구니 미션에서의 상품 추가 및 수정

중복1

클래스명을 제외하고 필드와 검증로직 그 외 모든게 같은 DTO를 보며 중복이라고 생각했다.
+하지만 반대로 용도가 다르기 때문에 중복이 아니라고 생각하기도 했다.
+위 경우는 중복일까? 중복이 아닐까?

이 부분에 대해서 다음과 같은 리뷰를 받았다.

ProductSaveRequestProductUpdateRequest가 완전히 동일한데, 재사용할 수 없을까? 라는 리뷰를 남겼었어요. 사실 생성과 수정은 서로 달라질 개연성이 높아서 미리 분리해놓는 게 더 좋은 방법이긴 한데, 그래도 중복은 싫어서 저도 요즘 이런저런 방법들을 시도해보는 중 입니다. 허브는 이 부분에 대해 어떤 생각을 가지고 있을지 궁금하네요 ㅎㅎ

질문에 대해 아래와 같이 답변을 했다.

저장과 수정할 때 필요한 필드값이 동일하여 현재 구조에서는 하나로 사용해도 된다고 생각을 하지만, 말씀해주신대로 요구사항이 변경된다면 달라질 가능성이 높다고 판단하였습니다!

중복과 우발적 중복

로버트 마틴님이 집필하신 클린 아키텍처는 아래와 같이 중복을 여러가지 종류로 나누어 설명하고 있다.

  • 진짜 중복: 한 인스턴스가 변경되면, 동일한 변경을 그 인스턴스의 모드 복사본에 반드시 적용해야 한다.
  • 거짓된 중복, 우발적 중복: 중복으로 보이는 두 코드 영역이 각자의 경로로 발전한다면, 즉 서로 다른 속도와 다른 이유로 변경된다면 이 두 코드는 진짜 중복이 아니다.

추가와 수정은 초기에는 중복으로 보이지만 초기 생성시에만 기입하는 데이터들이 추가되거나, 시간이 지나면서 서로 달라질 가능성이 높아진다. +그렇기 때문에 위 상황은 우발적 중복으로 보인다. 그래도 중복을 제거해볼 수 있지 않을까?

하나로 사용하는 건 안좋아보이고, 중복은 제거하고 싶은 마음

지금은 추가, 수정 2가지 경우 밖에 없지만 조금 더 복잡한 요구사항이 주어져서 10가지 경우로 입력을 받으면 어떻게 해야할까?
+서비스 계층에서도 계층의 분리를 위해서 다른 DTO를 사용하고 있다면 20개의 DTO를 만들어야 할까?
+리뷰어가 알려준 의존 역전을 이용한 방법을 통해 이를 해결해보자!

중복 제거 전 코드

현재 코드에서는 아래와 같은 구조로 되어있다.
+Controller와 Service에서 저장, 수정할 때 각각의 DTO를 사용하고 있다. +현재 DTO는 controller, service 패키지 내에 있는 것이 아니라 dto라는 패키지에 위치하고 있다.

├── controller
│   └── ProductController
├── service
│   └── ProductService
├── dto
│   ├── ProductSaveRequest
│   └── ProductUpdateRequest

중복2

인터페이스 작성하기

중복3

서비스 레이어에서 필요로 하는 값들을 인터페이스로 정의한다.
+해당 인터페이스는 서비스에서 사용하기 때문에 service 패키지 내부로 옮겨준다.

├── controller
│   └── ProductController
├── service
│   ├── ProductService
│   ├── ProductSaveRequest
│   └── ProductUpdateRequest
public interface ProductSaveRequest {

String getName();

String getImage();

Long getPrice();
}

// ProductService
public Long save(final ProductSaveRequest request) {
final Product product = new Product(request.getName(), request.getImage(), request.getPrice());
return productDao.saveAndGetId(product);
}

구현체 작성하기

중복4

위에서 작성한 인터페이스를 구현하는 클래스를 작성한다.
+요청은 ProductRequest 클래스로 받고, 서비스에 전달할 땐 해당 인터페이스의 명세만 맞추면 문제없이 사용할 수 있다.

├── controller
│   ├── ProductController
│   └── ProductRequest
├── service
│   ├── ProductService
│   ├── ProductSaveRequest
│   └── ProductUpdateRequest
public class ProductRequest implements ProductSaveRequest, ProductUpdateRequest {

@NotBlank(message = "이름은 공백일 수 없습니다.")
@Size(min = 1, max = 100, message = "이름은 최소 {min}자 이상, {max}자 이하여야 합니다.")
private final String name;

@NotBlank(message = "이미지는 공백일 수 없습니다.")
private final String image;

@Range(message = "가격은 최소 {min}원 이상, {max}원 이하여야 합니다.")
private final long price;

public ProductRequest(final String name, final String image, final long price) {
this.name = name;
this.image = image;
this.price = price;
}

@Override
public String getName() {
return name;
}

@Override
public String getImage() {
return image;
}

@Override
public long getPrice() {
return price;
}
}

// ProductController
@PostMapping("/products")
public ResponseEntity<Void> save(@Valid @RequestBody final ProductRequest request) {
final Long id = productService.save(request);
return ResponseEntity.created(URI.create("/products/" + id)).build();
}

정리

위와 같이 구현한다면 다음과 같은 장점을 얻을 수 있다.

  1. Service에서 모든 클라이언트 요청에 대한 DTO를 알지 않아도 된다.
  2. 공통적으로 사용하는 DTO를 제외하고 DTO 패키지에 대한 결합도가 낮아지고, 각 레이어의 응집도가 증가한다.
  3. 요청 객체만 다르고 서비스에서 동일한 행위를 수행하는 경우 중복을 제거할 수 있다.

위 방법을 지금 미션에서 바로 적용할까 하다가, 나중에 필요할 때 적용하면 더 좋을 것 같아서 미션에는 적용하지 않았다.
+상황에 맞춰 적재적소에 의존 역전을 이용해보는 것도 좋을 것 같다.

참고 자료

클린 아키텍처 16장 독립성, 로버트 C. 마틴
+https://techblog.woowahan.com/2647/
+https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/

+ + \ No newline at end of file diff --git a/page/17.html b/page/17.html index e6c2b07d5..bece9bbcb 100644 --- a/page/17.html +++ b/page/17.html @@ -13,31 +13,26 @@ - - + +
-
본문으로 건너뛰기

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
-웹 자동차 미션에서는 비버와 페어가 매칭되었다.
-레벨 2에서 진행하는 첫 미션이라 많이 긴장되었지만, 그래도 비버랑 초반에 맛있는 것도 많이 먹으면서 빨리 친해져서 재밌게 할 수 있었다.

스프링을 조금 사용할 줄 알아서, 비버랑 같이 학습하면서 미션을 진행했다.
-첫 미션이라 그런지 특별한 부분은 없었고, 최대한 깔끔하게 작성하려고 노력했다.
-난이도 높은 미션이 아니었지만 리뷰어인 라빈에게 칭찬을 많이 받아서 기분이 좋았다.
-라빈 감사합니다!

부족했던 부분

컨디션도 좋지 않고 열정도 식은 것 같은 느낌이 들었다.
-미션이 다소 여유롭다고 느껴져서, 시간에 대한 부분도 잘 관리하지 못한 것 같다.
-미션에 잘 집중하지 못해서 페어에게 많이 미안했고, 나 자신에게 아쉬웠던 부분이 많았다.

지난번 회고를 다시 보는데 집중을 잘 못한 경우가 많은 것 같다.
-도전적이지 않거나 시간이 부족하지 않으면 집중을 잘 못하는 것 같다.
-머릿속에서 시간적 여유가 있다고 생각할 때가 가장 위험한 순간인 것 같다.

함께 자라기에서 나온 난이도 높이기가 필요해지는 순간이다.

새로 학습한 부분

중요도가 있는 어노테이션부터 클래스 이름에 가깝게 명시하기

@SuppressWarnings("NonAsciiCharacters")
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
@Transactional
@AutoConfigureMockMvc
@SpringBootTest
public class RacingGameIntegrationTest {

페어에게 배울 부분

비버의 성격
-비버가 성격이 좋아서 편하게 페어를 할 수 있었다.
-미션을 진행하면서 성급하지 않고 여유로워서 좋았다.

미션에 집중하는 부분
-내가 미션에 잘 집중하지 못했는데도 같이 페어를 잘 진행한 것 같아서 좋았다.
-비버가 미션에 잘 집중해서 그렇지 않았나 생각했다.
-근육맨 비버라 그런지 체력이 좋아서 그런가?
-중간에 잘 안 쉬고도 집중해서 미션을 진행하는 걸 보고 대단하다고 생각했다.

학습에 대한 열정
-추가적으로 알고 싶은 부분을 따로 학습하는 열정이 좋다고 생각했다.
-비버와 스프링에 대해 알아가는 시간을 많이 가진 부분이 매우 좋았다.
-나도 5월부터 조금 더 화이팅 해야겠다.

- - +
본문으로 건너뛰기

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
+요구사항이 엄청 복잡한 미션은 아니었고, 스프링을 사용하여 기본적인 CRUD를 구현하는 미션이었다.
+2단계에서는 Basic 인증을 통해 자신의 장바구니에만 상품을 담고, 제거할 수 있도록 구현하는 요구사항이 추가되었다.
+Interceptor나 Argument Resolver에 대한 이해도가 높지 않았는데, 이번 미션을 통해 조금 더 알아간 느낌이다.
+이전에 스프링 사용할 때는 아무 생각 없이 코드를 작성하는 경우가 많았는데, 코드를 작성할 때 근거가 생기고 있는 것 같다.

새로 학습한 부분

DTO 우발적 중복

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.

dto1

클래스명을 제외하고 필드와 검증 로직 그 외 모든 게 같은 DTO를 보며 중복이라고 생각을 했고, 반대로 용도가 다르기 때문에 중복이 아니라고 생각하기도 했다.
+로버트 마틴님이 집필하신 클린 아키텍처는 아래와 같이 중복을 여러 가지 종류로 나누어 설명하고 있다.

  • 진짜 중복: 한 인스턴스가 변경되면, 동일한 변경을 그 인스턴스의 모드 복사본에 반드시 적용해야 한다.
  • 우발적 중복: 중복으로 보이는 두 코드 영역이 각자의 경로로 발전한다면, 즉 서로 다른 속도와 다른 이유로 변경된다면 이 두 코드는 진짜 중복이 아니다.

추가와 수정은 초기에는 중복으로 보이지만 초기 생성 시에만 기입하는 데이터들이 추가되거나, 시간이 지나면서 서로 달라질 가능성이 높아진다.
+따라서 리뷰어 웨지가 아래와 같이 의존 역전을 이용하는 방법도 있다고 알려주셨다.

dto2

Interceptor에서 인증한 값 재사용

사실 조회를 두 번 하기 싫어서 다양한 방법을 생각했었는데 이번 미션에서는 ThreadLocal을 사용했다.
+일단 Tomcat은 요청마다 다른 스레드를 사용하고, Interceptor에서 조회해서 만든 Credential을 ThreadLocal에 넣어두었다가 ArgumentResolver에서 꺼낸 다음 ThreadLocal을 clear 하면 문제가 없을 거라 판단했다.

리뷰어인 웨지에게도 어떤 방법을 사용할지 궁금증을 작성했었다.
+웨지는 email에 index를 걸어두고 dao 재조회를 사용할 것이라고 했다.
+재사용하지 않고 db에 인덱스를 걸 생각은 하지 못했는데, 제일 직관적이고 좋은 방법이라고 생각했다.

페어에게 배울 부분

기록

블랙캣은 기록을 굉장히 잘 하는 크루였다.
+노션에 페어를 진행하면서 했던 내용 + 고민했던 부분 + 회고를 꼼꼼하게 기록해서 공유해 주었다.
+추가적으로 이모지를 적극적으로 사용하여 더욱 좋았다!

의견 일치시키기

페어 시간은 한정되어 있고, 기간 내 요구사항을 만족해야 한다.
+따라서 적당히 타협을 봐서 의견을 빠르게 수용해 데드라인을 맞추는 것도 중요하다고 생각한다.
+블랙캣은 내 의견을 잘 들어줬고, 덕분에 막히는 부분 없이 빠르게 미션을 진행할 수 있었다.

빨리 친해졌고, 의사소통이 잘 돼서 재밌게 코딩할 수 있었다!

+ + \ No newline at end of file diff --git a/page/18.html b/page/18.html index 69dd4efdc..f3b2def66 100644 --- a/page/18.html +++ b/page/18.html @@ -13,31 +13,31 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
-추가로 채팅을 이어나갈 수 있게 하는 기능도 추가했다.
-자잘하게 신경 쓸 부분이 많아서, 프론트엔드 하는 사람들이 대단하다고 생각되었다.
-여유가 된다면 자신의 채팅을 볼 수 있는 기능이나, 채팅을 이어서 할 수 있는 기능, 댓글 기능도 추가할 예정이다.

백엔드

최대한 빨리 서비스를 크루들에게 제공하기로 정해서, 백엔드는 말랑이 일단 다 만들고 있다.
-말랑이 한 부분이 너무 많아서 내가 못 따라가는 것 같다.
-나중에 백엔드 코드를 이해하는 시간을 가져야겠다.

Http Request Header

아직 인증에 대한 부분을 하지 않아서 요청 헤더에 이름을 보내기로 했다.
-말랑이 한글은 안된다고 말해줘서 Base64로 인코딩하고, 백엔드에서 디코딩 하여 사용하기로 했다.
-아래는 pinia에 있는 name 값을 인코딩 하는 코드다. deprecated 되었다는데, 다른 방법을 사용할 줄 몰라서 일단 이걸 사용했다.

const encodedName = () => {
const uriComponent = unescape(encodeURIComponent(name.value));
return btoa(uriComponent);
};

Elastic Beanstalk

가장 빠르게 백엔드를 배포할 수 있는 방법이 뭘지 고민하다가 Elastic Beanstalk를 사용하기로 했다.
-Elastic Beanstalk를 사용하면 인프라에 대해 잘 알지 못해도 애플리케이션을 빠르게 배포하고 관리할 수 있다.
-모니터링, 로깅, 로드 밸런싱 등 다양한 기능을 제공한다.

Elastic Beanstalk RDS 설정 후 분리

초기 설정 시 RDS를 연결하고 설정 완료 후 분리한다면, Beanstalk 인스턴스 -> RDS 요청 시 인바운드 설정을 안 해도 된다.
-RDS 분리 시 Beanstalk에 기본적으로 설정되어 있는 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD와 같은 환경 변수가 같이 제거된다.
-추가로 Elastic Beanstalk로 RDS를 설정하면 기본 데이터베이스 명은 ebdb다.

Elastic Beanstalk nginx 설정

업로드하는 zip 파일 내부에 .platform/nginx/conf.d/ 경로에 설정 파일을 추가하면 nginx 설정을 할 수 있다.

Jenkins

백엔드 코드를 일일히 배포하기 불편해서 Jenkins를 이용하여 Repository에 코드를 push 할 때 자동으로 배포가 되게 설정하기로 했다.
-작년에 확인했을 땐 2022년 12월 31일까지 EC2 ARM 기반 t4g.small이 무료였는데, 다시 들어가 보니 2023년까지 12월 31일까지 t4g.small을 무료로 사용할 수 있었다.
-t4g.small은 램이 2G인데, 예전에는 부족하지 않았다고 생각했는데 Java 17을 써서 그런가 빌드 할 때 램이 많이 부족한 것 같아서 Swap 메모리 2기가를 추가로 설정했다.
-추가로 build.gradle에서 아래와 같이 설정한다면 테스트 시 사용하는 램을 늘릴 수 있다. 기본값은 512MB라고 한다.

test {
maxHeapSize = "1024m"
}

Jenkins Blue Ocean

Blue Ocean은 Jenkins Pipeline을 구성하는 데에 있어 편리하게 해주는 도구다.
-시각화도 잘 되어있고, 설정도 편리한 것 같다.
-오늘 적용해 보니 램이 부족하여 중간에 잘 안되기도 하고 그래서 그냥 "Pipeline만 사용할 걸 그랬나?" 라는 생각이 든다.

참고 자료

Elastic Beanstalk, AWS
-EC2 AWS Graviton, AWS
-Default Memory Settings, AWS

- - +
본문으로 건너뛰기

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
+웹 자동차 미션에서는 비버와 페어가 매칭되었다.
+레벨 2에서 진행하는 첫 미션이라 많이 긴장되었지만, 그래도 비버랑 초반에 맛있는 것도 많이 먹으면서 빨리 친해져서 재밌게 할 수 있었다.

스프링을 조금 사용할 줄 알아서, 비버랑 같이 학습하면서 미션을 진행했다.
+첫 미션이라 그런지 특별한 부분은 없었고, 최대한 깔끔하게 작성하려고 노력했다.
+난이도 높은 미션이 아니었지만 리뷰어인 라빈에게 칭찬을 많이 받아서 기분이 좋았다.
+라빈 감사합니다!

부족했던 부분

컨디션도 좋지 않고 열정도 식은 것 같은 느낌이 들었다.
+미션이 다소 여유롭다고 느껴져서, 시간에 대한 부분도 잘 관리하지 못한 것 같다.
+미션에 잘 집중하지 못해서 페어에게 많이 미안했고, 나 자신에게 아쉬웠던 부분이 많았다.

지난번 회고를 다시 보는데 집중을 잘 못한 경우가 많은 것 같다.
+도전적이지 않거나 시간이 부족하지 않으면 집중을 잘 못하는 것 같다.
+머릿속에서 시간적 여유가 있다고 생각할 때가 가장 위험한 순간인 것 같다.

함께 자라기에서 나온 난이도 높이기가 필요해지는 순간이다.

새로 학습한 부분

중요도가 있는 어노테이션부터 클래스 이름에 가깝게 명시하기

@SuppressWarnings("NonAsciiCharacters")
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
@Transactional
@AutoConfigureMockMvc
@SpringBootTest
public class RacingGameIntegrationTest {

페어에게 배울 부분

비버의 성격
+비버가 성격이 좋아서 편하게 페어를 할 수 있었다.
+미션을 진행하면서 성급하지 않고 여유로워서 좋았다.

미션에 집중하는 부분
+내가 미션에 잘 집중하지 못했는데도 같이 페어를 잘 진행한 것 같아서 좋았다.
+비버가 미션에 잘 집중해서 그렇지 않았나 생각했다.
+근육맨 비버라 그런지 체력이 좋아서 그런가?
+중간에 잘 안 쉬고도 집중해서 미션을 진행하는 걸 보고 대단하다고 생각했다.

학습에 대한 열정
+추가적으로 알고 싶은 부분을 따로 학습하는 열정이 좋다고 생각했다.
+비버와 스프링에 대해 알아가는 시간을 많이 가진 부분이 매우 좋았다.
+나도 5월부터 조금 더 화이팅 해야겠다.

+ + \ No newline at end of file diff --git a/page/19.html b/page/19.html index 0c23e9c1a..6ed5b39f3 100644 --- a/page/19.html +++ b/page/19.html @@ -13,30 +13,31 @@ - - + +
-
본문으로 건너뛰기

· 약 8분

설정 환경

소프트웨어 이미지: Amazon Linux 2023 AMI
-아키텍쳐: ARM
-인스턴스 유형: t4g.small
-환경 구성이 완료된 Elastic Beanstalk
-단일 Spring Boot 프로젝트가 존재하는 Github Repository

[EC2 CLI] Swap 메모리 설정

t4g.small이 램이 2G인데 램이 부족하다고 느껴져서 swap 메모리를 설정했다.
-아래 명령어를 따라 swap 메모리를 설정하고 free -h 명령어를 통해 잘 설정되었는지 확인할 수 있다.

# fallocate 이용하여 스왑 파일 생성
sudo fallocate -l 2G /swapfile

# 권한 설정
sudo chmod 600 /swapfile

# 파일을 Swap 포맷으로 변경 후 시스템에 등록
sudo mkswap /swapfile
sudo swapon /swapfile

# Swap 메모리 부팅시 자동으로 마운트하도록 적용
# 최하단에 다음 구문 설정 -> /swapfile swap swap defaults 0 0
sudo vim /etc/fstab

[EC2 CLI] jenkins 설치

sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum upgrade
sudo yum install java-17-amazon-corretto-devel
sudo yum install jenkins
sudo systemctl daemon-reload

Jenkins 공식 홈페이지 를 참고하여 설치하는 게 좋다.

[EC2 CLI] Jenkins 시작

sudo systemctl enable jenkins
sudo systemctl start jenkins

enable로 설정하여 부팅시 자동시작 되도록 설정한다.

[EC2 CLI] nginx & git 설치

sudo yum install nginx
sudo systemctl enable nginx
sudo systemctl start nginx

sudo yum install git

nginx와 코드를 불러올 때 사용할 git을 설치한다.

[EC2 CLI] nginx 리버스 프록시 설정

아래 설정 파일은 공식 홈페이지에서 안내한 기본적인 설정 파일이다.

upstream jenkins {
keepalive 32; # keepalive connections
server 127.0.0.1:8080; # jenkins ip and port
}

# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80; # Listen on port 80 for IPv4 requests

server_name jenkins.example.com; # replace 'jenkins.example.com' with your server domain name

# this is the jenkins web root directory
# (mentioned in the output of "systemctl cat jenkins")
root /var/run/jenkins/war/;

access_log /var/log/nginx/jenkins.access.log;
error_log /var/log/nginx/jenkins.error.log;

# pass through headers from Jenkins that Nginx considers invalid
ignore_invalid_headers off;

location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
# rewrite all static files into requests to the root
# E.g /static/12345678/css/something.css will become /css/something.css
rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
}

location /userContent {
# have nginx handle all the static requests to userContent folder
# note : This is the $JENKINS_HOME dir
root /var/lib/jenkins/;
if (!-f $request_filename){
# this file does not exist, might be a directory or a /**view** url
rewrite (.*) /$1 last;
break;
}
sendfile on;
}

location / {
sendfile off;
proxy_pass http://jenkins;
proxy_redirect default;
proxy_http_version 1.1;

# Required for Jenkins websocket agents
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;

#this is the maximum upload size
client_max_body_size 10m;
client_body_buffer_size 128k;

proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffering off;
proxy_request_buffering off; # Required for HTTP CLI commands
proxy_set_header Connection ""; # Clear for keepalive
}

}

Jenkins는 8080 포트로 동작하기 때문에 리버스 프록시를 설정해준다.
-/etc/nginx/conf.d 아래 default.conf 파일을 하나 생성하고 위와 같이 입력하고 저장한다.
-nginx의 기본 설정 파일에 존재하는 include /etc/nginx/conf.d/*.conf; 설정 때문에 .conf 로 끝난다면 설정이 적용된다.
-설정 후 sudo nginx -t로 설정파일이 정상인지 확인하고, sudo systemctl restart nginx 명령어로 nginx를 재시작한다.

[Jenkins] Jenkins 접속

Jenkins를 설치한 EC2 인스턴스 인바운드 설정에 80번 포트가 열려있는지 확인한다.
-EC2의 아이피 주소를 입력하고 들어가면 비밀번호를 입력하라는 창이 나온다.

jenkins-start

초기 비밀번호를 입력해야 하는데 sudo cat /var/lib/jenkins/secrets/initialAdminPasswor 를 입력해 초기 비밀번호를 얻을 수 있다.
-비밀번호를 입력하면 플러그인 설정 창이 나올텐데 install suggested plugins을 클릭하여 Jenkins가 추천하는 기본 플러그인들을 설치하면 된다.
-플러그인을 설치하면 계정 및 주소 설정을 해야하는데 이건 편하게 설정하면 된다.

[Jenkins] Jenkins Blue Ocean 설치

Jenkins 관리 → Plugin Manager에서 Blue Ocean을 검색해 설치한다.

[AWS IAM & EC2] IAM으로 EC2 인스턴스 권한 설정하기

S3와 Elastic Beanstalk에 접근할 수 있는 권한을 부여하려면 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk 두 개의 정책을 가지고 있는 역할을 생성해야 한다.
-IAM에서 다음과 같이 역할을 하나 새로 생성한다.

  1. 엔터티 선택

aws-iam1

  1. 권한 추가

aws-iam2

  1. 이름 지정, 검토 및 생성

aws-iam3

  1. 생성한 IAM EC2 Jenkins 인스턴스를 선택하고, 작업 → 보안 → IAM 역할 수정을 눌러 Role 설정

aws-iam4

[AWS S3] Jar 파일을 업로드 할 S3 버킷 생성

버킷을 생성할 때 다음 설정을 제외하고 모두 차단 활성화를 해준다.

  • 새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단

aws-s3

[Github] Blue Ocean에서 파이프라인 생성에 필요한 Github Token 생성

repo, user:email 권한이 있는 토큰이 필요하다.

[Jenkins] 블루 오션 시작

jenkins-blue-ocean1

블루 오션 열기로 파이프라인을 생성한다.
-토큰 입력 → 조직 선택 → CI/CD 설정할 Repository 선택을 하면 파이프라인 창으로 넘어간다.
-Jenkinsfile을 직접 작성하여 설정하기 위해 간단하게 print 하나 출력하는 것으로 설정했다.

jenkins-blue-ocean2

파이프라인이 실행될 텐데 pipeline status에서 아래와 같이 초록불이 뜨면 된다.

jenkins-blue-ocean3

[Github Repsoitory] Jenkinsfile 설정

블루 오션 시작을 통해 설정하면 Jenkinsfile이 하나 만들어지고, 아래와 같이 원하는 파이프라인을 설정한다.

pipeline {
agent any
stages {
stage('build and test') {
steps {
sh '/gradlew clean build'
}
}
stage('zip') {
steps {
sh 'mv ./build/libs/woowachat.jar .'
sh 'zip -r woowachat.zip .platform delivery.jar Procfile'
}
}
stage('upload') {
steps {
sh 'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2'
}
}
stage('deploy') {
steps {
sh 'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket="woowa-chat",S3Key="woowachat.zip"'
sh 'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}'
}
}
}
}

[Github] Webhooks 설정

github-hook

push 이벤트가 발생할 때 http://Jenkins주소/github-webhook/ 로 post request를 하도록 웹훅을 설정한다.

참고 자료

Install Jenkins - CentOS, Jenkins
-Nginx Reverse Proxy Configuration, Jenkins
-Amazon Corretto 17 JDK Install, AWS
-Amazon Linux 2023 packages, AWS

- - +
본문으로 건너뛰기

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
+추가로 채팅을 이어나갈 수 있게 하는 기능도 추가했다.
+자잘하게 신경 쓸 부분이 많아서, 프론트엔드 하는 사람들이 대단하다고 생각되었다.
+여유가 된다면 자신의 채팅을 볼 수 있는 기능이나, 채팅을 이어서 할 수 있는 기능, 댓글 기능도 추가할 예정이다.

백엔드

최대한 빨리 서비스를 크루들에게 제공하기로 정해서, 백엔드는 말랑이 일단 다 만들고 있다.
+말랑이 한 부분이 너무 많아서 내가 못 따라가는 것 같다.
+나중에 백엔드 코드를 이해하는 시간을 가져야겠다.

Http Request Header

아직 인증에 대한 부분을 하지 않아서 요청 헤더에 이름을 보내기로 했다.
+말랑이 한글은 안된다고 말해줘서 Base64로 인코딩하고, 백엔드에서 디코딩 하여 사용하기로 했다.
+아래는 pinia에 있는 name 값을 인코딩 하는 코드다. deprecated 되었다는데, 다른 방법을 사용할 줄 몰라서 일단 이걸 사용했다.

const encodedName = () => {
const uriComponent = unescape(encodeURIComponent(name.value));
return btoa(uriComponent);
};

Elastic Beanstalk

가장 빠르게 백엔드를 배포할 수 있는 방법이 뭘지 고민하다가 Elastic Beanstalk를 사용하기로 했다.
+Elastic Beanstalk를 사용하면 인프라에 대해 잘 알지 못해도 애플리케이션을 빠르게 배포하고 관리할 수 있다.
+모니터링, 로깅, 로드 밸런싱 등 다양한 기능을 제공한다.

Elastic Beanstalk RDS 설정 후 분리

초기 설정 시 RDS를 연결하고 설정 완료 후 분리한다면, Beanstalk 인스턴스 -> RDS 요청 시 인바운드 설정을 안 해도 된다.
+RDS 분리 시 Beanstalk에 기본적으로 설정되어 있는 RDS_HOSTNAME, RDS_PORT, RDS_USERNAME, RDS_PASSWORD와 같은 환경 변수가 같이 제거된다.
+추가로 Elastic Beanstalk로 RDS를 설정하면 기본 데이터베이스 명은 ebdb다.

Elastic Beanstalk nginx 설정

업로드하는 zip 파일 내부에 .platform/nginx/conf.d/ 경로에 설정 파일을 추가하면 nginx 설정을 할 수 있다.

Jenkins

백엔드 코드를 일일히 배포하기 불편해서 Jenkins를 이용하여 Repository에 코드를 push 할 때 자동으로 배포가 되게 설정하기로 했다.
+작년에 확인했을 땐 2022년 12월 31일까지 EC2 ARM 기반 t4g.small이 무료였는데, 다시 들어가 보니 2023년까지 12월 31일까지 t4g.small을 무료로 사용할 수 있었다.
+t4g.small은 램이 2G인데, 예전에는 부족하지 않았다고 생각했는데 Java 17을 써서 그런가 빌드 할 때 램이 많이 부족한 것 같아서 Swap 메모리 2기가를 추가로 설정했다.
+추가로 build.gradle에서 아래와 같이 설정한다면 테스트 시 사용하는 램을 늘릴 수 있다. 기본값은 512MB라고 한다.

test {
maxHeapSize = "1024m"
}

Jenkins Blue Ocean

Blue Ocean은 Jenkins Pipeline을 구성하는 데에 있어 편리하게 해주는 도구다.
+시각화도 잘 되어있고, 설정도 편리한 것 같다.
+오늘 적용해 보니 램이 부족하여 중간에 잘 안되기도 하고 그래서 그냥 "Pipeline만 사용할 걸 그랬나?" 라는 생각이 든다.

참고 자료

Elastic Beanstalk, AWS
+EC2 AWS Graviton, AWS
+Default Memory Settings, AWS

+ + \ No newline at end of file diff --git a/page/2.html b/page/2.html index 2bd0af704..9e9ee518f 100644 --- a/page/2.html +++ b/page/2.html @@ -13,23 +13,39 @@ - - + +
-
본문으로 건너뛰기

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
-경로 이미지에 대한 요구사항 및 기술 선택에 대한 내용은 링크에 있다.

구현 결과

./result.png

예시 데이터는 다음과 같다.
-서울역(점) → 신사역 → 노량진역 → 홍대입구역 → 종로3가역 → 옥수역 → 구로역(점) → 신림역 → 발산역

예시 데이터
List<Double> x = List.of(
126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,
126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639
);
List<Double> y = List.of(
37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,
37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184
);
List<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);
List<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);

IMAGE_SIZE & ROUTE_SIZE

RouteImageGenerator.java
private static final int IMAGE_SIZE = 800;
private static final int ROUTE_SIZE = 600;

코드를 보면 이미지 크기와 경로 크기가 있습니다.
-이미지 크기는 말 그대로 이미지의 width와 height를 의미한다.
-경로 크기의 경우 상하좌우 100px 만큼의 간격을 위해 존재한다.
-따라서 실제 경로 그려지는 크기는 600 * 600 사이즈로 생성된다.

./600.png

사이즈 변경의 이유

255 * 255 정도의 작은 사이즈로 이미지를 생성해보려고 했는데 화질이 너무 안좋아서 800으로 변경했다.

주요 클래스

요약

클래스명설명특이사항
Coordinate위도, 경도로 이루어진 위치 값좌표를 뜻하지만 Point와 구분하기 위해 longitude, latitude를 사용하지 않고 x, y 사용
CoordinatesCoordinate의 일급 컬렉션-
Position실제 이미지 생성에 사용할 위치 값Integer 타입의 x, y 사용
PositionsPositions의 일급 컬렉션-
RouteImageDrawer실제 이미지에 경로를 그려주는 클래스 BufferedImage, Graphics2D를 가지고 있음이미지 생성에 필요한 상수가 정의되어 있음
RouteImageUploaderBufferedImage를 받아 서버에 업로드 하는 클래스현재 업로드 위치가 정해지지 않아 일단 기본(프로젝트 루트) 위치에 생성
RouteImageGenerator이미지를 생성하고 업로드하는 서비스여행 종료, 감상 저장시 해당 클래스를 통해 이미지 생성 요청
BufferedImage(AWT)이미지 데이터를 처리하고 조작하는 데 사용왼쪽 상단의 좌표가 (0, 0)
Graphics2D(AWT)선 그리기, 색상 관리 등을 지원하는 클래스 실제 해당 클래스의 draw 메서드를 경로를 그림JDK1.2 이후에 추가됨, 2D(평면) 그래픽 환경을 지원, bufferedImage.createGraphics 메서드를 통해 생성

의존관계

Coordinates(위도, 경도의 일급 컬렉션)

List<Double> 2개(위도, 경도)인 형태로 관리하는 방법이 있었지만, 위치 점을 여러개 찍는 부분에서 로직이 복잡해 질 것 같아서 Coordinate(x, y)와 일급 컬렉션인 Coordinates로 관리하기로 했다.
-Coordinates 클래스에는 다음 두 개의 인터페이스가 존재한다.

  • calculatePositions: 경로 이미지의 크기를 받아 실제 이미지 생성시 사용될 Positions를 반환
  • indexOf: 다른 Coordinates를 받아 동일한 위치점에 해당하는 인덱스를 반환하는

Positions 계산 로직은 다음과 같다.
-위도, 경도 각각에 대한 부분을 이미지 생성시 필요한 값으로 변환한다.

Coordinates.java
// 호출
// List<Integer> xPositions = toPositions(xValues, maxDifference, routeImageSize);
// List<Integer> yPositions = toPositions(yValues, maxDifference, routeImageSize);

private List<Integer> toPositions(List<Double> values, Double maxDifference, Integer routeImageSize) {
Double minValue = Collections.min(values);
return values.stream()
.map(value -> normalizeCoordinate(value, maxDifference, minValue))
.map(value -> mapToPosition(value, routeImageSize))
.toList();
}

private double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {
return (coordinate - minValue) / maxDifference;
}

private int mapToPosition(Double coordinate, Integer routeImageSize) {
return (int) (coordinate * routeImageSize);
}

위도로 예시든 내용이다.

  1. Collections.min(values) → 위도를 받아 위도 리스트의 최소값을 구한다.
  2. normalizeCoordinate → 각 값에서 최소값을 빼고 0 ~ 1 사이 값으로 변환 후 위경도의 최대 차이로 나눈다.
  3. mapToPosition → 그래프 크기를 받아 0 ~ 1 사이 값을 실제 이미지를 위한 위치값으로 변환한다.

Positions(실제 이미지 생성에 사용할 위치)

Positions 클래스에는 다음 다섯 개의 인터페이스가 존재한다.

  • align: 이미지 사이즈와 경로 이미지 사이즈를 받아 Position 값들을 중앙 정렬한다.
  • getPositionsByIndexes: 인덱스 리스트를 받아 입력받은 인덱스에 해당하는 값들을 반환한다.
  • size: 크기를 반환한다.
  • xPositions: x 값들을 반환한다.
  • yPositions: y 값들을 반환한다.

중앙 정렬 로직은 다음과 같습니다.

Positions.java
public Positions align(int imageSize, int routeSize) {
int xOffset = calculateOffset(Position::x, imageSize);
int yOffset = calculateOffset(Position::y, imageSize);

return items.stream()
.map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))
.collect(collectingAndThen(toList(), Positions::new));
}

private int calculateOffset(ToIntFunction<Position> positionToInteger, int imageSize) {
List<Integer> positions = items.stream()
.mapToInt(positionToInteger)
.boxed()
.toList();

int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;
return imageSize / 2 - midValue;
}

상하좌우 여백을 동일하게 주기 위해서 offset 값을 구해서 x, y 값에 각각 더하는 형태로 중앙 정렬을 수행했다.
-BufferedImage를 사용할 때 왼쪽 상단의 좌표 (0, 0) 기준으로 아래로 내려갈수록 y 값이 커지고, 오른쪽으로 갈 수록 x 값이 커진다.

./800.png

따라서 최종적으로 이미지를 생성하기 위한 값을 다음과 같이 구했다.

x 값 → 계산한 offset 그대로 더한다.
-y 값 → imageSize(800)에서 y + offset 값을 뺀다.

RouteImageDrawer(실제 이미지에 경로를 그려주는 클래스)

BufferedImage, Graphics2D를 필드로 가지고 있는 클래스다.
-그림을 그리기 위해 설정한 상수들이 존재한다.

RouteImageDrawer.java
// RGB에 각각 8비트씩 할당한 값을 24비트 트루컬러라 부른다.
// 해당 설정은 24비트 + 8비트(alpha, 투명도)를 추가한 32비트 이미지 타입이다.
// 이를 RGBA라고 부른다.
private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;
// 배경 투명색
private static final Color TRANSPARENT = new Color(0, 0, 0, 0);
// 경로를 위한 STROKE
private static final int LINE_STROKE_WIDTH = 7;
private static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 위치 점을 위한 STROKE
private static final int POINT_STROKE_WIDTH = 20;
private static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 안티앨리어싱 등 화질이 안좋은 이미지를 개선하기 위한 설정
private static final Map<Object, Object> renderingHints = Map.of(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,
RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,
RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

RouteImageDrawer 클래스에는 다음 세 개의 인터페이스가 존재한다.

  • drawLine: 선을 그린다.
  • drawPoint: 점을 찍는다.
  • dispose: 자원 할당을 해제한다.

dispose의 경우 내부에서 생성된 graphics2D에 대한 자원 할당을 해제하는 메서드인 graphics2D.dispose를 호출한다.

이미지 생성 Flow

1. 이미지 생성 준비

2. 선 그리기 요청

3. 위치 점 그리기 요청

4. 업로드 요청

전체 Flow

- - +
본문으로 건너뛰기

· 약 12분

이전 글

경로 이미지 생성하기 - 기술 선택
+경로 이미지 생성하기 - 구현

개요

현재 여행을 마치는 경우, 감상을 생성하는 경우 이미지 생성 요청이 이루어진다.
+경로 이미지 생성의 경우 위치 정보의 개수에 정비례하여 생성 시간이 증가한다.
+따라서 비동기로 이미지 생성 요청을 처리하여 사용자의 경험을 개선시킬 수 있다고 생각했다.

주기능의 응답속도 개선

여행 종료와 감상 생성이 주기능이고, 이미지 생성 기능은 부기능이다.
+하지만 현재 여행 종료와 감상 생성의 응답 속도가 경로 이미지 생성 시간에 영향을 받고 있다.
+경로 이미지 생성은 비동기 처리하여도 애플리케이션 사용에 문제가 되지 않는다.
+소요 시간이 1초 이상 걸리는 경우가 존재하기에 이미지 생성을 비동기 처리하고 여행 종료와 감상 생성 기능의 응답 시간을 개선하는 것이 더 중요하다.

확장성 대비

현재 10분 간격으로 위치 정보를 서버에 저장하고 있다.
+조금 더 짧은 간격으로 위치 정보를 그리는 경우 하나의 여행에 많은 위치 정보가 저장될 수밖에 없고 따라서 경로 이미지 생성에 걸리는 시간이 더 길어질 수 있다.
+따라서 추후에 더 짧은 간격으로 위치 정보를 저장하는 경우를 대비하여 이미지 생성은 비동기로 처리하는 것이 합당하다.

비동기 처리

@Async를 사용하면 간단하게 메서드를 비동기로 동작하도록 만들 수 있다.

비동기 설정

사용하기 전에 설정 파일을 하나 만들어서 EnableAsync 설정을 해야한다.
+해당 설정을 적용하면 비동기적으로 실행하려는 메서드에 @Async 애너테이션을 붙여주기만 하면 비동기로 동작한다.

AsyncConfig
@EnableAsync
@Configuration
public class AsyncConfig {
}

스프링 부트를 사용하지 않는 경우 기본적으로 비동기 처리를 할 때 매번 새로운 스레드를 생성하기 때문에 스레드 풀 설정을 따로 해줘야 한다. 하지만 스프링 부트를 사용하는 경우 ThreadPoolTaskExecutor를 따로 설정하지 않아도 기본적으로 스프링 부트가 생성을 도와준다.

In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing. +7.7. Task Execution and Scheduling, Spring Boot Docs

@Async 적용

이미지 생성기에 Async 애너테이션을 붙여 비동기로 동작하도록 한다.

RouteImageGenerator
@Async
public void generate(
List<Double> latitudes,
List<Double> longitudes,
List<Double> pointedLatitudes,
List<Double> pointedLongitudes,
Long tripId
) {
// 이미지 생성
RouteImageDrawer routeImageDrawer = RouteImageDrawer.from(IMAGE_SIZE);
Coordinates coordinates = Coordinates.of(latitudes, longitudes);
Coordinates pointedCoordinates = Coordinates.of(pointedLatitudes, pointedLongitudes);
drawImage(coordinates, routeImageDrawer, pointedCoordinates);

// 이미지 저장
String imageName = routeImageUploader.upload(routeImageDrawer.bufferedImage());

// 자원 할당 해제
routeImageDrawer.dispose();

// 데이터베이스 값 변경
Trip trip = tripRepository.findById(tripId)
.orElseThrow();
trip.changeRouteImageUrl(imageUrl);
tripRepository.save(trip);
}

비동기 처리시 문제점

현재 이미지 생성을 하고 저장 후, 저장 경로를 DB에 반영해야 한다.
+따라서 패키지 간 순환 참조 형태가 되며 의존성 방향이 문제가 생긴다.

이를 해결하기 위해서는 인터페이스를 사용하는 방법과 이벤트를 사용하는 방법이 있다.
+인터페이스를 사용한다면 다음과 같은 구조가 된다.

패키지 간 의존성은 해결되었지만, 이미지 경로 저장을 위해 tripId를 받아야하는 등의 논리적인 의존성은 아직 해결되지 않았다.
+따라서 이벤트를 사용하기로 했다.

이벤트 사용

스프링의 애플리케이션 이벤트를 사용하면 비즈니스 로직의 비관심사(ex. 경로 이미지 생성)을 효율적인 방법으로 처리할 수 있다.

이벤트 발행

이벤트를 사용하려면 먼저 이벤트를 발행해야 한다.
+스프링에서는 ApplicationEventPublisher 인터페이스를 사용하여 이벤트를 발행할 수 있다.
+해당 인터페이스는 내부적으로 ApplicationContext가 구현하여 이벤트를 발행한다.

TripService & TripUpdateEvent
public void updateTripById(LoginUser loginUser, Long tripId, TripUpdateRequest tripUpdateRequest) {
...

// 이벤트 발행
applicationEventPublisher.publishEvent(new TripUpdateEvent(trip.id()));
}

public record TripUpdateEvent(Long tripId) {
}

이벤트를 발행할 때 발행하는 이벤트명이 중요하다.
+이벤트를 구독하는 도메인의 행위를 담고 있는 이벤트를 발행(ex. RouteImageGenerateEvent)한다면 논리적인 의존 관계가 남아있기에 이벤트를 적절히 사용했다고 보기 어렵다.
+발행하는 이벤트명은 주기능이 어떤 행위(ex. TripUpdateEvent)를 했는지에 대한 정보가 담겨있는 이벤트명으로 발행하는 것이 중요하다.

이벤트 구독

이벤트를 구독하여 실행하는 메서드는 비동기로 처리하기 위하여 @Async 애너테이션을 적용했다.
+이벤트의 구독은 여행이 정상적으로 종료될 때 여행에 대한 정보를 가지고 경로 이미지를 생성하기 위해 @TransactionalEventListener를 사용했다.

TransactionPhase 설정

TransactionPhase을 사용하여 트랜잭션 이벤트를 어떤 단계에서 수신하고 처리할지를 지정할 수 있다.

AFTER_COMMIT(기본값): 트랜잭션이 정상적으로 커밋 되는 경우 이벤트 실행
+AFTER_ROLLBACK: 트랜잭션이 롤백되는 경우 이벤트 실행
+AFTER_COMPLETION: 트랜잭션이 커밋 또는 롤백 되었을 경우 이벤트 실행
+BEFORE_COMMIT: 트랜잭션이 커밋 되기 전 이벤트 실행

이미지 생성의 경우 트랜잭션에서 제외하기 위해 @Transactional 애너테이션을 사용하지 않았다.

TripUpdateEventHandler
@Component
public class TripUpdateEventHandler {

private final RouteImageGenerator routeImageGenerator;
private final TripRepository tripRepository;

public TripUpdateEventHandler(RouteImageGenerator routeImageGenerator, TripRepository tripRepository) {
this.routeImageGenerator = routeImageGenerator;
this.tripRepository = tripRepository;
}

@Async
@TransactionalEventListener(phase = AFTER_COMMIT)
public void handle(TripUpdateEvent tripUpdateEvent) {
Trip trip = tripRepository.getTripWithPoints(tripUpdateEvent.tripId());

String imageUrl = routeImageGenerator.generate(
trip.getLatitudes(),
trip.getLongitudes(),
trip.getPointedLatitudes(),
trip.getPointedLongitudes()
);

trip.changeRouteImageUrl(imageUrl);
tripRepository.save(trip);
}
}

이벤트를 사용함으로써 패키지 간 순환 참조 문제가 다음과 같이 해결되었다.
+또한 주기능과 부기능을 분리함으로써 경로 이미지 생성 기능에 대한 전체적인 결합도를 낮추었다.

테스트

비동기로 동작하는 메서드를 테스트하기 위해서는 아래와 같은 방법이 있다.

@ContextConfiguration(classes = TestSyncConfig.class)
@SpringBootTest
public class TripUpdateEventHandlerIntegrationTest {

...

@Test
void 여행수정_이벤트를_발생시키면_이미지를_생성_요청을_한다() {
// given
TripUpdateEvent tripUpdateEvent = new TripUpdateEvent(1L);
given(tripRepository.getTripWithPoints(tripUpdateEvent.tripId()))
.willReturn(여행());

// when
transactionTemplate.executeWithoutResult(action -> applicationEventPublisher.publishEvent(tripUpdateEvent));

// then
then(routeImageGenerator)
.should(times(1))
.generate(any(), any(), any(), any());
}
}

처음에는 테스트에서만 동기로 설정 후 검증하려고 했다.
+통합 테스트에선 트랜잭션이 정상 종료되었을 때 비동기로 이벤트를 구독하여 이미지 생성 메서드를 호출하는지 검증이 필요했기 때문에 최종적으로 Mockito.timeout 메서드를 사용하여 비동기 메서드가 통과될 때까지 대기하는 방향으로 변경했다.

결과

./time.png

위 응답 시간은 위치 정보 1000개를 기준으로 테스트한 값이다.
+응답 시간에 이미지 생성 시간이 포함되지 않아서 성능이 개선된 것을 볼 수 있다.

참고 자료

7.7. Task Execution and Scheduling, Spring Boot Docs
+Spring Events, Baeldung
+회원시스템 이벤트기반 아키텍처 구축하기

+ + \ No newline at end of file diff --git a/page/20.html b/page/20.html index 28099c7a5..b235ae0c7 100644 --- a/page/20.html +++ b/page/20.html @@ -13,35 +13,30 @@ - - + +
-
본문으로 건너뛰기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
-레벨 3, 4에서 나만의 강점을 가지고 싶어 고민을 많이 했다.
-단순히 스프링을 깊게 공부하는 건 효율이 많이 떨어진다고 생각했다.
-글쓰기 수상으로 받은 쿠폰을 사용해 브라운에게 커피챗을 신청했고, 사이드 프로젝트를 해보라는 답을 받았다.

나는 아이디어를 못내는 편인데 브라운이 아이디어까지 던져주셨다.
-Chat-GPT 서비스를 크루들에게 제공하고, 해당 크루들이 질문한 내용을 공유할 수 있는 건 어떤지?

기술이 목적인 사이드 프로젝트를 진행하면 좋을 것 같다는 답변을 들었고, 혼자 아니면 페어할 수 있을 정도의 인원으로 진행하면 좋겠다고 하셨다.
-프론트랑 간단하게 배포까지 해본 경험이 있어서 혼자해도 크게 어렵지 않을 것 같아서 혼자 하기로 마음을 먹었다.

이건 못참지

도메인 구입 성공?

커피챗이 끝나고 집으로 돌아가는 길에 바로 도메인을 구매하려고 namecheap에서 적당한 도메인이 없을까 검색을 계속했다.
-마치 어릴 때 했던 게임 닉네임 정하는 것처럼 시간이 오래 걸렸다.
-dev, io, chat 도메인이 후보였고 집 가는 길에 결정만 하다가 구매하지 못했다.

말랑의 DM

집에 가서 밥을 먹고 말랑이랑 DM 하다 프로젝트를 같이 하자는 이야기가 나왔다.
-우테코 최고 고수 말랑의 요구라 수락하지 않으면 후폭풍을 감당할 수 없었다.

이런저런 대화를 나누다가 난 빠르게 프로토타입을 만들어 보고 싶어서 프론트를 구현한다고 했고, 말랑은 GPT api를 조사하기로 했다.
-추가로 도메인에 관한 이야기를 하다가 woowachat이 언급되었고, namecheap에서 chat 도메인을 사용한 woowa.chat으로 구매했다.
-이후에 teco.chat으로 변경했다!

도메인 설정 및 배포

토요일에 구매한 도메인을 CDN, 보안 등 다양한 기능을 제공하는 Cloudflare에 도메인 등록을 했다.
-나에게 익숙한 Nuxt3를 사용하기로 했고, Cloudflare Pages를 이용하여 배포했다.

GPT

무료 크레딧을 사용하니 api limit이 있어 분당 3번밖에 사용할 수 없었다.
-일단 백엔드를 구축하기 전에는 무료 크레딧을 사용할 생각이다.

Sonarcloud

정적 코드 분석 도구로 Sonarcloud를 적용했다.
-Sonarcloud는 SonarQube의 SaaS 버전이고 사용이 매우 편하다.
-예전에 Sonarcloud를 사용할 땐 버튼 몇 번 누르면 적용할 수 있었는데, 이번에는 바로 github action을 사용하라는 안내 페이지로 이동했다.
-Sonarcloud가 자체적으로 github repository에 push 하면 정적 분석을 해주는 기능을 원했고, Administration -> Analysis Method에 Automatic Analysis를 설정하니 되었다.
-너무 꽁꽁 숨겨져있네

Tiptap

코드 하이라이팅 기능을 넣고 싶어서 Tiptap을 사용했다.
-Tiptap은 Headless WYSIWYG 에디터로 사용자 정의 기능에 특화되어있는 에디터다.
-아직 Tiptap이 제공하는 모든 기능을 자연스럽게 사용하지는 못하지만 CodeBlockLowlight 플러그인을 사용하여 코드 블록을 예쁘게 출력할 수 있었다.
-api 반환값 그대로 tiptap의 content에 설정했더니 코드 블록이 설정되지 않아서 백 틱 3개를 <pre><code>로 변환했다.
-추가로 띄어쓰기도 적용되지 않아서 \n<br>태그로 변환했다.
-변환하는 로직은 GPT의 도움을 많이 받았다.

const replaceCodeFences = (input: String) => {
const codeFencesRegex = /```([\w-]*)\n([\s\S]*?)\n```/g;
return input
.replace(codeFencesRegex, (match, p1, p2) => {
const languageClass = p1 ? ` class="language-${p1}"` : "";
return `<pre><code${languageClass}>${p2}</code></pre>`;
})
.replace(/\n/g, "<br>");
};

Tiptap을 적용하니 다음과 같이 깔끔한 코드 블록을 볼 수 있었다.

tecochat

폰트 및 favicon 적용

타이틀은 배달의민족 도현체, 내용은 IBM Plex Sans를 사용했다.
-추가로 favicon도 간단하게 적용해서 만족스러웠다.

- - +
본문으로 건너뛰기

· 약 8분

설정 환경

소프트웨어 이미지: Amazon Linux 2023 AMI
+아키텍쳐: ARM
+인스턴스 유형: t4g.small
+환경 구성이 완료된 Elastic Beanstalk
+단일 Spring Boot 프로젝트가 존재하는 Github Repository

[EC2 CLI] Swap 메모리 설정

t4g.small이 램이 2G인데 램이 부족하다고 느껴져서 swap 메모리를 설정했다.
+아래 명령어를 따라 swap 메모리를 설정하고 free -h 명령어를 통해 잘 설정되었는지 확인할 수 있다.

# fallocate 이용하여 스왑 파일 생성
sudo fallocate -l 2G /swapfile

# 권한 설정
sudo chmod 600 /swapfile

# 파일을 Swap 포맷으로 변경 후 시스템에 등록
sudo mkswap /swapfile
sudo swapon /swapfile

# Swap 메모리 부팅시 자동으로 마운트하도록 적용
# 최하단에 다음 구문 설정 -> /swapfile swap swap defaults 0 0
sudo vim /etc/fstab

[EC2 CLI] jenkins 설치

sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum upgrade
sudo yum install java-17-amazon-corretto-devel
sudo yum install jenkins
sudo systemctl daemon-reload

Jenkins 공식 홈페이지 를 참고하여 설치하는 게 좋다.

[EC2 CLI] Jenkins 시작

sudo systemctl enable jenkins
sudo systemctl start jenkins

enable로 설정하여 부팅시 자동시작 되도록 설정한다.

[EC2 CLI] nginx & git 설치

sudo yum install nginx
sudo systemctl enable nginx
sudo systemctl start nginx

sudo yum install git

nginx와 코드를 불러올 때 사용할 git을 설치한다.

[EC2 CLI] nginx 리버스 프록시 설정

아래 설정 파일은 공식 홈페이지에서 안내한 기본적인 설정 파일이다.

upstream jenkins {
keepalive 32; # keepalive connections
server 127.0.0.1:8080; # jenkins ip and port
}

# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80; # Listen on port 80 for IPv4 requests

server_name jenkins.example.com; # replace 'jenkins.example.com' with your server domain name

# this is the jenkins web root directory
# (mentioned in the output of "systemctl cat jenkins")
root /var/run/jenkins/war/;

access_log /var/log/nginx/jenkins.access.log;
error_log /var/log/nginx/jenkins.error.log;

# pass through headers from Jenkins that Nginx considers invalid
ignore_invalid_headers off;

location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
# rewrite all static files into requests to the root
# E.g /static/12345678/css/something.css will become /css/something.css
rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
}

location /userContent {
# have nginx handle all the static requests to userContent folder
# note : This is the $JENKINS_HOME dir
root /var/lib/jenkins/;
if (!-f $request_filename){
# this file does not exist, might be a directory or a /**view** url
rewrite (.*) /$1 last;
break;
}
sendfile on;
}

location / {
sendfile off;
proxy_pass http://jenkins;
proxy_redirect default;
proxy_http_version 1.1;

# Required for Jenkins websocket agents
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;

#this is the maximum upload size
client_max_body_size 10m;
client_body_buffer_size 128k;

proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffering off;
proxy_request_buffering off; # Required for HTTP CLI commands
proxy_set_header Connection ""; # Clear for keepalive
}

}

Jenkins는 8080 포트로 동작하기 때문에 리버스 프록시를 설정해준다.
+/etc/nginx/conf.d 아래 default.conf 파일을 하나 생성하고 위와 같이 입력하고 저장한다.
+nginx의 기본 설정 파일에 존재하는 include /etc/nginx/conf.d/*.conf; 설정 때문에 .conf 로 끝난다면 설정이 적용된다.
+설정 후 sudo nginx -t로 설정파일이 정상인지 확인하고, sudo systemctl restart nginx 명령어로 nginx를 재시작한다.

[Jenkins] Jenkins 접속

Jenkins를 설치한 EC2 인스턴스 인바운드 설정에 80번 포트가 열려있는지 확인한다.
+EC2의 아이피 주소를 입력하고 들어가면 비밀번호를 입력하라는 창이 나온다.

jenkins-start

초기 비밀번호를 입력해야 하는데 sudo cat /var/lib/jenkins/secrets/initialAdminPasswor 를 입력해 초기 비밀번호를 얻을 수 있다.
+비밀번호를 입력하면 플러그인 설정 창이 나올텐데 install suggested plugins을 클릭하여 Jenkins가 추천하는 기본 플러그인들을 설치하면 된다.
+플러그인을 설치하면 계정 및 주소 설정을 해야하는데 이건 편하게 설정하면 된다.

[Jenkins] Jenkins Blue Ocean 설치

Jenkins 관리 → Plugin Manager에서 Blue Ocean을 검색해 설치한다.

[AWS IAM & EC2] IAM으로 EC2 인스턴스 권한 설정하기

S3와 Elastic Beanstalk에 접근할 수 있는 권한을 부여하려면 AmazonS3FullAccess, AdministratorAccess-AWSElasticBeanstalk 두 개의 정책을 가지고 있는 역할을 생성해야 한다.
+IAM에서 다음과 같이 역할을 하나 새로 생성한다.

  1. 엔터티 선택

aws-iam1

  1. 권한 추가

aws-iam2

  1. 이름 지정, 검토 및 생성

aws-iam3

  1. 생성한 IAM EC2 Jenkins 인스턴스를 선택하고, 작업 → 보안 → IAM 역할 수정을 눌러 Role 설정

aws-iam4

[AWS S3] Jar 파일을 업로드 할 S3 버킷 생성

버킷을 생성할 때 다음 설정을 제외하고 모두 차단 활성화를 해준다.

  • 새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단

aws-s3

[Github] Blue Ocean에서 파이프라인 생성에 필요한 Github Token 생성

repo, user:email 권한이 있는 토큰이 필요하다.

[Jenkins] 블루 오션 시작

jenkins-blue-ocean1

블루 오션 열기로 파이프라인을 생성한다.
+토큰 입력 → 조직 선택 → CI/CD 설정할 Repository 선택을 하면 파이프라인 창으로 넘어간다.
+Jenkinsfile을 직접 작성하여 설정하기 위해 간단하게 print 하나 출력하는 것으로 설정했다.

jenkins-blue-ocean2

파이프라인이 실행될 텐데 pipeline status에서 아래와 같이 초록불이 뜨면 된다.

jenkins-blue-ocean3

[Github Repsoitory] Jenkinsfile 설정

블루 오션 시작을 통해 설정하면 Jenkinsfile이 하나 만들어지고, 아래와 같이 원하는 파이프라인을 설정한다.

pipeline {
agent any
stages {
stage('build and test') {
steps {
sh '/gradlew clean build'
}
}
stage('zip') {
steps {
sh 'mv ./build/libs/woowachat.jar .'
sh 'zip -r woowachat.zip .platform delivery.jar Procfile'
}
}
stage('upload') {
steps {
sh 'aws s3 cp woowachat.zip s3://woowa-chat/woowachat.zip --region ap-northeast-2'
}
}
stage('deploy') {
steps {
sh 'aws elasticbeanstalk create-application-version --region ap-northeast-2 --application-name woowachat --version-label ${BUILD_TAG} --source-bundle S3Bucket="woowa-chat",S3Key="woowachat.zip"'
sh 'aws elasticbeanstalk update-environment --region ap-northeast-2 --environment-name Woowachat-env --version-label ${BUILD_TAG}'
}
}
}
}

[Github] Webhooks 설정

github-hook

push 이벤트가 발생할 때 http://Jenkins주소/github-webhook/ 로 post request를 하도록 웹훅을 설정한다.

참고 자료

Install Jenkins - CentOS, Jenkins
+Nginx Reverse Proxy Configuration, Jenkins
+Amazon Corretto 17 JDK Install, AWS
+Amazon Linux 2023 packages, AWS

+ + \ No newline at end of file diff --git a/page/21.html b/page/21.html index e22abc905..4aacc2962 100644 --- a/page/21.html +++ b/page/21.html @@ -13,42 +13,35 @@ - - + +
-
본문으로 건너뛰기

· 약 6분

책 정보

상자 밖에 있는 사람
-아빈저연구소

자기기만과 자기배반

책에서는 자기기만과 자기배반에 대한 내용을 다룬다.

  • 자기기만: 자신의 문제를 인정하지 않는 것
  • 자기배반: 다른 사람을 위해 무언가 해야만 한다는 생각을 반하는 행위

자기배반을 한다면 자기기만 상태가 된다.
-자기기만 상태에 빠지는 것을 책에서는 상자 안에 들어간다고 표현한다.

읽고 나서

최근에 읽은 책 중 가장 마음이 불편했다.
-그렇기에 더더욱 나에게 필요한 내용이 담겨있었다.

살면서 많은 선택의 순간이 존재했고, 그 순간마다 자기배반을 택하는 경우가 많았다.
-작게는 집안일을 해야 하는데 몸이 조금 힘들다고 하지 않거나
-크게는 잘못을 인정해야 하는 상황에서 그러지 않은 경우가 있었다.
-이런 상황이 반복되어 결국 상자 안에 나 자신을 가두는 경우가 많았다.

더 나은 삶을 위해 내가 상자 안에 있는지 지속적으로 확인하고, 상자 밖으로 나가려는 연습을 해야겠다.
-넓은 시선을 가지고, 항상 내가 틀릴 수 있다는 것을 생각하고 살아가자.

밑줄 친 문장들

우리의 생각은 지식보다 작다.
-우리의 지식은 사랑보다 작다.
-우리의 사랑은 존재보다 작다.
-그리고 우리가 생각하는 나는 실제의 나보다 그만큼 작다.
-R. D. 랭
-p.19

우리가 외적으로 어떤 행동을 하든지 간에, 사람들은 우리 마음에서 그들을 어떻게 대하고 있는지에 따라 주로 반응합니다.
-우리가 사람들에 대해 어떻게 느끼게 되는지는 우리가 상자 안에 있는지 혹은 상자 밖에 있는지에 따라 달라지게 됩니다.
-p.66

비난은 감정에 속하고 낙관은 의지에 속한다.
-인간은 감정보다 더 큰 존재이다.
-알랭, 탁닛한
-p.103

우리가 자신에게만 집중하고 있는 한, 혼자서 일하는 것 이상의 창조적인 결과나 협력을 이끌어 낸다는 것은 불가능합니다.
-오늘날 경제 환경에서는 혼자서는 일의 결과를 탁월하게 만들어 내기가 어렵습니다.
-내가 중심이어야 된다는 폐쇄적인 사고는 함께 일하는 사람들의 열정을 불러오지 못합니다.
-p.175

솔직함은 우리의 문제를 해결하는 열쇠입니다.
-그것은 자신의 행동과 관련된 사람에 대해 기꺼이 사과를 하는 것입니다.
-그것만이 실타래처럼 엉킨 관계의 문제를 해결할 수 있기 때문이죠.
-p.188

누군가를 나와 같이 동일한 가치를 지닌 한 인간으로 생각해서 그 사람을 위해 내가 상자 밖에 계속 머무르고 싶은 열망이 생길 때, 나는 이미 그 사람에 대해 상자 밖에 있다.
-p.214

대부분의 사람들이 관계 기술을 가지고 그들이 겪고 있는 문제를 바로잡으려고 하는 노력이 결실을 얻지 못하는 것은 결코 그러한 기술 부족 때문에 생기는 것이 아닙니다.
-그것들은 자기배반 때문에 생겨납니다.
-p.224

우리는 함께 일하고 우리와 함께 살아가는 사람이 진정으로 누구인지 알지 못합니다.
-우리가 그들과 진정으로 함께 소통하기 전까지는 우리는 그들의 가치를 잘 모릅니다.
-우리의 위대함이란 다른 사람들의 위대한 점을 발견해 주는 것에 있습니다.
-p.280

- - +
본문으로 건너뛰기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
+레벨 3, 4에서 나만의 강점을 가지고 싶어 고민을 많이 했다.
+단순히 스프링을 깊게 공부하는 건 효율이 많이 떨어진다고 생각했다.
+글쓰기 수상으로 받은 쿠폰을 사용해 브라운에게 커피챗을 신청했고, 사이드 프로젝트를 해보라는 답을 받았다.

나는 아이디어를 못내는 편인데 브라운이 아이디어까지 던져주셨다.
+Chat-GPT 서비스를 크루들에게 제공하고, 해당 크루들이 질문한 내용을 공유할 수 있는 건 어떤지?

기술이 목적인 사이드 프로젝트를 진행하면 좋을 것 같다는 답변을 들었고, 혼자 아니면 페어할 수 있을 정도의 인원으로 진행하면 좋겠다고 하셨다.
+프론트랑 간단하게 배포까지 해본 경험이 있어서 혼자해도 크게 어렵지 않을 것 같아서 혼자 하기로 마음을 먹었다.

이건 못참지

도메인 구입 성공?

커피챗이 끝나고 집으로 돌아가는 길에 바로 도메인을 구매하려고 namecheap에서 적당한 도메인이 없을까 검색을 계속했다.
+마치 어릴 때 했던 게임 닉네임 정하는 것처럼 시간이 오래 걸렸다.
+dev, io, chat 도메인이 후보였고 집 가는 길에 결정만 하다가 구매하지 못했다.

말랑의 DM

집에 가서 밥을 먹고 말랑이랑 DM 하다 프로젝트를 같이 하자는 이야기가 나왔다.
+우테코 최고 고수 말랑의 요구라 수락하지 않으면 후폭풍을 감당할 수 없었다.

이런저런 대화를 나누다가 난 빠르게 프로토타입을 만들어 보고 싶어서 프론트를 구현한다고 했고, 말랑은 GPT api를 조사하기로 했다.
+추가로 도메인에 관한 이야기를 하다가 woowachat이 언급되었고, namecheap에서 chat 도메인을 사용한 woowa.chat으로 구매했다.
+이후에 teco.chat으로 변경했다!

도메인 설정 및 배포

토요일에 구매한 도메인을 CDN, 보안 등 다양한 기능을 제공하는 Cloudflare에 도메인 등록을 했다.
+나에게 익숙한 Nuxt3를 사용하기로 했고, Cloudflare Pages를 이용하여 배포했다.

GPT

무료 크레딧을 사용하니 api limit이 있어 분당 3번밖에 사용할 수 없었다.
+일단 백엔드를 구축하기 전에는 무료 크레딧을 사용할 생각이다.

Sonarcloud

정적 코드 분석 도구로 Sonarcloud를 적용했다.
+Sonarcloud는 SonarQube의 SaaS 버전이고 사용이 매우 편하다.
+예전에 Sonarcloud를 사용할 땐 버튼 몇 번 누르면 적용할 수 있었는데, 이번에는 바로 github action을 사용하라는 안내 페이지로 이동했다.
+Sonarcloud가 자체적으로 github repository에 push 하면 정적 분석을 해주는 기능을 원했고, Administration -> Analysis Method에 Automatic Analysis를 설정하니 되었다.
+너무 꽁꽁 숨겨져있네

Tiptap

코드 하이라이팅 기능을 넣고 싶어서 Tiptap을 사용했다.
+Tiptap은 Headless WYSIWYG 에디터로 사용자 정의 기능에 특화되어있는 에디터다.
+아직 Tiptap이 제공하는 모든 기능을 자연스럽게 사용하지는 못하지만 CodeBlockLowlight 플러그인을 사용하여 코드 블록을 예쁘게 출력할 수 있었다.
+api 반환값 그대로 tiptap의 content에 설정했더니 코드 블록이 설정되지 않아서 백 틱 3개를 <pre><code>로 변환했다.
+추가로 띄어쓰기도 적용되지 않아서 \n<br>태그로 변환했다.
+변환하는 로직은 GPT의 도움을 많이 받았다.

const replaceCodeFences = (input: String) => {
const codeFencesRegex = /```([\w-]*)\n([\s\S]*?)\n```/g;
return input
.replace(codeFencesRegex, (match, p1, p2) => {
const languageClass = p1 ? ` class="language-${p1}"` : "";
return `<pre><code${languageClass}>${p2}</code></pre>`;
})
.replace(/\n/g, "<br>");
};

Tiptap을 적용하니 다음과 같이 깔끔한 코드 블록을 볼 수 있었다.

tecochat

폰트 및 favicon 적용

타이틀은 배달의민족 도현체, 내용은 IBM Plex Sans를 사용했다.
+추가로 favicon도 간단하게 적용해서 만족스러웠다.

+ + \ No newline at end of file diff --git a/page/22.html b/page/22.html index e1e37eb51..9ea09eef1 100644 --- a/page/22.html +++ b/page/22.html @@ -13,32 +13,42 @@ - - + +
-
본문으로 건너뛰기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
-보통 명시적으로 잠금을 사용하는 경우는 드물고, 격리 수준에 따라 묵시적으로 잠금이 사용된다.

동시성 제어 방식에는 낙관적인 방식과 비관적인 방식이 있다.
-InnoDB는 기본적으로 MVCC(다중 버전 동시성 제어)를 통해 낙관적인 방식을 사용하고 락을 통해 특정 상황에서 비관적인 방식을 사용한다.

낙관적 동시성 제어(OCC, Optimistic concurrency control)

트랜잭션이 서로 충돌하지 않는다고 가정하는 방식

비관적 동시성 제어(PCC, Pessimistic Concurrency Control)

트랜잭션이 충돌하는 가정하에 잠금을 거는 방식
-일반적으로 Shared Lock, Exclusive Lock을 통해 이를 구현한다.

Shared & Exclusive Locks

InnoDB는 로우 단위의 잠금을 수행할 때 공유 잠금과 배타적 잠금을 사용한다.

공유 잠금(S, shared lock)

데이터 조회를 위한 락, 읽기 잠금(read lock)으로도 불린다.
-다른 트랜잭션에서 읽기가 가능하지만, 쓰기는 불가능하다.
-예) SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;

배타적 잠금(X, exclusive lock)

데이터 변경을 위한 락, 쓰기 잠금(write lock)으로도 불린다.
-락을 건 트랜잭션만이 해당 데이터에 접근 가능하다. 다른 트랜잭션의 경우 읽기, 쓰기가 불가능하다.
-예) SELECT * FROM table_name WHERE id = 1 FOR UPDATE;

Intention Locks

InnoDB는 로우 단위 잠금과 테이블 잠금의 공존을 위해 인텍션 잠금을 지원한다.
-테이블에 있는 로우에 대해서 나중에 요청되는 것이 어떤 형태의 잠금인지 가리키기 위해 사용된다.
-기본적으로 로우 단위 잠금을 수행하기 전에 인텐션 잠금을 먼저 획득한다.
-인텐션 락은 기본적으로 충돌을 방지하고 데드락을 방지하는 역할을 한다.

인텐션 공유 잠금(IS, intention shared lock)

트랜잭션이 테이블의 개별 로우에 대한 공유 잠금을 수행하는 것을 의미한다.

인텐션 배타적 잠금(IX, intention exclusive lock)

트랜잭션이 테이블의 개별 로우에 대한 배타적 잠금을 수행하는 것을 의미한다.

잠금간의 호환성

XIXSIS
XConflictConflictConflictConflict
IXConflictCompatibleConflictCompatible
SConflictConflictCompatibleCompatible
ISConflictCompatibleCompatibleCompatible

Record Locks

레코드 자체만을 잠그는 락이다.
-InnoDB 스토리지 엔진은 레코드 자체가 아니라 인덱스의 레코드를 잠근다.

Gap Locks

레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 락이다.
-레코드와 레코드 사이의 간격에 새로운 레코드가 생성되는 것을 제어하고, 넥스트 키 락의 일부로 사용된다.

Next-Key Locks

레코드 락과 갭 락을 합쳐놓은 형태의 잠금으로 레코드와 그 레코드 앞의 갭 락을 포함한다.
-REPEATABLE READ 격리 수준에서 팬텀 리드를 방지하기 위한 잠금이다.

AUTO-INC Locks

AUTO_INCREMENT 칼림이 사용된 테이블에 동시에 여러 레코드가 INSERT되는 경우, 각 레코드는 중복되지 않고 저장된 순서대로 증가하는 일련번호 값을 가져야 한다.
-InnoDB 는 내부적으로 AUTO-INC 락이라고 하는 테이블 수준의 잠금을 사용한다.
-트랜잭션과 관계 없이 INSERTREPLACE 문장에서 AUTO_INCREMENT 값을 가져오는 순간만 락이 걸렸다가 해제된다.

잠금 예시

-- 레코드는 id 기준 10, 20, 30, 40, 50이 있다고 가정
-- Record Locks: 10에 대해 락이 걸린다.
SELECT * FROM table_name where id = 10 for update;

-- Gap Locks: 51부터 PositiveInfinity까지 락이 걸린다.
SELECT * FROM table_name where id > 100 for update;

-- Next-Key Locks: 21부터 30, 31부터 40에 락이 걸린다.
SELECT * FROM table_name where id BETWEEN 25 AND 35 for update;

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
-Optimistic and Pessimistic record locking, IBM
-MySQL Innodb Locks, cecil1018
-MySQL 8.0 InnoDB Locks, MySQL
-Locks Set by Different SQL Statements in InnoDB, MySQL

- - +
본문으로 건너뛰기

· 약 6분

책 정보

상자 밖에 있는 사람
+아빈저연구소

자기기만과 자기배반

책에서는 자기기만과 자기배반에 대한 내용을 다룬다.

  • 자기기만: 자신의 문제를 인정하지 않는 것
  • 자기배반: 다른 사람을 위해 무언가 해야만 한다는 생각을 반하는 행위

자기배반을 한다면 자기기만 상태가 된다.
+자기기만 상태에 빠지는 것을 책에서는 상자 안에 들어간다고 표현한다.

읽고 나서

최근에 읽은 책 중 가장 마음이 불편했다.
+그렇기에 더더욱 나에게 필요한 내용이 담겨있었다.

살면서 많은 선택의 순간이 존재했고, 그 순간마다 자기배반을 택하는 경우가 많았다.
+작게는 집안일을 해야 하는데 몸이 조금 힘들다고 하지 않거나
+크게는 잘못을 인정해야 하는 상황에서 그러지 않은 경우가 있었다.
+이런 상황이 반복되어 결국 상자 안에 나 자신을 가두는 경우가 많았다.

더 나은 삶을 위해 내가 상자 안에 있는지 지속적으로 확인하고, 상자 밖으로 나가려는 연습을 해야겠다.
+넓은 시선을 가지고, 항상 내가 틀릴 수 있다는 것을 생각하고 살아가자.

밑줄 친 문장들

우리의 생각은 지식보다 작다.
+우리의 지식은 사랑보다 작다.
+우리의 사랑은 존재보다 작다.
+그리고 우리가 생각하는 나는 실제의 나보다 그만큼 작다.
+R. D. 랭
+p.19

우리가 외적으로 어떤 행동을 하든지 간에, 사람들은 우리 마음에서 그들을 어떻게 대하고 있는지에 따라 주로 반응합니다.
+우리가 사람들에 대해 어떻게 느끼게 되는지는 우리가 상자 안에 있는지 혹은 상자 밖에 있는지에 따라 달라지게 됩니다.
+p.66

비난은 감정에 속하고 낙관은 의지에 속한다.
+인간은 감정보다 더 큰 존재이다.
+알랭, 탁닛한
+p.103

우리가 자신에게만 집중하고 있는 한, 혼자서 일하는 것 이상의 창조적인 결과나 협력을 이끌어 낸다는 것은 불가능합니다.
+오늘날 경제 환경에서는 혼자서는 일의 결과를 탁월하게 만들어 내기가 어렵습니다.
+내가 중심이어야 된다는 폐쇄적인 사고는 함께 일하는 사람들의 열정을 불러오지 못합니다.
+p.175

솔직함은 우리의 문제를 해결하는 열쇠입니다.
+그것은 자신의 행동과 관련된 사람에 대해 기꺼이 사과를 하는 것입니다.
+그것만이 실타래처럼 엉킨 관계의 문제를 해결할 수 있기 때문이죠.
+p.188

누군가를 나와 같이 동일한 가치를 지닌 한 인간으로 생각해서 그 사람을 위해 내가 상자 밖에 계속 머무르고 싶은 열망이 생길 때, 나는 이미 그 사람에 대해 상자 밖에 있다.
+p.214

대부분의 사람들이 관계 기술을 가지고 그들이 겪고 있는 문제를 바로잡으려고 하는 노력이 결실을 얻지 못하는 것은 결코 그러한 기술 부족 때문에 생기는 것이 아닙니다.
+그것들은 자기배반 때문에 생겨납니다.
+p.224

우리는 함께 일하고 우리와 함께 살아가는 사람이 진정으로 누구인지 알지 못합니다.
+우리가 그들과 진정으로 함께 소통하기 전까지는 우리는 그들의 가치를 잘 모릅니다.
+우리의 위대함이란 다른 사람들의 위대한 점을 발견해 주는 것에 있습니다.
+p.280

+ + \ No newline at end of file diff --git a/page/23.html b/page/23.html index 5db90ea3c..ec53778b7 100644 --- a/page/23.html +++ b/page/23.html @@ -13,26 +13,32 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
-MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다.

글로벌 락(Global lock)

MySQL에서 제공하는 잠금 중 가장 넓은 범위를 가지고 있는 잠금이다.

  • 영향을 미치는 범위는 해당 서버 전체이다.
  • 작업 대상 테이블, 데이터베이스 상관 없이 동일하게 영향을 받는다.

한 세션에서 글로벌 락을 획득하면 해제 될 때 까지 조회를 제외한 대부분의 명령이 대기 상태가 된다.
-데이터베이스에 존재하는 MyISAM이나 MEMORY 테이블에 대해 일관된 백업을 받아야할 때 사용한다.
-InnoDB 스토리지 엔진에서는 백업 시 조금 더 가벼운 백업 락을 사용할 수 있다.

-- GLOBAL LOCK
FLUSH TABLES WITH READ LOCK;
-- UNLOCK
UNLOCK TABLES;

-- BACKUP LOCK
LOCK INSTANCE FOR BACKUP;
-- UNLOCK
UNLOCK INSTANCE;
MyISAM

MySQL 5.5 버전 이전의 기본 스토리지 엔진이다.
-트랜잭션을 지원하지 않고, SELECT 작업 속도가 빠르다.

테이블 락(Table lock)

개별 테이블 단위로 설정되는 잠금이다.
-명시적 또는 묵시적으로 특정 테이블의 락을 획득할 수 있다.
-묵시적 락은 MyISAM이나 MEMORY 테이블에 데이터를 변경하는 쿼리를 실행하면 발생한다.
-InnoDB 테이블에는 DML 쿼리는 무시되고 DDL 일 경우에만 묵시적으로 락을 획득한다.

-- TABLE LOCK
LOCK TABLES table_name [ READ | WRITE ]

-- UNLOCK
UNLOCK TABLES;

네임드 락(Named lock)

임의의 문자열에 대한 잠금을 설정할 수 있는 잠금으로 유저 레벨 락으로도 불린다.
-여러 스레드나 프로세스가 동일한 데이터를 수정하려는 경우, 동시에 수정하지 못하도록 보호할 수 있다.

-- aGVyYg== 라는 문자열에 대한 잠금 획득, 이미 잠금을 사용중인 경우 1초 동안만 대기
SELECT GET_LOCK('aGVyYg==', 1);

-- 문자열에 대한 잠금이 설정되어 있는지 확인한다.
SELECT IS_FREE_LOCK('aGVyYg==');

-- 문자열에 대한 잠금을 해제한다.
SELECT RELEASE_LOCK('aGVyYg==');

-- 위 3개 함수 모두 정상적으로 락을 획득하거나 해제한 경우에 1을, 아니면 0을 반환한다.

-- 모든 문자열에 대한 잠금을 해제한다. 해제된 잠금의 개수를 반환한다.
SELECT RELEASE_ALL_LOCKS();

메타데이터 락(Metadata lock)

데이터베이스 객체의 이름이나 구조를 변경하는 경우 획득하는 잠금이다.
-명시적으로 획득 또는 해제 할 수 없지만 테이블의 이름을 변경하는 경우 자동으로 획득한다.
-보통 배치 프로그램에서 실시간으로 테이블을 바꿔야하는 경우에 사용된다.

-- 배치 프로그램에서 별도의 임시 테이블에 서비스용 랭킹 데이터 생성 후 기존 테이블을 백업하는 경우
-- 아래 구문 실행 시 메타데이터 락을 자동으로 획득한다.
RENAME TABLE rank TO rank_backup, rank_new TO rank;

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
-MySQL의 User Level Lock를 활용한다면?, gywndi
-Locking Functions, MySQL 5.7 Reference
-Locking Functions, MySQL 8.0 Reference

- - +
본문으로 건너뛰기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
+보통 명시적으로 잠금을 사용하는 경우는 드물고, 격리 수준에 따라 묵시적으로 잠금이 사용된다.

동시성 제어 방식에는 낙관적인 방식과 비관적인 방식이 있다.
+InnoDB는 기본적으로 MVCC(다중 버전 동시성 제어)를 통해 낙관적인 방식을 사용하고 락을 통해 특정 상황에서 비관적인 방식을 사용한다.

낙관적 동시성 제어(OCC, Optimistic concurrency control)

트랜잭션이 서로 충돌하지 않는다고 가정하는 방식

비관적 동시성 제어(PCC, Pessimistic Concurrency Control)

트랜잭션이 충돌하는 가정하에 잠금을 거는 방식
+일반적으로 Shared Lock, Exclusive Lock을 통해 이를 구현한다.

Shared & Exclusive Locks

InnoDB는 로우 단위의 잠금을 수행할 때 공유 잠금과 배타적 잠금을 사용한다.

공유 잠금(S, shared lock)

데이터 조회를 위한 락, 읽기 잠금(read lock)으로도 불린다.
+다른 트랜잭션에서 읽기가 가능하지만, 쓰기는 불가능하다.
+예) SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;

배타적 잠금(X, exclusive lock)

데이터 변경을 위한 락, 쓰기 잠금(write lock)으로도 불린다.
+락을 건 트랜잭션만이 해당 데이터에 접근 가능하다. 다른 트랜잭션의 경우 읽기, 쓰기가 불가능하다.
+예) SELECT * FROM table_name WHERE id = 1 FOR UPDATE;

Intention Locks

InnoDB는 로우 단위 잠금과 테이블 잠금의 공존을 위해 인텍션 잠금을 지원한다.
+테이블에 있는 로우에 대해서 나중에 요청되는 것이 어떤 형태의 잠금인지 가리키기 위해 사용된다.
+기본적으로 로우 단위 잠금을 수행하기 전에 인텐션 잠금을 먼저 획득한다.
+인텐션 락은 기본적으로 충돌을 방지하고 데드락을 방지하는 역할을 한다.

인텐션 공유 잠금(IS, intention shared lock)

트랜잭션이 테이블의 개별 로우에 대한 공유 잠금을 수행하는 것을 의미한다.

인텐션 배타적 잠금(IX, intention exclusive lock)

트랜잭션이 테이블의 개별 로우에 대한 배타적 잠금을 수행하는 것을 의미한다.

잠금간의 호환성

XIXSIS
XConflictConflictConflictConflict
IXConflictCompatibleConflictCompatible
SConflictConflictCompatibleCompatible
ISConflictCompatibleCompatibleCompatible

Record Locks

레코드 자체만을 잠그는 락이다.
+InnoDB 스토리지 엔진은 레코드 자체가 아니라 인덱스의 레코드를 잠근다.

Gap Locks

레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 락이다.
+레코드와 레코드 사이의 간격에 새로운 레코드가 생성되는 것을 제어하고, 넥스트 키 락의 일부로 사용된다.

Next-Key Locks

레코드 락과 갭 락을 합쳐놓은 형태의 잠금으로 레코드와 그 레코드 앞의 갭 락을 포함한다.
+REPEATABLE READ 격리 수준에서 팬텀 리드를 방지하기 위한 잠금이다.

AUTO-INC Locks

AUTO_INCREMENT 칼림이 사용된 테이블에 동시에 여러 레코드가 INSERT되는 경우, 각 레코드는 중복되지 않고 저장된 순서대로 증가하는 일련번호 값을 가져야 한다.
+InnoDB 는 내부적으로 AUTO-INC 락이라고 하는 테이블 수준의 잠금을 사용한다.
+트랜잭션과 관계 없이 INSERTREPLACE 문장에서 AUTO_INCREMENT 값을 가져오는 순간만 락이 걸렸다가 해제된다.

잠금 예시

-- 레코드는 id 기준 10, 20, 30, 40, 50이 있다고 가정
-- Record Locks: 10에 대해 락이 걸린다.
SELECT * FROM table_name where id = 10 for update;

-- Gap Locks: 51부터 PositiveInfinity까지 락이 걸린다.
SELECT * FROM table_name where id > 100 for update;

-- Next-Key Locks: 21부터 30, 31부터 40에 락이 걸린다.
SELECT * FROM table_name where id BETWEEN 25 AND 35 for update;

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
+Optimistic and Pessimistic record locking, IBM
+MySQL Innodb Locks, cecil1018
+MySQL 8.0 InnoDB Locks, MySQL
+Locks Set by Different SQL Statements in InnoDB, MySQL

+ + \ No newline at end of file diff --git a/page/24.html b/page/24.html index fbfa777f4..277c3b3d4 100644 --- a/page/24.html +++ b/page/24.html @@ -13,36 +13,26 @@ - - + +
-
본문으로 건너뛰기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
-트랜잭션은 작업의 완전성과 데이터의 정합성을 보장해 준다.
-논리적인 작업 셋을 완벽하게 처리하거나, 오류 시 작업의 일부만 적용되는 현상을 막아준다.

트랜잭션의 속성(ACID)

원자성(Atomicity): 트랜잭션 내에서 실행된 작업들은 모두 성공하거나, 실패해야 한다.
-일관성(Consistency): 트랜잭션이 수행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
-격리성(Isolation): 각각의 트랜잭션은 독립적이라 서로에게 영향을 주지 않아야 한다.
-지속성(Durability): 트랜잭션이 성공적으로 완료된다면 영구적으로 결과에 반영되어야 한다.

트랜잭션 주의사항

트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.(트랜잭션의 범위를 최소화하라)
-구현해야 하는 업무에 따라 트랜잭션을 묶거나 트랜잭션에서 제외하고, 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제해야 한다.

왜 네트워크 작업이 있을 때 트랜잭션에서 배제해야 할까? 🤔

데이터의 일관성과 안전성을 보장하기 위해 배제해야 한다.
-네트워크 작업을 트랜잭션 내부에 포함한다면 다음과 같은 문제가 발생할 수 있다.

  • 네트워크 작업이 중간에 실패할 가능성(안전성 X)
  • 통신으로 인해 데이터가 변경될 수 있는 부분(일관성 X)

격리 수준(Isolation level)

여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 데이터의 조회 및 변경을 허용할지 결정하는 것을 말한다.
-격리 수준이 높아질 수록 동시 처리 성능이 떨어지는 것이 일반적이지만, SERIALIZABLE이 아니라면 크게 성능의 저하가 발생하지 않는다.

READ UNCOMMITTED

각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 보인다.
-더티 리드 현상이 발생하기 때문에 정합성의 문제가 많은 격리 수준이다.
-MySQL 사용시 최소 READ COMMITTED 이상의 격리 수준 사용을 권장한다.

READ COMMITTED

트랜잭션에서 데이터를 변경하더라도 COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있다.
-오라클 DBMS에서 기본으로 사용되는 격리 수준이며, 온라인 서비스에서 가장 많이 선택되는 격리 수준이다.
-REPEATABLE READ가 보장되지 않기 때문에 NON-REPEATABLE READ 문제가 발생한다.

REPEATABLE READ

트랜잭션이 시작되기 전에 COMMIT이 완료된 내용에 대해서만 조회할 수 있다.
-MySQL의 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준이다.
-MVCC를 이용해 언두(Undo) 영역에 백업된 이전 데이터를 이용해 동일 트랜잭션 내에서는 동일한 결과를 보여줄 수 있게 보장한다.
-동일한 결과를 보장하는 방법은 다음과 같다.

  • 모든 InnoDB 트랜잭션은 순차적으로 증가하는 고유한 트랜잭션 번호를 가진다.
  • Undo 영역에 백업된 레코드에는 변경을 발생시킨 트랜잭션의 번호가 포함되어있다.
  • Undo 영역의 백업된 데이터는 스토리지 엔진이 불필요하다고 판단하는 경우 삭제된다.
  • REPEATABLE READ 격리 수준에서는 MVCC를 보장하기 위해 가장 오래된 트랜잭션 번호보다 앞선 Undo 영역의 데이터는 삭제하지 않는다.

InnoDB에서는 갭 락과 넥스트 키 락을 이용하여 팬텀 리드 현상을 방지한다.

갭 랍(Gap lock)과 넥스트 키 락(Next-key lock)

갭 락: 레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 락이다.
-넥스트 키 락: 레코드 락과 갭 락을 합쳐놓은 형태의 잠금으로 레코드와 그 레코드 앞의 갭 락을 포함한다.

MVCC(Multi Version Concurrency Control)

동시성을 제어하는 방법 중 하나로 하나의 레코드에 대해 여러 개의 버전이 동시에 관리되는 것이다.

  • PostgreSQL은 다중 버전의 데이터를 저장하는 것으로 MVCC를 구현한다.
  • Oracle, InnoDB는 Undo log를 이용해 이 기능을 구현한다.(최신 버전의 데이터만 DB에 저장)

잠금을 사용하지 않는 읽관된 읽기를 제공하는 것이 목적이다.

SERIALIZABLE

트랜잭션을 순차적으로 진행시키는 격리 수준이고 따라서 동시 처리 성능도 다른 격리 수준보다 떨어진다.
-트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 접근할 수 없고 단순한 읽기 작업도 공유 잠금(읽기 잠금)을 획득해야만 한다.
-InnoDB에서는 팬텀 리드 현상이 REPEATABLE READ 격리 수준에서 발생하지 않기 때문에 굳이 사용할 필요는 없다.

격리 수준에 따른 부정합 문제

격리 수준에 따라 더티 리드, 반복 가능하지 않은 조회, 팬텀 리드 문제가 발생한다.

격리 수준 / 부정합 문제더티 리드반복 가능하지 않은 조회팬텀 리드
READ UNCOMMITTEDOOO
READ COMMITTEDXOO
REPEATABLE READXXO(InnoDB는 X)
SERIALIZABLEXXX

더티 리드(Dirty read)

어떤 트랜잭션에서 처리한 작업이 완료되지 않았어도 다른 트랜잭션에서 볼 수 있는 현상
-트랜잭션 격리 수준이 READ UNCOMMITTED일 때 발생한다.
-예) B가 레코드를 추가하고 커밋을 하지 않았지만, A가 해당 레코드를 조회할 수 있는 경우

반복 가능하지 않은 조회(Non-repeatable read)

한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 현상
-예) A가 레코드를 여러 번 조회하던 중 B가 레코드를 변경하여 A가 조회한 값이 달라지는 경우

팬텀 리드(Phantom read, Phantom row)

한 트랜잭션 내에서 동일한 쿼리 수행시, 수행 결과가 다른 현상
-예) A가 레코드를 조회하고 B가 레코드를 추가하여 A가 다시 조회할 때 존재하지 않은 레코드가 조회되는 경우

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
-Isolation Level, MySQL

- - +
본문으로 건너뛰기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
+MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다.

글로벌 락(Global lock)

MySQL에서 제공하는 잠금 중 가장 넓은 범위를 가지고 있는 잠금이다.

  • 영향을 미치는 범위는 해당 서버 전체이다.
  • 작업 대상 테이블, 데이터베이스 상관 없이 동일하게 영향을 받는다.

한 세션에서 글로벌 락을 획득하면 해제 될 때 까지 조회를 제외한 대부분의 명령이 대기 상태가 된다.
+데이터베이스에 존재하는 MyISAM이나 MEMORY 테이블에 대해 일관된 백업을 받아야할 때 사용한다.
+InnoDB 스토리지 엔진에서는 백업 시 조금 더 가벼운 백업 락을 사용할 수 있다.

-- GLOBAL LOCK
FLUSH TABLES WITH READ LOCK;
-- UNLOCK
UNLOCK TABLES;

-- BACKUP LOCK
LOCK INSTANCE FOR BACKUP;
-- UNLOCK
UNLOCK INSTANCE;
MyISAM

MySQL 5.5 버전 이전의 기본 스토리지 엔진이다.
+트랜잭션을 지원하지 않고, SELECT 작업 속도가 빠르다.

테이블 락(Table lock)

개별 테이블 단위로 설정되는 잠금이다.
+명시적 또는 묵시적으로 특정 테이블의 락을 획득할 수 있다.
+묵시적 락은 MyISAM이나 MEMORY 테이블에 데이터를 변경하는 쿼리를 실행하면 발생한다.
+InnoDB 테이블에는 DML 쿼리는 무시되고 DDL 일 경우에만 묵시적으로 락을 획득한다.

-- TABLE LOCK
LOCK TABLES table_name [ READ | WRITE ]

-- UNLOCK
UNLOCK TABLES;

네임드 락(Named lock)

임의의 문자열에 대한 잠금을 설정할 수 있는 잠금으로 유저 레벨 락으로도 불린다.
+여러 스레드나 프로세스가 동일한 데이터를 수정하려는 경우, 동시에 수정하지 못하도록 보호할 수 있다.

-- aGVyYg== 라는 문자열에 대한 잠금 획득, 이미 잠금을 사용중인 경우 1초 동안만 대기
SELECT GET_LOCK('aGVyYg==', 1);

-- 문자열에 대한 잠금이 설정되어 있는지 확인한다.
SELECT IS_FREE_LOCK('aGVyYg==');

-- 문자열에 대한 잠금을 해제한다.
SELECT RELEASE_LOCK('aGVyYg==');

-- 위 3개 함수 모두 정상적으로 락을 획득하거나 해제한 경우에 1을, 아니면 0을 반환한다.

-- 모든 문자열에 대한 잠금을 해제한다. 해제된 잠금의 개수를 반환한다.
SELECT RELEASE_ALL_LOCKS();

메타데이터 락(Metadata lock)

데이터베이스 객체의 이름이나 구조를 변경하는 경우 획득하는 잠금이다.
+명시적으로 획득 또는 해제 할 수 없지만 테이블의 이름을 변경하는 경우 자동으로 획득한다.
+보통 배치 프로그램에서 실시간으로 테이블을 바꿔야하는 경우에 사용된다.

-- 배치 프로그램에서 별도의 임시 테이블에 서비스용 랭킹 데이터 생성 후 기존 테이블을 백업하는 경우
-- 아래 구문 실행 시 메타데이터 락을 자동으로 획득한다.
RENAME TABLE rank TO rank_backup, rank_new TO rank;

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
+MySQL의 User Level Lock를 활용한다면?, gywndi
+Locking Functions, MySQL 5.7 Reference
+Locking Functions, MySQL 8.0 Reference

+ + \ No newline at end of file diff --git a/page/25.html b/page/25.html index c27d8537d..73d1fa752 100644 --- a/page/25.html +++ b/page/25.html @@ -13,30 +13,36 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
-Gerard Meszaros의 xUnit Test Patterns라는 책에서는 테스트 대역을 다섯 가지(더미, 스텁, 스파이, 목, 페이크)로 구분한다.

테스트 대역의 기본 메커니즘은 다형성을 이용하는 방법이다.
-외부 서비스를 사용하는 코드를 테스트 하는 경우, 인터페이스를 정의하고 외부 서비스 대신 테스트 용도의 구현체를 생성하는 것이다.

테스트 대역의 타입 계층 구조

더미(Dummy)

가장 단순하고, 원시적인 유형의 테스트 대역이다.
-기본적으로 아무 일도 하지 않는 구현체로 인스턴스화가 필요한 경우 사용한다.
-만약 메서드가 무언가 반환을 해야하는 경우 0, null과 같은 값을 반환한다.

스텁(Stub)

시나리오마다 다른 값(미리 준비 된 결과)을 반환한다.
-이를 통해 특정 조건에서 메서드가 예상한대로 동작하는지 확인할 수 있다.

스파이(Spy)

스텁과 유사하지만 호출 여부를 기록하거나 호출할 때 전달한 인자값을 기록할 수 있다.
-예) 메일 전송 기능을 가진 객체를 테스트 대역으로 구현했을 때 메일 전송 횟수를 기록한다.

목, 모의 객체(Mock)

목은 더미, 스텁, 스파이를 포함한다.
-호출 시 사전에 정의된 결과를 반환하고, 예상치 못한 호출이 있을 경우 예외를 던질 수 있다.
-또한 호출에 대한 검증을 할 수 있다.

가짜(Fake)

DOC와 동일한 기능을 제공하지만, 더욱 간단한 방법으로 구현된 것이다.
-예) 실제 데이터베이스와 유사하게 동작하는 가짜 객체를 만들어 테스트할 수 있다.

DOC(depended-on component)

의존 구성 요소, DOC를 테스트 더블로 대체할 수 있다.
-테스트 더블은 DOC와 동일한 API를 제공해야 한다.

상호작용에 따른 목과 스텁 구분

단위 테스트 p.149 에서는 테스트 대역을 크게 목과 스텁으로 구분한다.
-목은 SUT와 관련된 상호작용을 모방하고 검사하는 반면, 스텁은 단순 모방만 한다.

TestDoubleMockStub
포함 유형목, 스파이스텁, 더미, 페이크
용도외부로 나가는 상호작용을 모방하고 검사하는 데 사용내부로 들어오는 상호작용을 모방하는 데 사용
설명SUT가 상태를 변경하기 위한 의존성을 호출하는 것에 해당SUT가 입력 데이터를 얻기 위한 의존성을 호출하는 것에 해당
예시이메일 발송데이터 검색
SUT(system under test)

테스트 대상 시스템
-테스트를 하려는 대상

참고 자료

소프트웨어 장인 정신 이야기 - 3장 고급 테스트 주도 개발, 로버트 C. 마틴
-단위 테스트 - 5장 목과 테스트 취약성, 블라디미르 코리코프
-테스트 주도 개발 시작하기 - 7장 대역, 최범균
-테스트 더블, Martin Fowler
-테스트 관련 용어 정리, Johngrib
-Test Double, Gerard Meszaros

- - +
본문으로 건너뛰기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
+트랜잭션은 작업의 완전성과 데이터의 정합성을 보장해 준다.
+논리적인 작업 셋을 완벽하게 처리하거나, 오류 시 작업의 일부만 적용되는 현상을 막아준다.

트랜잭션의 속성(ACID)

원자성(Atomicity): 트랜잭션 내에서 실행된 작업들은 모두 성공하거나, 실패해야 한다.
+일관성(Consistency): 트랜잭션이 수행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
+격리성(Isolation): 각각의 트랜잭션은 독립적이라 서로에게 영향을 주지 않아야 한다.
+지속성(Durability): 트랜잭션이 성공적으로 완료된다면 영구적으로 결과에 반영되어야 한다.

트랜잭션 주의사항

트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.(트랜잭션의 범위를 최소화하라)
+구현해야 하는 업무에 따라 트랜잭션을 묶거나 트랜잭션에서 제외하고, 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제해야 한다.

왜 네트워크 작업이 있을 때 트랜잭션에서 배제해야 할까? 🤔

데이터의 일관성과 안전성을 보장하기 위해 배제해야 한다.
+네트워크 작업을 트랜잭션 내부에 포함한다면 다음과 같은 문제가 발생할 수 있다.

  • 네트워크 작업이 중간에 실패할 가능성(안전성 X)
  • 통신으로 인해 데이터가 변경될 수 있는 부분(일관성 X)

격리 수준(Isolation level)

여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 데이터의 조회 및 변경을 허용할지 결정하는 것을 말한다.
+격리 수준이 높아질 수록 동시 처리 성능이 떨어지는 것이 일반적이지만, SERIALIZABLE이 아니라면 크게 성능의 저하가 발생하지 않는다.

READ UNCOMMITTED

각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 보인다.
+더티 리드 현상이 발생하기 때문에 정합성의 문제가 많은 격리 수준이다.
+MySQL 사용시 최소 READ COMMITTED 이상의 격리 수준 사용을 권장한다.

READ COMMITTED

트랜잭션에서 데이터를 변경하더라도 COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있다.
+오라클 DBMS에서 기본으로 사용되는 격리 수준이며, 온라인 서비스에서 가장 많이 선택되는 격리 수준이다.
+REPEATABLE READ가 보장되지 않기 때문에 NON-REPEATABLE READ 문제가 발생한다.

REPEATABLE READ

트랜잭션이 시작되기 전에 COMMIT이 완료된 내용에 대해서만 조회할 수 있다.
+MySQL의 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준이다.
+MVCC를 이용해 언두(Undo) 영역에 백업된 이전 데이터를 이용해 동일 트랜잭션 내에서는 동일한 결과를 보여줄 수 있게 보장한다.
+동일한 결과를 보장하는 방법은 다음과 같다.

  • 모든 InnoDB 트랜잭션은 순차적으로 증가하는 고유한 트랜잭션 번호를 가진다.
  • Undo 영역에 백업된 레코드에는 변경을 발생시킨 트랜잭션의 번호가 포함되어있다.
  • Undo 영역의 백업된 데이터는 스토리지 엔진이 불필요하다고 판단하는 경우 삭제된다.
  • REPEATABLE READ 격리 수준에서는 MVCC를 보장하기 위해 가장 오래된 트랜잭션 번호보다 앞선 Undo 영역의 데이터는 삭제하지 않는다.

InnoDB에서는 갭 락과 넥스트 키 락을 이용하여 팬텀 리드 현상을 방지한다.

갭 랍(Gap lock)과 넥스트 키 락(Next-key lock)

갭 락: 레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 락이다.
+넥스트 키 락: 레코드 락과 갭 락을 합쳐놓은 형태의 잠금으로 레코드와 그 레코드 앞의 갭 락을 포함한다.

MVCC(Multi Version Concurrency Control)

동시성을 제어하는 방법 중 하나로 하나의 레코드에 대해 여러 개의 버전이 동시에 관리되는 것이다.

  • PostgreSQL은 다중 버전의 데이터를 저장하는 것으로 MVCC를 구현한다.
  • Oracle, InnoDB는 Undo log를 이용해 이 기능을 구현한다.(최신 버전의 데이터만 DB에 저장)

잠금을 사용하지 않는 읽관된 읽기를 제공하는 것이 목적이다.

SERIALIZABLE

트랜잭션을 순차적으로 진행시키는 격리 수준이고 따라서 동시 처리 성능도 다른 격리 수준보다 떨어진다.
+트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 접근할 수 없고 단순한 읽기 작업도 공유 잠금(읽기 잠금)을 획득해야만 한다.
+InnoDB에서는 팬텀 리드 현상이 REPEATABLE READ 격리 수준에서 발생하지 않기 때문에 굳이 사용할 필요는 없다.

격리 수준에 따른 부정합 문제

격리 수준에 따라 더티 리드, 반복 가능하지 않은 조회, 팬텀 리드 문제가 발생한다.

격리 수준 / 부정합 문제더티 리드반복 가능하지 않은 조회팬텀 리드
READ UNCOMMITTEDOOO
READ COMMITTEDXOO
REPEATABLE READXXO(InnoDB는 X)
SERIALIZABLEXXX

더티 리드(Dirty read)

어떤 트랜잭션에서 처리한 작업이 완료되지 않았어도 다른 트랜잭션에서 볼 수 있는 현상
+트랜잭션 격리 수준이 READ UNCOMMITTED일 때 발생한다.
+예) B가 레코드를 추가하고 커밋을 하지 않았지만, A가 해당 레코드를 조회할 수 있는 경우

반복 가능하지 않은 조회(Non-repeatable read)

한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 현상
+예) A가 레코드를 여러 번 조회하던 중 B가 레코드를 변경하여 A가 조회한 값이 달라지는 경우

팬텀 리드(Phantom read, Phantom row)

한 트랜잭션 내에서 동일한 쿼리 수행시, 수행 결과가 다른 현상
+예) A가 레코드를 조회하고 B가 레코드를 추가하여 A가 다시 조회할 때 존재하지 않은 레코드가 조회되는 경우

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
+Isolation Level, MySQL

+ + \ No newline at end of file diff --git a/page/26.html b/page/26.html index 1c1085434..90cda3154 100644 --- a/page/26.html +++ b/page/26.html @@ -13,30 +13,30 @@ - - + +
-
본문으로 건너뛰기

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
-컴파일된 클래스파일은 어떤 구조로 되어있을까?

클래스 파일의 데이터 형식

8비트 바이트의 스트림으로 구성된다.
-16비트 및 32비트의 데이터는 각각 2개, 4개의 연속된 8비트를 읽어서 구성된다.
-멀티바이트의 경우 항상 big endian 순서로 저장된다.

u1 → unsigned 1byte
-u2 → unsigned 2byte
-u4 → unsigned 4byte

클래스 파일 구조

ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}

매직넘버

모든 클래스 파일은 0xCAFEBABE라는 매직넘버로 시작한다.
-보통 매직넘버는 파일 종류를 식별하는 용도로 사용된다.

클래스 파일 포맷 버전

클래스 파일 버전 값은 클래스로더의 호환성 보장을 위해 꼭 필요한 값이다.

  • Java 17 버전으로 빌드한다면 class version 61 ex) 00 00 00 3D

호환되지 않는 버전의 클래스 파일을 로딩하려고 하는 경우 런타임에 UnsupportedClassVersionError 예외가 발생한다.

class file format major versions

Java SEReleasedMajorSupported majors
8March 20145245 .. 52
9September 20175345 .. 53
10March 20185445 .. 54
11September 20185545 .. 55
12March 20195645 .. 56
13September 20195745 .. 57
14March 20205845 .. 58
15September 20205945 .. 59
16March 20216045 .. 60
17September 20216145 .. 61

상수 풀

2바이트의 상수의 개수값이 먼저오고 그 뒤로 코드에 등장하는 상수값이 모여있다.
-클래스명, 상수명, 상수 값, 필드명, 메서드명과 같은 값들이 존재한다.
-JVM은 코드 실행 시 런타임에 배치된 메모리가 아니라, 해당 상수 풀 테이블을 찾아보고 필요한 값을 참조한다.

액세스 플래그

클래스, 인터페이스와 같은 파일의 속성을 표시한다.
-예를 들어 public interface로 정의된 인터페이스의 플래그는 0x0601이다.

  • 계산은 다음과 같이 이루어진다. ACC_PUBLIC xor ACC_INTERFACE xor ACC_ABSTRACT

공식문서에 들어가면 각 플래그에 대한 설명 + 플래그 설정시 동시에 설정되면 안되는 플래그와 같은 설명이 자세하게 나와있다.

Class access and property modifiers

Flag NameValueInterpretation
ACC_PUBLIC0x0001Declared public; may be accessed from outside its package.
ACC_FINAL0x0010Declared final; no subclasses allowed.
ACC_SUPER0x0020Treat superclass methods specially when invoked by the invokespecial instruction.
ACC_INTERFACE0x0200Is an interface, not a class.
ACC_ABSTRACT0x0400Declared abstract; must not be instantiated.
ACC_SYNTHETIC0x1000Declared synthetic; not present in the source code.
ACC_ANNOTATION0x2000Declared as an annotation type.
ACC_ENUM0x4000Declared as an enum type.
ACC_MODULE0x8000Is a module, not a class or interface.

this_class

클래스명과 같은 이름을 표현하는 값으로, 상수 풀에서 클래스명과 일치하는 항목의 인덱스를 참조한다.
-해당 인덱스의 항목은 CONSTANT_Class_infoclass 형식의 값이어야 한다.

super_class

상수 풀에서 슈퍼 클래스의 이름과 일치하는 항목의 인덱스를 참조한다.
-아무것도 상속하지 않는 클래스의 경우 java.lang.Object의 인덱스 값이 들어있다.

interface, field, method

각각의 개수와, 정보에 대한 값이 들어있다.
-interface, field, method를 표시하는 방법이 각각 다르고, 접근자에 대한 플래그도 각각 다르다.

attributes

해당 클래스 파일에서 사용하는 추가 정보의 모음이다. 예) 소스파일명
-정해진 클래스 파일의 구조를 확장하는 역할을 한다.

클래스 파일 확인하면서 사용한 툴

IntelliJ plugin - BinEd
-IntelliJ plugin - jclasslib Bytecode Viewer

참고 자료

2장 JVM 이야기, 자바 최적화
-Class file in Java, File Format
-java se11 Class 파일 형식, Oracle
-java se17 Class 파일 형식, Oracle

- - +
본문으로 건너뛰기

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
+Gerard Meszaros의 xUnit Test Patterns라는 책에서는 테스트 대역을 다섯 가지(더미, 스텁, 스파이, 목, 페이크)로 구분한다.

테스트 대역의 기본 메커니즘은 다형성을 이용하는 방법이다.
+외부 서비스를 사용하는 코드를 테스트 하는 경우, 인터페이스를 정의하고 외부 서비스 대신 테스트 용도의 구현체를 생성하는 것이다.

테스트 대역의 타입 계층 구조

더미(Dummy)

가장 단순하고, 원시적인 유형의 테스트 대역이다.
+기본적으로 아무 일도 하지 않는 구현체로 인스턴스화가 필요한 경우 사용한다.
+만약 메서드가 무언가 반환을 해야하는 경우 0, null과 같은 값을 반환한다.

스텁(Stub)

시나리오마다 다른 값(미리 준비 된 결과)을 반환한다.
+이를 통해 특정 조건에서 메서드가 예상한대로 동작하는지 확인할 수 있다.

스파이(Spy)

스텁과 유사하지만 호출 여부를 기록하거나 호출할 때 전달한 인자값을 기록할 수 있다.
+예) 메일 전송 기능을 가진 객체를 테스트 대역으로 구현했을 때 메일 전송 횟수를 기록한다.

목, 모의 객체(Mock)

목은 더미, 스텁, 스파이를 포함한다.
+호출 시 사전에 정의된 결과를 반환하고, 예상치 못한 호출이 있을 경우 예외를 던질 수 있다.
+또한 호출에 대한 검증을 할 수 있다.

가짜(Fake)

DOC와 동일한 기능을 제공하지만, 더욱 간단한 방법으로 구현된 것이다.
+예) 실제 데이터베이스와 유사하게 동작하는 가짜 객체를 만들어 테스트할 수 있다.

DOC(depended-on component)

의존 구성 요소, DOC를 테스트 더블로 대체할 수 있다.
+테스트 더블은 DOC와 동일한 API를 제공해야 한다.

상호작용에 따른 목과 스텁 구분

단위 테스트 p.149 에서는 테스트 대역을 크게 목과 스텁으로 구분한다.
+목은 SUT와 관련된 상호작용을 모방하고 검사하는 반면, 스텁은 단순 모방만 한다.

TestDoubleMockStub
포함 유형목, 스파이스텁, 더미, 페이크
용도외부로 나가는 상호작용을 모방하고 검사하는 데 사용내부로 들어오는 상호작용을 모방하는 데 사용
설명SUT가 상태를 변경하기 위한 의존성을 호출하는 것에 해당SUT가 입력 데이터를 얻기 위한 의존성을 호출하는 것에 해당
예시이메일 발송데이터 검색
SUT(system under test)

테스트 대상 시스템
+테스트를 하려는 대상

참고 자료

소프트웨어 장인 정신 이야기 - 3장 고급 테스트 주도 개발, 로버트 C. 마틴
+단위 테스트 - 5장 목과 테스트 취약성, 블라디미르 코리코프
+테스트 주도 개발 시작하기 - 7장 대역, 최범균
+테스트 더블, Martin Fowler
+테스트 관련 용어 정리, Johngrib
+Test Double, Gerard Meszaros

+ + \ No newline at end of file diff --git a/page/27.html b/page/27.html index 20449459f..8065ce751 100644 --- a/page/27.html +++ b/page/27.html @@ -13,24 +13,30 @@ - - + +
-
본문으로 건너뛰기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
-이 때 JDBC를 사용할 때 데이터베이스의 커넥션을 얻고, try-with-resource를 사용하는 부분이 반복되었다.
-템플릿 콜백 패턴을 이용하여 나만의 JdbcTemplate을 만들어보았다.

기존 코드

public class User {
private final int id;
private final String name;

public User(final int id, final String name) {
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

public String getName() {
return name;
}
}

SELECT, DELETE 중복 제거

변하지 않는 부분: try-with-resource, preparedStatement를 사용하는 부분, executeUpdate로 실행 등등
-변하는 부분: SQL Query, 매개변수

다음과 같이 쿼리를 실행하는 부분을 분리하고 가변인수를 사용한다면 SELECT와 DELETE의 중복을 제거할 수 있다.

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
executeUpdate(query, userId);
}

private void executeUpdate(final String query, final Object... parameters) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
preparedStatement.executeUpdate();
} catch (final SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

조회 분리하기 - 1. 콜백을 위한 인터페이스 정의

조회는 INSERT, DELETE와 달리 값을 반환받아야 하기 때문에 다른 방법을 사용해야 한다.
-이 때 콜백이라는 것을 사용하여 중복을 제거할 수 있다.

콜백(Callback)

프로그래밍에서 콜백은 다른 코드의 인수로 넘겨주는 실행 가능한 코드를 뜻한다.
-자바에서는 람다나 익명 클래스를 넘겨서 사용할 수 있다.

데이터베이스에서 값을 조회하고, 해당 값을 객체로 매핑하여 값을 반환해야 한다.
-executeQuery로 조회한 값은 ResultSet 안에 들어가있다.
-이를 원하는 타입의 값으로 변환해야하니 일단 콜백을 위한 인터페이스를 만들어야 한다.

@FunctionalInterface
public interface RowMapper {
User mapRow(final ResultSet resultSet) throws SQLException;
}

조회 분리하기 - 2. 단건 조회

위에서 정의한 RowMapper를 메서드에서 어떻게 사용해야 할까?
-아래와 같이 SQL 쿼리, RowMapper, 파라미터를 분리한 메서드에 넘겨주고 쿼리 실행 후 매핑한 값을 반환하도록 한다.

public User findById(final int userId) {
final String query = "SELECT * FROM user WHERE id = ?";
return queryForSingleResult(query, resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
}, userId);
}

private User queryForSingleResult(
final String query,
final RowMapper rowMapper,
final Object... parameters
) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query);
final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {
if (resultSet.next()) {
return rowMapper.mapRow(resultSet);
}
return null;
} catch (SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

private ResultSet executeQuery(
final PreparedStatement preparedStatement,
final Object[] parameters) throws SQLException {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
return preparedStatement.executeQuery();
}

조회 분리하기 - 3. 다건 조회

단건 조회와 유사하다.

public List<User> findAll() {
final String query = "SELECT * FROM user";
return query(query, resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
});
}

private List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query);
final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {
final List<User> result = new ArrayList<>();
while (resultSet.next()) {
result.add(rowMapper.mapRow(resultSet));
}
return result;
} catch (SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

private ResultSet executeQuery(
final PreparedStatement preparedStatement,
final Object[] parameters) throws SQLException {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
return preparedStatement.executeQuery();
}

제네릭 사용하기

위의 코드는 User를 조회할 때만 사용할 수 있다.
-아래와 같이 제네릭을 적용하여 다른 Dao에서도 사용 가능하도록 변경할 수 있다.

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(final ResultSet resultSet) throws SQLException;
}

private <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}
private <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}

메서드 분리한 부분 클래스로 분리하기 + Optional 사용하기

메서드로 분리한 부분을 JdbcTemplate이라는 클래스를 만들어 옮긴다.
-또한 null을 반환하기 보단 Optional로 감싸서 반환하도록 변경한다.
-최종적으로 아래와 같은 코드가 완성된다.

public class UserDao {
private final RowMapper<User> rowMapper = resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
};
private final JdbcTemplate jdbcTemplate;

public UserDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
jdbcTemplate.executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
jdbcTemplate.executeUpdate(query, userId);
}

public Optional<User> findById(final int userId) {
final String query = "SELECT * FROM user WHERE id = ?";
return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);
}

public List<User> findAll() {
final String query = "SELECT * FROM user";
return jdbcTemplate.query(query, rowMapper);
}
}
- - +
본문으로 건너뛰기

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
+컴파일된 클래스파일은 어떤 구조로 되어있을까?

클래스 파일의 데이터 형식

8비트 바이트의 스트림으로 구성된다.
+16비트 및 32비트의 데이터는 각각 2개, 4개의 연속된 8비트를 읽어서 구성된다.
+멀티바이트의 경우 항상 big endian 순서로 저장된다.

u1 → unsigned 1byte
+u2 → unsigned 2byte
+u4 → unsigned 4byte

클래스 파일 구조

ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}

매직넘버

모든 클래스 파일은 0xCAFEBABE라는 매직넘버로 시작한다.
+보통 매직넘버는 파일 종류를 식별하는 용도로 사용된다.

클래스 파일 포맷 버전

클래스 파일 버전 값은 클래스로더의 호환성 보장을 위해 꼭 필요한 값이다.

  • Java 17 버전으로 빌드한다면 class version 61 ex) 00 00 00 3D

호환되지 않는 버전의 클래스 파일을 로딩하려고 하는 경우 런타임에 UnsupportedClassVersionError 예외가 발생한다.

class file format major versions

Java SEReleasedMajorSupported majors
8March 20145245 .. 52
9September 20175345 .. 53
10March 20185445 .. 54
11September 20185545 .. 55
12March 20195645 .. 56
13September 20195745 .. 57
14March 20205845 .. 58
15September 20205945 .. 59
16March 20216045 .. 60
17September 20216145 .. 61

상수 풀

2바이트의 상수의 개수값이 먼저오고 그 뒤로 코드에 등장하는 상수값이 모여있다.
+클래스명, 상수명, 상수 값, 필드명, 메서드명과 같은 값들이 존재한다.
+JVM은 코드 실행 시 런타임에 배치된 메모리가 아니라, 해당 상수 풀 테이블을 찾아보고 필요한 값을 참조한다.

액세스 플래그

클래스, 인터페이스와 같은 파일의 속성을 표시한다.
+예를 들어 public interface로 정의된 인터페이스의 플래그는 0x0601이다.

  • 계산은 다음과 같이 이루어진다. ACC_PUBLIC xor ACC_INTERFACE xor ACC_ABSTRACT

공식문서에 들어가면 각 플래그에 대한 설명 + 플래그 설정시 동시에 설정되면 안되는 플래그와 같은 설명이 자세하게 나와있다.

Class access and property modifiers

Flag NameValueInterpretation
ACC_PUBLIC0x0001Declared public; may be accessed from outside its package.
ACC_FINAL0x0010Declared final; no subclasses allowed.
ACC_SUPER0x0020Treat superclass methods specially when invoked by the invokespecial instruction.
ACC_INTERFACE0x0200Is an interface, not a class.
ACC_ABSTRACT0x0400Declared abstract; must not be instantiated.
ACC_SYNTHETIC0x1000Declared synthetic; not present in the source code.
ACC_ANNOTATION0x2000Declared as an annotation type.
ACC_ENUM0x4000Declared as an enum type.
ACC_MODULE0x8000Is a module, not a class or interface.

this_class

클래스명과 같은 이름을 표현하는 값으로, 상수 풀에서 클래스명과 일치하는 항목의 인덱스를 참조한다.
+해당 인덱스의 항목은 CONSTANT_Class_infoclass 형식의 값이어야 한다.

super_class

상수 풀에서 슈퍼 클래스의 이름과 일치하는 항목의 인덱스를 참조한다.
+아무것도 상속하지 않는 클래스의 경우 java.lang.Object의 인덱스 값이 들어있다.

interface, field, method

각각의 개수와, 정보에 대한 값이 들어있다.
+interface, field, method를 표시하는 방법이 각각 다르고, 접근자에 대한 플래그도 각각 다르다.

attributes

해당 클래스 파일에서 사용하는 추가 정보의 모음이다. 예) 소스파일명
+정해진 클래스 파일의 구조를 확장하는 역할을 한다.

클래스 파일 확인하면서 사용한 툴

IntelliJ plugin - BinEd
+IntelliJ plugin - jclasslib Bytecode Viewer

참고 자료

2장 JVM 이야기, 자바 최적화
+Class file in Java, File Format
+java se11 Class 파일 형식, Oracle
+java se17 Class 파일 형식, Oracle

+ + \ No newline at end of file diff --git a/page/28.html b/page/28.html index bcd8199c8..373814c05 100644 --- a/page/28.html +++ b/page/28.html @@ -13,44 +13,24 @@ - - + +
-
본문으로 건너뛰기

· 약 8분

레벨 1이 끝났다.
-우테코를 시작하기 전 내가 정해두었던 목표 이상으로 달성했기 때문에 매우 만족스럽다.
-혼자 독학을 할 땐 이 방향으로 공부하는 게 맞는지 계속 반추하다 결국 무기력함에 빠져들었다.
-하지만 이제는 같이 공부할 사람도 있고, 이야기할 사람도 있기 때문에 즐기는 일만 남은 것 같다.

Keep

나만의 루틴 만들기

스스로가 외부의 영향을 많이 받는다고 생각한다.
-최대한 꾸준히 할 수 있는 시간을 만드는 것이 중요하다고 생각한다.

매일 8시에 도착하여 아침에 해야 할 일을 정리하거나, 우선순위에 따라 처리하고
-소화능력이 부족하기 때문에 점심은 도시락(그래봤자 계란2개)을 준비하고
-항상 똑같은 컨디션을 유지하기 위해 항상 6시에 집에 간다.
-이제 바빠질 테니 일찍 집에 가는 일은 어쩔 수 없이 줄어들겠지만😢

선택도 비용이다. 앞으로 의사결정이 필요 없는 부분을 최대한 많이 만들어야겠다.

크루들과 친하게 지내기

10명 정도의 크루의 닉네임을 외우고 친하게 지낸다면 성공적이라고 생각했었다.
-하다 보니 더 많은 크루들의 닉네임을 외운 것 같다.
-앞으로도 크루들과 친하게 지내고 아무 때나 말을 걸 수 있는 크루가 늘어나길 :)

글쓰기

글을 잘 쓰는 편은 아니지만 꾸준히 작성하려고 노력했다.
-매 미션마다 회고를 작성하니 생각도 정리되고 개선점도 찾을 수 있어서 좋았다.

우아한테크코스에는 레벨마다 글쓰기를 진행하는데, 운이 좋게 글쓰기 상을 받았다.
-사실 겉으로 드러내지 않았지만 꼭 받아보고 싶었다.
-글쓰기 조원, 투표해 준 크루들에게 너무 감사하다.

코드 리뷰 스터디

누누, 주노, 다즐, 말랑, 박스터, 오잉, 깃짱와 코드 리뷰 스터디를 진행했다.
-과연 도움이 될까 생각했지만 결과적으로는 코드 리뷰를 하면서 성장을 많이 한 것 같다.
-투자한 시간 대비 가성비가 좋은 활동이었다.
-누누가 스터디장인데 과연 꾸준히 이어나가려나?

레벨 인터뷰

인터뷰할 때 많이 떨지 않아서 좋았다.
-남들 앞에서 이야기를 하거나, 면접을 보면 항상 엄청 떨어서 걱정했는데
-기술적인 질문을 받았을 때 떨지 않고 잘 대답할 수 있었다.
-우아한테크코스 생활을 하면서 다른 크루가 질문했을 때, 최대한 이해하기 쉽게 설명하려고 했던 경험이 도움이 된 것 같다.
-이후 레벨 인터뷰를 진행할 때 다음과 같은 부분을 고려하면 더 좋을 것 같다.

  • 대답하면서 질문을 계속 생각하며 잊어버리지 말기
  • 두괄식 표현
  • 설명하다가 잘못 설명한 것 같으면 다 끊고 다시 이야기해도 될지 물어보기
  • 설명할 수 있을만큼 시간 충분히 가지기
  • 인터뷰어의 질문 의도를 명확히 이해하지 못했다면 의도 다시 물어보기
  • 끝맺는 부분 연습하기(자신감 있게)
  • 기술적인 집착가지기
  • 기술적인 부분을 꼼꼼히 준비했으면 협업 관련 질문도 준비하기

Problem

페어프로그래밍

우아한테크코스를 진행하면서 가장 어려운 활동 중 하나라고 생각한다.
-페어는 매번 바뀌고, 미션의 복잡도도 증가하기 때문인 것 같다.
-소통 능력, 시간관리가 부족했고, 만족스럽지 않았다.
-하지만 페어를 진행하고, 회고를 하다 보니 나만의 노하우가 쌓이는 느낌이다.
-레벨 2에서는 부족했던 부분을 개선하여 함께하고 싶은 페어가 되고 싶다.

집중하는 시간⏱️ 부족

레벨 1을 진행하면서 집중하는 시간이 많이 부족했다.
-이른 아침과 오후에 개인적으로 집중할 수 있는 공간을 예약해서 온전히 나만의 시간을 가져야겠다.

Try

허브🌿와의 티타임?

소프트 스킬을 늘릴 방법을 생각하다가 대화를 나누지 못한 다른 크루들과 깜짝 커피챗을 하면 어떨까 생각했다.
-예를 들어 잡담방에 저와 커피챗 하실 분 :) 하면서 올릴 수 있을 것 같다.
-참여하는 사람이 있을지, 안 좋게 보는 게 아닐지 걱정되지만 그래도 재밌을 것 같다.
-저랑 허브티 한잔 하실래요?

기술적인 부분

우아한테크코스 생활을 하면서 소프트 스킬에 조금 더 무게를 두다 보니 이론적인 부분이 부족할 수 있다고 생각했다.
-시간의 여유가 될 때 책을 조금씩 읽어야겠다.
-블로그에 기술적인 부분을 많이 정리하지 않았는데, 조금 더 깊게 공부하고 정리하는 시간도 가져야겠다.

레벨 1을 마무리하며

시간이 빠르게 흘러갔다.
-타인에게 좋은 영향을 주기위해, 방학동안 나를 챙기는 시간을 가져야겠다.
-또한 함께 일하고 싶은 사람을 목표로 앞으로도 꾸준히 의식적 노력을 해야겠다.

- - +
본문으로 건너뛰기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
+이 때 JDBC를 사용할 때 데이터베이스의 커넥션을 얻고, try-with-resource를 사용하는 부분이 반복되었다.
+템플릿 콜백 패턴을 이용하여 나만의 JdbcTemplate을 만들어보았다.

기존 코드

public class User {
private final int id;
private final String name;

public User(final int id, final String name) {
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

public String getName() {
return name;
}
}

SELECT, DELETE 중복 제거

변하지 않는 부분: try-with-resource, preparedStatement를 사용하는 부분, executeUpdate로 실행 등등
+변하는 부분: SQL Query, 매개변수

다음과 같이 쿼리를 실행하는 부분을 분리하고 가변인수를 사용한다면 SELECT와 DELETE의 중복을 제거할 수 있다.

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
executeUpdate(query, userId);
}

private void executeUpdate(final String query, final Object... parameters) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
preparedStatement.executeUpdate();
} catch (final SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

조회 분리하기 - 1. 콜백을 위한 인터페이스 정의

조회는 INSERT, DELETE와 달리 값을 반환받아야 하기 때문에 다른 방법을 사용해야 한다.
+이 때 콜백이라는 것을 사용하여 중복을 제거할 수 있다.

콜백(Callback)

프로그래밍에서 콜백은 다른 코드의 인수로 넘겨주는 실행 가능한 코드를 뜻한다.
+자바에서는 람다나 익명 클래스를 넘겨서 사용할 수 있다.

데이터베이스에서 값을 조회하고, 해당 값을 객체로 매핑하여 값을 반환해야 한다.
+executeQuery로 조회한 값은 ResultSet 안에 들어가있다.
+이를 원하는 타입의 값으로 변환해야하니 일단 콜백을 위한 인터페이스를 만들어야 한다.

@FunctionalInterface
public interface RowMapper {
User mapRow(final ResultSet resultSet) throws SQLException;
}

조회 분리하기 - 2. 단건 조회

위에서 정의한 RowMapper를 메서드에서 어떻게 사용해야 할까?
+아래와 같이 SQL 쿼리, RowMapper, 파라미터를 분리한 메서드에 넘겨주고 쿼리 실행 후 매핑한 값을 반환하도록 한다.

public User findById(final int userId) {
final String query = "SELECT * FROM user WHERE id = ?";
return queryForSingleResult(query, resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
}, userId);
}

private User queryForSingleResult(
final String query,
final RowMapper rowMapper,
final Object... parameters
) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query);
final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {
if (resultSet.next()) {
return rowMapper.mapRow(resultSet);
}
return null;
} catch (SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

private ResultSet executeQuery(
final PreparedStatement preparedStatement,
final Object[] parameters) throws SQLException {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
return preparedStatement.executeQuery();
}

조회 분리하기 - 3. 다건 조회

단건 조회와 유사하다.

public List<User> findAll() {
final String query = "SELECT * FROM user";
return query(query, resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
});
}

private List<User> query(final String query, final RowMapper rowMapper, final Object... parameters) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query);
final ResultSet resultSet = executeQuery(preparedStatement, parameters)) {
final List<User> result = new ArrayList<>();
while (resultSet.next()) {
result.add(rowMapper.mapRow(resultSet));
}
return result;
} catch (SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

private ResultSet executeQuery(
final PreparedStatement preparedStatement,
final Object[] parameters) throws SQLException {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
return preparedStatement.executeQuery();
}

제네릭 사용하기

위의 코드는 User를 조회할 때만 사용할 수 있다.
+아래와 같이 제네릭을 적용하여 다른 Dao에서도 사용 가능하도록 변경할 수 있다.

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(final ResultSet resultSet) throws SQLException;
}

private <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}
private <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}

메서드 분리한 부분 클래스로 분리하기 + Optional 사용하기

메서드로 분리한 부분을 JdbcTemplate이라는 클래스를 만들어 옮긴다.
+또한 null을 반환하기 보단 Optional로 감싸서 반환하도록 변경한다.
+최종적으로 아래와 같은 코드가 완성된다.

public class UserDao {
private final RowMapper<User> rowMapper = resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
};
private final JdbcTemplate jdbcTemplate;

public UserDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
jdbcTemplate.executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
jdbcTemplate.executeUpdate(query, userId);
}

public Optional<User> findById(final int userId) {
final String query = "SELECT * FROM user WHERE id = ?";
return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);
}

public List<User> findAll() {
final String query = "SELECT * FROM user";
return jdbcTemplate.query(query, rowMapper);
}
}
+ + \ No newline at end of file diff --git a/page/29.html b/page/29.html index 84070fcd2..89df7f480 100644 --- a/page/29.html +++ b/page/29.html @@ -13,47 +13,44 @@ - - + +
-
본문으로 건너뛰기

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
-체스는 이전 미션들보다 훨씬 복잡한 도메인이었다.
-하지만 가비와 나는 체스 도메인이 익숙해서 더 편한 마음으로 시작할 수 있었다.
-미션을 진행하면서 어려웠던 부분은 기물의 이동, 이동시 경로에 기물이 존재하는지 확인하는 부분이었다.

가비가 집에가서도 기물의 이동 관련해 생각 정리한 글을 보내줘서 더욱 빨리 진행할 수 있었다.
-최종적으로 결정한 부분은 다음과 같다.

각 기물의 이동 가능여부
-Rank와 File은 각각 위치값을 가지고 있고, 값의 차이를 이용해서 각 기물의 이동 가능 여부를 계산했다.
-직선 → Rank와 File 차이 중 하나가 0이어야 한다.
-대각선 → Rank와 File 차이의 절대값이 같아야 한다. ex) abs(-2) == abs(2)
-나이트 → 차이의 절대값이 하나는 2 나머지 하나는 1이어야 한다.

도착 칸의 기물 여부
-아군 → 이동이 불가능하다.
-적군 → 이동이 가능하다. 적군을 잡는다.

중간에 기물 존재 여부
-이동 경로에 기물이 존재하면 안된다.

데이터베이스 사용
-체스 미션은 특별하게 데이터베이스와 연결하는 부분이 있었다.
-체스 게임의 상태를 다음의 두가지 방법으로 정할 수 있다고 생각했다.

  • 기물 전체를 저장하는 방법
  • 기보를 저장하고 게임을 불러와 기보대로 이동시키는 방법

기물이 이동할 때마다 값을 저장하고 싶었고, 기보를 저장하는 방법을 선택했다.
-기물 전체를 저장하지 않은 이유는 다음과 같다.

  • 턴과 같은 부가적인 요소를 저장해야 한다.
  • 이동을 할 때 기물이 잡히는 경우 update 쿼리(이동 기물)와 delete(잡힌 기물) 2개의 쿼리를 날려야 한다.
  • 현재 구조에서 도메인의 변경이 크게(초기 상태를 구성하는 부분) 일어나야 한다.

정리하자면 기물 전체 저장과 기보 저장은 다음과 차이가 있다.
-보드저장: 초기상태에서 32개의 Insert 쿼리(기물의 위치) + 기물 이동 시 움직임 변경(잡히는 경우 2개의 쿼리)
-기보저장: 초기상태 애플리케이션에서 구성 + 저장된 기보를 select 쿼리로 조회해서 사용(1회) + insert 쿼리(이동 당 1회)

추가로 기보저장이 구현도 더욱 간단하다. 👍

부가적인 부분

리뷰어인 찰리🍫가 동시에 여러 게임이 진행된다면 어떨지? 에 대한 코멘트를 남겨주셔서 다양한 시도를 해봤다.

  • 누누의 도움으로 ConnectionPool 구현
  • ThreadLocal 사용해서 쓰레드 별 세션 관리
  • 실제로 애플리케이션 내에서 체스 게임이 진행되는 Board를 ConcurrentHashMap으로 저장(사실 이 부분은 현재 구조에서 필요없지만 2명이 서로 게임하는 경우를 생각해서 넣어보았다.)

두 명이 서로 같은 방에 입장하여 게임을 진행한다면 출력하는 부분이 까다로워질 것 같다고 예상되어(Board에 옵저버 패턴을 사용해야되나?) 해볼 엄두가 나지 않았다.

부족했던 부분

꼼꼼하게 코드를 작성하지 못한 부분
-DB 관련 부분을 꼼꼼하게 코딩을 하지 못했다.
-도메인 로직에만 집중하다보니 정적 중요한 DB의 코드의 예외처리, 빈 값을 반환 하는 부분을 꼼꼼하게 처리하지 못했다.
-하지만 찰리의 꼼꼼한 리뷰로 DB부분과 나만의 JdbcTemplate을 깔끔하게 구현할 수 있었다.

시간에 대한 부담감
-초반에는 여유롭지만 제출 마감에 가까워질 수록 사람이 급해지는 것 같다.
-다음 페어프로그래밍할 땐 속도를 조절하고, 마음에 여유를 가져야겠다.

새로 학습한 부분

DAO 중복 제거

프롤로그에 을 작성했다.
-DAO를 작성하는데 try-catch-resources와 여러 코드가 중복되서 제거하고싶었다.
-템플릿 콜백 패턴으로 깔끔하게 중복을 제거할 수 있었다.👍

페어에게 배울 부분

페어 생각하기
-가비는 누구보다 페어를 생각하고, 배려해주는 페어였다.
-중간 중간 당 떨어질까봐 걱정도 해주고, 나의 컨디션도 확인해줬다!

미션 몰입하기
-최근에 미션에 잘 몰입하지 못했다.
-가비는 페어를 진행할 때 미션에 대한 몰입도가 매우 좋았다.
-집에가서도 체스 이동에 대한 로직을 어떻게 구현할 지 생각한 뒤 꼼꼼해서 정리해서 나에게 보내주었다.
-덕분에 나도 가비의 생각을 알 수 있어서 미션을 진행하는데 가속도가 붙은 것 같다.
-또한 미션을 잘 마무리하고 싶은 마음이 전달되서 그런지 나도 덩달아 열심히 미션을 할 수 있었다.😄

솔직함
-먼저 회고하자고 말 걸어줘서 정말 고마웠다고 표현해주는 부분
-모르는게 있으면 솔직하게 말해주는 부분
-나의 의견을 정리하지 못한 상태로 전달할 때 이해가 안되었다고 정확히 전달해주는 부분
-솔직함은 페어할 때 중요한 부분인 것 같다.

마지막으로 찰리🍫 체스 미션때 꼼꼼하게 리뷰 남겨주셔서 감사합니다!

- - +
본문으로 건너뛰기

· 약 8분

레벨 1이 끝났다.
+우테코를 시작하기 전 내가 정해두었던 목표 이상으로 달성했기 때문에 매우 만족스럽다.
+혼자 독학을 할 땐 이 방향으로 공부하는 게 맞는지 계속 반추하다 결국 무기력함에 빠져들었다.
+하지만 이제는 같이 공부할 사람도 있고, 이야기할 사람도 있기 때문에 즐기는 일만 남은 것 같다.

Keep

나만의 루틴 만들기

스스로가 외부의 영향을 많이 받는다고 생각한다.
+최대한 꾸준히 할 수 있는 시간을 만드는 것이 중요하다고 생각한다.

매일 8시에 도착하여 아침에 해야 할 일을 정리하거나, 우선순위에 따라 처리하고
+소화능력이 부족하기 때문에 점심은 도시락(그래봤자 계란2개)을 준비하고
+항상 똑같은 컨디션을 유지하기 위해 항상 6시에 집에 간다.
+이제 바빠질 테니 일찍 집에 가는 일은 어쩔 수 없이 줄어들겠지만😢

선택도 비용이다. 앞으로 의사결정이 필요 없는 부분을 최대한 많이 만들어야겠다.

크루들과 친하게 지내기

10명 정도의 크루의 닉네임을 외우고 친하게 지낸다면 성공적이라고 생각했었다.
+하다 보니 더 많은 크루들의 닉네임을 외운 것 같다.
+앞으로도 크루들과 친하게 지내고 아무 때나 말을 걸 수 있는 크루가 늘어나길 :)

글쓰기

글을 잘 쓰는 편은 아니지만 꾸준히 작성하려고 노력했다.
+매 미션마다 회고를 작성하니 생각도 정리되고 개선점도 찾을 수 있어서 좋았다.

우아한테크코스에는 레벨마다 글쓰기를 진행하는데, 운이 좋게 글쓰기 상을 받았다.
+사실 겉으로 드러내지 않았지만 꼭 받아보고 싶었다.
+글쓰기 조원, 투표해 준 크루들에게 너무 감사하다.

코드 리뷰 스터디

누누, 주노, 다즐, 말랑, 박스터, 오잉, 깃짱와 코드 리뷰 스터디를 진행했다.
+과연 도움이 될까 생각했지만 결과적으로는 코드 리뷰를 하면서 성장을 많이 한 것 같다.
+투자한 시간 대비 가성비가 좋은 활동이었다.
+누누가 스터디장인데 과연 꾸준히 이어나가려나?

레벨 인터뷰

인터뷰할 때 많이 떨지 않아서 좋았다.
+남들 앞에서 이야기를 하거나, 면접을 보면 항상 엄청 떨어서 걱정했는데
+기술적인 질문을 받았을 때 떨지 않고 잘 대답할 수 있었다.
+우아한테크코스 생활을 하면서 다른 크루가 질문했을 때, 최대한 이해하기 쉽게 설명하려고 했던 경험이 도움이 된 것 같다.
+이후 레벨 인터뷰를 진행할 때 다음과 같은 부분을 고려하면 더 좋을 것 같다.

  • 대답하면서 질문을 계속 생각하며 잊어버리지 말기
  • 두괄식 표현
  • 설명하다가 잘못 설명한 것 같으면 다 끊고 다시 이야기해도 될지 물어보기
  • 설명할 수 있을만큼 시간 충분히 가지기
  • 인터뷰어의 질문 의도를 명확히 이해하지 못했다면 의도 다시 물어보기
  • 끝맺는 부분 연습하기(자신감 있게)
  • 기술적인 집착가지기
  • 기술적인 부분을 꼼꼼히 준비했으면 협업 관련 질문도 준비하기

Problem

페어프로그래밍

우아한테크코스를 진행하면서 가장 어려운 활동 중 하나라고 생각한다.
+페어는 매번 바뀌고, 미션의 복잡도도 증가하기 때문인 것 같다.
+소통 능력, 시간관리가 부족했고, 만족스럽지 않았다.
+하지만 페어를 진행하고, 회고를 하다 보니 나만의 노하우가 쌓이는 느낌이다.
+레벨 2에서는 부족했던 부분을 개선하여 함께하고 싶은 페어가 되고 싶다.

집중하는 시간⏱️ 부족

레벨 1을 진행하면서 집중하는 시간이 많이 부족했다.
+이른 아침과 오후에 개인적으로 집중할 수 있는 공간을 예약해서 온전히 나만의 시간을 가져야겠다.

Try

허브🌿와의 티타임?

소프트 스킬을 늘릴 방법을 생각하다가 대화를 나누지 못한 다른 크루들과 깜짝 커피챗을 하면 어떨까 생각했다.
+예를 들어 잡담방에 저와 커피챗 하실 분 :) 하면서 올릴 수 있을 것 같다.
+참여하는 사람이 있을지, 안 좋게 보는 게 아닐지 걱정되지만 그래도 재밌을 것 같다.
+저랑 허브티 한잔 하실래요?

기술적인 부분

우아한테크코스 생활을 하면서 소프트 스킬에 조금 더 무게를 두다 보니 이론적인 부분이 부족할 수 있다고 생각했다.
+시간의 여유가 될 때 책을 조금씩 읽어야겠다.
+블로그에 기술적인 부분을 많이 정리하지 않았는데, 조금 더 깊게 공부하고 정리하는 시간도 가져야겠다.

레벨 1을 마무리하며

시간이 빠르게 흘러갔다.
+타인에게 좋은 영향을 주기위해, 방학동안 나를 챙기는 시간을 가져야겠다.
+또한 함께 일하고 싶은 사람을 목표로 앞으로도 꾸준히 의식적 노력을 해야겠다.

+ + \ No newline at end of file diff --git a/page/3.html b/page/3.html index 698968a8e..035841393 100644 --- a/page/3.html +++ b/page/3.html @@ -13,33 +13,23 @@ - - + +
-
본문으로 건너뛰기

· 약 7분

개요

이전에 기술 구현 가능 여부를 조사하면서 파이썬을 사용한 내용을 정리한 내용이다.

사용 기술

언어: Python 3.10
-이미지 생성: matplotlib
-서비스: AWS Lambda, AWS API Gateway
-이미지 저장 및 URL: AWS S3, AWS CloudFront

플로우는 다음과 같다.

요구사항

./route.png

우측 상단의 경로 이미지를 생성하려고 한다.
-경로 이미지 생성에 대한 요구사항은 다음과 같다.

  • 위도, 경도로 이루어진 배열을 입력받는다.
  • 이미지 생성
  • 선과 점 표현
  • 투명한 배경색
  • 위경도 차이가 크든 작든 제공하는 이미지 내에 경로가 다 포함되어 있어야 한다.

이미지 출력 방식

  1. 위경도를 처리한 값으로 직접 경로를 그린 다음 이미지 형태로 저장
  2. 플롯을 그려주는 라이브러리 사용하여 이미지 형태로 저장

이미지 출력 방식의 경우 1번과 2번을 고민했었다.
-파이썬으로는 플롯을 그려주는 라이브러리인 matplotlib을 사용했다.

로컬에서 기능 구현

import time

import matplotlib.pyplot as plt


def draw(point):
start = time.time()
x, y = zip(*point)
pixel_x, pixel_y = convert_to_pixel_values(x, y)
draw_lines(pixel_x, pixel_y)
end = time.time()
print(end - start)

def convert_to_pixel_values(x, y):
max_diff = max(max(x) - min(x), max(y) - min(y))
return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)


def scale_to_pixel_values(points, max_diff):
min_value = min(points)
scaled_coordinates = [(p - min_value) / max_diff for p in points]
return scaled_coordinates


def draw_lines(x, y):
figure = plt.gcf()
figure.set_size_inches(5, 5)
plt.plot(x, y, c = 'w',linewidth=5)
plt.scatter(x[3],y[3], c = 'w', s = 125)
plt.axis('off')
plt.savefig('name.png', transparent=True, format='png')

point = [
[126.96352960597338, 37.590841000217125],
[126.96987292787792, 37.58435564234159],
[126.98128481452298, 37.58594375113966],
[126.99360339342958, 37.58248524741927],
[126.99867565340067, 37.56778118088622],
[127.001935378366117, 37.55985240444085],
[126.9831048919687, 37.548030119488665],
[126.97189273528845, 37.5119879225856],
[127.02689859997221, 37.48488593333883]
]

draw(point)

생성 결과는 아래와 같다. (예시를 위해 검은색으로 출력)

./routeImage.png

AWS Lambda

썸네일 생성 서버를 따로 두기는 기능 대비 비용이 너무 클 것이라고 생각했다.
-따라서 서버리스로 파일을 처리했다.
-추가로 s3 접근은 boto3를 사용했다.

람다 S3 접근을 위한 IAM 생성

AmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy 두가지를 추가해서 Lambda 전용 역할을 만들어 사용했다.

람다 배포용 코드

기술 구현 가능 여부를 확인할 땐 위치 점을 찍는 기능을 람다에 배포하지 않았다.


import io
import uuid

import boto3
import matplotlib.pyplot as plt

PIXEL = 255
BUCKET_NAME = 'image-plot'
S3 = 's3'

def lambda_handler(event, context):
x = event['x']
y = event['y']
image_name = str(uuid.uuid4())

img_data = draw(x, y)
s3 = boto3.client(S3)
s3.put_object(Body=img_data.getvalue(), ContentType='image/png', Bucket=BUCKET_NAME, Key=image_name)
url = f'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}'

return {
'statusCode': 200,
'body': url
}

def draw(x, y):
pixel_x, pixel_y = convert_to_pixel_values(x, y)
img_data = draw_lines(pixel_x, pixel_y)
plt.close()
return img_data

def convert_to_pixel_values(x, y):
max_diff = max(max(x) - min(x), max(y) - min(y))
return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)

def scale_to_pixel_values(points, max_diff):
min_value = min(points)
scaled_coordinates = [(p - min_value) / max_diff for p in points]
pixel_values = [int(p * PIXEL) for p in scaled_coordinates]
return pixel_values

def draw_lines(x, y):
plt.plot(x, y, 'k-', linewidth=10)
plt.axis('off')
img_data = io.BytesIO()
plt.savefig(img_data, transparent=True, format='png')
img_data.seek(0)
return img_data

Layer 추가를 위한 zip 파일 생성

matplotlib의 경우 외부 라이브러리기 때문에 따로 Layer를 추가해야 한다.
-zip 파일을 만들어서 업로드해야한다.
-이때 python의 Lambda 런타임에 대한 계층 경로는 python이다.
-따라서 압축한 zip 파일은 다음과 같은 구조를 띄어야 한다.

pillow.zip
│ python/PIL
└ python/Pillow-5.3.0.dist-info

Ubuntu 기준 다음 명령어를 입력하여 생성을 진행했다.

sudo apt update
sudo apt install zip
sudo apt install python3-pip

mkdir python
pip3 install matplotlib -t python # pip3 install 설치할_패키지 -t 설치_경로
zip -r my_layer.zip python # zip -r 압축_파일명 압축_파일이_존재하는_경로

No module named 'numpy.core._multiarray_umath' 에러

Layer 추가 후 람다 실행 시 발생한 에러였다.
-처음에 mac에서 zip 파일을 생성해서 업로드했는데 해당 문제가 발생했다.
-이는 lambda가 돌아가는 동일한 환경에서 layer를 위한 zip 파일을 만들지 않아서 발생하는 문제다.
-간단하게 ec2 인스턴스를 하나 만들어서 따로 Layer를 생성하면 문제가 발생하지 않는다.

적정기술에 대한 생각

프로젝트에 Lambda와 Python을 사용하려고 했지만 아쉽게도 반려당했다.
-AWS Lambda를 사용하는 것은 인스턴스에 해당 코드를 배포하는 것보다 더 효율적인 방법일 수 있다.
-하지만 현재 프로젝트에서 가용 가능한 자원, 기술의 난이도, 사용하는 팀원을 고려한다면 Lambda는 적정기술이 아닐 수 있다.
-따라서 해당 이미지 생성기를 어떻게 적용할지 조금 더 고려를 해야 될 것으로 보인다.

최종적으로 Java AWT를 사용하기로 결정했다.

참고 자료

AWS Lambda
-Lambda Layer
-Python Lambda 함수에 대한 .zip 파일 아카이브 작업
-No module named 'numpy.core._multiarray_umath'
-사례별로 알아본 안전한 S3 사용 가이드

- - +
본문으로 건너뛰기

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
+경로 이미지에 대한 요구사항 및 기술 선택에 대한 내용은 링크에 있다.

구현 결과

./result.png

예시 데이터는 다음과 같다.
+서울역(점) → 신사역 → 노량진역 → 홍대입구역 → 종로3가역 → 옥수역 → 구로역(점) → 신림역 → 발산역

예시 데이터
List<Double> x = List.of(
126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,
126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639
);
List<Double> y = List.of(
37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,
37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184
);
List<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);
List<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);

IMAGE_SIZE & ROUTE_SIZE

RouteImageGenerator.java
private static final int IMAGE_SIZE = 800;
private static final int ROUTE_SIZE = 600;

코드를 보면 이미지 크기와 경로 크기가 있습니다.
+이미지 크기는 말 그대로 이미지의 width와 height를 의미한다.
+경로 크기의 경우 상하좌우 100px 만큼의 간격을 위해 존재한다.
+따라서 실제 경로 그려지는 크기는 600 * 600 사이즈로 생성된다.

./600.png

사이즈 변경의 이유

255 * 255 정도의 작은 사이즈로 이미지를 생성해보려고 했는데 화질이 너무 안좋아서 800으로 변경했다.

주요 클래스

요약

클래스명설명특이사항
Coordinate위도, 경도로 이루어진 위치 값좌표를 뜻하지만 Point와 구분하기 위해 longitude, latitude를 사용하지 않고 x, y 사용
CoordinatesCoordinate의 일급 컬렉션-
Position실제 이미지 생성에 사용할 위치 값Integer 타입의 x, y 사용
PositionsPositions의 일급 컬렉션-
RouteImageDrawer실제 이미지에 경로를 그려주는 클래스 BufferedImage, Graphics2D를 가지고 있음이미지 생성에 필요한 상수가 정의되어 있음
RouteImageUploaderBufferedImage를 받아 서버에 업로드 하는 클래스현재 업로드 위치가 정해지지 않아 일단 기본(프로젝트 루트) 위치에 생성
RouteImageGenerator이미지를 생성하고 업로드하는 서비스여행 종료, 감상 저장시 해당 클래스를 통해 이미지 생성 요청
BufferedImage(AWT)이미지 데이터를 처리하고 조작하는 데 사용왼쪽 상단의 좌표가 (0, 0)
Graphics2D(AWT)선 그리기, 색상 관리 등을 지원하는 클래스 실제 해당 클래스의 draw 메서드를 경로를 그림JDK1.2 이후에 추가됨, 2D(평면) 그래픽 환경을 지원, bufferedImage.createGraphics 메서드를 통해 생성

의존관계

Coordinates(위도, 경도의 일급 컬렉션)

List<Double> 2개(위도, 경도)인 형태로 관리하는 방법이 있었지만, 위치 점을 여러개 찍는 부분에서 로직이 복잡해 질 것 같아서 Coordinate(x, y)와 일급 컬렉션인 Coordinates로 관리하기로 했다.
+Coordinates 클래스에는 다음 두 개의 인터페이스가 존재한다.

  • calculatePositions: 경로 이미지의 크기를 받아 실제 이미지 생성시 사용될 Positions를 반환
  • indexOf: 다른 Coordinates를 받아 동일한 위치점에 해당하는 인덱스를 반환하는

Positions 계산 로직은 다음과 같다.
+위도, 경도 각각에 대한 부분을 이미지 생성시 필요한 값으로 변환한다.

Coordinates.java
// 호출
// List<Integer> xPositions = toPositions(xValues, maxDifference, routeImageSize);
// List<Integer> yPositions = toPositions(yValues, maxDifference, routeImageSize);

private List<Integer> toPositions(List<Double> values, Double maxDifference, Integer routeImageSize) {
Double minValue = Collections.min(values);
return values.stream()
.map(value -> normalizeCoordinate(value, maxDifference, minValue))
.map(value -> mapToPosition(value, routeImageSize))
.toList();
}

private double normalizeCoordinate(Double coordinate, Double maxDifference, Double minValue) {
return (coordinate - minValue) / maxDifference;
}

private int mapToPosition(Double coordinate, Integer routeImageSize) {
return (int) (coordinate * routeImageSize);
}

위도로 예시든 내용이다.

  1. Collections.min(values) → 위도를 받아 위도 리스트의 최소값을 구한다.
  2. normalizeCoordinate → 각 값에서 최소값을 빼고 0 ~ 1 사이 값으로 변환 후 위경도의 최대 차이로 나눈다.
  3. mapToPosition → 그래프 크기를 받아 0 ~ 1 사이 값을 실제 이미지를 위한 위치값으로 변환한다.

Positions(실제 이미지 생성에 사용할 위치)

Positions 클래스에는 다음 다섯 개의 인터페이스가 존재한다.

  • align: 이미지 사이즈와 경로 이미지 사이즈를 받아 Position 값들을 중앙 정렬한다.
  • getPositionsByIndexes: 인덱스 리스트를 받아 입력받은 인덱스에 해당하는 값들을 반환한다.
  • size: 크기를 반환한다.
  • xPositions: x 값들을 반환한다.
  • yPositions: y 값들을 반환한다.

중앙 정렬 로직은 다음과 같습니다.

Positions.java
public Positions align(int imageSize, int routeSize) {
int xOffset = calculateOffset(Position::x, imageSize);
int yOffset = calculateOffset(Position::y, imageSize);

return items.stream()
.map(item -> new Position(item.x() + xOffset, imageSize - (item.y() + yOffset)))
.collect(collectingAndThen(toList(), Positions::new));
}

private int calculateOffset(ToIntFunction<Position> positionToInteger, int imageSize) {
List<Integer> positions = items.stream()
.mapToInt(positionToInteger)
.boxed()
.toList();

int midValue = (Collections.min(positions) + Collections.max(positions)) / 2;
return imageSize / 2 - midValue;
}

상하좌우 여백을 동일하게 주기 위해서 offset 값을 구해서 x, y 값에 각각 더하는 형태로 중앙 정렬을 수행했다.
+BufferedImage를 사용할 때 왼쪽 상단의 좌표 (0, 0) 기준으로 아래로 내려갈수록 y 값이 커지고, 오른쪽으로 갈 수록 x 값이 커진다.

./800.png

따라서 최종적으로 이미지를 생성하기 위한 값을 다음과 같이 구했다.

x 값 → 계산한 offset 그대로 더한다.
+y 값 → imageSize(800)에서 y + offset 값을 뺀다.

RouteImageDrawer(실제 이미지에 경로를 그려주는 클래스)

BufferedImage, Graphics2D를 필드로 가지고 있는 클래스다.
+그림을 그리기 위해 설정한 상수들이 존재한다.

RouteImageDrawer.java
// RGB에 각각 8비트씩 할당한 값을 24비트 트루컬러라 부른다.
// 해당 설정은 24비트 + 8비트(alpha, 투명도)를 추가한 32비트 이미지 타입이다.
// 이를 RGBA라고 부른다.
private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;
// 배경 투명색
private static final Color TRANSPARENT = new Color(0, 0, 0, 0);
// 경로를 위한 STROKE
private static final int LINE_STROKE_WIDTH = 7;
private static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 위치 점을 위한 STROKE
private static final int POINT_STROKE_WIDTH = 20;
private static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 안티앨리어싱 등 화질이 안좋은 이미지를 개선하기 위한 설정
private static final Map<Object, Object> renderingHints = Map.of(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,
RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,
RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

RouteImageDrawer 클래스에는 다음 세 개의 인터페이스가 존재한다.

  • drawLine: 선을 그린다.
  • drawPoint: 점을 찍는다.
  • dispose: 자원 할당을 해제한다.

dispose의 경우 내부에서 생성된 graphics2D에 대한 자원 할당을 해제하는 메서드인 graphics2D.dispose를 호출한다.

이미지 생성 Flow

1. 이미지 생성 준비

2. 선 그리기 요청

3. 위치 점 그리기 요청

4. 업로드 요청

전체 Flow

+ + \ No newline at end of file diff --git a/page/30.html b/page/30.html index 021ceee41..0da5a6ba7 100644 --- a/page/30.html +++ b/page/30.html @@ -13,15 +13,47 @@ - - + +
-
본문으로 건너뛰기

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) -객체 사이의 의존성이 과한 경우 결합도가 높다고 말한다.

  • 오브젝트 p.17

결합도를 낮춘다면 다음과 같은 이점이 있다.

  • 다른 구성 요소의 변화에 영향을 받지 않는다.
  • 재사용이 편리해진다.
  • 해당 클래스에 대한 이해가 쉬워진다. (의존하는 클래스가 적기 때문에)

높은 응집도 패턴(High Cohesion)

Q. 객체를 관리하기 쉽게 하려면 어떻게 해야 할까?

A. 높은 응집도를 유지할 수 있게 책임을 할당해야 한다.

응집도(Cohesion) -연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도가 높다고 말한다.

  • 오브젝트 p.26

변경의 이유에 따라 클래스를 분리한다면 응집도를 높일 수 있고, 응집도가 높아진다면 다음과 같은 이점이 있다.

  • 해당 클래스에 대한 이해가 쉬워진다. (할당된 책임만을 수행하고 있기 때문에)
  • 유지보수가 쉬워진다.
  • 낮은 결합도 또한 지원한다.
  • 응집도가 높은 클래스는 특정한 목적에 사용할 수 있기 때문에 재사용하기 좋다.

컨트롤러 패턴(Controller)

Q. 사용자의 요청을 처리하는 것은 누가 담당해야 하는가?

A. 사용자의 요청을 처리하는 Controller 객체를 만들어서 사용해야 한다.

어떤 서브시스템이 존재한다고 가정할 때

  • 직접적으로 객체에 접근하여 프로그램을 사용한다면 결합도가 상승한다.
  • 서브 시스템에 들어오는 요청을 처리해주는 컨트롤러가 있다면 사용하는 입장에서는 해당 컨트롤러만 알면 된다.
  • 만약 서브 시스템의 변경이 생겼을 때 외부에 미치는 영향도 줄어든다.

다형성 패턴(Polymorphism)

Q. 객체의 타입에 따라 행동이 바뀐다면 책임을 어떻게 할당해야 할까?

A. OOP가 지원하는 다형성을 적극적으로 활용한다. (인터페이스를 두고 행동에 대한 부분을 구현)

객체의 종류에 따라 분기하는 조건문이 아닌 다형성을 사용하는 것이 좋은 방법이다.

새로운 타입이 추가되었을 때 조건문을 사용한다면 기존의 조건문을 수정해야 하지만 다형성을 활용하면 쉽게 확장할 수 있다.

변경 보호 패턴(Protected Variations)

Q. 어떻게 하면 변경이 다른 요소에 영향을 미치지 않도록 방지할 수 있을까?

A. 변화가 예상되는 지점을 식별하고, 주위에 안정된 인터페이스를 형성하도록 책임을 할당해야 한다.

간접 참조 패턴(Indirection)

Q. 두 객체 사이의 직접적인 연결을 피하고 싶다면 어떻게 해야 할까?

A. 두 객체 사이에 또 다른 객체를 두어 직접적인 연결을 피할 수 있다.

중재자 패턴을 사용하여 두 객체 사이에 또 하나의 객체를 추가하여 복잡한 관계를 단순화할 수 있다.

중간에 인터페이스를 둔다면 변경 보호 패턴(Protected Variations)에 해당된다.

순수한 가공물 패턴(Pure Fabrication)

Q. 책임을 할당한 도메인 객체가 Low Coupling, High Cohesion, 재사용성 등의 목적을 위반한다면 어떻게 해야 할까?

A. 도메인 개념을 포함하지 않는 클래스를 하나 만들고 매우 응집된 책임을 할당할 수 있다.

행동을 추가할 때, 해당 책임을 수행할 도메인 개념이 존재하지 않는다면 도메인과 무관한 인공적인 객체를 만든다음 해당 객체에게 책임을 할당한다.

객체가 데이터베이스에 저장해야 할 값을 가지고 있다고, 정보 전문가 패턴을 적용하여 데이터베이스에 저장하라는 책임을 가지라고 하지 않는다.

예) 상점과 고객 클래스가 있고 서로 다른 통화를 사용하고 있다고 가정

  • 서로 다른 통화를 사용하고 있기 때문에 거래를 하려면 환전을 해야한다.
  • 두 클래스 다 환전에 대한 책임을 부여하기 애매하다면 환전을 책임하는 클래스를 추가하고 사용할 수 있다.

참고 자료

오브젝트 5장. 책임 할당하기, 조영호

Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman

GRASP, 한빛 네트워크

- - +
본문으로 건너뛰기

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
+체스는 이전 미션들보다 훨씬 복잡한 도메인이었다.
+하지만 가비와 나는 체스 도메인이 익숙해서 더 편한 마음으로 시작할 수 있었다.
+미션을 진행하면서 어려웠던 부분은 기물의 이동, 이동시 경로에 기물이 존재하는지 확인하는 부분이었다.

가비가 집에가서도 기물의 이동 관련해 생각 정리한 글을 보내줘서 더욱 빨리 진행할 수 있었다.
+최종적으로 결정한 부분은 다음과 같다.

각 기물의 이동 가능여부
+Rank와 File은 각각 위치값을 가지고 있고, 값의 차이를 이용해서 각 기물의 이동 가능 여부를 계산했다.
+직선 → Rank와 File 차이 중 하나가 0이어야 한다.
+대각선 → Rank와 File 차이의 절대값이 같아야 한다. ex) abs(-2) == abs(2)
+나이트 → 차이의 절대값이 하나는 2 나머지 하나는 1이어야 한다.

도착 칸의 기물 여부
+아군 → 이동이 불가능하다.
+적군 → 이동이 가능하다. 적군을 잡는다.

중간에 기물 존재 여부
+이동 경로에 기물이 존재하면 안된다.

데이터베이스 사용
+체스 미션은 특별하게 데이터베이스와 연결하는 부분이 있었다.
+체스 게임의 상태를 다음의 두가지 방법으로 정할 수 있다고 생각했다.

  • 기물 전체를 저장하는 방법
  • 기보를 저장하고 게임을 불러와 기보대로 이동시키는 방법

기물이 이동할 때마다 값을 저장하고 싶었고, 기보를 저장하는 방법을 선택했다.
+기물 전체를 저장하지 않은 이유는 다음과 같다.

  • 턴과 같은 부가적인 요소를 저장해야 한다.
  • 이동을 할 때 기물이 잡히는 경우 update 쿼리(이동 기물)와 delete(잡힌 기물) 2개의 쿼리를 날려야 한다.
  • 현재 구조에서 도메인의 변경이 크게(초기 상태를 구성하는 부분) 일어나야 한다.

정리하자면 기물 전체 저장과 기보 저장은 다음과 차이가 있다.
+보드저장: 초기상태에서 32개의 Insert 쿼리(기물의 위치) + 기물 이동 시 움직임 변경(잡히는 경우 2개의 쿼리)
+기보저장: 초기상태 애플리케이션에서 구성 + 저장된 기보를 select 쿼리로 조회해서 사용(1회) + insert 쿼리(이동 당 1회)

추가로 기보저장이 구현도 더욱 간단하다. 👍

부가적인 부분

리뷰어인 찰리🍫가 동시에 여러 게임이 진행된다면 어떨지? 에 대한 코멘트를 남겨주셔서 다양한 시도를 해봤다.

  • 누누의 도움으로 ConnectionPool 구현
  • ThreadLocal 사용해서 쓰레드 별 세션 관리
  • 실제로 애플리케이션 내에서 체스 게임이 진행되는 Board를 ConcurrentHashMap으로 저장(사실 이 부분은 현재 구조에서 필요없지만 2명이 서로 게임하는 경우를 생각해서 넣어보았다.)

두 명이 서로 같은 방에 입장하여 게임을 진행한다면 출력하는 부분이 까다로워질 것 같다고 예상되어(Board에 옵저버 패턴을 사용해야되나?) 해볼 엄두가 나지 않았다.

부족했던 부분

꼼꼼하게 코드를 작성하지 못한 부분
+DB 관련 부분을 꼼꼼하게 코딩을 하지 못했다.
+도메인 로직에만 집중하다보니 정적 중요한 DB의 코드의 예외처리, 빈 값을 반환 하는 부분을 꼼꼼하게 처리하지 못했다.
+하지만 찰리의 꼼꼼한 리뷰로 DB부분과 나만의 JdbcTemplate을 깔끔하게 구현할 수 있었다.

시간에 대한 부담감
+초반에는 여유롭지만 제출 마감에 가까워질 수록 사람이 급해지는 것 같다.
+다음 페어프로그래밍할 땐 속도를 조절하고, 마음에 여유를 가져야겠다.

새로 학습한 부분

DAO 중복 제거

프롤로그에 을 작성했다.
+DAO를 작성하는데 try-catch-resources와 여러 코드가 중복되서 제거하고싶었다.
+템플릿 콜백 패턴으로 깔끔하게 중복을 제거할 수 있었다.👍

페어에게 배울 부분

페어 생각하기
+가비는 누구보다 페어를 생각하고, 배려해주는 페어였다.
+중간 중간 당 떨어질까봐 걱정도 해주고, 나의 컨디션도 확인해줬다!

미션 몰입하기
+최근에 미션에 잘 몰입하지 못했다.
+가비는 페어를 진행할 때 미션에 대한 몰입도가 매우 좋았다.
+집에가서도 체스 이동에 대한 로직을 어떻게 구현할 지 생각한 뒤 꼼꼼해서 정리해서 나에게 보내주었다.
+덕분에 나도 가비의 생각을 알 수 있어서 미션을 진행하는데 가속도가 붙은 것 같다.
+또한 미션을 잘 마무리하고 싶은 마음이 전달되서 그런지 나도 덩달아 열심히 미션을 할 수 있었다.😄

솔직함
+먼저 회고하자고 말 걸어줘서 정말 고마웠다고 표현해주는 부분
+모르는게 있으면 솔직하게 말해주는 부분
+나의 의견을 정리하지 못한 상태로 전달할 때 이해가 안되었다고 정확히 전달해주는 부분
+솔직함은 페어할 때 중요한 부분인 것 같다.

마지막으로 찰리🍫 체스 미션때 꼼꼼하게 리뷰 남겨주셔서 감사합니다!

+ + \ No newline at end of file diff --git a/page/31.html b/page/31.html index b81f27da8..b331c7cdd 100644 --- a/page/31.html +++ b/page/31.html @@ -13,42 +13,15 @@ - - + +
-
본문으로 건너뛰기

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
-이번에는 실수하지 않고, 바로 미션을 진행하지 않고 친해지기 부터 시작했다.

블랙잭은 구현해야 될 내용이 많아 시간이 많이 부족할 것 같았지만
-후추와 함께 전략적(삼일절에 미션 이야기 나누기)으로 미션을 진행해 시간 내에 제출할 수 있었다.

미션을 끝나고 회고를 했을 때 후추가 고민거리를 하나 내줬다.
-"페어를 진행할 때 압박감을 느끼는 페어가 있다면 허브가 해줄 수 있는게 뭐가 있을까?"

곰곰히 생각해봤지만 쉽게 답을 내릴 수 없었다.
-중간 중간 회고를 하고, 나의 소프트스킬을 높히는게 답일까?
-부담감을 느끼지 않고 같이 일하고 싶은 사람이 될 수 있도록 계속 생각해봐야겠다.

이 부분에 대해 생각이 많아져서 전 리뷰어인 터틀🐢과도 대화를 나누었다.
-터틀은 제어할 수 없는 부분보다 제어할 수 있는 부분(궁극적인 목표인 좋은 코드를 작성하는 것)에 집중해보라고 하셨다.

좋은 코드, 좋은 페어에 대한 부분을 일단 지속적으로 생각해봐야겠다.

부족했던 부분

페어 신경쓰기
-이번 페어할 때 적극적으로 의견을 내보도록 했다. 그렇기에 너무 의견을 강하게 밀어붙인 느낌이 들어서 미안했다.
-후추가 압박을 느꼈을 수도 있을 것 같다는 생각이 든다.
-중간 중간 작은 회고를 진행해보는 것이 좋을까?

체력 관리
-요즘 잘 못먹는 것 같다.
-앞으로 살 날이 많은데 잘 챙겨먹고, 힘내야겠다.

중간 중간 돌아보기
-이번 미션과 관련된 내용은 아니지만 우테코를 잘 활용 하고 있는지 생각을 해봐야겠다.
-내가 우테코에 지원한 이유를 항상 잊지 않아야겠다.

새로 학습한 부분

상태 패턴
-객체의 내부 상태에 따라 스스로 행동을 변경하도록 하는 패턴으로 if/else/switch와 같은 조건문을 효과적으로 제거할 수 있다.
-블랙잭 미션을 진행하면서 상태 패턴에 대한 부분을 처음 적용해보았다.
-처음 적용하기 전에는 별로라고 생각했는데, 생각보다 괜찮은 것 같다.

일관성, 가독성, 추상화
-이번 리뷰어는 검프🍫 였다!
-검프의 리뷰는 간결함에 관련된 내용이 많았다.
-일관성이 있는 코드, 가독성이 좋은 코드, 추상화가 잘 되어있는 코드
-읽기 좋고, 간결한 방향으로 코드를 작성하는 방법을 배운 것 같다.
-코드를 바라보는 시점이 하나 늘어난 기분이다!(앞으로 적용하는 것은 나의 몫이지만)

페어에게 배울 부분

생각 정리
-중간 중간 현재 상황에 대해 그림을 그리거나, 글을 적으면서 정리한다.
-페어와 동일한 부분을 이해하고 있는지 확인한다.
-진행하는데 매우 도움이 되었던 것 같다.
-나도 다음 페어때부터 펜이랑 종이를 준비해야겠다.

가감없이 의견을 말해주는 부분
-진행 상황에 대한 부분, 진행 속도, 지금 자신이 이해하고 있는 부분을 말해줘서 편했다.
-회고때도 서로 솔직하게 의견을 주고 받아서 좋았다.

도메인 언어에 신경쓰는 부분
-클래스명, 변수명과 같은 언어를 세심하게 신경쓴다.
-요구사항 정리도 깔끔하게 잘하는 것 같다.

후추 최고 👍

- - +
본문으로 건너뛰기

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) +객체 사이의 의존성이 과한 경우 결합도가 높다고 말한다.

  • 오브젝트 p.17

결합도를 낮춘다면 다음과 같은 이점이 있다.

  • 다른 구성 요소의 변화에 영향을 받지 않는다.
  • 재사용이 편리해진다.
  • 해당 클래스에 대한 이해가 쉬워진다. (의존하는 클래스가 적기 때문에)

높은 응집도 패턴(High Cohesion)

Q. 객체를 관리하기 쉽게 하려면 어떻게 해야 할까?

A. 높은 응집도를 유지할 수 있게 책임을 할당해야 한다.

응집도(Cohesion) +연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도가 높다고 말한다.

  • 오브젝트 p.26

변경의 이유에 따라 클래스를 분리한다면 응집도를 높일 수 있고, 응집도가 높아진다면 다음과 같은 이점이 있다.

  • 해당 클래스에 대한 이해가 쉬워진다. (할당된 책임만을 수행하고 있기 때문에)
  • 유지보수가 쉬워진다.
  • 낮은 결합도 또한 지원한다.
  • 응집도가 높은 클래스는 특정한 목적에 사용할 수 있기 때문에 재사용하기 좋다.

컨트롤러 패턴(Controller)

Q. 사용자의 요청을 처리하는 것은 누가 담당해야 하는가?

A. 사용자의 요청을 처리하는 Controller 객체를 만들어서 사용해야 한다.

어떤 서브시스템이 존재한다고 가정할 때

  • 직접적으로 객체에 접근하여 프로그램을 사용한다면 결합도가 상승한다.
  • 서브 시스템에 들어오는 요청을 처리해주는 컨트롤러가 있다면 사용하는 입장에서는 해당 컨트롤러만 알면 된다.
  • 만약 서브 시스템의 변경이 생겼을 때 외부에 미치는 영향도 줄어든다.

다형성 패턴(Polymorphism)

Q. 객체의 타입에 따라 행동이 바뀐다면 책임을 어떻게 할당해야 할까?

A. OOP가 지원하는 다형성을 적극적으로 활용한다. (인터페이스를 두고 행동에 대한 부분을 구현)

객체의 종류에 따라 분기하는 조건문이 아닌 다형성을 사용하는 것이 좋은 방법이다.

새로운 타입이 추가되었을 때 조건문을 사용한다면 기존의 조건문을 수정해야 하지만 다형성을 활용하면 쉽게 확장할 수 있다.

변경 보호 패턴(Protected Variations)

Q. 어떻게 하면 변경이 다른 요소에 영향을 미치지 않도록 방지할 수 있을까?

A. 변화가 예상되는 지점을 식별하고, 주위에 안정된 인터페이스를 형성하도록 책임을 할당해야 한다.

간접 참조 패턴(Indirection)

Q. 두 객체 사이의 직접적인 연결을 피하고 싶다면 어떻게 해야 할까?

A. 두 객체 사이에 또 다른 객체를 두어 직접적인 연결을 피할 수 있다.

중재자 패턴을 사용하여 두 객체 사이에 또 하나의 객체를 추가하여 복잡한 관계를 단순화할 수 있다.

중간에 인터페이스를 둔다면 변경 보호 패턴(Protected Variations)에 해당된다.

순수한 가공물 패턴(Pure Fabrication)

Q. 책임을 할당한 도메인 객체가 Low Coupling, High Cohesion, 재사용성 등의 목적을 위반한다면 어떻게 해야 할까?

A. 도메인 개념을 포함하지 않는 클래스를 하나 만들고 매우 응집된 책임을 할당할 수 있다.

행동을 추가할 때, 해당 책임을 수행할 도메인 개념이 존재하지 않는다면 도메인과 무관한 인공적인 객체를 만든다음 해당 객체에게 책임을 할당한다.

객체가 데이터베이스에 저장해야 할 값을 가지고 있다고, 정보 전문가 패턴을 적용하여 데이터베이스에 저장하라는 책임을 가지라고 하지 않는다.

예) 상점과 고객 클래스가 있고 서로 다른 통화를 사용하고 있다고 가정

  • 서로 다른 통화를 사용하고 있기 때문에 거래를 하려면 환전을 해야한다.
  • 두 클래스 다 환전에 대한 책임을 부여하기 애매하다면 환전을 책임하는 클래스를 추가하고 사용할 수 있다.

참고 자료

오브젝트 5장. 책임 할당하기, 조영호

Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman

GRASP, 한빛 네트워크

+ + \ No newline at end of file diff --git a/page/32.html b/page/32.html index d3b138cab..352f30c53 100644 --- a/page/32.html +++ b/page/32.html @@ -13,44 +13,42 @@ - - + +
-
본문으로 건너뛰기

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
-이전 미션과 달리 TDD로 진행하는 것이 필수였기 때문에 익숙하지 않았지만, 우가와 미션에 관한 소통이 잘 되어서 큰 문제 없이 미션을 마무리할 수 있었다.

우가와 이야기가 잘 통해서 그런지 1단계는 크게 어렵지 않게 진행할 수 있었는데, 2단계에서 많이 고전한 것 같다.

2단계에서는 2가지 방법으로 구현해봤다.

  1. LadderGame에서 Position 기준으로 사다리 게임을 진행하는 방법
  2. Player에게 Ladder를 넘겨서 Ladder에게 Position을 넘겨주며 메시지를 보내는 방법

Position 기준으로 사다리 게임을 진행하는 방법

사실상 index를 Ladder에게 넘겨주고, 해당 index에 대한 결과를 받는 방법과 유사했다.
-구현하고 나니 다른 클래스들이 Position에 대한 의존도가 너무 높은 것 같았다.
-또한 Players가 별다른 책임을 가지고 있지 않다고 느꼈다.

public LadderGameResult play() {
final Map<Player, Item> result = new LinkedHashMap<>();
// 사용자 수만큼 Position을 가져와서 사다리 게임을 진행한다.
for (Position position : Position.range(players.count())) {
final Position resultPosition = ladder.play(position);
result.put(players.get(position), items.get(resultPosition));
}
return new LadderGameResult(result);
}

Player에게 Ladder를 전달하여 게임을 진행하는 방법

Position에 대한 값을 가지고 있는 Player에게 Ladder를 넘겨서, Player가 Ladder에게 메시지를 보내도록 구현하였다.
-이 방법이 사다리 게임을 위해서 객체들이 긴밀하게 협력하고, 조금 더 책임의 분배가 잘 되어있다고 생각이 되었다.

public LadderGameResult play() {
// 참가자들에게 사다리를 전달해서 사다리에게 메시지를 보내도록 한다.
final Map<Player, Position> playResult = players.play(ladder);

final Map<Player, Item> result = new LinkedHashMap<>();
for (Player player : playResult.keySet()) {
result.put(player, toItem(playResult.get(player)));
}
return new LadderGameResult(result);
}

부족했던 부분

유비쿼터스 언어에 시간을 들이기
-유비쿼터스 언어를 정하는데 시간을 조금 더 들여야겠다고 생각했다.
-사다리 타기의 실행 결과를 Item으로 짓다니.. 뭔가 만족스럽지 않다.
-이전 미션과 마찬가지로, 명명하는 부분에서 부족함을 많이 느꼈다.

페어와 조금 더 친해지기
-첫날은 페어와 친해지는 시간을 조금 더 가져야겠다고 생각했다.
-우가랑 회고할 때 내가 시작하자마자 컨벤션 정하자고 해서 많이 당황스러웠다고 한다. 우가 미안.. 🥲

README를 조금 더 꼼꼼하게
-이상하게 코딩에 집중하면 README를 업데이트하면서 같이 커밋 하는 걸 항상 까먹는다.
-다음 미션에는 조금 더 신경 써야겠다.

좋은 질문을 생각하기
-첫 PR때 리뷰어에게 질문을 남기지 못했다.
-리뷰어와의 시간이 소중한 시간이라는 것을 까먹지 말고, 나의 성장에 도움이 될 수 있는 질문을 생각해야겠다.

PR 후에도 꼼꼼하게 확인하기
-분명 알고 있는 부분이지만, 놓친 부분이 많은 것 같았다.
-PR 하기 전에도 계속 확인을 했지만, 아무래도 IntelliJ에서 보니 코드에 익숙해져서 그런지 변경해야 할 부분이 잘 안보였다.
-github pr에서는 전체 변경사항을 확인할 수 있으니 PR 후에도 꼭 확인해야겠다.

적극적으로 나의 의견을 말하기
-의견을 적극적으로 내는 부분에 대해서 페어의 의견이 괜찮다고 생각하면 수용 후 개선을 하는 방향으로 진행을 했었는데, 조금 더 개선할 수 있는 방향이 있다면 나도 적극적으로 의견을 말해야겠다고 생각이 든다.
-나도 설득하는 힘을 기르고, 페어도 좋은 방향을 알 수 있고, 결과물도 좋은 방향으로 나오지 않을까? (고민 들어주신 리뷰어 터틀🐢 감사합니다.)

새로 학습한 부분

객체의 생성 책임
-Players가 Position을 생성하고 Player의 생성자에 넣어주었다. 하지만 이 부분에 대해서 생성 책임에 관련된 코멘트가 달렸다. -시간을 가지고 생각해 보니 Position을 가지고 있는 건 Player기 때문에 생성 책임을 Player가 담당하는 것이 좋다고 생각되었다.

생성 책임에 관한 패턴으로 GRASP의 Creator 패턴이 있는데 다음의 요소를 최대한 만족하는 클래스에 생성 책임을 할당하는 것이 좋다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A를 긴밀하게 사용한다.
  • B가 A의 초깃값을 가지고 있다.

실제로 객체의 생성 책임에 관해서 깊이 생각하면서 코딩을 하지 않았는데, 이번 미션을 통해 시야가 넓어진 것 같다.

패키지 분리 기준
-패키지 분리에 대한 나만의 기준이 아직 명확하지 않아 질문이 들어와도 명확하게 답변을 하지 못했다.
-마지막 제출 전에 도메인 패키지 내부를 분리해 봤는데, 기준이 명확하지 않았기 때문에 좋지 않은 선택이었던 것 같다. -현재 진행하는 미션의 애플리케이션 크기가 그렇게 크지 않으니, domain 패키지에서 세부 패키지로 분리하지 않아도 될 것 같다.

사용하는 쪽에서 생각하기 & 예측가능한 코드 작성하기
-Position에서 다음 위치나 이전 위치를 반환하는 메서드를 허용 범위(0~19)가 벗어난다면, 의미 없는 값이 들어간 Position을 반환하도록 했다.
-이건 Position을 사용하는 입장을 고려하지 못한 코딩이었는데, 사용하는 입장에서는 0~19의 값이 보장되어 있다고 생각할 것이기 때문이다.
-따라서 hasNext, hasPrevious라는 이전 값, 이후 값이 범위 내에 있는지 확인하는 메서드를 추가하고, 기존의 값을 가져오는 메서드는 범위가 벗어나면 예외를 던지는 방향으로 해결하였다.

페어에게 배울 부분

밝은 기운을 가지고 있고 다른 사람들과 친화력이 좋은 것 같았다.
-이번에 페어 할 때 컨디션 관리를 제대로 못해서 많이 미안했다. 다음에는 최상의 컨디션으로 페어를 준비해 봐야겠다.
-그리고 우가랑 페어를 하고 나서, 나도 다른 사람들과 더 잘 지내봐야겠다는 생각이 들어 조금 더 용기를 내 잡담 중이다!

의견을 적극적으로 내줘서 페어프로그래밍 진행이 잘 되었다.
-또한 페어 진행이 느린 것 같다고 말해줘서 안정적으로 시간 안에 미션을 완료할 수 있었다.
-페어프로그래밍 진행 속도에 대해 조금 더 생각을 해봐야겠다!

항상 지나갈 때마다 웃어주는데, 나도 자주 웃어야겠다고 생각했다.
-웃는 것만으로도 사람이 밝아 보여서 너무 좋은 것 같다!

- - +
본문으로 건너뛰기

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
+이번에는 실수하지 않고, 바로 미션을 진행하지 않고 친해지기 부터 시작했다.

블랙잭은 구현해야 될 내용이 많아 시간이 많이 부족할 것 같았지만
+후추와 함께 전략적(삼일절에 미션 이야기 나누기)으로 미션을 진행해 시간 내에 제출할 수 있었다.

미션을 끝나고 회고를 했을 때 후추가 고민거리를 하나 내줬다.
+"페어를 진행할 때 압박감을 느끼는 페어가 있다면 허브가 해줄 수 있는게 뭐가 있을까?"

곰곰히 생각해봤지만 쉽게 답을 내릴 수 없었다.
+중간 중간 회고를 하고, 나의 소프트스킬을 높히는게 답일까?
+부담감을 느끼지 않고 같이 일하고 싶은 사람이 될 수 있도록 계속 생각해봐야겠다.

이 부분에 대해 생각이 많아져서 전 리뷰어인 터틀🐢과도 대화를 나누었다.
+터틀은 제어할 수 없는 부분보다 제어할 수 있는 부분(궁극적인 목표인 좋은 코드를 작성하는 것)에 집중해보라고 하셨다.

좋은 코드, 좋은 페어에 대한 부분을 일단 지속적으로 생각해봐야겠다.

부족했던 부분

페어 신경쓰기
+이번 페어할 때 적극적으로 의견을 내보도록 했다. 그렇기에 너무 의견을 강하게 밀어붙인 느낌이 들어서 미안했다.
+후추가 압박을 느꼈을 수도 있을 것 같다는 생각이 든다.
+중간 중간 작은 회고를 진행해보는 것이 좋을까?

체력 관리
+요즘 잘 못먹는 것 같다.
+앞으로 살 날이 많은데 잘 챙겨먹고, 힘내야겠다.

중간 중간 돌아보기
+이번 미션과 관련된 내용은 아니지만 우테코를 잘 활용 하고 있는지 생각을 해봐야겠다.
+내가 우테코에 지원한 이유를 항상 잊지 않아야겠다.

새로 학습한 부분

상태 패턴
+객체의 내부 상태에 따라 스스로 행동을 변경하도록 하는 패턴으로 if/else/switch와 같은 조건문을 효과적으로 제거할 수 있다.
+블랙잭 미션을 진행하면서 상태 패턴에 대한 부분을 처음 적용해보았다.
+처음 적용하기 전에는 별로라고 생각했는데, 생각보다 괜찮은 것 같다.

일관성, 가독성, 추상화
+이번 리뷰어는 검프🍫 였다!
+검프의 리뷰는 간결함에 관련된 내용이 많았다.
+일관성이 있는 코드, 가독성이 좋은 코드, 추상화가 잘 되어있는 코드
+읽기 좋고, 간결한 방향으로 코드를 작성하는 방법을 배운 것 같다.
+코드를 바라보는 시점이 하나 늘어난 기분이다!(앞으로 적용하는 것은 나의 몫이지만)

페어에게 배울 부분

생각 정리
+중간 중간 현재 상황에 대해 그림을 그리거나, 글을 적으면서 정리한다.
+페어와 동일한 부분을 이해하고 있는지 확인한다.
+진행하는데 매우 도움이 되었던 것 같다.
+나도 다음 페어때부터 펜이랑 종이를 준비해야겠다.

가감없이 의견을 말해주는 부분
+진행 상황에 대한 부분, 진행 속도, 지금 자신이 이해하고 있는 부분을 말해줘서 편했다.
+회고때도 서로 솔직하게 의견을 주고 받아서 좋았다.

도메인 언어에 신경쓰는 부분
+클래스명, 변수명과 같은 언어를 세심하게 신경쓴다.
+요구사항 정리도 깔끔하게 잘하는 것 같다.

후추 최고 👍

+ + \ No newline at end of file diff --git a/page/33.html b/page/33.html index 1c1e6f7c3..4c461daf0 100644 --- a/page/33.html +++ b/page/33.html @@ -13,38 +13,44 @@ - - + +
-
본문으로 건너뛰기

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
-우테코 들어와서 첫 페어프로그래밍이라 많이 떨렸지만, 다즐이 대화를 잘 이끌어줘 너무 즐거웠다.

첫날은 간단히 컨벤션과 환경을 설정하는 시간을 가졌고 다음 날부터 자동차 경주를 시작했다.
-시작은 간단하게 요구사항을 정리하고, 어떻게 코드를 작성할지 같이 고민했다.

시작하기 전 아래와 같이 mermaid를 이용하여 의존성 방향에 대해서 간단한 다이어그램을 만들고 시작했다.
-mermaid는 코드로 다이어그램을 생성 해주는 도구로 다음과 같은 장점이 있다고 생각한다.

  • 코드 기반이라 빠른 시간 안에 생각한 것을 시각화할 수 있다.
  • github에서 mermaid를 지원하기 때문에 리뷰어에게 코드를 이해할 수 있는 부가적인 정보를 제공할 수 있다.

미션을 진행하는 데 큰 어려움이 있지는 않았고, 페어를 마치기 전 서로 고민되는 부분을 정리했을 때 좋았다.

페어하면서 잘했다고 생각했던 점은 서로의 생각과 리뷰 받은 것을 공유한 것이다.
-리팩터링을 어떻게 했는지? 이런 리뷰에 대해 어떻게 생각하는지 깊게 고민하는 시간을 가질 수 있었다.

부족했던 부분

리팩터링이 끝난 후 메서드명, 테스트시 출력하는 메시지에 대한 코멘트가 많이 달렸다.
-객체가 어떤 책임과 역할을 가지는지 생각하는 시간을 가지고 명확한 메서드명을 작성해야겠다고 생각했다.

평소에 프로그래밍 이야기가 아닌 다른 주제로 이야기하면 잘 들으려고 하는 편이지만
-내가 좋아하는 주제, 관심가는 주제인 프로그래밍에 대한 이야기를 할 땐 말이 많아진다.
-다음 미션부터는 더 많은 시간을 페어의 의견과 이야기를 듣는 곳에 사용해야겠다.

새로 학습한 부분

Assertions extracting

결과 내부에 있는 값을 확인하고 싶을 때 extracting 키워드를 이용해서 내부의 값을 검증할 수 있다.
-이전에는 필요에 따라 stream을 이용하여 검증할 값을 생성했지만, 해당 방법을 이용해서 절차를 줄일 수 있었다.

@Test
void extracting() {
final Cars cars = new Cars(List.of("car1", "car2"));

assertThat(cars.getCars())
.extracting(Car::getName)
.containsExactly("car1", "car2");
}

아래는 리뷰어님과 대화를 나누면서 얻은 답변 + 나의 의견이다.

제어할 수 없는 부분에 대한 테스트

테스트 대상이 검증된 것이라면 작성하지 않거나, 제어할 수 있는 부분에 대한 테스트를 더욱 꼼꼼하게 작성한다.
-이건 개인적인 생각이지만 내가 안정감이 들 수 있을 정도로 출력 범위 내의 결과를 반환하는지 정도 테스트할 수 있지 않을까?

단순 위임을 하는 메서드에 대한 테스트

위임이라는 것은 역할과 책임을 넘겨준다는 것이다.
-호출 횟수를 검증하는 것보다 결과에 대한 테스트하는 것이 좋다.
-단순히 위임만 하는 테스트의 경우 결과를 검증한다면 테스트가 중복되지 않을까 생각했었다.
-따라서 중복된 테스트를 줄이기 위해 내부의 메서드를 호출하는지 검증하는 방법도 있다는 것을 알게 되었지만
-안정적으로 결과를 테스트 하는 것이 더 좋은 방법인 것 같다.

테스트를 위한 getter 사용

테스트 용도로 도메인에 새로운 메서드가 생성되는 것은 좋지 못하다.
-필요의 경우 생성해서 사용할 수 있지만, 기존에 있는 메서드들을 활용해보는 것이 더 좋은 방법이다.
-이 부분에 대해서 매우 동의하고, 앞으로도 최대한 테스트를 위한 코드를 도메인에 작성하지 않을 것 같다.

페어에게 배울 부분

질문이나 생각할 점이 있을 때 매우 깊게 고민하는 것 같았다.
-생각을 정리한 후 자신의 의견을 명료하게 전달해주었다.
-그렇기 때문에 지식을 효율적으로 습득한다.
-난 생각을 잘 정리하지 않은 채로 내버려 둔 얕은 지식이 많은 것 같다. (이런 것도 아는 것이라고 할 수 있을까?)
-앞으로 조금 더 머릿속에서 정리하고, 문제에 대해 깊게 고민하는 시간을 늘려야겠다.

개발에 열정을 가진 게 느껴진다.
-나도 개발을 좋아하지만, 최근에는 의지가 약해졌었다.
-열정이 가득한 사람을 만나니 나도 열정적인 사람이 되는 것 같다.

칭찬을 많이 해준다. 단순히 많이 해주는 것이 아니라, 진심을 담긴 칭찬을 해줬다.
-칭찬은 고래도 춤추게 하던가?
-그래서 즐거운 마음으로 페어 프로그래밍을 했었던 것 같다.

어떤 이유 때문인지 모르겠지만 같이 페어하는데 편한 마음이 들었다.
-이건 바로 배울 수 없지만.
-나도 같이 일할 때 편한 사람, 같이 일하고 싶은 사람이 되기 위해 깊이 고민해봐야겠다.

- - +
본문으로 건너뛰기

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
+이전 미션과 달리 TDD로 진행하는 것이 필수였기 때문에 익숙하지 않았지만, 우가와 미션에 관한 소통이 잘 되어서 큰 문제 없이 미션을 마무리할 수 있었다.

우가와 이야기가 잘 통해서 그런지 1단계는 크게 어렵지 않게 진행할 수 있었는데, 2단계에서 많이 고전한 것 같다.

2단계에서는 2가지 방법으로 구현해봤다.

  1. LadderGame에서 Position 기준으로 사다리 게임을 진행하는 방법
  2. Player에게 Ladder를 넘겨서 Ladder에게 Position을 넘겨주며 메시지를 보내는 방법

Position 기준으로 사다리 게임을 진행하는 방법

사실상 index를 Ladder에게 넘겨주고, 해당 index에 대한 결과를 받는 방법과 유사했다.
+구현하고 나니 다른 클래스들이 Position에 대한 의존도가 너무 높은 것 같았다.
+또한 Players가 별다른 책임을 가지고 있지 않다고 느꼈다.

public LadderGameResult play() {
final Map<Player, Item> result = new LinkedHashMap<>();
// 사용자 수만큼 Position을 가져와서 사다리 게임을 진행한다.
for (Position position : Position.range(players.count())) {
final Position resultPosition = ladder.play(position);
result.put(players.get(position), items.get(resultPosition));
}
return new LadderGameResult(result);
}

Player에게 Ladder를 전달하여 게임을 진행하는 방법

Position에 대한 값을 가지고 있는 Player에게 Ladder를 넘겨서, Player가 Ladder에게 메시지를 보내도록 구현하였다.
+이 방법이 사다리 게임을 위해서 객체들이 긴밀하게 협력하고, 조금 더 책임의 분배가 잘 되어있다고 생각이 되었다.

public LadderGameResult play() {
// 참가자들에게 사다리를 전달해서 사다리에게 메시지를 보내도록 한다.
final Map<Player, Position> playResult = players.play(ladder);

final Map<Player, Item> result = new LinkedHashMap<>();
for (Player player : playResult.keySet()) {
result.put(player, toItem(playResult.get(player)));
}
return new LadderGameResult(result);
}

부족했던 부분

유비쿼터스 언어에 시간을 들이기
+유비쿼터스 언어를 정하는데 시간을 조금 더 들여야겠다고 생각했다.
+사다리 타기의 실행 결과를 Item으로 짓다니.. 뭔가 만족스럽지 않다.
+이전 미션과 마찬가지로, 명명하는 부분에서 부족함을 많이 느꼈다.

페어와 조금 더 친해지기
+첫날은 페어와 친해지는 시간을 조금 더 가져야겠다고 생각했다.
+우가랑 회고할 때 내가 시작하자마자 컨벤션 정하자고 해서 많이 당황스러웠다고 한다. 우가 미안.. 🥲

README를 조금 더 꼼꼼하게
+이상하게 코딩에 집중하면 README를 업데이트하면서 같이 커밋 하는 걸 항상 까먹는다.
+다음 미션에는 조금 더 신경 써야겠다.

좋은 질문을 생각하기
+첫 PR때 리뷰어에게 질문을 남기지 못했다.
+리뷰어와의 시간이 소중한 시간이라는 것을 까먹지 말고, 나의 성장에 도움이 될 수 있는 질문을 생각해야겠다.

PR 후에도 꼼꼼하게 확인하기
+분명 알고 있는 부분이지만, 놓친 부분이 많은 것 같았다.
+PR 하기 전에도 계속 확인을 했지만, 아무래도 IntelliJ에서 보니 코드에 익숙해져서 그런지 변경해야 할 부분이 잘 안보였다.
+github pr에서는 전체 변경사항을 확인할 수 있으니 PR 후에도 꼭 확인해야겠다.

적극적으로 나의 의견을 말하기
+의견을 적극적으로 내는 부분에 대해서 페어의 의견이 괜찮다고 생각하면 수용 후 개선을 하는 방향으로 진행을 했었는데, 조금 더 개선할 수 있는 방향이 있다면 나도 적극적으로 의견을 말해야겠다고 생각이 든다.
+나도 설득하는 힘을 기르고, 페어도 좋은 방향을 알 수 있고, 결과물도 좋은 방향으로 나오지 않을까? (고민 들어주신 리뷰어 터틀🐢 감사합니다.)

새로 학습한 부분

객체의 생성 책임
+Players가 Position을 생성하고 Player의 생성자에 넣어주었다. 하지만 이 부분에 대해서 생성 책임에 관련된 코멘트가 달렸다. +시간을 가지고 생각해 보니 Position을 가지고 있는 건 Player기 때문에 생성 책임을 Player가 담당하는 것이 좋다고 생각되었다.

생성 책임에 관한 패턴으로 GRASP의 Creator 패턴이 있는데 다음의 요소를 최대한 만족하는 클래스에 생성 책임을 할당하는 것이 좋다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A를 긴밀하게 사용한다.
  • B가 A의 초깃값을 가지고 있다.

실제로 객체의 생성 책임에 관해서 깊이 생각하면서 코딩을 하지 않았는데, 이번 미션을 통해 시야가 넓어진 것 같다.

패키지 분리 기준
+패키지 분리에 대한 나만의 기준이 아직 명확하지 않아 질문이 들어와도 명확하게 답변을 하지 못했다.
+마지막 제출 전에 도메인 패키지 내부를 분리해 봤는데, 기준이 명확하지 않았기 때문에 좋지 않은 선택이었던 것 같다. +현재 진행하는 미션의 애플리케이션 크기가 그렇게 크지 않으니, domain 패키지에서 세부 패키지로 분리하지 않아도 될 것 같다.

사용하는 쪽에서 생각하기 & 예측가능한 코드 작성하기
+Position에서 다음 위치나 이전 위치를 반환하는 메서드를 허용 범위(0~19)가 벗어난다면, 의미 없는 값이 들어간 Position을 반환하도록 했다.
+이건 Position을 사용하는 입장을 고려하지 못한 코딩이었는데, 사용하는 입장에서는 0~19의 값이 보장되어 있다고 생각할 것이기 때문이다.
+따라서 hasNext, hasPrevious라는 이전 값, 이후 값이 범위 내에 있는지 확인하는 메서드를 추가하고, 기존의 값을 가져오는 메서드는 범위가 벗어나면 예외를 던지는 방향으로 해결하였다.

페어에게 배울 부분

밝은 기운을 가지고 있고 다른 사람들과 친화력이 좋은 것 같았다.
+이번에 페어 할 때 컨디션 관리를 제대로 못해서 많이 미안했다. 다음에는 최상의 컨디션으로 페어를 준비해 봐야겠다.
+그리고 우가랑 페어를 하고 나서, 나도 다른 사람들과 더 잘 지내봐야겠다는 생각이 들어 조금 더 용기를 내 잡담 중이다!

의견을 적극적으로 내줘서 페어프로그래밍 진행이 잘 되었다.
+또한 페어 진행이 느린 것 같다고 말해줘서 안정적으로 시간 안에 미션을 완료할 수 있었다.
+페어프로그래밍 진행 속도에 대해 조금 더 생각을 해봐야겠다!

항상 지나갈 때마다 웃어주는데, 나도 자주 웃어야겠다고 생각했다.
+웃는 것만으로도 사람이 밝아 보여서 너무 좋은 것 같다!

+ + \ No newline at end of file diff --git a/page/34.html b/page/34.html index c9cd71812..13dab5e2f 100644 --- a/page/34.html +++ b/page/34.html @@ -13,20 +13,38 @@ - - + +
-
본문으로 건너뛰기

· 약 4분

테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
-이 때 @ParameterizedTest를 사용하면 단일 테스트를 매개변수를 사용하여 여러 번 반복할 수 있다.

Argument Sources

@ParameterizedTest를 사용하려면 최소 하나 이상의 Source 애노테이션이 필요하다.
-JUnit이 제공하는 다양한 Source가 있기 때문에, 테스트에 맞춰 다양하게 사용할 수 있다.

Value Source

값을 이용하여 제공하는 형태로, 다음과 같은 타입의 값을 매개변수로 제공할 수 있다.

  • short, int, long, float, double
  • byte, char, boolean, String, Class
@ParameterizedTest
@ValueSource(ints = {1, 100, Integer.MAX_VALUE})
void valueTest(final int value) {
Assertions.assertThat(value).isPositive();
}

Null & Empty Source

null 값, 빈 값을 제공한다.
-Empty Source의 경우 다음과 같은 타입에 한해 매개변수로 제공할 수 있다.

  • String
  • java.util.List, java.util.Set, java.util.Map
  • primitive arrays — ex) int[]
  • object arrays — ex) String[]
@ParameterizedTest
@NullAndEmptySource
void nullAndEmptyTest(final String value) {
Assertions.assertThat(value).isNullOrEmpty();
}

Enum Source

EnumSource를 이용하여 Enum 또한 매개변수로 제공할 수 있다.

enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

@ParameterizedTest
@EnumSource(Day.class)
void enumTest(final Day day) {
assertThat(day).isInstanceOf(Day.class);
}

다음과 같이 mode 값을 이용하여 특징 Enum을 제외하거나, 포함시킬 수 있다. (default: Mode.Include)

@ParameterizedTest
@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)
void enumTest(final Day day) {
// MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
assertThat(day).isInstanceOf(Day.class);
}

CSV Source

csv 형식의 값을 이용하여 매개변수를 제공한다.
-구분자의 기본값은 쉼표(,)로 구분자를 변경하고 싶을 땐 delimeter 값을 따로 전달하여 사용할 수 있다. -개인적으로 2개 정도의 값을 매개변수로 전달하는 경우 CsvSource를 사용한다.

@ParameterizedTest
@CsvSource({"1,1", "2,4", "3,9", "4,16"})
void csvTest(final int number, final int result) {
assertThat(number * number).isEqualTo(result);
}

Method Source

복잡한 타입의 값을 전달할 때 사용한다.
-메서드명을 입력하여 매개변수를 제공하는 메서드를 지정할 수 있다.
-메서드명을 따로 입력하지 않으면 테스트명과 동일한 static 메서드가 지정된다.

@ParameterizedTest
@MethodSource
void methodTest(final List<Integer> numbers, final int count) {
assertThat(numbers).hasSize(count);
}

private static Stream<Arguments> methodTest() {
return Stream.of(
Arguments.of(List.of(1), 1),
Arguments.of(List.of(1, 2), 2),
Arguments.of(List.of(1, 2, 3), 3)
);
}

ETC.

위에서 언급한 방법 이외에도 다양한 방법으로 매개변수를 제공할 수 있다.

  • CSV 파일을 이용한 CsvFileSource
  • ArgumentsProvider 구현한 클래스를 이용하는 ArgumentsSource

참고 자료

- - +
본문으로 건너뛰기

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
+우테코 들어와서 첫 페어프로그래밍이라 많이 떨렸지만, 다즐이 대화를 잘 이끌어줘 너무 즐거웠다.

첫날은 간단히 컨벤션과 환경을 설정하는 시간을 가졌고 다음 날부터 자동차 경주를 시작했다.
+시작은 간단하게 요구사항을 정리하고, 어떻게 코드를 작성할지 같이 고민했다.

시작하기 전 아래와 같이 mermaid를 이용하여 의존성 방향에 대해서 간단한 다이어그램을 만들고 시작했다.
+mermaid는 코드로 다이어그램을 생성 해주는 도구로 다음과 같은 장점이 있다고 생각한다.

  • 코드 기반이라 빠른 시간 안에 생각한 것을 시각화할 수 있다.
  • github에서 mermaid를 지원하기 때문에 리뷰어에게 코드를 이해할 수 있는 부가적인 정보를 제공할 수 있다.

미션을 진행하는 데 큰 어려움이 있지는 않았고, 페어를 마치기 전 서로 고민되는 부분을 정리했을 때 좋았다.

페어하면서 잘했다고 생각했던 점은 서로의 생각과 리뷰 받은 것을 공유한 것이다.
+리팩터링을 어떻게 했는지? 이런 리뷰에 대해 어떻게 생각하는지 깊게 고민하는 시간을 가질 수 있었다.

부족했던 부분

리팩터링이 끝난 후 메서드명, 테스트시 출력하는 메시지에 대한 코멘트가 많이 달렸다.
+객체가 어떤 책임과 역할을 가지는지 생각하는 시간을 가지고 명확한 메서드명을 작성해야겠다고 생각했다.

평소에 프로그래밍 이야기가 아닌 다른 주제로 이야기하면 잘 들으려고 하는 편이지만
+내가 좋아하는 주제, 관심가는 주제인 프로그래밍에 대한 이야기를 할 땐 말이 많아진다.
+다음 미션부터는 더 많은 시간을 페어의 의견과 이야기를 듣는 곳에 사용해야겠다.

새로 학습한 부분

Assertions extracting

결과 내부에 있는 값을 확인하고 싶을 때 extracting 키워드를 이용해서 내부의 값을 검증할 수 있다.
+이전에는 필요에 따라 stream을 이용하여 검증할 값을 생성했지만, 해당 방법을 이용해서 절차를 줄일 수 있었다.

@Test
void extracting() {
final Cars cars = new Cars(List.of("car1", "car2"));

assertThat(cars.getCars())
.extracting(Car::getName)
.containsExactly("car1", "car2");
}

아래는 리뷰어님과 대화를 나누면서 얻은 답변 + 나의 의견이다.

제어할 수 없는 부분에 대한 테스트

테스트 대상이 검증된 것이라면 작성하지 않거나, 제어할 수 있는 부분에 대한 테스트를 더욱 꼼꼼하게 작성한다.
+이건 개인적인 생각이지만 내가 안정감이 들 수 있을 정도로 출력 범위 내의 결과를 반환하는지 정도 테스트할 수 있지 않을까?

단순 위임을 하는 메서드에 대한 테스트

위임이라는 것은 역할과 책임을 넘겨준다는 것이다.
+호출 횟수를 검증하는 것보다 결과에 대한 테스트하는 것이 좋다.
+단순히 위임만 하는 테스트의 경우 결과를 검증한다면 테스트가 중복되지 않을까 생각했었다.
+따라서 중복된 테스트를 줄이기 위해 내부의 메서드를 호출하는지 검증하는 방법도 있다는 것을 알게 되었지만
+안정적으로 결과를 테스트 하는 것이 더 좋은 방법인 것 같다.

테스트를 위한 getter 사용

테스트 용도로 도메인에 새로운 메서드가 생성되는 것은 좋지 못하다.
+필요의 경우 생성해서 사용할 수 있지만, 기존에 있는 메서드들을 활용해보는 것이 더 좋은 방법이다.
+이 부분에 대해서 매우 동의하고, 앞으로도 최대한 테스트를 위한 코드를 도메인에 작성하지 않을 것 같다.

페어에게 배울 부분

질문이나 생각할 점이 있을 때 매우 깊게 고민하는 것 같았다.
+생각을 정리한 후 자신의 의견을 명료하게 전달해주었다.
+그렇기 때문에 지식을 효율적으로 습득한다.
+난 생각을 잘 정리하지 않은 채로 내버려 둔 얕은 지식이 많은 것 같다. (이런 것도 아는 것이라고 할 수 있을까?)
+앞으로 조금 더 머릿속에서 정리하고, 문제에 대해 깊게 고민하는 시간을 늘려야겠다.

개발에 열정을 가진 게 느껴진다.
+나도 개발을 좋아하지만, 최근에는 의지가 약해졌었다.
+열정이 가득한 사람을 만나니 나도 열정적인 사람이 되는 것 같다.

칭찬을 많이 해준다. 단순히 많이 해주는 것이 아니라, 진심을 담긴 칭찬을 해줬다.
+칭찬은 고래도 춤추게 하던가?
+그래서 즐거운 마음으로 페어 프로그래밍을 했었던 것 같다.

어떤 이유 때문인지 모르겠지만 같이 페어하는데 편한 마음이 들었다.
+이건 바로 배울 수 없지만.
+나도 같이 일할 때 편한 사람, 같이 일하고 싶은 사람이 되기 위해 깊이 고민해봐야겠다.

+ + \ No newline at end of file diff --git a/page/35.html b/page/35.html index 1d8298403..b3bb6efc6 100644 --- a/page/35.html +++ b/page/35.html @@ -13,13 +13,20 @@ - - + +
-
본문으로 건너뛰기

· 약 1분

Import 자동 적용

Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly

auto-import

저장시 동작

Prefrences > Tools > Actions on Save

actions-on-save

Reformat Code: Code Reformmating

Optimize imports: 사용하지 않는 Import 제거

Rearrange: Code Style > Arrangement 설정 기반 코드 재정렬

메소드 추출, 변수 추출시 final 적용

Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier

final-modifier

- - +
본문으로 건너뛰기

· 약 4분

테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
+이 때 @ParameterizedTest를 사용하면 단일 테스트를 매개변수를 사용하여 여러 번 반복할 수 있다.

Argument Sources

@ParameterizedTest를 사용하려면 최소 하나 이상의 Source 애노테이션이 필요하다.
+JUnit이 제공하는 다양한 Source가 있기 때문에, 테스트에 맞춰 다양하게 사용할 수 있다.

Value Source

값을 이용하여 제공하는 형태로, 다음과 같은 타입의 값을 매개변수로 제공할 수 있다.

  • short, int, long, float, double
  • byte, char, boolean, String, Class
@ParameterizedTest
@ValueSource(ints = {1, 100, Integer.MAX_VALUE})
void valueTest(final int value) {
Assertions.assertThat(value).isPositive();
}

Null & Empty Source

null 값, 빈 값을 제공한다.
+Empty Source의 경우 다음과 같은 타입에 한해 매개변수로 제공할 수 있다.

  • String
  • java.util.List, java.util.Set, java.util.Map
  • primitive arrays — ex) int[]
  • object arrays — ex) String[]
@ParameterizedTest
@NullAndEmptySource
void nullAndEmptyTest(final String value) {
Assertions.assertThat(value).isNullOrEmpty();
}

Enum Source

EnumSource를 이용하여 Enum 또한 매개변수로 제공할 수 있다.

enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

@ParameterizedTest
@EnumSource(Day.class)
void enumTest(final Day day) {
assertThat(day).isInstanceOf(Day.class);
}

다음과 같이 mode 값을 이용하여 특징 Enum을 제외하거나, 포함시킬 수 있다. (default: Mode.Include)

@ParameterizedTest
@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)
void enumTest(final Day day) {
// MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
assertThat(day).isInstanceOf(Day.class);
}

CSV Source

csv 형식의 값을 이용하여 매개변수를 제공한다.
+구분자의 기본값은 쉼표(,)로 구분자를 변경하고 싶을 땐 delimeter 값을 따로 전달하여 사용할 수 있다. +개인적으로 2개 정도의 값을 매개변수로 전달하는 경우 CsvSource를 사용한다.

@ParameterizedTest
@CsvSource({"1,1", "2,4", "3,9", "4,16"})
void csvTest(final int number, final int result) {
assertThat(number * number).isEqualTo(result);
}

Method Source

복잡한 타입의 값을 전달할 때 사용한다.
+메서드명을 입력하여 매개변수를 제공하는 메서드를 지정할 수 있다.
+메서드명을 따로 입력하지 않으면 테스트명과 동일한 static 메서드가 지정된다.

@ParameterizedTest
@MethodSource
void methodTest(final List<Integer> numbers, final int count) {
assertThat(numbers).hasSize(count);
}

private static Stream<Arguments> methodTest() {
return Stream.of(
Arguments.of(List.of(1), 1),
Arguments.of(List.of(1, 2), 2),
Arguments.of(List.of(1, 2, 3), 3)
);
}

ETC.

위에서 언급한 방법 이외에도 다양한 방법으로 매개변수를 제공할 수 있다.

  • CSV 파일을 이용한 CsvFileSource
  • ArgumentsProvider 구현한 클래스를 이용하는 ArgumentsSource

참고 자료

+ + \ No newline at end of file diff --git a/page/36.html b/page/36.html index 9737f7cb3..faab1f54c 100644 --- a/page/36.html +++ b/page/36.html @@ -13,24 +13,13 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

nullable 타입

코틀린은 NullPointerException 예외를 최대한 발생시키지 않기 위해 타입 시스템이 설계되어 있다.
-이는 실행 시점이 아닌 컴파일 시 미리 오류가 발생할 가능성이 있는 부분을 미리 감지하여 NPE 발생의 가능성을 줄여준다.

코틀린의 경우 nullable 타입을 다음과 같이 표현한다.

val number: Int?

타입 뒤에 ?를 붙여 해당 값이 null이 될 수 있다는 것을 의미한다.
-만약 ?를 붙이지 않을 때 null을 받는 경우 컴파일 시 오류가 발생한다.

?. Safe Calls 연산자

자바에서 NPE를 발생시키지 않기 위해 null을 처리하는 가장 간단한 방법으로는 분기를 사용하는 방법이 있다.

코틀린은 안전한 호출 연산자인 ?. 연산자를 지원한다.
-따라서 참조 값이 null이 아닐 경우에만 메서드 호출을 할 수 있다.
-참조 값이 null인 경우 메서드 호출이 무시되고, null을 반환한다.

public String repeat(String word) {
if (word == null) {
return null;
}
return word.repeat(2);
}

?: 엘비스 연산자

참조하려는 값이 null일 경우 기본 값을 반환하고 싶을 때는 어떻게 해야 할까?
-코틀린은 null이 아닌 경우 기본 값을 지정할 때 사용할 수 있는 엘비스 연산자를 지원한다.

public String stringSafe(String word) {
if (word == null) {
return "";
}
return word;
}

코틀린에서는 throw도 식이기 때문에 엘비스 연산자를 이용하여 예외를 던질 수 있다.
-예를 들어 사용자 정보가 있는 저장소에 찾는 사용자가 없는 경우 아래와 같이 사용할 수 있다.

userRepository.findByName(name) ?: throw IllegalArgumentException()

!! 널 아님 단언 연산자

!! 연산자를 이용한다면 강제로 어떤 값이든 non-nullable 타입으로 변경할 수 있다.
-하지만 null인 값에 사용한다면 NPE가 발생하게 된다.
-일반적인 경우에는 !! 연산자를 사용하는 것은 위험하다.
-사용하기 쉽지만, 리스크가 크고 혹시나 해당 값이 추후에는 null이 될 수 있기 때문에 지양해야 된다고 생각한다.

val length: Int = word!!.length

as? 안전한 캐스팅

타입 변환을 할 때 지정한 타입으로 변경할 수 없다면 ClassCastException이 발생한다.
-코틀린에서는 as 뒤에 ?를 붙여 안전하게 타입 변환을 할 수 있다.
-따라서 미리 변환 가능한 타입인지 확인하지 않고, 안전하게 타입을 변환 할 수 있다.

타입 변환이 불가능 할 경우 예외를 발생시키지 않고 null을 반환한다.

val value: Int? = something as? Int

List에서의 null 처리

List에는 null이 아닌 값만 반환하는 filterNotNull 유틸리티 메서드를 제공한다.

val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")
val foods = foodsWithNull.filterNotNull()

참고 자료

- - +
본문으로 건너뛰기

· 약 1분

Import 자동 적용

Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly

auto-import

저장시 동작

Prefrences > Tools > Actions on Save

actions-on-save

Reformat Code: Code Reformmating

Optimize imports: 사용하지 않는 Import 제거

Rearrange: Code Style > Arrangement 설정 기반 코드 재정렬

메소드 추출, 변수 추출시 final 적용

Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier

final-modifier

+ + \ No newline at end of file diff --git a/page/37.html b/page/37.html index 69293921b..28373665a 100644 --- a/page/37.html +++ b/page/37.html @@ -13,19 +13,24 @@ - - + +
-
본문으로 건너뛰기

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
-ISO-8601을 기반으로 작성
-설계 목표 → 불변, Fluent API, 명확하고 명시적, 확장 가능성

ISO-8601

날짜와 시간에 관련된 데이터를 다루는 국제 표준

LocalDate, LocalTime, LocalDateTime

날짜와 시간을 표현하는 클래스

Instant

유닉스 시간(1970-01-01, 00:00:00 UTC) 기준으로 특정 지점까지의 시간을 초로 표현하는 클래스
-기계의 관점에서 시간 표현

Duration, Period

간격을 표현하는 클래스

TemporalAdjusters

복잡한 날짜 조정이 필요할 때 사용
-필요한 경우 다음 인터페이스를 구현하여 커스텀 TemporalAdjuster를 구현 가능

@FunctionalInterface
public interface TemporalAdjuster {
Temporal adjustInto(Temporal temporal);
}

DateTimeFormatter

날짜와 시간 포맷 클래스
-특정 날짜 패턴이나, DateTimeFormatterBuilder를 이용해서 커스텀한 포맷을 생성 가능

ZoneId, ZoneOffset

ZoneId는 지역 ID는 ‘지역/도시’ 형식, ZoneOffset은 시차 UTC 기준 고정된 시간 차이 이용
-ZoneId의 경우 IANA Time Zone Database에서 제공하는 지역 집합 정보 사용

Instant instant = Instant.now();
LocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

참고 자료

- - +
본문으로 건너뛰기

· 약 5분

nullable 타입

코틀린은 NullPointerException 예외를 최대한 발생시키지 않기 위해 타입 시스템이 설계되어 있다.
+이는 실행 시점이 아닌 컴파일 시 미리 오류가 발생할 가능성이 있는 부분을 미리 감지하여 NPE 발생의 가능성을 줄여준다.

코틀린의 경우 nullable 타입을 다음과 같이 표현한다.

val number: Int?

타입 뒤에 ?를 붙여 해당 값이 null이 될 수 있다는 것을 의미한다.
+만약 ?를 붙이지 않을 때 null을 받는 경우 컴파일 시 오류가 발생한다.

?. Safe Calls 연산자

자바에서 NPE를 발생시키지 않기 위해 null을 처리하는 가장 간단한 방법으로는 분기를 사용하는 방법이 있다.

코틀린은 안전한 호출 연산자인 ?. 연산자를 지원한다.
+따라서 참조 값이 null이 아닐 경우에만 메서드 호출을 할 수 있다.
+참조 값이 null인 경우 메서드 호출이 무시되고, null을 반환한다.

public String repeat(String word) {
if (word == null) {
return null;
}
return word.repeat(2);
}

?: 엘비스 연산자

참조하려는 값이 null일 경우 기본 값을 반환하고 싶을 때는 어떻게 해야 할까?
+코틀린은 null이 아닌 경우 기본 값을 지정할 때 사용할 수 있는 엘비스 연산자를 지원한다.

public String stringSafe(String word) {
if (word == null) {
return "";
}
return word;
}

코틀린에서는 throw도 식이기 때문에 엘비스 연산자를 이용하여 예외를 던질 수 있다.
+예를 들어 사용자 정보가 있는 저장소에 찾는 사용자가 없는 경우 아래와 같이 사용할 수 있다.

userRepository.findByName(name) ?: throw IllegalArgumentException()

!! 널 아님 단언 연산자

!! 연산자를 이용한다면 강제로 어떤 값이든 non-nullable 타입으로 변경할 수 있다.
+하지만 null인 값에 사용한다면 NPE가 발생하게 된다.
+일반적인 경우에는 !! 연산자를 사용하는 것은 위험하다.
+사용하기 쉽지만, 리스크가 크고 혹시나 해당 값이 추후에는 null이 될 수 있기 때문에 지양해야 된다고 생각한다.

val length: Int = word!!.length

as? 안전한 캐스팅

타입 변환을 할 때 지정한 타입으로 변경할 수 없다면 ClassCastException이 발생한다.
+코틀린에서는 as 뒤에 ?를 붙여 안전하게 타입 변환을 할 수 있다.
+따라서 미리 변환 가능한 타입인지 확인하지 않고, 안전하게 타입을 변환 할 수 있다.

타입 변환이 불가능 할 경우 예외를 발생시키지 않고 null을 반환한다.

val value: Int? = something as? Int

List에서의 null 처리

List에는 null이 아닌 값만 반환하는 filterNotNull 유틸리티 메서드를 제공한다.

val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")
val foods = foodsWithNull.filterNotNull()

참고 자료

+ + \ No newline at end of file diff --git a/page/38.html b/page/38.html index 28e462f23..5e2ece3c0 100644 --- a/page/38.html +++ b/page/38.html @@ -13,32 +13,19 @@ - - + +
-
본문으로 건너뛰기

· 약 6분

책 정보

객체지향의 사실과 오해
-조영호

읽고 나서

조영호님의 오브젝트를 읽고 나서 다시 한 번 읽어보았다.
-아직 이해가 안되는 부분이 많지만, 그래도 항상 새로움을 느낀다.
-더할 나위 없이 휼륭한 객체지향 책이고, 조금 더 공부하고 다시 읽어봐야될 것 같다.

커피 전문점, 지하철 노선도, 이상한 나라의 엘리스를 예시로 든 설명이 너무 좋았고
-좋은 내용을 담고 있지만 그렇다고 너무 무겁지 않아 가볍게 읽기도 좋은 것 같다.

책임의 자율성을 강조하는 이유 p.173

협력을 단순하게 만든다.

  • 의도를 명확하게 표현 → 협력의 복잡함 저하
  • 책임의 추상화

외부와 내부를 명확하게 분리한다.

  • 요청하는 객체가 몰라도 되는 부분이 캡슐화됨으로 인터페이스와 구현의 분리

책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다.

  • 변경의 파급효과를 객체 내부로 캡슐화 → 메시지를 보내는 객체와의 결합도 저하

협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다.

  • 유연한 설계 → 재사용성 증가

객체의 역할을 이해하기 쉬워진다.

  • 응집도를 높은 상태로 유지

밑줄 친 문장들

객체지향의 목표는 실세계를 모방하는 것이 아니다. -오히려 새로운 세계를 창조하는 것이다. -소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이다. -p.21

과거의 전통적인 개발 방법은 데이터와 프로세스를 엄격하게 구분한다. -이에 반해 객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다. -자율적인 객체로 구성된 공동체는 유지 보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있는 가능성을 제시한다. -p.33

객체지향의 본질

시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법

자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.

객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.

객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다. -p.35

클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라. -객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다. -p.38

객체지향에서 중요한 것은 동적으로 변하는 객체의 ‘상태’와 상태를 변경하는 ‘행위’다. -클래스는 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘이라는 사실을 기억하라. -p.105

책임 주도 설계의 핵심은 어떤 행위가 필요한지를 먼저 결정한 후에 이 행위를 수행할 객체를 결정하는 것이다. -이 과정을 흔히 What/Who 사이클이라고 한다. -’어떤 행위(What)’를 수행할 것인지 결정한 후 ‘누가(who)’ 그 행위를 수행할 것인지 결정해야 한다. -여기서 ‘어떤 행위’가 바로 메시지다. -p.158

- - +
본문으로 건너뛰기

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
+ISO-8601을 기반으로 작성
+설계 목표 → 불변, Fluent API, 명확하고 명시적, 확장 가능성

ISO-8601

날짜와 시간에 관련된 데이터를 다루는 국제 표준

LocalDate, LocalTime, LocalDateTime

날짜와 시간을 표현하는 클래스

Instant

유닉스 시간(1970-01-01, 00:00:00 UTC) 기준으로 특정 지점까지의 시간을 초로 표현하는 클래스
+기계의 관점에서 시간 표현

Duration, Period

간격을 표현하는 클래스

TemporalAdjusters

복잡한 날짜 조정이 필요할 때 사용
+필요한 경우 다음 인터페이스를 구현하여 커스텀 TemporalAdjuster를 구현 가능

@FunctionalInterface
public interface TemporalAdjuster {
Temporal adjustInto(Temporal temporal);
}

DateTimeFormatter

날짜와 시간 포맷 클래스
+특정 날짜 패턴이나, DateTimeFormatterBuilder를 이용해서 커스텀한 포맷을 생성 가능

ZoneId, ZoneOffset

ZoneId는 지역 ID는 ‘지역/도시’ 형식, ZoneOffset은 시차 UTC 기준 고정된 시간 차이 이용
+ZoneId의 경우 IANA Time Zone Database에서 제공하는 지역 집합 정보 사용

Instant instant = Instant.now();
LocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

참고 자료

+ + \ No newline at end of file diff --git a/page/39.html b/page/39.html index 04feb1685..43f983f77 100644 --- a/page/39.html +++ b/page/39.html @@ -13,27 +13,32 @@ - - + +
-
본문으로 건너뛰기

· 약 4분

적당한 전환점, 2022년을 돌아보며

전역

약 1년 6개월간의 공군 정보보호병 생활을 마치고 전역을 했다.
-조기 전역 때문에 2021년 12월에 나왔지만, 실제 전역 날짜는 2022년이니 회고에 적어도 상관없겠지.

조금 더 미래에 대한 생각을 해볼걸 그랬다.
-전역을 했지만 뭐 하나 제대로 할 줄 아는 것도 없으니 넓은 바닷속에 덩그러니 놓아진 기분이 괜히 들었었다.
-일찍 생각을 정리하여 방향을 잡지 못했기에 아쉬움이 많이 남았다.

자바

전역을 하고 진로를 고민하다 향로님의 자바 공화국 포스팅을 읽고 나서 자바 공부를 시작했다.
-유명한 인프런의 김영한님의 스프링 강의도 있고, 좋은 자바 개발 서적이 많아서 독학하기로 결정했다.
-하다 보니 자바와 스프링을 공부하면서 “왜 진작하지 않았지”라는 생각도 많이 들었다.
-양질의 자료도 많았기 때문에, 예전에 노드로 개발했을 때 풀지 못했던 답답함을 많이 해소했던 것 같다.

23년에는 조금 더 깊게 자바를 공부해볼 생각이다.
-언어를 하나 깊게 공부하는 건 많은 도움이 되는 것 같다.

스터디

김영한님의 강의를 거의 다 들었을 때쯤, 항상 강의에서 언급되는 토비의 스프링을 읽어보고 싶어졌고
-혼자 공부하기에는 동기부여도 부족했기 때문에 스터디를 시작했다.
-다른 사람에게 설명을 해야 했기 때문에 더욱 꼼꼼하게 공부를 할 수 있어서 좋았지만 나에게는 내용이 꽤나 어려워서 시간을 많이 소비했다.
-같이 스터디하시는 분과 7개월 동안 스터디를 꾸준히 이어나가 총 3권의 책을 읽을 수 있었다.

우아한 테크코스

군 복무 중일 때 지원했다 떨어진 우아한 테크코스를 다시 지원했다.
-이번 연도에 취업을 하는 게 목표였지만 내가 가지고 있는 특별한 무기가 없다는 걸 깨달았다.
-적지 않은 시간을 투자해 준비를 했고, 감사하게도 이번에는 최종 합격을 했다.

난 사람들과 소통하고, 협업하는 능력이 부족하다고 생각을 많이 했다.
-우아한 테크코스를 통해 그 빈 부분을 채우도록 노력해야겠다.

2023년에는

마음의 여유가 없었던 2022년이었던 것 같다.
-하고 싶은 건 많지만, 이번에는 여유를 가지고 할 수 있는 것에 최선을 다해야겠다.

- - +
본문으로 건너뛰기

· 약 6분

책 정보

객체지향의 사실과 오해
+조영호

읽고 나서

조영호님의 오브젝트를 읽고 나서 다시 한 번 읽어보았다.
+아직 이해가 안되는 부분이 많지만, 그래도 항상 새로움을 느낀다.
+더할 나위 없이 휼륭한 객체지향 책이고, 조금 더 공부하고 다시 읽어봐야될 것 같다.

커피 전문점, 지하철 노선도, 이상한 나라의 엘리스를 예시로 든 설명이 너무 좋았고
+좋은 내용을 담고 있지만 그렇다고 너무 무겁지 않아 가볍게 읽기도 좋은 것 같다.

책임의 자율성을 강조하는 이유 p.173

협력을 단순하게 만든다.

  • 의도를 명확하게 표현 → 협력의 복잡함 저하
  • 책임의 추상화

외부와 내부를 명확하게 분리한다.

  • 요청하는 객체가 몰라도 되는 부분이 캡슐화됨으로 인터페이스와 구현의 분리

책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다.

  • 변경의 파급효과를 객체 내부로 캡슐화 → 메시지를 보내는 객체와의 결합도 저하

협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다.

  • 유연한 설계 → 재사용성 증가

객체의 역할을 이해하기 쉬워진다.

  • 응집도를 높은 상태로 유지

밑줄 친 문장들

객체지향의 목표는 실세계를 모방하는 것이 아니다. +오히려 새로운 세계를 창조하는 것이다. +소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이다. +p.21

과거의 전통적인 개발 방법은 데이터와 프로세스를 엄격하게 구분한다. +이에 반해 객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다. +자율적인 객체로 구성된 공동체는 유지 보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있는 가능성을 제시한다. +p.33

객체지향의 본질

시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법

자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.

객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.

객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다. +p.35

클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라. +객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다. +p.38

객체지향에서 중요한 것은 동적으로 변하는 객체의 ‘상태’와 상태를 변경하는 ‘행위’다. +클래스는 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘이라는 사실을 기억하라. +p.105

책임 주도 설계의 핵심은 어떤 행위가 필요한지를 먼저 결정한 후에 이 행위를 수행할 객체를 결정하는 것이다. +이 과정을 흔히 What/Who 사이클이라고 한다. +’어떤 행위(What)’를 수행할 것인지 결정한 후 ‘누가(who)’ 그 행위를 수행할 것인지 결정해야 한다. +여기서 ‘어떤 행위’가 바로 메시지다. +p.158

+ + \ No newline at end of file diff --git a/page/4.html b/page/4.html index cbb0d6a3a..5ded0f3ea 100644 --- a/page/4.html +++ b/page/4.html @@ -13,21 +13,33 @@ - - + +
-
본문으로 건너뛰기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
-하지만 특수한 경우에는 정적 메서드를 모킹하는 것이 필요할 수 있다고 생각한다.

예를 들어 레거시 코드를 테스트 한다던지, IO 관련한 부분을 테스트 할 때 정말 필요한 부분에만 적용할 수 있을 것이다.

프로젝트를 진행하며 ImageIo.write 메서드가 호출되는 지 검증이 필요했다.
-해당 static 메서드를 호출하는 부분을 따로 RouteImageUploader 클래스로 최대한 분리했다.
-이미지 저장 기능 자체가 외부로 나가는 상호작용이고, 호출 횟수를 검사하는데는 mock을 사용하는게 적절하다고 판단했다.

public void upload(BufferedImage bufferedImage) {
File file = new File(파일경로);
try {
ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);
} catch (IOException e) {
throw new DrawException(IMAGE_SAVE_FAIL);
}
}

Mocking static methods

Mockito 3.4.0 이후에는 static method를 모킹할 수 있는 Mockito.mockStatic 메서드를 지원한다.
-mockStatic을 사용하면 MockedStatic<T>이 반환되는데 사용 후 꼭 close를 해줘야 한다.

JUnit의 @BeforeAll로 설정하고 @AfterAll 메서드로 종료하는 방법도 있지만 MockedStatic<T>의 상위 인터페이스인 ScopedMock이 AutoCloseable을 구현하고 있기에 try-with-resources를 사용하는 방법이 더욱 좋은 것 같다.

// given
BufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);
RouteImageUploader routeImageUploader = new RouteImageUploader();

// expect
try (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {
routeImageUploader.upload(bufferedImage);
imageIO.verify(
() -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),
times(1)
);
}

마치며

정적 메서드를 모킹하는 것은 안티패턴이기 때문에 최대한 적절한 추상화를 이용해 테스트 하기 좋은 코드를 만드는 연습을 하자.
-하지만 추상화를 하면 할 수록 코드의 복잡도는 증가한다.
-항상 상황을 고려하고 간결함을 포기할 만큼 중요한 부분인지 적절한 트레이드오프를 고려하자.

참고 자료

Mocking static methods
-Mockito mock static methods
-Enable mocking static methods in Mockito

- - +
본문으로 건너뛰기

· 약 7분

개요

이전에 기술 구현 가능 여부를 조사하면서 파이썬을 사용한 내용을 정리한 내용이다.

사용 기술

언어: Python 3.10
+이미지 생성: matplotlib
+서비스: AWS Lambda, AWS API Gateway
+이미지 저장 및 URL: AWS S3, AWS CloudFront

플로우는 다음과 같다.

요구사항

./route.png

우측 상단의 경로 이미지를 생성하려고 한다.
+경로 이미지 생성에 대한 요구사항은 다음과 같다.

  • 위도, 경도로 이루어진 배열을 입력받는다.
  • 이미지 생성
  • 선과 점 표현
  • 투명한 배경색
  • 위경도 차이가 크든 작든 제공하는 이미지 내에 경로가 다 포함되어 있어야 한다.

이미지 출력 방식

  1. 위경도를 처리한 값으로 직접 경로를 그린 다음 이미지 형태로 저장
  2. 플롯을 그려주는 라이브러리 사용하여 이미지 형태로 저장

이미지 출력 방식의 경우 1번과 2번을 고민했었다.
+파이썬으로는 플롯을 그려주는 라이브러리인 matplotlib을 사용했다.

로컬에서 기능 구현

import time

import matplotlib.pyplot as plt


def draw(point):
start = time.time()
x, y = zip(*point)
pixel_x, pixel_y = convert_to_pixel_values(x, y)
draw_lines(pixel_x, pixel_y)
end = time.time()
print(end - start)

def convert_to_pixel_values(x, y):
max_diff = max(max(x) - min(x), max(y) - min(y))
return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)


def scale_to_pixel_values(points, max_diff):
min_value = min(points)
scaled_coordinates = [(p - min_value) / max_diff for p in points]
return scaled_coordinates


def draw_lines(x, y):
figure = plt.gcf()
figure.set_size_inches(5, 5)
plt.plot(x, y, c = 'w',linewidth=5)
plt.scatter(x[3],y[3], c = 'w', s = 125)
plt.axis('off')
plt.savefig('name.png', transparent=True, format='png')

point = [
[126.96352960597338, 37.590841000217125],
[126.96987292787792, 37.58435564234159],
[126.98128481452298, 37.58594375113966],
[126.99360339342958, 37.58248524741927],
[126.99867565340067, 37.56778118088622],
[127.001935378366117, 37.55985240444085],
[126.9831048919687, 37.548030119488665],
[126.97189273528845, 37.5119879225856],
[127.02689859997221, 37.48488593333883]
]

draw(point)

생성 결과는 아래와 같다. (예시를 위해 검은색으로 출력)

./routeImage.png

AWS Lambda

썸네일 생성 서버를 따로 두기는 기능 대비 비용이 너무 클 것이라고 생각했다.
+따라서 서버리스로 파일을 처리했다.
+추가로 s3 접근은 boto3를 사용했다.

람다 S3 접근을 위한 IAM 생성

AmazonS3FullAccess, AmazonS3ObjectLambdaExecutionRolePolicy 두가지를 추가해서 Lambda 전용 역할을 만들어 사용했다.

람다 배포용 코드

기술 구현 가능 여부를 확인할 땐 위치 점을 찍는 기능을 람다에 배포하지 않았다.


import io
import uuid

import boto3
import matplotlib.pyplot as plt

PIXEL = 255
BUCKET_NAME = 'image-plot'
S3 = 's3'

def lambda_handler(event, context):
x = event['x']
y = event['y']
image_name = str(uuid.uuid4())

img_data = draw(x, y)
s3 = boto3.client(S3)
s3.put_object(Body=img_data.getvalue(), ContentType='image/png', Bucket=BUCKET_NAME, Key=image_name)
url = f'https://{BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{image_name}'

return {
'statusCode': 200,
'body': url
}

def draw(x, y):
pixel_x, pixel_y = convert_to_pixel_values(x, y)
img_data = draw_lines(pixel_x, pixel_y)
plt.close()
return img_data

def convert_to_pixel_values(x, y):
max_diff = max(max(x) - min(x), max(y) - min(y))
return scale_to_pixel_values(x, max_diff), scale_to_pixel_values(y, max_diff)

def scale_to_pixel_values(points, max_diff):
min_value = min(points)
scaled_coordinates = [(p - min_value) / max_diff for p in points]
pixel_values = [int(p * PIXEL) for p in scaled_coordinates]
return pixel_values

def draw_lines(x, y):
plt.plot(x, y, 'k-', linewidth=10)
plt.axis('off')
img_data = io.BytesIO()
plt.savefig(img_data, transparent=True, format='png')
img_data.seek(0)
return img_data

Layer 추가를 위한 zip 파일 생성

matplotlib의 경우 외부 라이브러리기 때문에 따로 Layer를 추가해야 한다.
+zip 파일을 만들어서 업로드해야한다.
+이때 python의 Lambda 런타임에 대한 계층 경로는 python이다.
+따라서 압축한 zip 파일은 다음과 같은 구조를 띄어야 한다.

pillow.zip
│ python/PIL
└ python/Pillow-5.3.0.dist-info

Ubuntu 기준 다음 명령어를 입력하여 생성을 진행했다.

sudo apt update
sudo apt install zip
sudo apt install python3-pip

mkdir python
pip3 install matplotlib -t python # pip3 install 설치할_패키지 -t 설치_경로
zip -r my_layer.zip python # zip -r 압축_파일명 압축_파일이_존재하는_경로

No module named 'numpy.core._multiarray_umath' 에러

Layer 추가 후 람다 실행 시 발생한 에러였다.
+처음에 mac에서 zip 파일을 생성해서 업로드했는데 해당 문제가 발생했다.
+이는 lambda가 돌아가는 동일한 환경에서 layer를 위한 zip 파일을 만들지 않아서 발생하는 문제다.
+간단하게 ec2 인스턴스를 하나 만들어서 따로 Layer를 생성하면 문제가 발생하지 않는다.

적정기술에 대한 생각

프로젝트에 Lambda와 Python을 사용하려고 했지만 아쉽게도 반려당했다.
+AWS Lambda를 사용하는 것은 인스턴스에 해당 코드를 배포하는 것보다 더 효율적인 방법일 수 있다.
+하지만 현재 프로젝트에서 가용 가능한 자원, 기술의 난이도, 사용하는 팀원을 고려한다면 Lambda는 적정기술이 아닐 수 있다.
+따라서 해당 이미지 생성기를 어떻게 적용할지 조금 더 고려를 해야 될 것으로 보인다.

최종적으로 Java AWT를 사용하기로 결정했다.

참고 자료

AWS Lambda
+Lambda Layer
+Python Lambda 함수에 대한 .zip 파일 아카이브 작업
+No module named 'numpy.core._multiarray_umath'
+사례별로 알아본 안전한 S3 사용 가이드

+ + \ No newline at end of file diff --git a/page/40.html b/page/40.html index c8cd2fe1a..990a714c6 100644 --- a/page/40.html +++ b/page/40.html @@ -13,18 +13,27 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

책 정보

글, 우리도 잘 쓸 수 있습니다.
-박솔미

읽고 나서

저자의 경험과 함께 글쓰기에 대한 가벼운 조언이 담겨있어 가볍게 읽기 좋았다.
-글을 잘 작성해 보고 싶을 때 적용해 볼 수 있는 정보가 많아서 도움이 되었다.

우아한 테크코스의 프리코스를 진행할 때 후기를 작성하고 나면 항상 글이 딱딱하다는 느낌을 받았다.
-다른 지원자들의 읽기 편하고, 밝은 느낌을 주는 글을 보면 부러운 마음을 가지기도 했다.
-이 책을 읽었으니 2023년에는 조금 더 글을 잘 적어보려고 한다.

밑줄 친 문장들

문장이 심심하고 지루하다면 -내용을 일목요연하게 정리했고, 글의 의도도 삐뚤지 않고, 단어도 적절한 것으로 골랐는데… 그런데도 어딘가가 심심하고 지루하다면? 축축 처지고 따분하다면? 말꼬리를 모조리 ‘~다’로 통일한 건 아닌지 점검해 보세요.

말꼬리를 잘 갖고 놀아야 합니다. 문장의 마지막 글자를 매번 다르게 고쳐쓰는 것만으로도 글에 활기를 더할 수 있죠. 때론 문장을 다 마치지 않고, 단어로만 끝맺는 것도 방법. 문장과 문장 사이에 쉼표가 들어서며 글 전체에 활기가 돌게 돼요. 문장의 길이도 다채로워지는 덕분에 덤으로 얻게 되는 것도 있습니다. 바로, 글의 리듬.

이전 문장에서 끝난 글자로, 다음 문장을 끝맺지 않기. 한두 문단마다 단어 수준의 아주 짧은 문장 배치하기.

글의 진짜 이유, 글의 진짜 목적, 글의 진짜 대상을 찾으려고 애썼습니다. 지금처럼 틀을 떠올린다거나, 눈치를 본다거나, 정치적인 셈도 하지 않았어요.

제목은 짧게, 보기 쉽게, 읽기 쉽게, 발음이 비슷하게, 순서를 바꿔서

글을 마지막으로 다듬을 때, 노래에 가까워질 방법은 없을지 고민해봅니다. 감히 가 닿을 수 없는 목표이겠지만, 할 수 있는 최소한의 리듬이라도 붙여주고 싶어요.

여는 말과 마지막 말에 작정하고 마음을 담는 연습을 해봅시다. 글의 어느 구석이라도 뻔한 글자는 남기지 않겠노라 다짐하며 써보는 겁니다. 나만이 가진 유일한 메시지에 집중하면서요. 그럼 생각이 달라지고, 고르는 단어도 달라지고, 남긴 문장도 달라져요. 결국에는 글을 쓴 사람인 나 자신도 남달라질 겁니다.

맞춤법은 중요합니다. 하지만 맞춤법보다 더 중요한 건 거기에 담긴 마음입니다. 내 마음을 글에 담아 실어 보내기 전, 맞춤법을 점검하는 이유 역시 그겁니다. 오직 내 마음이 남에게 읽히는 동안 방해가 되지 않기를 바라기 때문이죠. 내가 쓴 글도, 남이 쓴 글도. 언제나 그 안에 담긴 마음이 먼저입니다.

글을 쓴다고 글이 완성되는 게 아니에요. 글과 닮은 모습으로 살 때, 글은 비로소 완성됩니다.

- - +
본문으로 건너뛰기

· 약 4분

적당한 전환점, 2022년을 돌아보며

전역

약 1년 6개월간의 공군 정보보호병 생활을 마치고 전역을 했다.
+조기 전역 때문에 2021년 12월에 나왔지만, 실제 전역 날짜는 2022년이니 회고에 적어도 상관없겠지.

조금 더 미래에 대한 생각을 해볼걸 그랬다.
+전역을 했지만 뭐 하나 제대로 할 줄 아는 것도 없으니 넓은 바닷속에 덩그러니 놓아진 기분이 괜히 들었었다.
+일찍 생각을 정리하여 방향을 잡지 못했기에 아쉬움이 많이 남았다.

자바

전역을 하고 진로를 고민하다 향로님의 자바 공화국 포스팅을 읽고 나서 자바 공부를 시작했다.
+유명한 인프런의 김영한님의 스프링 강의도 있고, 좋은 자바 개발 서적이 많아서 독학하기로 결정했다.
+하다 보니 자바와 스프링을 공부하면서 “왜 진작하지 않았지”라는 생각도 많이 들었다.
+양질의 자료도 많았기 때문에, 예전에 노드로 개발했을 때 풀지 못했던 답답함을 많이 해소했던 것 같다.

23년에는 조금 더 깊게 자바를 공부해볼 생각이다.
+언어를 하나 깊게 공부하는 건 많은 도움이 되는 것 같다.

스터디

김영한님의 강의를 거의 다 들었을 때쯤, 항상 강의에서 언급되는 토비의 스프링을 읽어보고 싶어졌고
+혼자 공부하기에는 동기부여도 부족했기 때문에 스터디를 시작했다.
+다른 사람에게 설명을 해야 했기 때문에 더욱 꼼꼼하게 공부를 할 수 있어서 좋았지만 나에게는 내용이 꽤나 어려워서 시간을 많이 소비했다.
+같이 스터디하시는 분과 7개월 동안 스터디를 꾸준히 이어나가 총 3권의 책을 읽을 수 있었다.

우아한 테크코스

군 복무 중일 때 지원했다 떨어진 우아한 테크코스를 다시 지원했다.
+이번 연도에 취업을 하는 게 목표였지만 내가 가지고 있는 특별한 무기가 없다는 걸 깨달았다.
+적지 않은 시간을 투자해 준비를 했고, 감사하게도 이번에는 최종 합격을 했다.

난 사람들과 소통하고, 협업하는 능력이 부족하다고 생각을 많이 했다.
+우아한 테크코스를 통해 그 빈 부분을 채우도록 노력해야겠다.

2023년에는

마음의 여유가 없었던 2022년이었던 것 같다.
+하고 싶은 건 많지만, 이번에는 여유를 가지고 할 수 있는 것에 최선을 다해야겠다.

+ + \ No newline at end of file diff --git a/page/41.html b/page/41.html new file mode 100644 index 000000000..528df843d --- /dev/null +++ b/page/41.html @@ -0,0 +1,30 @@ + + + + + +Blog | GG + + + + + + + + + + + + + +
+
본문으로 건너뛰기

· 약 5분

책 정보

글, 우리도 잘 쓸 수 있습니다.
+박솔미

읽고 나서

저자의 경험과 함께 글쓰기에 대한 가벼운 조언이 담겨있어 가볍게 읽기 좋았다.
+글을 잘 작성해 보고 싶을 때 적용해 볼 수 있는 정보가 많아서 도움이 되었다.

우아한 테크코스의 프리코스를 진행할 때 후기를 작성하고 나면 항상 글이 딱딱하다는 느낌을 받았다.
+다른 지원자들의 읽기 편하고, 밝은 느낌을 주는 글을 보면 부러운 마음을 가지기도 했다.
+이 책을 읽었으니 2023년에는 조금 더 글을 잘 적어보려고 한다.

밑줄 친 문장들

문장이 심심하고 지루하다면 +내용을 일목요연하게 정리했고, 글의 의도도 삐뚤지 않고, 단어도 적절한 것으로 골랐는데… 그런데도 어딘가가 심심하고 지루하다면? 축축 처지고 따분하다면? 말꼬리를 모조리 ‘~다’로 통일한 건 아닌지 점검해 보세요.

말꼬리를 잘 갖고 놀아야 합니다. 문장의 마지막 글자를 매번 다르게 고쳐쓰는 것만으로도 글에 활기를 더할 수 있죠. 때론 문장을 다 마치지 않고, 단어로만 끝맺는 것도 방법. 문장과 문장 사이에 쉼표가 들어서며 글 전체에 활기가 돌게 돼요. 문장의 길이도 다채로워지는 덕분에 덤으로 얻게 되는 것도 있습니다. 바로, 글의 리듬.

이전 문장에서 끝난 글자로, 다음 문장을 끝맺지 않기. 한두 문단마다 단어 수준의 아주 짧은 문장 배치하기.

글의 진짜 이유, 글의 진짜 목적, 글의 진짜 대상을 찾으려고 애썼습니다. 지금처럼 틀을 떠올린다거나, 눈치를 본다거나, 정치적인 셈도 하지 않았어요.

제목은 짧게, 보기 쉽게, 읽기 쉽게, 발음이 비슷하게, 순서를 바꿔서

글을 마지막으로 다듬을 때, 노래에 가까워질 방법은 없을지 고민해봅니다. 감히 가 닿을 수 없는 목표이겠지만, 할 수 있는 최소한의 리듬이라도 붙여주고 싶어요.

여는 말과 마지막 말에 작정하고 마음을 담는 연습을 해봅시다. 글의 어느 구석이라도 뻔한 글자는 남기지 않겠노라 다짐하며 써보는 겁니다. 나만이 가진 유일한 메시지에 집중하면서요. 그럼 생각이 달라지고, 고르는 단어도 달라지고, 남긴 문장도 달라져요. 결국에는 글을 쓴 사람인 나 자신도 남달라질 겁니다.

맞춤법은 중요합니다. 하지만 맞춤법보다 더 중요한 건 거기에 담긴 마음입니다. 내 마음을 글에 담아 실어 보내기 전, 맞춤법을 점검하는 이유 역시 그겁니다. 오직 내 마음이 남에게 읽히는 동안 방해가 되지 않기를 바라기 때문이죠. 내가 쓴 글도, 남이 쓴 글도. 언제나 그 안에 담긴 마음이 먼저입니다.

글을 쓴다고 글이 완성되는 게 아니에요. 글과 닮은 모습으로 살 때, 글은 비로소 완성됩니다.

+ + + + \ No newline at end of file diff --git a/page/5.html b/page/5.html index 2ed919ee3..8a3cd5b3b 100644 --- a/page/5.html +++ b/page/5.html @@ -13,18 +13,21 @@ - - + +
-
본문으로 건너뛰기

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
-따라서 이미지를 직접 생성하거나, 클라이언트에서 직접 위경도를 이용하여 그려야 한다.

해당 요구사항을 해결하기 위해서는 다음과 같은 기능을 가진 라이브러리가 필요하다.

  • 이미지 생성
  • 선과 점 표현
  • 투명한 배경색

현재 클라이언트의 바쁜 일정과 기능 구현에 있어 약간의 연산이 들어간다는 부분에서 백엔드에서 이미지를 생성하기로 결정을 내렸다.

고려한 기술

이미지 생성을 위해 다음과 같은 라이브러리 또는 기술들을 확인해 보았다.

  • Python의 Matplotlib
  • AWT(Abstract Window Toolkit) [최종 선택]
  • 이미지 처리 라이브러리 및 Java에서 내부적으로 Matplotlib 사용할 수 있는 라이브러리 (원하는 기능 없음)
  • Java Swing, Java FX (단순한 선 그리기 + 점 찍기라 불필요)

Python & Matplotlib

데이터 시각화 라이브러리
-이미지 생성 및 로컬에 저장까지 걸리는 시간: 0.2초

  • 코드가 간단해서 유지 보수성이 좋다.
  • AWS Lambda 같은 서버리스 컴퓨팅 서비스나 FastAPI와 같은 웹 프레임워크로 추가적인 API를 구현해야 한다.
  • Spring Boot에서 추가적인 API 호출을 해야하고, 확장성과 비동기 처리 등 고려 해야 할 부분이 많다.

Java AWT 이외의 라이브러리

Python이 아닌 Java에서의 라이브러리도 고려를 해봤지만 요구사항에 적합하지 않거나, 적은 요구사항에 비해 무거운 라이브러리들이 많아서 제외했다.

라이브러리설명제외 이유
SwingAWT 이후에 나온 GUI 라이브러리, 네이티브 UI를 사용하지 않고 모든 운영체제 상에서 동일한 UI를 가지도록 함요구사항에 비해 무겁고 복잡도가 높음
JavaFXSwing 이후에 나온 GUI 라이브러리, 3차원 그래픽을 지원함요구사항에 비해 무겁고 복잡도가 높음
simple-java-plotAWT로 구현된 플로팅 라이브러리AWT 기반이긴 하지만 직접 AWT를 사용하는 것에 비해 메리트가 없음, 커스텀 설정 기능이 없음
matplotlib4jMatplotlib를 Java에서 사용할 수 있게 하는 라이브러리내부적으로 파이썬 사용하기에 무거움, 배경 투명화 기능 없음

Java & AWT(Abstract Window Toolkit)

그래픽과 이미지를 그리기 위한 도구
-이미지 생성 및 로컬에 저장까지 걸리는 시간: 1.75초

  • 플로팅 라이브러리를 사용하는 것보다 구현의 난이도가 다소 존재한다.
  • 이미지 생성 시간이 다소 소요되기 때문에 빠른 응답 반환을 위해 비동기 처리를 고려할 수 있을 것 같다.
  • 추가적인 api 호출을 하지 않아도 된다.

기술 선택

AWT의 경우 Matplotlib에 비해 구현의 난이도가 다소 있고, 이미지 생성 시간이 더 많이 걸리는 단점이 있다.
-하지만 추가적인 api 호출을 하지 않아도 되는 부분, Python을 사용하는 경우 추가적인 웹 프레임워크의 학습 비용을 고려하여 AWT를 사용하기로 결정했다.

유지 보수

AWT라는 생소한 기술을 사용하기 때문에 유지 보수성을 위해 팀원들과 공유하는 것이 중요하다고 생각했다.
-따라서 다음과 같은 방법으로 공유하기로 했다.

  1. 코드 리뷰와 PR을 통해 작성한 AWT 코드에 대한 설명 및 리뷰 받는다.
  2. AWT를 사용한 부분을 문서화하여 공유한다.
- - +
본문으로 건너뛰기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
+하지만 특수한 경우에는 정적 메서드를 모킹하는 것이 필요할 수 있다고 생각한다.

예를 들어 레거시 코드를 테스트 한다던지, IO 관련한 부분을 테스트 할 때 정말 필요한 부분에만 적용할 수 있을 것이다.

프로젝트를 진행하며 ImageIo.write 메서드가 호출되는 지 검증이 필요했다.
+해당 static 메서드를 호출하는 부분을 따로 RouteImageUploader 클래스로 최대한 분리했다.
+이미지 저장 기능 자체가 외부로 나가는 상호작용이고, 호출 횟수를 검사하는데는 mock을 사용하는게 적절하다고 판단했다.

public void upload(BufferedImage bufferedImage) {
File file = new File(파일경로);
try {
ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);
} catch (IOException e) {
throw new DrawException(IMAGE_SAVE_FAIL);
}
}

Mocking static methods

Mockito 3.4.0 이후에는 static method를 모킹할 수 있는 Mockito.mockStatic 메서드를 지원한다.
+mockStatic을 사용하면 MockedStatic<T>이 반환되는데 사용 후 꼭 close를 해줘야 한다.

JUnit의 @BeforeAll로 설정하고 @AfterAll 메서드로 종료하는 방법도 있지만 MockedStatic<T>의 상위 인터페이스인 ScopedMock이 AutoCloseable을 구현하고 있기에 try-with-resources를 사용하는 방법이 더욱 좋은 것 같다.

// given
BufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);
RouteImageUploader routeImageUploader = new RouteImageUploader();

// expect
try (MockedStatic<ImageIO> imageIO = Mockito.mockStatic(ImageIO.class)) {
routeImageUploader.upload(bufferedImage);
imageIO.verify(
() -> ImageIO.write(any(BufferedImage.class), any(String.class), any(File.class)),
times(1)
);
}

마치며

정적 메서드를 모킹하는 것은 안티패턴이기 때문에 최대한 적절한 추상화를 이용해 테스트 하기 좋은 코드를 만드는 연습을 하자.
+하지만 추상화를 하면 할 수록 코드의 복잡도는 증가한다.
+항상 상황을 고려하고 간결함을 포기할 만큼 중요한 부분인지 적절한 트레이드오프를 고려하자.

참고 자료

Mocking static methods
+Mockito mock static methods
+Enable mocking static methods in Mockito

+ + \ No newline at end of file diff --git a/page/6.html b/page/6.html index 05b75eace..74dd8bf8b 100644 --- a/page/6.html +++ b/page/6.html @@ -13,28 +13,18 @@ - - + +
-
본문으로 건너뛰기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
-2.7 버전을 사용할 수도 있었지만 LTS 기간과 취약점 패치로 인한 버전업 등을 고려했을 때 3.1과 자바 17을 사용하는 것이 더 효율적이라고 판단했다.

자바 변경 사항

우아한테크코스 레벨 2까지는 자바 11을 사용했었다.
-따라서 자바 11부터 자바 17까지의 변경사항을 정식 릴리즈 기준으로 정리해보려고 한다.

Switch Expressions(Java 14)

Java 14에서는 기존의 Switch 문을 간결하게 작성할 수 있는 Switch 식이 추가되었다.

enum RESULT {
WIN, LOSE, DRAW
}

RESULT result = RESULT.WIN;

int prize = switch (result) {
case WIN -> 10_000_000;
case LOSE, DRAW -> 5_000_000;
default -> 0;
};

주요 특징은 다음과 같다.

  • -> 연산자를 이용하여 각 case에 대한 결과를 바로 반환할 수 있다.
  • case를 콤마(,)로 연결하여 하나의 case에 여러 값을 지정할 수 있다.
  • break 문이 필요 없다.
  • default 블록을 통해 기본 값을 지정할 수 있다.

Text Block(Java 15)

Java 15에는 새로운 문자열 표현방식이 추가되었다.
-긴 문자열을 + 연산자의 도움 없이 가독성있게 작성할 수 있다.

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("""
SELECT p FROM Post p
WHERE p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
""")
List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);
}

NPE 메시지(Java 15)

String name = null;
name.chars();

/**
# before
java.lang.NullPointerException
at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)

# after
Cannot invoke "String.chars()" because "name" is null
java.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null
*/

Record(Java 16)

Lombok의 @Data, kotlin의 data 클래스와 유사한 기능을 제공한다.
-Record를 선언하는 경우 접근자, 생성자, equals & hashcode, toString이 제공된다.
-데이터 전송 용도로 적합해 보인다.

public record PostDto(String title, String content) {
}

추가적인 변경사항

이외에도 stream의 toList, 인스턴스의 타입을 간편하게 체크하는 Pattern Matching Instanceof, Sealed class 등이 추가되었다.

스프링, 스프링 부트 변경 사항

스프링과 스프링 부트에도 많은 변경 사항이 있었다.
-따라서 필요해보이는 몇개 정도만 정리했다.

스프링 요구사항

Java 17, Jakarta EE 9 이상이어야 한다.

네임스페이스 변경

Jakarta EE 9가 적용되면서 네임스페이스도 전반적으로 javax -> jakarta로 변경되었다.

PathPatternParser - trailing slash 허용하지 않음

6.0 이전의 경우 기본 설정 기준으로 @GetMapping("/hello")@GetMapping("/hello/")가 동일했다.
-6.0 이후의 PathPatternParser가 기본으로 사용되고, /hello/hello/는 서로 다른 URL로 매칭된다.

PathPatternParser used by default (with the ability to opt into PathMatcher).

HTTP interface client

자바 인터페이스와 어노테이션을 이용하여 HTTP 요청을 위한 서비스를 정의할 수 있는 방법이 추가되었다.
-자세한 내용은 토비님의 강의를 참고하면 좋을 것 같다.

스프링 부트 최소 요구사항

Gradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6
-이외에도 서드파티들의 최신 릴리즈 버전을 사용함으로, 문제가 발생하는 경우 해당 버전에 맞는 릴리즈 노트를 참고할 수 있을 것 같다.

참고 자료

어느 월급쟁이개발자 의 스프링 부트 따라잡기
-자바 9-16 주요 특징 복습하기
-Java EE에서 Jakarta EE로의 전환
-Spring 6의 새로운 HTTP Interface와 3 가지 REST Clients 라이브 코딩
-What's New in Spring Framework 6.x
-Spring Boot 3.0 Release Notes
-Spring Boot 3.1 Release Notes

- - +
본문으로 건너뛰기

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
+따라서 이미지를 직접 생성하거나, 클라이언트에서 직접 위경도를 이용하여 그려야 한다.

해당 요구사항을 해결하기 위해서는 다음과 같은 기능을 가진 라이브러리가 필요하다.

  • 이미지 생성
  • 선과 점 표현
  • 투명한 배경색

현재 클라이언트의 바쁜 일정과 기능 구현에 있어 약간의 연산이 들어간다는 부분에서 백엔드에서 이미지를 생성하기로 결정을 내렸다.

고려한 기술

이미지 생성을 위해 다음과 같은 라이브러리 또는 기술들을 확인해 보았다.

  • Python의 Matplotlib
  • AWT(Abstract Window Toolkit) [최종 선택]
  • 이미지 처리 라이브러리 및 Java에서 내부적으로 Matplotlib 사용할 수 있는 라이브러리 (원하는 기능 없음)
  • Java Swing, Java FX (단순한 선 그리기 + 점 찍기라 불필요)

Python & Matplotlib

데이터 시각화 라이브러리
+이미지 생성 및 로컬에 저장까지 걸리는 시간: 0.2초

  • 코드가 간단해서 유지 보수성이 좋다.
  • AWS Lambda 같은 서버리스 컴퓨팅 서비스나 FastAPI와 같은 웹 프레임워크로 추가적인 API를 구현해야 한다.
  • Spring Boot에서 추가적인 API 호출을 해야하고, 확장성과 비동기 처리 등 고려 해야 할 부분이 많다.

Java AWT 이외의 라이브러리

Python이 아닌 Java에서의 라이브러리도 고려를 해봤지만 요구사항에 적합하지 않거나, 적은 요구사항에 비해 무거운 라이브러리들이 많아서 제외했다.

라이브러리설명제외 이유
SwingAWT 이후에 나온 GUI 라이브러리, 네이티브 UI를 사용하지 않고 모든 운영체제 상에서 동일한 UI를 가지도록 함요구사항에 비해 무겁고 복잡도가 높음
JavaFXSwing 이후에 나온 GUI 라이브러리, 3차원 그래픽을 지원함요구사항에 비해 무겁고 복잡도가 높음
simple-java-plotAWT로 구현된 플로팅 라이브러리AWT 기반이긴 하지만 직접 AWT를 사용하는 것에 비해 메리트가 없음, 커스텀 설정 기능이 없음
matplotlib4jMatplotlib를 Java에서 사용할 수 있게 하는 라이브러리내부적으로 파이썬 사용하기에 무거움, 배경 투명화 기능 없음

Java & AWT(Abstract Window Toolkit)

그래픽과 이미지를 그리기 위한 도구
+이미지 생성 및 로컬에 저장까지 걸리는 시간: 1.75초

  • 플로팅 라이브러리를 사용하는 것보다 구현의 난이도가 다소 존재한다.
  • 이미지 생성 시간이 다소 소요되기 때문에 빠른 응답 반환을 위해 비동기 처리를 고려할 수 있을 것 같다.
  • 추가적인 api 호출을 하지 않아도 된다.

기술 선택

AWT의 경우 Matplotlib에 비해 구현의 난이도가 다소 있고, 이미지 생성 시간이 더 많이 걸리는 단점이 있다.
+하지만 추가적인 api 호출을 하지 않아도 되는 부분, Python을 사용하는 경우 추가적인 웹 프레임워크의 학습 비용을 고려하여 AWT를 사용하기로 결정했다.

유지 보수

AWT라는 생소한 기술을 사용하기 때문에 유지 보수성을 위해 팀원들과 공유하는 것이 중요하다고 생각했다.
+따라서 다음과 같은 방법으로 공유하기로 했다.

  1. 코드 리뷰와 PR을 통해 작성한 AWT 코드에 대한 설명 및 리뷰 받는다.
  2. AWT를 사용한 부분을 문서화하여 공유한다.
+ + \ No newline at end of file diff --git a/page/7.html b/page/7.html index a7d5f4e74..8784e3f8c 100644 --- a/page/7.html +++ b/page/7.html @@ -13,26 +13,28 @@ - - + +
-
본문으로 건너뛰기

· 약 3분

웹소켓

단일 TCP 연결을 통해 클라이언트와 서버 간 전이중 양방향 통신을 지원하는 프로토콜
-웹 환경에서 연속된 데이터를 실시간으로 처리할 수 있다.

웹소켓은 HTTP의 포트를 그대로 사용하고 각각 포트 80과 포트 443을 사용하여 HTTP(ws://) 및 HTTPS(wss://)로 서버에 연결한다.

웹소켓 등장 배경

웹소켓이 등장하기 이전, 실시간성을 보장하기 위해 Polling, Streaming 같은 기술을 사용했어야 했다.
-이는 실시간성이나 양방향성을 만족시키지 못했고, HTTP를 이용하기 때문에 과도한 오버헤드가 발생했다.

웹소켓의 동작

1. Upgrade 요청

WebSocket 프로토콜로 전환하는 HTTP 요청을 보낸다.
-이는 HTTP와 같이 80, 443 포트를 사용한다.
-웹소켓으로 전환하기 위해서는 Upgrade: websocket, Connection: Upgrade 헤더가 필요하다.
-Sec-WebSocket-Key는 서버에서 Sec-WebSocket-Accept를 계산하여 응답하고 이 값이 예상한 값과 다르면 연결이 수립되지 않는다.
-Sec-WebSocket-Protocol의 경우 서브프로토콜의 목록으로 서버 측에서는 해당 목록 중 하나를 선택하여 반환해야 한다.
-만약 서버측에서 여러 개 지원이 가능한 경우 지원 가능한 프로토콜 중 첫번째 프로토콜을 클라이언트측으로 보낸다.

GET /chats HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080

2. Switching Protocols

서버는 101 Switching Protocols 응답을 반환한다.
-Sec-WebSocket-Accept은 Sec-WebSocket-Key 뒤에 258EAFA5-E914-47DA-95CA-C5AB0DC85B11를 붙이고 SHA1로 해싱 후 Base64로 인코딩하여 반환한다.
-이는 서버 웹소켓 프로토콜의 지원 여부를 클라이언트에게 명확히 알리기 위해 존재한다.

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp

3. 통신 후 종료

연결이 수립되면 웹소켓 프레임 단위로 양방향 통신을 한다.
-연결 종료를 원하는 경우 클라이언트, 서버 모두 연결 종료를 요청할 수 있다.

참고 자료

https://datatracker.ietf.org/doc/html/rfc6455 -https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications
-https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
-https://docs.spring.io/spring-framework/reference/web/websocket.html

- - +
본문으로 건너뛰기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
+2.7 버전을 사용할 수도 있었지만 LTS 기간과 취약점 패치로 인한 버전업 등을 고려했을 때 3.1과 자바 17을 사용하는 것이 더 효율적이라고 판단했다.

자바 변경 사항

우아한테크코스 레벨 2까지는 자바 11을 사용했었다.
+따라서 자바 11부터 자바 17까지의 변경사항을 정식 릴리즈 기준으로 정리해보려고 한다.

Switch Expressions(Java 14)

Java 14에서는 기존의 Switch 문을 간결하게 작성할 수 있는 Switch 식이 추가되었다.

enum RESULT {
WIN, LOSE, DRAW
}

RESULT result = RESULT.WIN;

int prize = switch (result) {
case WIN -> 10_000_000;
case LOSE, DRAW -> 5_000_000;
default -> 0;
};

주요 특징은 다음과 같다.

  • -> 연산자를 이용하여 각 case에 대한 결과를 바로 반환할 수 있다.
  • case를 콤마(,)로 연결하여 하나의 case에 여러 값을 지정할 수 있다.
  • break 문이 필요 없다.
  • default 블록을 통해 기본 값을 지정할 수 있다.

Text Block(Java 15)

Java 15에는 새로운 문자열 표현방식이 추가되었다.
+긴 문자열을 + 연산자의 도움 없이 가독성있게 작성할 수 있다.

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("""
SELECT p FROM Post p
WHERE p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
""")
List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);
}

NPE 메시지(Java 15)

String name = null;
name.chars();

/**
# before
java.lang.NullPointerException
at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)

# after
Cannot invoke "String.chars()" because "name" is null
java.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null
*/

Record(Java 16)

Lombok의 @Data, kotlin의 data 클래스와 유사한 기능을 제공한다.
+Record를 선언하는 경우 접근자, 생성자, equals & hashcode, toString이 제공된다.
+데이터 전송 용도로 적합해 보인다.

public record PostDto(String title, String content) {
}

추가적인 변경사항

이외에도 stream의 toList, 인스턴스의 타입을 간편하게 체크하는 Pattern Matching Instanceof, Sealed class 등이 추가되었다.

스프링, 스프링 부트 변경 사항

스프링과 스프링 부트에도 많은 변경 사항이 있었다.
+따라서 필요해보이는 몇개 정도만 정리했다.

스프링 요구사항

Java 17, Jakarta EE 9 이상이어야 한다.

네임스페이스 변경

Jakarta EE 9가 적용되면서 네임스페이스도 전반적으로 javax -> jakarta로 변경되었다.

PathPatternParser - trailing slash 허용하지 않음

6.0 이전의 경우 기본 설정 기준으로 @GetMapping("/hello")@GetMapping("/hello/")가 동일했다.
+6.0 이후의 PathPatternParser가 기본으로 사용되고, /hello/hello/는 서로 다른 URL로 매칭된다.

PathPatternParser used by default (with the ability to opt into PathMatcher).

HTTP interface client

자바 인터페이스와 어노테이션을 이용하여 HTTP 요청을 위한 서비스를 정의할 수 있는 방법이 추가되었다.
+자세한 내용은 토비님의 강의를 참고하면 좋을 것 같다.

스프링 부트 최소 요구사항

Gradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6
+이외에도 서드파티들의 최신 릴리즈 버전을 사용함으로, 문제가 발생하는 경우 해당 버전에 맞는 릴리즈 노트를 참고할 수 있을 것 같다.

참고 자료

어느 월급쟁이개발자 의 스프링 부트 따라잡기
+자바 9-16 주요 특징 복습하기
+Java EE에서 Jakarta EE로의 전환
+Spring 6의 새로운 HTTP Interface와 3 가지 REST Clients 라이브 코딩
+What's New in Spring Framework 6.x
+Spring Boot 3.0 Release Notes
+Spring Boot 3.1 Release Notes

+ + \ No newline at end of file diff --git a/page/8.html b/page/8.html index 7957acc95..c38b49baa 100644 --- a/page/8.html +++ b/page/8.html @@ -13,33 +13,26 @@ - - + +
-
본문으로 건너뛰기

· 약 11분

팀 블로그 또는 문서화를 위해 Docusaurus를 사용하는 방법을 정리하려고 한다.

설치

공식 홈페이지에 들어가서 최신 버전을 설치한다.

yarn create docusaurus

배포

배포 안내 문서
-netlify나 vercel 같은 서버리스 플랫폼을 추천하고 있고, 간단하고, 빠른 시간 안에 배포를 할 수 있다.
-이 글에서는 github pages를 이용해서 배포하는 방법을 설명한다.

레포지토리 생성

github pages를 이용하려면 예시와 같이 username.github.io 형태의 레포지토리를 생성해야 한다.
-이때 organization을 사용하는 경우 organization.github.io 형태의 레포지토리를 생성해서 사용한다.

설정 파일 수정

docusaurus.config
module.exports = {
// ...
url: 'https://greeng00se.github.io',
baseUrl: '/',
projectName: 'greeng00se.github.io',
organizationName: 'greeng00se',
trailingSlash: false,
// ...
};

토큰 설정

github action을 위해 배포용 토큰을 하나 생성하여 생성한 레포지토리에 Repository secrets으로 설정한다.
-이 글에서는 토큰을 클래식 방식으로 생성했고 스코프는 [repo, user, workflow] 을 설정했다.

github

브랜치 생성

github에서 gh-pages 브랜치를 하나 생성한다.
-repository -> settings -> pages -> branch에서 생성한 gh-pages로 브랜치를 변경한다.
-설정한 브랜치가 배포 브랜치가 되며, 해당 브랜치에 있는 파일들을 이용해서 정적 웹사이트를 제공한다.

워크플로 작성

Docusaurus 2.0 기준 Node.js 16.14 이상의 버전을 사용해야 합니다.
-배포시에는 Repository secrets으로 설정한 DEPLOY_TOKEN 을 이용합니다.

.github/workflows/deploy.yml
name: blog

on:
push:
branches: [main]

jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v3
with:
node-version: 18
cache: yarn

- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Build website
run: yarn build

- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.DEPLOY_TOKEN }}
publish_dir: ./build
user_name: github-actions[bot]
user_email: 41898282+github-actions[bot]@users.noreply.github.com

댓글 기능

giscus를 이용하여 댓글 기능을 추가한다.

giscus 설정

  1. 공개 저장소여야 한다.
  2. giscus 앱이 설치되어 있어야 한다.
  3. Discussions 기능이 해당 저장소에서 활성화되어 있어야 한다.

자세한 내용은 giscus를 확인하자.

docusaurus 설정

swizzling을 이용하여 컴포넌트를 감싼다.
-기존에 게시물을 giscus가 포함된 리액트 컴포넌트로 감싸는 형태가 된다.
-아래 명령어를 이용하여 BlogPostItem을 추출할 수 있다.

yarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap

명령어를 입력하면 /src/theme/BlogPostItem/index.js 위치에 파일이 생성된다.
-파일의 내용을 아래와 같이 수정하고, 이때 setAttribute 부분은 적절하게 자신의 giscus 설정을 이용한다.

/src/theme/BlogPostItem/index.js
import OriginalBlogPostItem from "@theme-original/BlogPostItem";
import React, { useEffect, useRef } from "react";
// @ts-expect-error internal code
import { useColorMode } from "@docusaurus/theme-common";
import { useBlogPost } from "@docusaurus/theme-common/internal";

const giscusSelector = "iframe.giscus-frame";

function BlogPostItem(props) {
const { colorMode } = useColorMode();
const { isBlogPostPage } = useBlogPost();
const giscusTheme = colorMode === "dark" ? "dark" : "light";
const containerRef = useRef(null);

useEffect(() => {
if (!isBlogPostPage) return;

const giscusEl = containerRef.current.querySelector(giscusSelector);

const createGiscusEl = () => {
const script = document.createElement("script");

script.src = "https://giscus.app/client.js";
script.setAttribute("data-repo", "teco-chat/teco-chat.github.io");
script.setAttribute("data-repo-id", "R_kgDOJZ5j0Q");
script.setAttribute("data-category", "Announcements");
script.setAttribute("data-category-id", "DIC_kwDOJZ5j0c4CXS_Q");
script.setAttribute("data-mapping", "pathname");
script.setAttribute("data-strict", "0");
script.setAttribute("data-reactions-enabled", "1");
script.setAttribute("data-emit-metadata", "0");
script.setAttribute("data-input-position", "bottom");
script.setAttribute("data-theme", giscusTheme);
script.setAttribute("data-lang", "ko");
script.crossOrigin = "anonymous";
script.async = true;

containerRef.current.appendChild(script);
};

const postThemeMessage = () => {
const message = {
setConfig: {
theme: giscusTheme,
}
};

giscusEl.contentWindow.postMessage({ giscus: message }, "https://giscus.app");
};

giscusEl ? postThemeMessage() : createGiscusEl();
}, [giscusTheme]);

return (
<>
<OriginalBlogPostItem {...props} />
{isBlogPostPage && <div ref={containerRef} />}
</>
);
}

export default BlogPostItem;

알고리아 설정 및 직접 관리하기

알고리아를 사용하면 검색 기능을 추가할 수 있다.
-유료 플랜이나 netlify를 사용하는 경우 크롤러를 따로 제공해 주는 것 같다.

무료 플랜은 직접 인덱스를 수집하는 방법과, docsearch를 이용하는 방법이 있다.
-docsearch에 등록한다면 일주일에 한 번씩 크롤링이 진행된다.
-이 글에서는 직접 인덱스를 수집하는 방법을 사용한다.

알고리아 애플리케이션 생성 및 키 확인

회원가입을 하고 새로운 애플리케이션 생성을 누른다.
-생성을 다 마치면 다음과 같이 api 키를 확인할 수 있다.

algolia

키 생성

직접 인덱스를 수집하기 위한 키를 생성한다.
-addObject, editSettings, deleteIndex acl(접근 제어 목록)이 있으면 된다.

key

.env 파일 생성

프로젝트 폴더 상단에 .env 파일을 생성한다.

.env
APPLICATION_ID=MVIU5UEMOM
API_KEY=인덱스_생성용_키

config 파일 생성

마찬가지로 최상단에 config.json 파일을 생성한다. -설정 파일은 해당 링크를 참고한다.
-또는 Docusaurus의 설정 파일을 참고한다.

config.json
{
"index_name": "teco",
"start_urls": [
"https://teco-chat.github.io/"
],
"sitemap_urls": [
"https://teco-chat.github.io/sitemap.xml"
],
"sitemap_alternate_links": true,
"stop_urls": [
"/tests"
],
"selectors": {
"lvl0": {
"selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class, 'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class, 'navbar')]//a[contains(@class, 'navbar__link--active')]/text())[last()]",
"type": "xpath",
"global": true,
"default_value": "Documentation"
},
"lvl1": "header h1",
"lvl2": "article h2",
"lvl3": "article h3",
"lvl4": "article h4",
"lvl5": "article h5, article td:first-child",
"lvl6": "article h6",
"text": "article p, article li, article td:last-child"
},
"strip_chars": " .,;:#",
"custom_settings": {
"separatorsToIndex": "_",
"attributesForFaceting": [
"language",
"version",
"type",
"docusaurus_tag"
],
"attributesToRetrieve": [
"hierarchy",
"content",
"anchor",
"url",
"url_without_anchor",
"type"
]
},
"conversation_id": [
"833762294"
],
"nb_hits": 46250
}

docker 이용하여 크롤링

docker와 jq가 필요하다.
-jq가 설치되어 있지 않으면 mac 기준 brew를 이용해서 설치할 수 있다.

brew install jq

다음 명령어를 이용하여 .env와 config.json을 이용하여 크롤링을 한다.

docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper

docusaurus 설정

전에 확인한 APP ID, Search-Only API KEY, IndexName을 이용하여 docusaurus.config 파일에 설정한다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
algolia: {
appId: 'MVIU5UEMOM', // Application ID
apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key
indexName: 'teco', // config.json에 설정한 인덱스명
contextualSearch: true,
},
})

부가 설정

화면 상단 Github Icon

파일 최하단에 아래 css 구문을 추가한다.

/src/css/custom.css
.header-github-link:hover {
opacity: 0.6;
}

.header-github-link:before {
content: '';
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

html[data-theme='dark'] .header-github-link:before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

themeconfig -> navbar에 github link를 설정한다.

docusaurus.config
navbar: {
title: 'HELLO',
items: [
{
href: 'https://github.com/greeng00se',
position: 'right',
className: 'header-github-link',
'aria-label': 'GitHub repository',
},
],
},

코드블럭

java나 kotlin의 경우 기본적으로 하이라이팅을 지원해 주지 않는다.
-prism 설정을 아래와 같이 변경해 준다.

docusaurus.config
prism: {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
additionalLanguages: ['java', 'kotlin'],
}

mermaid

mermaid를 사용하려면 @docusaurus/theme-mermaid 를 설치해야 한다.

yarn add @docusaurus/theme-mermaid

설치 후 아래와 같이 설정을 추가한다.

docusaurus.config
const config = {
...
markdown: {
mermaid: true,
},
themes: [
'@docusaurus/theme-mermaid'
],
};

themeConfig에서 mermaid의 테마를 지정할 수 있다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
mermaid: {
theme: {
light: 'neutral',
dark: 'dark'
},
},
}),

국제화 설정

국제화 설정을 한다면 Older Entries 형태의 설명이 다음 페이지 로 변경된다.
-설정파일에서 i18n에 있는 로케일 설정을 ko로 변경하면 된다.

docusaurus.config
i18n: {
defaultLocale: "ko",
locales: ["ko"],
},

블로그 글 author

팀원 별로 문서를 관리한다면 다음과 같이 어떤 팀원이 글을 작성했는지 설정해야 한다.

author

authors.yml 파일을 이용하여 사용자에 대한 기본 설정을 할 수 있다.

/blog/authors.yml
herb:
name: 허브
title: Backend
url: https://github.com/greeng00se
image_url: https://github.com/greeng00se.png

mallang:
name: 말랑
title: Backend
url: https://github.com/shin-mallang
image_url: https://github.com/shin-mallang.png

블로그 글을 작성할 때 다음과 같이 authors에 넣어주기만 하면 된다.

---
slug: 1
title: Hello World
authors: [herb, mallang]
tags: [hello, docusaurus]
---

첫 번째 문서 내용
- - +
본문으로 건너뛰기

· 약 3분

웹소켓

단일 TCP 연결을 통해 클라이언트와 서버 간 전이중 양방향 통신을 지원하는 프로토콜
+웹 환경에서 연속된 데이터를 실시간으로 처리할 수 있다.

웹소켓은 HTTP의 포트를 그대로 사용하고 각각 포트 80과 포트 443을 사용하여 HTTP(ws://) 및 HTTPS(wss://)로 서버에 연결한다.

웹소켓 등장 배경

웹소켓이 등장하기 이전, 실시간성을 보장하기 위해 Polling, Streaming 같은 기술을 사용했어야 했다.
+이는 실시간성이나 양방향성을 만족시키지 못했고, HTTP를 이용하기 때문에 과도한 오버헤드가 발생했다.

웹소켓의 동작

1. Upgrade 요청

WebSocket 프로토콜로 전환하는 HTTP 요청을 보낸다.
+이는 HTTP와 같이 80, 443 포트를 사용한다.
+웹소켓으로 전환하기 위해서는 Upgrade: websocket, Connection: Upgrade 헤더가 필요하다.
+Sec-WebSocket-Key는 서버에서 Sec-WebSocket-Accept를 계산하여 응답하고 이 값이 예상한 값과 다르면 연결이 수립되지 않는다.
+Sec-WebSocket-Protocol의 경우 서브프로토콜의 목록으로 서버 측에서는 해당 목록 중 하나를 선택하여 반환해야 한다.
+만약 서버측에서 여러 개 지원이 가능한 경우 지원 가능한 프로토콜 중 첫번째 프로토콜을 클라이언트측으로 보낸다.

GET /chats HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080

2. Switching Protocols

서버는 101 Switching Protocols 응답을 반환한다.
+Sec-WebSocket-Accept은 Sec-WebSocket-Key 뒤에 258EAFA5-E914-47DA-95CA-C5AB0DC85B11를 붙이고 SHA1로 해싱 후 Base64로 인코딩하여 반환한다.
+이는 서버 웹소켓 프로토콜의 지원 여부를 클라이언트에게 명확히 알리기 위해 존재한다.

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp

3. 통신 후 종료

연결이 수립되면 웹소켓 프레임 단위로 양방향 통신을 한다.
+연결 종료를 원하는 경우 클라이언트, 서버 모두 연결 종료를 요청할 수 있다.

참고 자료

https://datatracker.ietf.org/doc/html/rfc6455 +https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications
+https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
+https://docs.spring.io/spring-framework/reference/web/websocket.html

+ + \ No newline at end of file diff --git a/page/9.html b/page/9.html index f5cf15d32..3a7a2eb6b 100644 --- a/page/9.html +++ b/page/9.html @@ -13,23 +13,33 @@ - - + +
-
본문으로 건너뛰기

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
-빠르게 지나가서 조금 아쉽다.

학습

회고를 작성하기 전에 레벨 2 동안 보냈던 PR과 회고를 쭉 읽어봤다.
-항상 아쉬운 곳은 있기 마련이지만, 잘 학습한 것 같다.
-미션을 하면서 기술을 어떻게 선택하고, 적용할 것인지 고민하는 과정에서 꽤나 많은 성장을 한 것 같다.

고민은 깊었지만 이론적인 학습이 부족한 레벨 2였다.
-방학 그리고 레벨 3 때는 조금 더 이론적인 부분을 학습하는데 집중해야겠다.

점차 학습 범위가 넓어지면서 자연스럽게 모르는 내용이 쌓여간다.
-필요한 내용은 앞으로 천천히 학습하면 되니까 조급해지지 말아야겠다.

수면

레벨 2를 진행하는 동안 수면이 많이 부족했었고, 결과적으로는 그날의 컨디션을 많이 좌우했던 것 같다.
-앞으로 수면 시간을 늘리고, 좋은 수면 습관을 가지도록 노력해야겠다.

협업

레벨 2 마지막에 협업 미션이 있었다.
-지금까지는 백엔드 크루들과 페어 프로그래밍을 하면서 협업을 경험했다.
-이번에는 프런트엔드 크루와 협업을 했다. 소통은 잘 된 것 같지만 API 명세를 정하는 부분이 아직 미숙한 것 같다.

레벨 3 때부터 본격적으로 프로젝트가 시작된다.
-팀을 위해 어떤 것을 할 수 있을지 고민을 많이 해봐야겠다.

레벨 2를 마무리하며

회고 작성하면서 레벨 2에서 했던 것들을 반추해 봤는데 부족한 점은 많았어도 좋은 방향으로 가고 있는 것 같다. -읽고 싶은 책도 읽고, 부족한 부분 채우면서 쉬어야겠다.

- - +
본문으로 건너뛰기

· 약 11분

팀 블로그 또는 문서화를 위해 Docusaurus를 사용하는 방법을 정리하려고 한다.

설치

공식 홈페이지에 들어가서 최신 버전을 설치한다.

yarn create docusaurus

배포

배포 안내 문서
+netlify나 vercel 같은 서버리스 플랫폼을 추천하고 있고, 간단하고, 빠른 시간 안에 배포를 할 수 있다.
+이 글에서는 github pages를 이용해서 배포하는 방법을 설명한다.

레포지토리 생성

github pages를 이용하려면 예시와 같이 username.github.io 형태의 레포지토리를 생성해야 한다.
+이때 organization을 사용하는 경우 organization.github.io 형태의 레포지토리를 생성해서 사용한다.

설정 파일 수정

docusaurus.config
module.exports = {
// ...
url: 'https://greeng00se.github.io',
baseUrl: '/',
projectName: 'greeng00se.github.io',
organizationName: 'greeng00se',
trailingSlash: false,
// ...
};

토큰 설정

github action을 위해 배포용 토큰을 하나 생성하여 생성한 레포지토리에 Repository secrets으로 설정한다.
+이 글에서는 토큰을 클래식 방식으로 생성했고 스코프는 [repo, user, workflow] 을 설정했다.

github

브랜치 생성

github에서 gh-pages 브랜치를 하나 생성한다.
+repository -> settings -> pages -> branch에서 생성한 gh-pages로 브랜치를 변경한다.
+설정한 브랜치가 배포 브랜치가 되며, 해당 브랜치에 있는 파일들을 이용해서 정적 웹사이트를 제공한다.

워크플로 작성

Docusaurus 2.0 기준 Node.js 16.14 이상의 버전을 사용해야 합니다.
+배포시에는 Repository secrets으로 설정한 DEPLOY_TOKEN 을 이용합니다.

.github/workflows/deploy.yml
name: blog

on:
push:
branches: [main]

jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v3
with:
node-version: 18
cache: yarn

- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Build website
run: yarn build

- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.DEPLOY_TOKEN }}
publish_dir: ./build
user_name: github-actions[bot]
user_email: 41898282+github-actions[bot]@users.noreply.github.com

댓글 기능

giscus를 이용하여 댓글 기능을 추가한다.

giscus 설정

  1. 공개 저장소여야 한다.
  2. giscus 앱이 설치되어 있어야 한다.
  3. Discussions 기능이 해당 저장소에서 활성화되어 있어야 한다.

자세한 내용은 giscus를 확인하자.

docusaurus 설정

swizzling을 이용하여 컴포넌트를 감싼다.
+기존에 게시물을 giscus가 포함된 리액트 컴포넌트로 감싸는 형태가 된다.
+아래 명령어를 이용하여 BlogPostItem을 추출할 수 있다.

yarn run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap

명령어를 입력하면 /src/theme/BlogPostItem/index.js 위치에 파일이 생성된다.
+파일의 내용을 아래와 같이 수정하고, 이때 setAttribute 부분은 적절하게 자신의 giscus 설정을 이용한다.

/src/theme/BlogPostItem/index.js
import OriginalBlogPostItem from "@theme-original/BlogPostItem";
import React, { useEffect, useRef } from "react";
// @ts-expect-error internal code
import { useColorMode } from "@docusaurus/theme-common";
import { useBlogPost } from "@docusaurus/theme-common/internal";

const giscusSelector = "iframe.giscus-frame";

function BlogPostItem(props) {
const { colorMode } = useColorMode();
const { isBlogPostPage } = useBlogPost();
const giscusTheme = colorMode === "dark" ? "dark" : "light";
const containerRef = useRef(null);

useEffect(() => {
if (!isBlogPostPage) return;

const giscusEl = containerRef.current.querySelector(giscusSelector);

const createGiscusEl = () => {
const script = document.createElement("script");

script.src = "https://giscus.app/client.js";
script.setAttribute("data-repo", "teco-chat/teco-chat.github.io");
script.setAttribute("data-repo-id", "R_kgDOJZ5j0Q");
script.setAttribute("data-category", "Announcements");
script.setAttribute("data-category-id", "DIC_kwDOJZ5j0c4CXS_Q");
script.setAttribute("data-mapping", "pathname");
script.setAttribute("data-strict", "0");
script.setAttribute("data-reactions-enabled", "1");
script.setAttribute("data-emit-metadata", "0");
script.setAttribute("data-input-position", "bottom");
script.setAttribute("data-theme", giscusTheme);
script.setAttribute("data-lang", "ko");
script.crossOrigin = "anonymous";
script.async = true;

containerRef.current.appendChild(script);
};

const postThemeMessage = () => {
const message = {
setConfig: {
theme: giscusTheme,
}
};

giscusEl.contentWindow.postMessage({ giscus: message }, "https://giscus.app");
};

giscusEl ? postThemeMessage() : createGiscusEl();
}, [giscusTheme]);

return (
<>
<OriginalBlogPostItem {...props} />
{isBlogPostPage && <div ref={containerRef} />}
</>
);
}

export default BlogPostItem;

알고리아 설정 및 직접 관리하기

알고리아를 사용하면 검색 기능을 추가할 수 있다.
+유료 플랜이나 netlify를 사용하는 경우 크롤러를 따로 제공해 주는 것 같다.

무료 플랜은 직접 인덱스를 수집하는 방법과, docsearch를 이용하는 방법이 있다.
+docsearch에 등록한다면 일주일에 한 번씩 크롤링이 진행된다.
+이 글에서는 직접 인덱스를 수집하는 방법을 사용한다.

알고리아 애플리케이션 생성 및 키 확인

회원가입을 하고 새로운 애플리케이션 생성을 누른다.
+생성을 다 마치면 다음과 같이 api 키를 확인할 수 있다.

algolia

키 생성

직접 인덱스를 수집하기 위한 키를 생성한다.
+addObject, editSettings, deleteIndex acl(접근 제어 목록)이 있으면 된다.

key

.env 파일 생성

프로젝트 폴더 상단에 .env 파일을 생성한다.

.env
APPLICATION_ID=MVIU5UEMOM
API_KEY=인덱스_생성용_키

config 파일 생성

마찬가지로 최상단에 config.json 파일을 생성한다. +설정 파일은 해당 링크를 참고한다.
+또는 Docusaurus의 설정 파일을 참고한다.

config.json
{
"index_name": "teco",
"start_urls": [
"https://teco-chat.github.io/"
],
"sitemap_urls": [
"https://teco-chat.github.io/sitemap.xml"
],
"sitemap_alternate_links": true,
"stop_urls": [
"/tests"
],
"selectors": {
"lvl0": {
"selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class, 'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class, 'navbar')]//a[contains(@class, 'navbar__link--active')]/text())[last()]",
"type": "xpath",
"global": true,
"default_value": "Documentation"
},
"lvl1": "header h1",
"lvl2": "article h2",
"lvl3": "article h3",
"lvl4": "article h4",
"lvl5": "article h5, article td:first-child",
"lvl6": "article h6",
"text": "article p, article li, article td:last-child"
},
"strip_chars": " .,;:#",
"custom_settings": {
"separatorsToIndex": "_",
"attributesForFaceting": [
"language",
"version",
"type",
"docusaurus_tag"
],
"attributesToRetrieve": [
"hierarchy",
"content",
"anchor",
"url",
"url_without_anchor",
"type"
]
},
"conversation_id": [
"833762294"
],
"nb_hits": 46250
}

docker 이용하여 크롤링

docker와 jq가 필요하다.
+jq가 설치되어 있지 않으면 mac 기준 brew를 이용해서 설치할 수 있다.

brew install jq

다음 명령어를 이용하여 .env와 config.json을 이용하여 크롤링을 한다.

docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper

docusaurus 설정

전에 확인한 APP ID, Search-Only API KEY, IndexName을 이용하여 docusaurus.config 파일에 설정한다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
algolia: {
appId: 'MVIU5UEMOM', // Application ID
apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key
indexName: 'teco', // config.json에 설정한 인덱스명
contextualSearch: true,
},
})

부가 설정

화면 상단 Github Icon

파일 최하단에 아래 css 구문을 추가한다.

/src/css/custom.css
.header-github-link:hover {
opacity: 0.6;
}

.header-github-link:before {
content: '';
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

html[data-theme='dark'] .header-github-link:before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

themeconfig -> navbar에 github link를 설정한다.

docusaurus.config
navbar: {
title: 'HELLO',
items: [
{
href: 'https://github.com/greeng00se',
position: 'right',
className: 'header-github-link',
'aria-label': 'GitHub repository',
},
],
},

코드블럭

java나 kotlin의 경우 기본적으로 하이라이팅을 지원해 주지 않는다.
+prism 설정을 아래와 같이 변경해 준다.

docusaurus.config
prism: {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
additionalLanguages: ['java', 'kotlin'],
}

mermaid

mermaid를 사용하려면 @docusaurus/theme-mermaid 를 설치해야 한다.

yarn add @docusaurus/theme-mermaid

설치 후 아래와 같이 설정을 추가한다.

docusaurus.config
const config = {
...
markdown: {
mermaid: true,
},
themes: [
'@docusaurus/theme-mermaid'
],
};

themeConfig에서 mermaid의 테마를 지정할 수 있다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
mermaid: {
theme: {
light: 'neutral',
dark: 'dark'
},
},
}),

국제화 설정

국제화 설정을 한다면 Older Entries 형태의 설명이 다음 페이지 로 변경된다.
+설정파일에서 i18n에 있는 로케일 설정을 ko로 변경하면 된다.

docusaurus.config
i18n: {
defaultLocale: "ko",
locales: ["ko"],
},

블로그 글 author

팀원 별로 문서를 관리한다면 다음과 같이 어떤 팀원이 글을 작성했는지 설정해야 한다.

author

authors.yml 파일을 이용하여 사용자에 대한 기본 설정을 할 수 있다.

/blog/authors.yml
herb:
name: 허브
title: Backend
url: https://github.com/greeng00se
image_url: https://github.com/greeng00se.png

mallang:
name: 말랑
title: Backend
url: https://github.com/shin-mallang
image_url: https://github.com/shin-mallang.png

블로그 글을 작성할 때 다음과 같이 authors에 넣어주기만 하면 된다.

---
slug: 1
title: Hello World
authors: [herb, mallang]
tags: [hello, docusaurus]
---

첫 번째 문서 내용
+ + \ No newline at end of file diff --git a/rss.xml b/rss.xml index 04f3b07e8..d2ea46d60 100644 --- a/rss.xml +++ b/rss.xml @@ -4,10 +4,40 @@ GG Blog https://greeng00se.github.io/ GG Blog - Sun, 13 Aug 2023 00:00:00 GMT + Thu, 17 Aug 2023 00:00:00 GMT https://validator.w3.org/feed/docs/rss2.html https://github.com/jpmonette/feed ko + + <![CDATA[CloudWatch를 이용한 로깅, 메트릭 모니터링 환경 구성]]> + https://greeng00se.github.io/41 + https://greeng00se.github.io/41 + Thu, 17 Aug 2023 00:00:00 GMT + + CloudWatch

AWS 리소스와 애플리케이션의 지표와 로그에 대한 모니터링을 제공하는 서비스다.
+지표를 감시하여 알림을 보내는 기능도 제공한다.
+프리티어를 사용하지 않는 경우 대시보드당 3$/M 의 비용이 청구되고, 지표나 로그의 양에 따라 비용이 추가적으로 청구된다.
+요금 정보에 대한 자세한 정보는 다음 링크에서 확인할 수 있다.

CloudWatch Metrics

기본적으로 5분마다 지표에 대한 정보가 수집된다.
+세부 모니터링(Detailed Monitoring)을 활성화하면 1분마다 지표를 수집한다.
+대시보드에서 InstanceId로 검색하여 수집된 지표를 확인할 수 있다.

./cloudwatch1.png

CPUUtilization, NetworkIn, NetworkOut과 같은 기본적인 지표를 제공하고, 메모리, 디스크 공간과 같은 지표를 확인하려면 사용자 지정 지표를 설정해야 한다.

CloudWatch Agent 설치

CloudWatch Agent 사용자 지정 지표와 로그를 수집할 수 있다.

IAM 역할 설정

기본적으로 EC2 인스턴스가 CloudWatchAgentServerPolicy에 대한 권한이 있어야 한다.
+IAM → 역할에서 역할 생성을 클릭한다.

./cloudwatch2.png

CloudWatchAgentServerPolicy 권한 정책을 선택하고, 적당한 역할 이름을 입력해서 역할을 생성한다.

./cloudwatch3.png

EC2 인스턴스 목록으로 들어가서, CloudWatch Agent를 설치할 EC2 인스턴스를 클릭한다.
+작업 → 보안 → IAM 역할 수정에서 이전에 생성한 역할을 지정한다.

./cloudwatch4.png

설치

환경은 다음과 같다.

OS: ubuntu 22.04
+인스턴스 유형: t4g.small (ARM64)

아래 명령어를 입력하여 설치한다.

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

사용 설명서에 각 인스턴스 유형마다 다운로드 링크가 자세하게 안내되어 있다.

Wizard

CloudWatch Wizard를 사용하면 간단하게 설정 파일 생성할 수 있다.
+로그를 수집하도록 설정하는 경우 Wizard 실행 명령어 입력 전 log 파일의 절대 경로를 복사해두는 것이 좋다.
+아래의 명령어를 입력하여 Wizard를 실행할 수 있다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

설정을 진행하다 보면 설정 파일이 어떻게 구성될지 확인할 수 있다.
+로그를 추가할 것이냐고 물어보는 입력창이 나오면 준비해뒀던 로그 파일의 절대 경로를 입력한다.

./cloudwatch5.png

중간에 SSM parameter store에 설정 파일을 저장할 것이냐고 물어보는 창이 나온다.

Do you want to store the config in the SSM parameter store?
1. yes
2. no

추가적으로 설정하지 않는 경우 2번을 선택한다.
+Parameter Store 관리에 대한 내용은 다음의 문서를 참고하면 좋을 거 같다.
+설정이 완료되면 /opt/aws/amazon-cloudwatch-agent/bin/config.json 에 설정에 대한 내용이 저장된다.

설정 파일 적용

아래의 명령어를 입력하여 설정파일을 적용할 수 있다.
+file 뒤에는 설정 파일에 대한 절대경로(아래 명령어 기준 기본 생성 위치)를 입력하면 된다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

types.db: no such file or directory 에러

다음과 같은 에러가 발생한다면 types.db 파일을 생성해서 문제를 해결할 수 있다.

Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory

types.db 파일 생성

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

지표 확인

CloudWatch Metrics에 가보면 CWAgent라는 사용자 지정 네임스페이스가 추가된 것을 볼 수 있다.
+설정 파일에 네임스페이스를 추가하는 방법도 있다.

./cloudwatch6.png

로그

CloudWatch → 로그 그룹으로 가면 Wizard로 추가한 로그를 확인할 수 있다.

./cloudwatch7.png

참고 자료

CloudWatch란 무엇입니까?
+Amazon CloudWatch 요금
+Linux 인스턴스 지표
+서버에 CloudWatch 에이전트 설치 및 실행
+CloudWatch Agent를 Parameter Store에서 관리해 보기

]]>
+ cloudwatch + log + monitoring +
<![CDATA[경로 이미지 생성하기 - 비동기 처리]]> https://greeng00se.github.io/40 diff --git a/search.html b/search.html index 04e439d78..6240e9ba4 100644 --- a/search.html +++ b/search.html @@ -13,13 +13,13 @@ - - + +
본문으로 건너뛰기

문서를 검색합니다.

- - + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 6c3f1a496..5595dea86 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://greeng00se.github.io/1weekly0.5https://greeng00se.github.io/10weekly0.5https://greeng00se.github.io/11weekly0.5https://greeng00se.github.io/12weekly0.5https://greeng00se.github.io/13weekly0.5https://greeng00se.github.io/14weekly0.5https://greeng00se.github.io/15weekly0.5https://greeng00se.github.io/16weekly0.5https://greeng00se.github.io/17weekly0.5https://greeng00se.github.io/18weekly0.5https://greeng00se.github.io/19weekly0.5https://greeng00se.github.io/2weekly0.5https://greeng00se.github.io/20weekly0.5https://greeng00se.github.io/21weekly0.5https://greeng00se.github.io/22weekly0.5https://greeng00se.github.io/23weekly0.5https://greeng00se.github.io/24weekly0.5https://greeng00se.github.io/25weekly0.5https://greeng00se.github.io/26weekly0.5https://greeng00se.github.io/27weekly0.5https://greeng00se.github.io/28weekly0.5https://greeng00se.github.io/29weekly0.5https://greeng00se.github.io/3weekly0.5https://greeng00se.github.io/30weekly0.5https://greeng00se.github.io/31weekly0.5https://greeng00se.github.io/32weekly0.5https://greeng00se.github.io/33weekly0.5https://greeng00se.github.io/34weekly0.5https://greeng00se.github.io/35weekly0.5https://greeng00se.github.io/36weekly0.5https://greeng00se.github.io/37weekly0.5https://greeng00se.github.io/38weekly0.5https://greeng00se.github.io/39weekly0.5https://greeng00se.github.io/4weekly0.5https://greeng00se.github.io/40weekly0.5https://greeng00se.github.io/5weekly0.5https://greeng00se.github.io/6weekly0.5https://greeng00se.github.io/7weekly0.5https://greeng00se.github.io/8weekly0.5https://greeng00se.github.io/9weekly0.5https://greeng00se.github.io/blogweekly0.5https://greeng00se.github.io/docs/tagsweekly0.5https://greeng00se.github.io/docs/tags/bookweekly0.5https://greeng00se.github.io/docs/tags/etcweekly0.5https://greeng00se.github.io/docs/tags/jpaweekly0.5https://greeng00se.github.io/docs/tags/monitoringweekly0.5https://greeng00se.github.io/docs/tags/nginxweekly0.5https://greeng00se.github.io/docs/tags/pacakgeweekly0.5https://greeng00se.github.io/docs/tags/postmortemweekly0.5https://greeng00se.github.io/docs/tags/testweekly0.5https://greeng00se.github.io/page/10weekly0.5https://greeng00se.github.io/page/11weekly0.5https://greeng00se.github.io/page/12weekly0.5https://greeng00se.github.io/page/13weekly0.5https://greeng00se.github.io/page/14weekly0.5https://greeng00se.github.io/page/15weekly0.5https://greeng00se.github.io/page/16weekly0.5https://greeng00se.github.io/page/17weekly0.5https://greeng00se.github.io/page/18weekly0.5https://greeng00se.github.io/page/19weekly0.5https://greeng00se.github.io/page/2weekly0.5https://greeng00se.github.io/page/20weekly0.5https://greeng00se.github.io/page/21weekly0.5https://greeng00se.github.io/page/22weekly0.5https://greeng00se.github.io/page/23weekly0.5https://greeng00se.github.io/page/24weekly0.5https://greeng00se.github.io/page/25weekly0.5https://greeng00se.github.io/page/26weekly0.5https://greeng00se.github.io/page/27weekly0.5https://greeng00se.github.io/page/28weekly0.5https://greeng00se.github.io/page/29weekly0.5https://greeng00se.github.io/page/3weekly0.5https://greeng00se.github.io/page/30weekly0.5https://greeng00se.github.io/page/31weekly0.5https://greeng00se.github.io/page/32weekly0.5https://greeng00se.github.io/page/33weekly0.5https://greeng00se.github.io/page/34weekly0.5https://greeng00se.github.io/page/35weekly0.5https://greeng00se.github.io/page/36weekly0.5https://greeng00se.github.io/page/37weekly0.5https://greeng00se.github.io/page/38weekly0.5https://greeng00se.github.io/page/39weekly0.5https://greeng00se.github.io/page/4weekly0.5https://greeng00se.github.io/page/40weekly0.5https://greeng00se.github.io/page/5weekly0.5https://greeng00se.github.io/page/6weekly0.5https://greeng00se.github.io/page/7weekly0.5https://greeng00se.github.io/page/8weekly0.5https://greeng00se.github.io/page/9weekly0.5https://greeng00se.github.io/searchweekly0.5https://greeng00se.github.io/tagsweekly0.5https://greeng00se.github.io/tags/asyncweekly0.5https://greeng00se.github.io/tags/awtweekly0.5https://greeng00se.github.io/tags/awt/page/2weekly0.5https://greeng00se.github.io/tags/bookweekly0.5https://greeng00se.github.io/tags/book/page/2weekly0.5https://greeng00se.github.io/tags/book/page/3weekly0.5https://greeng00se.github.io/tags/classweekly0.5https://greeng00se.github.io/tags/compositeweekly0.5https://greeng00se.github.io/tags/data-baseweekly0.5https://greeng00se.github.io/tags/data-base/page/2weekly0.5https://greeng00se.github.io/tags/data-base/page/3weekly0.5https://greeng00se.github.io/tags/documentationweekly0.5https://greeng00se.github.io/tags/dtoweekly0.5https://greeng00se.github.io/tags/elastic-beanstalkweekly0.5https://greeng00se.github.io/tags/eventweekly0.5https://greeng00se.github.io/tags/graspweekly0.5https://greeng00se.github.io/tags/imageweekly0.5https://greeng00se.github.io/tags/image/page/2weekly0.5https://greeng00se.github.io/tags/image/page/3weekly0.5https://greeng00se.github.io/tags/inno-dbweekly0.5https://greeng00se.github.io/tags/intelli-jweekly0.5https://greeng00se.github.io/tags/isolationweekly0.5https://greeng00se.github.io/tags/javaweekly0.5https://greeng00se.github.io/tags/java/page/2weekly0.5https://greeng00se.github.io/tags/java/page/3weekly0.5https://greeng00se.github.io/tags/java/page/4weekly0.5https://greeng00se.github.io/tags/java/page/5weekly0.5https://greeng00se.github.io/tags/jdbcweekly0.5https://greeng00se.github.io/tags/jenkinsweekly0.5https://greeng00se.github.io/tags/kotlinweekly0.5https://greeng00se.github.io/tags/lockweekly0.5https://greeng00se.github.io/tags/lock/page/2weekly0.5https://greeng00se.github.io/tags/mockweekly0.5https://greeng00se.github.io/tags/mockitoweekly0.5https://greeng00se.github.io/tags/my-sqlweekly0.5https://greeng00se.github.io/tags/oopweekly0.5https://greeng00se.github.io/tags/patternweekly0.5https://greeng00se.github.io/tags/pythonweekly0.5https://greeng00se.github.io/tags/retrospectiveweekly0.5https://greeng00se.github.io/tags/retrospective/page/10weekly0.5https://greeng00se.github.io/tags/retrospective/page/11weekly0.5https://greeng00se.github.io/tags/retrospective/page/12weekly0.5https://greeng00se.github.io/tags/retrospective/page/13weekly0.5https://greeng00se.github.io/tags/retrospective/page/14weekly0.5https://greeng00se.github.io/tags/retrospective/page/15weekly0.5https://greeng00se.github.io/tags/retrospective/page/2weekly0.5https://greeng00se.github.io/tags/retrospective/page/3weekly0.5https://greeng00se.github.io/tags/retrospective/page/4weekly0.5https://greeng00se.github.io/tags/retrospective/page/5weekly0.5https://greeng00se.github.io/tags/retrospective/page/6weekly0.5https://greeng00se.github.io/tags/retrospective/page/7weekly0.5https://greeng00se.github.io/tags/retrospective/page/8weekly0.5https://greeng00se.github.io/tags/retrospective/page/9weekly0.5https://greeng00se.github.io/tags/springweekly0.5https://greeng00se.github.io/tags/spring-bootweekly0.5https://greeng00se.github.io/tags/staticweekly0.5https://greeng00se.github.io/tags/teco-chatweekly0.5https://greeng00se.github.io/tags/teco-chat/page/2weekly0.5https://greeng00se.github.io/tags/teco-chat/page/3weekly0.5https://greeng00se.github.io/tags/testweekly0.5https://greeng00se.github.io/tags/timeweekly0.5https://greeng00se.github.io/tags/transactionweekly0.5https://greeng00se.github.io/tags/web-socketweekly0.5https://greeng00se.github.io/tags/woowahan-techcourseweekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/10weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/11weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/2weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/3weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/4weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/5weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/6weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/7weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/8weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/9weekly0.5https://greeng00se.github.io/docsweekly0.5https://greeng00se.github.io/docs/JPA/%EA%B8%B0%EB%B3%B8_%ED%82%A4_%EB%A7%A4%ED%95%91weekly0.5https://greeng00se.github.io/docs/Nginx/%EA%B5%AC%EC%A1%B0_%EB%B0%8F_%EB%AA%85%EB%A0%B9%EC%96%B4weekly0.5https://greeng00se.github.io/docs/Nginx/%EC%A0%95%EC%A0%81_%EC%BB%A8%ED%85%90%EC%B8%A0_%EC%A0%9C%EA%B3%B5weekly0.5https://greeng00se.github.io/docs/%EA%B8%B0%ED%83%80/%EA%B1%B4%EA%B0%95%ED%95%98%EA%B2%8C_%EB%82%98%EC%95%84%EC%A7%80%EA%B8%B0weekly0.5https://greeng00se.github.io/docs/%EB%8F%84%EC%84%9C/%EC%83%81%EC%9E%90_%EB%B0%96%EC%9C%BC%EB%A1%9C_%ED%83%88%EC%B6%9C%ED%95%98%EA%B8%B0weekly0.5https://greeng00se.github.io/docs/%EB%A6%AC%EB%88%85%EC%8A%A4/Swap_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EC%84%A4%EC%A0%95weekly0.5https://greeng00se.github.io/docs/%EB%A6%AC%EB%88%85%EC%8A%A4/%ED%84%B0%EB%AF%B8%EB%84%90_%EC%89%98_%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8_%EC%84%A4%EC%A0%95weekly0.5https://greeng00se.github.io/docs/%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81/%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81_%ED%99%98%EA%B2%BD_%EA%B5%AC%EC%84%B1weekly0.5https://greeng00se.github.io/docs/%EB%AC%B8%ED%99%94/%ED%8F%AC%EC%8A%A4%ED%8A%B8_%EB%AA%A8%ED%85%9Cweekly0.5https://greeng00se.github.io/docs/%EC%84%A4%EA%B3%84/%ED%8C%A8%ED%82%A4%EC%A7%80weekly0.5https://greeng00se.github.io/docs/%ED%85%8C%EC%8A%A4%ED%8A%B8/%EA%B3%84%EB%8B%A8_%ED%85%8C%EC%8A%A4%ED%8A%B8weekly0.5https://greeng00se.github.io/docs/%ED%85%8C%EC%8A%A4%ED%8A%B8/%ED%85%8C%EC%8A%A4%ED%8A%B8_%EC%A3%BC%EB%8F%84_%EA%B0%9C%EB%B0%9C_%EA%B7%9C%EC%B9%99weekly0.5https://greeng00se.github.io/docs/%ED%85%8C%EC%8A%A4%ED%8A%B8/%ED%85%8C%EC%8A%A4%ED%8A%B8_%EC%BD%94%EB%93%9C%EA%B0%80_%EC%A3%BC%EB%8A%94_%ED%98%9C%ED%83%9Dweekly0.5https://greeng00se.github.io/weekly0.5https://greeng00se.github.io/weekly0.5 \ No newline at end of file +https://greeng00se.github.io/1weekly0.5https://greeng00se.github.io/10weekly0.5https://greeng00se.github.io/11weekly0.5https://greeng00se.github.io/12weekly0.5https://greeng00se.github.io/13weekly0.5https://greeng00se.github.io/14weekly0.5https://greeng00se.github.io/15weekly0.5https://greeng00se.github.io/16weekly0.5https://greeng00se.github.io/17weekly0.5https://greeng00se.github.io/18weekly0.5https://greeng00se.github.io/19weekly0.5https://greeng00se.github.io/2weekly0.5https://greeng00se.github.io/20weekly0.5https://greeng00se.github.io/21weekly0.5https://greeng00se.github.io/22weekly0.5https://greeng00se.github.io/23weekly0.5https://greeng00se.github.io/24weekly0.5https://greeng00se.github.io/25weekly0.5https://greeng00se.github.io/26weekly0.5https://greeng00se.github.io/27weekly0.5https://greeng00se.github.io/28weekly0.5https://greeng00se.github.io/29weekly0.5https://greeng00se.github.io/3weekly0.5https://greeng00se.github.io/30weekly0.5https://greeng00se.github.io/31weekly0.5https://greeng00se.github.io/32weekly0.5https://greeng00se.github.io/33weekly0.5https://greeng00se.github.io/34weekly0.5https://greeng00se.github.io/35weekly0.5https://greeng00se.github.io/36weekly0.5https://greeng00se.github.io/37weekly0.5https://greeng00se.github.io/38weekly0.5https://greeng00se.github.io/39weekly0.5https://greeng00se.github.io/4weekly0.5https://greeng00se.github.io/40weekly0.5https://greeng00se.github.io/41weekly0.5https://greeng00se.github.io/5weekly0.5https://greeng00se.github.io/6weekly0.5https://greeng00se.github.io/7weekly0.5https://greeng00se.github.io/8weekly0.5https://greeng00se.github.io/9weekly0.5https://greeng00se.github.io/blogweekly0.5https://greeng00se.github.io/docs/tagsweekly0.5https://greeng00se.github.io/docs/tags/bookweekly0.5https://greeng00se.github.io/docs/tags/etcweekly0.5https://greeng00se.github.io/docs/tags/jpaweekly0.5https://greeng00se.github.io/docs/tags/monitoringweekly0.5https://greeng00se.github.io/docs/tags/nginxweekly0.5https://greeng00se.github.io/docs/tags/pacakgeweekly0.5https://greeng00se.github.io/docs/tags/postmortemweekly0.5https://greeng00se.github.io/docs/tags/testweekly0.5https://greeng00se.github.io/page/10weekly0.5https://greeng00se.github.io/page/11weekly0.5https://greeng00se.github.io/page/12weekly0.5https://greeng00se.github.io/page/13weekly0.5https://greeng00se.github.io/page/14weekly0.5https://greeng00se.github.io/page/15weekly0.5https://greeng00se.github.io/page/16weekly0.5https://greeng00se.github.io/page/17weekly0.5https://greeng00se.github.io/page/18weekly0.5https://greeng00se.github.io/page/19weekly0.5https://greeng00se.github.io/page/2weekly0.5https://greeng00se.github.io/page/20weekly0.5https://greeng00se.github.io/page/21weekly0.5https://greeng00se.github.io/page/22weekly0.5https://greeng00se.github.io/page/23weekly0.5https://greeng00se.github.io/page/24weekly0.5https://greeng00se.github.io/page/25weekly0.5https://greeng00se.github.io/page/26weekly0.5https://greeng00se.github.io/page/27weekly0.5https://greeng00se.github.io/page/28weekly0.5https://greeng00se.github.io/page/29weekly0.5https://greeng00se.github.io/page/3weekly0.5https://greeng00se.github.io/page/30weekly0.5https://greeng00se.github.io/page/31weekly0.5https://greeng00se.github.io/page/32weekly0.5https://greeng00se.github.io/page/33weekly0.5https://greeng00se.github.io/page/34weekly0.5https://greeng00se.github.io/page/35weekly0.5https://greeng00se.github.io/page/36weekly0.5https://greeng00se.github.io/page/37weekly0.5https://greeng00se.github.io/page/38weekly0.5https://greeng00se.github.io/page/39weekly0.5https://greeng00se.github.io/page/4weekly0.5https://greeng00se.github.io/page/40weekly0.5https://greeng00se.github.io/page/41weekly0.5https://greeng00se.github.io/page/5weekly0.5https://greeng00se.github.io/page/6weekly0.5https://greeng00se.github.io/page/7weekly0.5https://greeng00se.github.io/page/8weekly0.5https://greeng00se.github.io/page/9weekly0.5https://greeng00se.github.io/searchweekly0.5https://greeng00se.github.io/tagsweekly0.5https://greeng00se.github.io/tags/asyncweekly0.5https://greeng00se.github.io/tags/awtweekly0.5https://greeng00se.github.io/tags/awt/page/2weekly0.5https://greeng00se.github.io/tags/bookweekly0.5https://greeng00se.github.io/tags/book/page/2weekly0.5https://greeng00se.github.io/tags/book/page/3weekly0.5https://greeng00se.github.io/tags/classweekly0.5https://greeng00se.github.io/tags/cloudwatchweekly0.5https://greeng00se.github.io/tags/compositeweekly0.5https://greeng00se.github.io/tags/data-baseweekly0.5https://greeng00se.github.io/tags/data-base/page/2weekly0.5https://greeng00se.github.io/tags/data-base/page/3weekly0.5https://greeng00se.github.io/tags/documentationweekly0.5https://greeng00se.github.io/tags/dtoweekly0.5https://greeng00se.github.io/tags/elastic-beanstalkweekly0.5https://greeng00se.github.io/tags/eventweekly0.5https://greeng00se.github.io/tags/graspweekly0.5https://greeng00se.github.io/tags/imageweekly0.5https://greeng00se.github.io/tags/image/page/2weekly0.5https://greeng00se.github.io/tags/image/page/3weekly0.5https://greeng00se.github.io/tags/inno-dbweekly0.5https://greeng00se.github.io/tags/intelli-jweekly0.5https://greeng00se.github.io/tags/isolationweekly0.5https://greeng00se.github.io/tags/javaweekly0.5https://greeng00se.github.io/tags/java/page/2weekly0.5https://greeng00se.github.io/tags/java/page/3weekly0.5https://greeng00se.github.io/tags/java/page/4weekly0.5https://greeng00se.github.io/tags/java/page/5weekly0.5https://greeng00se.github.io/tags/jdbcweekly0.5https://greeng00se.github.io/tags/jenkinsweekly0.5https://greeng00se.github.io/tags/kotlinweekly0.5https://greeng00se.github.io/tags/lockweekly0.5https://greeng00se.github.io/tags/lock/page/2weekly0.5https://greeng00se.github.io/tags/logweekly0.5https://greeng00se.github.io/tags/mockweekly0.5https://greeng00se.github.io/tags/mockitoweekly0.5https://greeng00se.github.io/tags/monitoringweekly0.5https://greeng00se.github.io/tags/my-sqlweekly0.5https://greeng00se.github.io/tags/oopweekly0.5https://greeng00se.github.io/tags/patternweekly0.5https://greeng00se.github.io/tags/pythonweekly0.5https://greeng00se.github.io/tags/retrospectiveweekly0.5https://greeng00se.github.io/tags/retrospective/page/10weekly0.5https://greeng00se.github.io/tags/retrospective/page/11weekly0.5https://greeng00se.github.io/tags/retrospective/page/12weekly0.5https://greeng00se.github.io/tags/retrospective/page/13weekly0.5https://greeng00se.github.io/tags/retrospective/page/14weekly0.5https://greeng00se.github.io/tags/retrospective/page/15weekly0.5https://greeng00se.github.io/tags/retrospective/page/2weekly0.5https://greeng00se.github.io/tags/retrospective/page/3weekly0.5https://greeng00se.github.io/tags/retrospective/page/4weekly0.5https://greeng00se.github.io/tags/retrospective/page/5weekly0.5https://greeng00se.github.io/tags/retrospective/page/6weekly0.5https://greeng00se.github.io/tags/retrospective/page/7weekly0.5https://greeng00se.github.io/tags/retrospective/page/8weekly0.5https://greeng00se.github.io/tags/retrospective/page/9weekly0.5https://greeng00se.github.io/tags/springweekly0.5https://greeng00se.github.io/tags/spring-bootweekly0.5https://greeng00se.github.io/tags/staticweekly0.5https://greeng00se.github.io/tags/teco-chatweekly0.5https://greeng00se.github.io/tags/teco-chat/page/2weekly0.5https://greeng00se.github.io/tags/teco-chat/page/3weekly0.5https://greeng00se.github.io/tags/testweekly0.5https://greeng00se.github.io/tags/timeweekly0.5https://greeng00se.github.io/tags/transactionweekly0.5https://greeng00se.github.io/tags/web-socketweekly0.5https://greeng00se.github.io/tags/woowahan-techcourseweekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/10weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/11weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/2weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/3weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/4weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/5weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/6weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/7weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/8weekly0.5https://greeng00se.github.io/tags/woowahan-techcourse/page/9weekly0.5https://greeng00se.github.io/docsweekly0.5https://greeng00se.github.io/docs/JPA/%EA%B8%B0%EB%B3%B8_%ED%82%A4_%EB%A7%A4%ED%95%91weekly0.5https://greeng00se.github.io/docs/Nginx/%EA%B5%AC%EC%A1%B0_%EB%B0%8F_%EB%AA%85%EB%A0%B9%EC%96%B4weekly0.5https://greeng00se.github.io/docs/Nginx/%EC%A0%95%EC%A0%81_%EC%BB%A8%ED%85%90%EC%B8%A0_%EC%A0%9C%EA%B3%B5weekly0.5https://greeng00se.github.io/docs/%EA%B8%B0%ED%83%80/%EA%B1%B4%EA%B0%95%ED%95%98%EA%B2%8C_%EB%82%98%EC%95%84%EC%A7%80%EA%B8%B0weekly0.5https://greeng00se.github.io/docs/%EB%8F%84%EC%84%9C/%EC%83%81%EC%9E%90_%EB%B0%96%EC%9C%BC%EB%A1%9C_%ED%83%88%EC%B6%9C%ED%95%98%EA%B8%B0weekly0.5https://greeng00se.github.io/docs/%EB%A6%AC%EB%88%85%EC%8A%A4/Swap_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EC%84%A4%EC%A0%95weekly0.5https://greeng00se.github.io/docs/%EB%A6%AC%EB%88%85%EC%8A%A4/%ED%84%B0%EB%AF%B8%EB%84%90_%EC%89%98_%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8_%EC%84%A4%EC%A0%95weekly0.5https://greeng00se.github.io/docs/%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81/%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81_%ED%99%98%EA%B2%BD_%EA%B5%AC%EC%84%B1weekly0.5https://greeng00se.github.io/docs/%EB%AC%B8%ED%99%94/%ED%8F%AC%EC%8A%A4%ED%8A%B8_%EB%AA%A8%ED%85%9Cweekly0.5https://greeng00se.github.io/docs/%EC%84%A4%EA%B3%84/%ED%8C%A8%ED%82%A4%EC%A7%80weekly0.5https://greeng00se.github.io/docs/%ED%85%8C%EC%8A%A4%ED%8A%B8/%EA%B3%84%EB%8B%A8_%ED%85%8C%EC%8A%A4%ED%8A%B8weekly0.5https://greeng00se.github.io/docs/%ED%85%8C%EC%8A%A4%ED%8A%B8/%ED%85%8C%EC%8A%A4%ED%8A%B8_%EC%A3%BC%EB%8F%84_%EA%B0%9C%EB%B0%9C_%EA%B7%9C%EC%B9%99weekly0.5https://greeng00se.github.io/docs/%ED%85%8C%EC%8A%A4%ED%8A%B8/%ED%85%8C%EC%8A%A4%ED%8A%B8_%EC%BD%94%EB%93%9C%EA%B0%80_%EC%A3%BC%EB%8A%94_%ED%98%9C%ED%83%9Dweekly0.5https://greeng00se.github.io/weekly0.5https://greeng00se.github.io/weekly0.5 \ No newline at end of file diff --git a/tags.html b/tags.html index fac1eb140..168d0312e 100644 --- a/tags.html +++ b/tags.html @@ -13,13 +13,13 @@ - - + +
-
본문으로 건너뛰기
- - +
본문으로 건너뛰기
+ + \ No newline at end of file diff --git a/tags/async.html b/tags/async.html index 91352bcb3..9186e5332 100644 --- a/tags/async.html +++ b/tags/async.html @@ -13,12 +13,12 @@ - - + +
-
본문으로 건너뛰기

"async" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

이전 글

경로 이미지 생성하기 - 기술 선택
+

"async" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

이전 글

경로 이미지 생성하기 - 기술 선택
경로 이미지 생성하기 - 구현

개요

현재 여행을 마치는 경우, 감상을 생성하는 경우 이미지 생성 요청이 이루어진다.
경로 이미지 생성의 경우 위치 정보의 개수에 정비례하여 생성 시간이 증가한다.
따라서 비동기로 이미지 생성 요청을 처리하여 사용자의 경험을 개선시킬 수 있다고 생각했다.

주기능의 응답속도 개선

여행 종료와 감상 생성이 주기능이고, 이미지 생성 기능은 부기능이다.
@@ -45,7 +45,7 @@ 응답 시간에 이미지 생성 시간이 포함되지 않아서 성능이 개선된 것을 볼 수 있다.

참고 자료

7.7. Task Execution and Scheduling, Spring Boot Docs
Spring Events, Baeldung
회원시스템 이벤트기반 아키텍처 구축하기

- - + + \ No newline at end of file diff --git a/tags/awt.html b/tags/awt.html index 1077bf233..ed8c2457e 100644 --- a/tags/awt.html +++ b/tags/awt.html @@ -13,12 +13,12 @@ - - + +
-

"awt" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
+

"awt" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
경로 이미지에 대한 요구사항 및 기술 선택에 대한 내용은 링크에 있다.

구현 결과

./result.png

예시 데이터는 다음과 같다.
서울역(점) → 신사역 → 노량진역 → 홍대입구역 → 종로3가역 → 옥수역 → 구로역(점) → 신림역 → 발산역

예시 데이터
List<Double> x = List.of(
126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,
126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639
);
List<Double> y = List.of(
37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,
37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184
);
List<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);
List<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);

IMAGE_SIZE & ROUTE_SIZE

RouteImageGenerator.java
private static final int IMAGE_SIZE = 800;
private static final int ROUTE_SIZE = 600;

코드를 보면 이미지 크기와 경로 크기가 있습니다.
이미지 크기는 말 그대로 이미지의 width와 height를 의미한다.
@@ -29,7 +29,7 @@ BufferedImage를 사용할 때 왼쪽 상단의 좌표 (0, 0) 기준으로 아래로 내려갈수록 y 값이 커지고, 오른쪽으로 갈 수록 x 값이 커진다.

./800.png

따라서 최종적으로 이미지를 생성하기 위한 값을 다음과 같이 구했다.

x 값 → 계산한 offset 그대로 더한다.
y 값 → imageSize(800)에서 y + offset 값을 뺀다.

RouteImageDrawer(실제 이미지에 경로를 그려주는 클래스)

BufferedImage, Graphics2D를 필드로 가지고 있는 클래스다.
그림을 그리기 위해 설정한 상수들이 존재한다.

RouteImageDrawer.java
// RGB에 각각 8비트씩 할당한 값을 24비트 트루컬러라 부른다.
// 해당 설정은 24비트 + 8비트(alpha, 투명도)를 추가한 32비트 이미지 타입이다.
// 이를 RGBA라고 부른다.
private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;
// 배경 투명색
private static final Color TRANSPARENT = new Color(0, 0, 0, 0);
// 경로를 위한 STROKE
private static final int LINE_STROKE_WIDTH = 7;
private static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 위치 점을 위한 STROKE
private static final int POINT_STROKE_WIDTH = 20;
private static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 안티앨리어싱 등 화질이 안좋은 이미지를 개선하기 위한 설정
private static final Map<Object, Object> renderingHints = Map.of(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,
RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,
RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

RouteImageDrawer 클래스에는 다음 세 개의 인터페이스가 존재한다.

  • drawLine: 선을 그린다.
  • drawPoint: 점을 찍는다.
  • dispose: 자원 할당을 해제한다.

dispose의 경우 내부에서 생성된 graphics2D에 대한 자원 할당을 해제하는 메서드인 graphics2D.dispose를 호출한다.

이미지 생성 Flow

1. 이미지 생성 준비

2. 선 그리기 요청

3. 위치 점 그리기 요청

4. 업로드 요청

전체 Flow

- - + + \ No newline at end of file diff --git a/tags/awt/page/2.html b/tags/awt/page/2.html index dd307a83c..cd56cfd75 100644 --- a/tags/awt/page/2.html +++ b/tags/awt/page/2.html @@ -13,18 +13,18 @@ - - + +
-

"awt" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
+

"awt" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
따라서 이미지를 직접 생성하거나, 클라이언트에서 직접 위경도를 이용하여 그려야 한다.

해당 요구사항을 해결하기 위해서는 다음과 같은 기능을 가진 라이브러리가 필요하다.

  • 이미지 생성
  • 선과 점 표현
  • 투명한 배경색

현재 클라이언트의 바쁜 일정과 기능 구현에 있어 약간의 연산이 들어간다는 부분에서 백엔드에서 이미지를 생성하기로 결정을 내렸다.

고려한 기술

이미지 생성을 위해 다음과 같은 라이브러리 또는 기술들을 확인해 보았다.

  • Python의 Matplotlib
  • AWT(Abstract Window Toolkit) [최종 선택]
  • 이미지 처리 라이브러리 및 Java에서 내부적으로 Matplotlib 사용할 수 있는 라이브러리 (원하는 기능 없음)
  • Java Swing, Java FX (단순한 선 그리기 + 점 찍기라 불필요)

Python & Matplotlib

데이터 시각화 라이브러리
이미지 생성 및 로컬에 저장까지 걸리는 시간: 0.2초

  • 코드가 간단해서 유지 보수성이 좋다.
  • AWS Lambda 같은 서버리스 컴퓨팅 서비스나 FastAPI와 같은 웹 프레임워크로 추가적인 API를 구현해야 한다.
  • Spring Boot에서 추가적인 API 호출을 해야하고, 확장성과 비동기 처리 등 고려 해야 할 부분이 많다.

Java AWT 이외의 라이브러리

Python이 아닌 Java에서의 라이브러리도 고려를 해봤지만 요구사항에 적합하지 않거나, 적은 요구사항에 비해 무거운 라이브러리들이 많아서 제외했다.

라이브러리설명제외 이유
SwingAWT 이후에 나온 GUI 라이브러리, 네이티브 UI를 사용하지 않고 모든 운영체제 상에서 동일한 UI를 가지도록 함요구사항에 비해 무겁고 복잡도가 높음
JavaFXSwing 이후에 나온 GUI 라이브러리, 3차원 그래픽을 지원함요구사항에 비해 무겁고 복잡도가 높음
simple-java-plotAWT로 구현된 플로팅 라이브러리AWT 기반이긴 하지만 직접 AWT를 사용하는 것에 비해 메리트가 없음, 커스텀 설정 기능이 없음
matplotlib4jMatplotlib를 Java에서 사용할 수 있게 하는 라이브러리내부적으로 파이썬 사용하기에 무거움, 배경 투명화 기능 없음

Java & AWT(Abstract Window Toolkit)

그래픽과 이미지를 그리기 위한 도구
이미지 생성 및 로컬에 저장까지 걸리는 시간: 1.75초

  • 플로팅 라이브러리를 사용하는 것보다 구현의 난이도가 다소 존재한다.
  • 이미지 생성 시간이 다소 소요되기 때문에 빠른 응답 반환을 위해 비동기 처리를 고려할 수 있을 것 같다.
  • 추가적인 api 호출을 하지 않아도 된다.

기술 선택

AWT의 경우 Matplotlib에 비해 구현의 난이도가 다소 있고, 이미지 생성 시간이 더 많이 걸리는 단점이 있다.
하지만 추가적인 api 호출을 하지 않아도 되는 부분, Python을 사용하는 경우 추가적인 웹 프레임워크의 학습 비용을 고려하여 AWT를 사용하기로 결정했다.

유지 보수

AWT라는 생소한 기술을 사용하기 때문에 유지 보수성을 위해 팀원들과 공유하는 것이 중요하다고 생각했다.
따라서 다음과 같은 방법으로 공유하기로 했다.

  1. 코드 리뷰와 PR을 통해 작성한 AWT 코드에 대한 설명 및 리뷰 받는다.
  2. AWT를 사용한 부분을 문서화하여 공유한다.
- - + + \ No newline at end of file diff --git a/tags/book.html b/tags/book.html index 6b9a6f01e..1e96c0895 100644 --- a/tags/book.html +++ b/tags/book.html @@ -13,12 +13,12 @@ - - + +
-

"Book" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

책 정보

상자 밖에 있는 사람
+

"Book" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

책 정보

상자 밖에 있는 사람
아빈저연구소

자기기만과 자기배반

책에서는 자기기만과 자기배반에 대한 내용을 다룬다.

  • 자기기만: 자신의 문제를 인정하지 않는 것
  • 자기배반: 다른 사람을 위해 무언가 해야만 한다는 생각을 반하는 행위

자기배반을 한다면 자기기만 상태가 된다.
자기기만 상태에 빠지는 것을 책에서는 상자 안에 들어간다고 표현한다.

읽고 나서

최근에 읽은 책 중 가장 마음이 불편했다.
그렇기에 더더욱 나에게 필요한 내용이 담겨있었다.

살면서 많은 선택의 순간이 존재했고, 그 순간마다 자기배반을 택하는 경우가 많았다.
@@ -48,7 +48,7 @@ 우리가 그들과 진정으로 함께 소통하기 전까지는 우리는 그들의 가치를 잘 모릅니다.
우리의 위대함이란 다른 사람들의 위대한 점을 발견해 주는 것에 있습니다.
p.280

- - + + \ No newline at end of file diff --git a/tags/book/page/2.html b/tags/book/page/2.html index d981c736e..305367321 100644 --- a/tags/book/page/2.html +++ b/tags/book/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"Book" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

책 정보

객체지향의 사실과 오해
+

"Book" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

책 정보

객체지향의 사실과 오해
조영호

읽고 나서

조영호님의 오브젝트를 읽고 나서 다시 한 번 읽어보았다.
아직 이해가 안되는 부분이 많지만, 그래도 항상 새로움을 느낀다.
더할 나위 없이 휼륭한 객체지향 책이고, 조금 더 공부하고 다시 읽어봐야될 것 같다.

커피 전문점, 지하철 노선도, 이상한 나라의 엘리스를 예시로 든 설명이 너무 좋았고
@@ -38,7 +38,7 @@ ’어떤 행위(What)’를 수행할 것인지 결정한 후 ‘누가(who)’ 그 행위를 수행할 것인지 결정해야 한다. 여기서 ‘어떤 행위’가 바로 메시지다. p.158

- - + + \ No newline at end of file diff --git a/tags/book/page/3.html b/tags/book/page/3.html index 3ad5128ee..f1b0e0509 100644 --- a/tags/book/page/3.html +++ b/tags/book/page/3.html @@ -13,18 +13,18 @@ - - + +
-

"Book" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

책 정보

글, 우리도 잘 쓸 수 있습니다.
+

"Book" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

책 정보

글, 우리도 잘 쓸 수 있습니다.
박솔미

읽고 나서

저자의 경험과 함께 글쓰기에 대한 가벼운 조언이 담겨있어 가볍게 읽기 좋았다.
글을 잘 작성해 보고 싶을 때 적용해 볼 수 있는 정보가 많아서 도움이 되었다.

우아한 테크코스의 프리코스를 진행할 때 후기를 작성하고 나면 항상 글이 딱딱하다는 느낌을 받았다.
다른 지원자들의 읽기 편하고, 밝은 느낌을 주는 글을 보면 부러운 마음을 가지기도 했다.
이 책을 읽었으니 2023년에는 조금 더 글을 잘 적어보려고 한다.

밑줄 친 문장들

문장이 심심하고 지루하다면 내용을 일목요연하게 정리했고, 글의 의도도 삐뚤지 않고, 단어도 적절한 것으로 골랐는데… 그런데도 어딘가가 심심하고 지루하다면? 축축 처지고 따분하다면? 말꼬리를 모조리 ‘~다’로 통일한 건 아닌지 점검해 보세요.

말꼬리를 잘 갖고 놀아야 합니다. 문장의 마지막 글자를 매번 다르게 고쳐쓰는 것만으로도 글에 활기를 더할 수 있죠. 때론 문장을 다 마치지 않고, 단어로만 끝맺는 것도 방법. 문장과 문장 사이에 쉼표가 들어서며 글 전체에 활기가 돌게 돼요. 문장의 길이도 다채로워지는 덕분에 덤으로 얻게 되는 것도 있습니다. 바로, 글의 리듬.

이전 문장에서 끝난 글자로, 다음 문장을 끝맺지 않기. 한두 문단마다 단어 수준의 아주 짧은 문장 배치하기.

글의 진짜 이유, 글의 진짜 목적, 글의 진짜 대상을 찾으려고 애썼습니다. 지금처럼 틀을 떠올린다거나, 눈치를 본다거나, 정치적인 셈도 하지 않았어요.

제목은 짧게, 보기 쉽게, 읽기 쉽게, 발음이 비슷하게, 순서를 바꿔서

글을 마지막으로 다듬을 때, 노래에 가까워질 방법은 없을지 고민해봅니다. 감히 가 닿을 수 없는 목표이겠지만, 할 수 있는 최소한의 리듬이라도 붙여주고 싶어요.

여는 말과 마지막 말에 작정하고 마음을 담는 연습을 해봅시다. 글의 어느 구석이라도 뻔한 글자는 남기지 않겠노라 다짐하며 써보는 겁니다. 나만이 가진 유일한 메시지에 집중하면서요. 그럼 생각이 달라지고, 고르는 단어도 달라지고, 남긴 문장도 달라져요. 결국에는 글을 쓴 사람인 나 자신도 남달라질 겁니다.

맞춤법은 중요합니다. 하지만 맞춤법보다 더 중요한 건 거기에 담긴 마음입니다. 내 마음을 글에 담아 실어 보내기 전, 맞춤법을 점검하는 이유 역시 그겁니다. 오직 내 마음이 남에게 읽히는 동안 방해가 되지 않기를 바라기 때문이죠. 내가 쓴 글도, 남이 쓴 글도. 언제나 그 안에 담긴 마음이 먼저입니다.

글을 쓴다고 글이 완성되는 게 아니에요. 글과 닮은 모습으로 살 때, 글은 비로소 완성됩니다.

- - + + \ No newline at end of file diff --git a/tags/class.html b/tags/class.html index bcbdc9061..734fe283f 100644 --- a/tags/class.html +++ b/tags/class.html @@ -13,12 +13,12 @@ - - + +
-

"Class" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
+

"Class" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
컴파일된 클래스파일은 어떤 구조로 되어있을까?

클래스 파일의 데이터 형식

8비트 바이트의 스트림으로 구성된다.
16비트 및 32비트의 데이터는 각각 2개, 4개의 연속된 8비트를 읽어서 구성된다.
멀티바이트의 경우 항상 big endian 순서로 저장된다.

u1 → unsigned 1byte
@@ -36,7 +36,7 @@ Class file in Java, File Format
java se11 Class 파일 형식, Oracle
java se17 Class 파일 형식, Oracle

- - + + \ No newline at end of file diff --git a/tags/cloudwatch.html b/tags/cloudwatch.html new file mode 100644 index 000000000..b186ae513 --- /dev/null +++ b/tags/cloudwatch.html @@ -0,0 +1,44 @@ + + + + + +"cloudwatch" 태그로 연결된 1개 게시물개의 게시물이 있습니다. | GG + + + + + + + + + + + + + +
+

"cloudwatch" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

CloudWatch

AWS 리소스와 애플리케이션의 지표와 로그에 대한 모니터링을 제공하는 서비스다.
+지표를 감시하여 알림을 보내는 기능도 제공한다.
+프리티어를 사용하지 않는 경우 대시보드당 3$/M 의 비용이 청구되고, 지표나 로그의 양에 따라 비용이 추가적으로 청구된다.
+요금 정보에 대한 자세한 정보는 다음 링크에서 확인할 수 있다.

CloudWatch Metrics

기본적으로 5분마다 지표에 대한 정보가 수집된다.
+세부 모니터링(Detailed Monitoring)을 활성화하면 1분마다 지표를 수집한다.
+대시보드에서 InstanceId로 검색하여 수집된 지표를 확인할 수 있다.

./cloudwatch1.png

CPUUtilization, NetworkIn, NetworkOut과 같은 기본적인 지표를 제공하고, 메모리, 디스크 공간과 같은 지표를 확인하려면 사용자 지정 지표를 설정해야 한다.

CloudWatch Agent 설치

CloudWatch Agent 사용자 지정 지표와 로그를 수집할 수 있다.

IAM 역할 설정

기본적으로 EC2 인스턴스가 CloudWatchAgentServerPolicy에 대한 권한이 있어야 한다.
+IAM → 역할에서 역할 생성을 클릭한다.

./cloudwatch2.png

CloudWatchAgentServerPolicy 권한 정책을 선택하고, 적당한 역할 이름을 입력해서 역할을 생성한다.

./cloudwatch3.png

EC2 인스턴스 목록으로 들어가서, CloudWatch Agent를 설치할 EC2 인스턴스를 클릭한다.
+작업 → 보안 → IAM 역할 수정에서 이전에 생성한 역할을 지정한다.

./cloudwatch4.png

설치

환경은 다음과 같다.

OS: ubuntu 22.04
+인스턴스 유형: t4g.small (ARM64)

아래 명령어를 입력하여 설치한다.

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

사용 설명서에 각 인스턴스 유형마다 다운로드 링크가 자세하게 안내되어 있다.

Wizard

CloudWatch Wizard를 사용하면 간단하게 설정 파일 생성할 수 있다.
+로그를 수집하도록 설정하는 경우 Wizard 실행 명령어 입력 전 log 파일의 절대 경로를 복사해두는 것이 좋다.
+아래의 명령어를 입력하여 Wizard를 실행할 수 있다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

설정을 진행하다 보면 설정 파일이 어떻게 구성될지 확인할 수 있다.
+로그를 추가할 것이냐고 물어보는 입력창이 나오면 준비해뒀던 로그 파일의 절대 경로를 입력한다.

./cloudwatch5.png

중간에 SSM parameter store에 설정 파일을 저장할 것이냐고 물어보는 창이 나온다.

Do you want to store the config in the SSM parameter store?
1. yes
2. no

추가적으로 설정하지 않는 경우 2번을 선택한다.
+Parameter Store 관리에 대한 내용은 다음의 문서를 참고하면 좋을 거 같다.
+설정이 완료되면 /opt/aws/amazon-cloudwatch-agent/bin/config.json 에 설정에 대한 내용이 저장된다.

설정 파일 적용

아래의 명령어를 입력하여 설정파일을 적용할 수 있다.
+file 뒤에는 설정 파일에 대한 절대경로(아래 명령어 기준 기본 생성 위치)를 입력하면 된다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

types.db: no such file or directory 에러

다음과 같은 에러가 발생한다면 types.db 파일을 생성해서 문제를 해결할 수 있다.

Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory

types.db 파일 생성

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

지표 확인

CloudWatch Metrics에 가보면 CWAgent라는 사용자 지정 네임스페이스가 추가된 것을 볼 수 있다.
+설정 파일에 네임스페이스를 추가하는 방법도 있다.

./cloudwatch6.png

로그

CloudWatch → 로그 그룹으로 가면 Wizard로 추가한 로그를 확인할 수 있다.

./cloudwatch7.png

참고 자료

CloudWatch란 무엇입니까?
+Amazon CloudWatch 요금
+Linux 인스턴스 지표
+서버에 CloudWatch 에이전트 설치 및 실행
+CloudWatch Agent를 Parameter Store에서 관리해 보기

+ + + + \ No newline at end of file diff --git a/tags/composite.html b/tags/composite.html index b5b2a8841..7ed746d83 100644 --- a/tags/composite.html +++ b/tags/composite.html @@ -13,12 +13,12 @@ - - + +
-

"Composite" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
+

"Composite" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
요금을 계산하는 메서드는 최단 경로 계산의 결과, 사용자의 정보, 요금을 받아 요금을 계산한다.

public interface FarePolicy {
int calculate(Path path, Passenger passenger, int fare);
}

public class BaseFarePolicy implements FarePolicy { ... }
public class DistanceFarePolicy implements FarePolicy { ... }
public class AgeDiscountFarePolicy implements FarePolicy { ... }

composite1

모든 요금 정책을 포함하는 새로운 요금 정책 만들기

나머지 구현체를 모두 가지고 있는 하나의 구현체를 만들었다.
이 또한 FarePolicy를 구현한 형태가 되고, 필드로는 나머지 구현체들을 가지고 있다.

public class SubwayFarePolicy implements FarePolicy {

private final List<FarePolicy> farePolicies;

public SubwayFarePolicy(final List<FarePolicy> farePolicies) {
this.farePolicies = farePolicies;
}

@Override
public int calculate(final Path path, final Passenger passenger, final int fare) {
int calculatedFare = fare;
for (FarePolicy farePolicy : farePolicies) {
calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);
}
return calculatedFare;
}
}

따라서 그림으로 본다면 다음과 같은 구조가 된다.

composite2

정책의 순서

지하철 요구사항은 순서가 중요했다.
금액의 총합을 구하고, 그 후에 할인 정책이 들어가야했다.
@@ -31,7 +31,7 @@ 패턴을 맹목적으로 사용해서는 안되고, 현재의 요구사항에 따라 패턴을 유동적으로 수정해가면서 적용하는 것이 좋다.
항상 트레이드오프를 생각하자!

참고 자료

컴포지트 패턴, GoF의 디자인 패턴
디자인 패턴과 프레임워크, 오브젝트

- - + + \ No newline at end of file diff --git a/tags/data-base.html b/tags/data-base.html index 296cd64e7..a23bddb63 100644 --- a/tags/data-base.html +++ b/tags/data-base.html @@ -13,12 +13,12 @@ - - + +
-

"DataBase" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
+

"DataBase" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
보통 명시적으로 잠금을 사용하는 경우는 드물고, 격리 수준에 따라 묵시적으로 잠금이 사용된다.

동시성 제어 방식에는 낙관적인 방식과 비관적인 방식이 있다.
InnoDB는 기본적으로 MVCC(다중 버전 동시성 제어)를 통해 낙관적인 방식을 사용하고 락을 통해 특정 상황에서 비관적인 방식을 사용한다.

낙관적 동시성 제어(OCC, Optimistic concurrency control)

트랜잭션이 서로 충돌하지 않는다고 가정하는 방식

비관적 동시성 제어(PCC, Pessimistic Concurrency Control)

트랜잭션이 충돌하는 가정하에 잠금을 거는 방식
일반적으로 Shared Lock, Exclusive Lock을 통해 이를 구현한다.

Shared & Exclusive Locks

InnoDB는 로우 단위의 잠금을 수행할 때 공유 잠금과 배타적 잠금을 사용한다.

공유 잠금(S, shared lock)

데이터 조회를 위한 락, 읽기 잠금(read lock)으로도 불린다.
@@ -38,7 +38,7 @@ MySQL Innodb Locks, cecil1018
MySQL 8.0 InnoDB Locks, MySQL
Locks Set by Different SQL Statements in InnoDB, MySQL

- - + + \ No newline at end of file diff --git a/tags/data-base/page/2.html b/tags/data-base/page/2.html index 2fe836885..9989f9e8b 100644 --- a/tags/data-base/page/2.html +++ b/tags/data-base/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"DataBase" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
+

"DataBase" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다.

글로벌 락(Global lock)

MySQL에서 제공하는 잠금 중 가장 넓은 범위를 가지고 있는 잠금이다.

  • 영향을 미치는 범위는 해당 서버 전체이다.
  • 작업 대상 테이블, 데이터베이스 상관 없이 동일하게 영향을 받는다.

한 세션에서 글로벌 락을 획득하면 해제 될 때 까지 조회를 제외한 대부분의 명령이 대기 상태가 된다.
데이터베이스에 존재하는 MyISAM이나 MEMORY 테이블에 대해 일관된 백업을 받아야할 때 사용한다.
InnoDB 스토리지 엔진에서는 백업 시 조금 더 가벼운 백업 락을 사용할 수 있다.

-- GLOBAL LOCK
FLUSH TABLES WITH READ LOCK;
-- UNLOCK
UNLOCK TABLES;

-- BACKUP LOCK
LOCK INSTANCE FOR BACKUP;
-- UNLOCK
UNLOCK INSTANCE;
- - + + \ No newline at end of file diff --git a/tags/data-base/page/3.html b/tags/data-base/page/3.html index 7674d04e0..3bc0ba782 100644 --- a/tags/data-base/page/3.html +++ b/tags/data-base/page/3.html @@ -13,12 +13,12 @@ - - + +
-

"DataBase" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
+

"DataBase" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
트랜잭션은 작업의 완전성과 데이터의 정합성을 보장해 준다.
논리적인 작업 셋을 완벽하게 처리하거나, 오류 시 작업의 일부만 적용되는 현상을 막아준다.

트랜잭션의 속성(ACID)

원자성(Atomicity): 트랜잭션 내에서 실행된 작업들은 모두 성공하거나, 실패해야 한다.
일관성(Consistency): 트랜잭션이 수행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
@@ -42,7 +42,7 @@ 예) A가 레코드를 여러 번 조회하던 중 B가 레코드를 변경하여 A가 조회한 값이 달라지는 경우

팬텀 리드(Phantom read, Phantom row)

한 트랜잭션 내에서 동일한 쿼리 수행시, 수행 결과가 다른 현상
예) A가 레코드를 조회하고 B가 레코드를 추가하여 A가 다시 조회할 때 존재하지 않은 레코드가 조회되는 경우

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
Isolation Level, MySQL

- - + + \ No newline at end of file diff --git a/tags/documentation.html b/tags/documentation.html index bb8826503..a48229192 100644 --- a/tags/documentation.html +++ b/tags/documentation.html @@ -13,12 +13,12 @@ - - + +
-

"Documentation" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 11분

팀 블로그 또는 문서화를 위해 Docusaurus를 사용하는 방법을 정리하려고 한다.

설치

공식 홈페이지에 들어가서 최신 버전을 설치한다.

yarn create docusaurus

배포

배포 안내 문서
+

"Documentation" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 11분

팀 블로그 또는 문서화를 위해 Docusaurus를 사용하는 방법을 정리하려고 한다.

설치

공식 홈페이지에 들어가서 최신 버전을 설치한다.

yarn create docusaurus

배포

배포 안내 문서
netlify나 vercel 같은 서버리스 플랫폼을 추천하고 있고, 간단하고, 빠른 시간 안에 배포를 할 수 있다.
이 글에서는 github pages를 이용해서 배포하는 방법을 설명한다.

레포지토리 생성

github pages를 이용하려면 예시와 같이 username.github.io 형태의 레포지토리를 생성해야 한다.
이때 organization을 사용하는 경우 organization.github.io 형태의 레포지토리를 생성해서 사용한다.

설정 파일 수정

docusaurus.config
module.exports = {
// ...
url: 'https://greeng00se.github.io',
baseUrl: '/',
projectName: 'greeng00se.github.io',
organizationName: 'greeng00se',
trailingSlash: false,
// ...
};

토큰 설정

github action을 위해 배포용 토큰을 하나 생성하여 생성한 레포지토리에 Repository secrets으로 설정한다.
@@ -39,7 +39,7 @@ jq가 설치되어 있지 않으면 mac 기준 brew를 이용해서 설치할 수 있다.

brew install jq

다음 명령어를 이용하여 .env와 config.json을 이용하여 크롤링을 한다.

docker run -it --env-file=.env -e "CONFIG=$(cat ./config.json | jq -r tostring)" algolia/docsearch-scraper

docusaurus 설정

전에 확인한 APP ID, Search-Only API KEY, IndexName을 이용하여 docusaurus.config 파일에 설정한다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
algolia: {
appId: 'MVIU5UEMOM', // Application ID
apiKey: 'b68f378013817d9a190df88cdde226a0', // Search-Only API Key
indexName: 'teco', // config.json에 설정한 인덱스명
contextualSearch: true,
},
})

부가 설정

화면 상단 Github Icon

파일 최하단에 아래 css 구문을 추가한다.

/src/css/custom.css
.header-github-link:hover {
opacity: 0.6;
}

.header-github-link:before {
content: '';
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

html[data-theme='dark'] .header-github-link:before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}

themeconfig -> navbar에 github link를 설정한다.

docusaurus.config
navbar: {
title: 'HELLO',
items: [
{
href: 'https://github.com/greeng00se',
position: 'right',
className: 'header-github-link',
'aria-label': 'GitHub repository',
},
],
},

코드블럭

java나 kotlin의 경우 기본적으로 하이라이팅을 지원해 주지 않는다.
prism 설정을 아래와 같이 변경해 준다.

docusaurus.config
prism: {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
additionalLanguages: ['java', 'kotlin'],
}

mermaid

mermaid를 사용하려면 @docusaurus/theme-mermaid 를 설치해야 한다.

yarn add @docusaurus/theme-mermaid

설치 후 아래와 같이 설정을 추가한다.

docusaurus.config
const config = {
...
markdown: {
mermaid: true,
},
themes: [
'@docusaurus/theme-mermaid'
],
};

themeConfig에서 mermaid의 테마를 지정할 수 있다.

docusaurus.config
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
...
mermaid: {
theme: {
light: 'neutral',
dark: 'dark'
},
},
}),

국제화 설정

국제화 설정을 한다면 Older Entries 형태의 설명이 다음 페이지 로 변경된다.
설정파일에서 i18n에 있는 로케일 설정을 ko로 변경하면 된다.

docusaurus.config
i18n: {
defaultLocale: "ko",
locales: ["ko"],
},

블로그 글 author

팀원 별로 문서를 관리한다면 다음과 같이 어떤 팀원이 글을 작성했는지 설정해야 한다.

author

authors.yml 파일을 이용하여 사용자에 대한 기본 설정을 할 수 있다.

/blog/authors.yml
herb:
name: 허브
title: Backend
url: https://github.com/greeng00se
image_url: https://github.com/greeng00se.png

mallang:
name: 말랑
title: Backend
url: https://github.com/shin-mallang
image_url: https://github.com/shin-mallang.png

블로그 글을 작성할 때 다음과 같이 authors에 넣어주기만 하면 된다.

---
slug: 1
title: Hello World
authors: [herb, mallang]
tags: [hello, docusaurus]
---

첫 번째 문서 내용
- - + + \ No newline at end of file diff --git a/tags/dto.html b/tags/dto.html index c3c716b35..375936d37 100644 --- a/tags/dto.html +++ b/tags/dto.html @@ -13,12 +13,12 @@ - - + +
-

"DTO" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.
+

"DTO" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

장바구니 미션에서는 상품 추가와 상품 수정에 대한 요구사항이 있었다.
요청에 담긴 Body를 통해 전달받은 값을 DTO로 매핑하여 추가와 수정을 했다.

장바구니 미션에서의 상품 추가 및 수정

중복1

클래스명을 제외하고 필드와 검증로직 그 외 모든게 같은 DTO를 보며 중복이라고 생각했다.
하지만 반대로 용도가 다르기 때문에 중복이 아니라고 생각하기도 했다.
위 경우는 중복일까? 중복이 아닐까?

이 부분에 대해서 다음과 같은 리뷰를 받았다.

ProductSaveRequestProductUpdateRequest가 완전히 동일한데, 재사용할 수 없을까? 라는 리뷰를 남겼었어요. 사실 생성과 수정은 서로 달라질 개연성이 높아서 미리 분리해놓는 게 더 좋은 방법이긴 한데, 그래도 중복은 싫어서 저도 요즘 이런저런 방법들을 시도해보는 중 입니다. 허브는 이 부분에 대해 어떤 생각을 가지고 있을지 궁금하네요 ㅎㅎ

질문에 대해 아래와 같이 답변을 했다.

저장과 수정할 때 필요한 필드값이 동일하여 현재 구조에서는 하나로 사용해도 된다고 생각을 하지만, 말씀해주신대로 요구사항이 변경된다면 달라질 가능성이 높다고 판단하였습니다!

중복과 우발적 중복

로버트 마틴님이 집필하신 클린 아키텍처는 아래와 같이 중복을 여러가지 종류로 나누어 설명하고 있다.

  • 진짜 중복: 한 인스턴스가 변경되면, 동일한 변경을 그 인스턴스의 모드 복사본에 반드시 적용해야 한다.
  • 거짓된 중복, 우발적 중복: 중복으로 보이는 두 코드 영역이 각자의 경로로 발전한다면, 즉 서로 다른 속도와 다른 이유로 변경된다면 이 두 코드는 진짜 중복이 아니다.

추가와 수정은 초기에는 중복으로 보이지만 초기 생성시에만 기입하는 데이터들이 추가되거나, 시간이 지나면서 서로 달라질 가능성이 높아진다. @@ -32,7 +32,7 @@ 상황에 맞춰 적재적소에 의존 역전을 이용해보는 것도 좋을 것 같다.

참고 자료

클린 아키텍처 16장 독립성, 로버트 C. 마틴
https://techblog.woowahan.com/2647/
https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/

- - + + \ No newline at end of file diff --git a/tags/elastic-beanstalk.html b/tags/elastic-beanstalk.html index fc908f697..d8b6a8f14 100644 --- a/tags/elastic-beanstalk.html +++ b/tags/elastic-beanstalk.html @@ -13,12 +13,12 @@ - - + +
-

"Elastic Beanstalk" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

설정 환경

소프트웨어 이미지: Amazon Linux 2023 AMI
+

"Elastic Beanstalk" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기
- - + + \ No newline at end of file diff --git a/tags/event.html b/tags/event.html index 4cd06bc5e..9d118ce9b 100644 --- a/tags/event.html +++ b/tags/event.html @@ -13,12 +13,12 @@ - - + +
-

"event" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

이전 글

경로 이미지 생성하기 - 기술 선택
+

"event" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

이전 글

경로 이미지 생성하기 - 기술 선택
경로 이미지 생성하기 - 구현

개요

현재 여행을 마치는 경우, 감상을 생성하는 경우 이미지 생성 요청이 이루어진다.
경로 이미지 생성의 경우 위치 정보의 개수에 정비례하여 생성 시간이 증가한다.
따라서 비동기로 이미지 생성 요청을 처리하여 사용자의 경험을 개선시킬 수 있다고 생각했다.

주기능의 응답속도 개선

여행 종료와 감상 생성이 주기능이고, 이미지 생성 기능은 부기능이다.
@@ -45,7 +45,7 @@ 응답 시간에 이미지 생성 시간이 포함되지 않아서 성능이 개선된 것을 볼 수 있다.

참고 자료

7.7. Task Execution and Scheduling, Spring Boot Docs
Spring Events, Baeldung
회원시스템 이벤트기반 아키텍처 구축하기

- - + + \ No newline at end of file diff --git a/tags/grasp.html b/tags/grasp.html index 0dedc16c8..1809bbab7 100644 --- a/tags/grasp.html +++ b/tags/grasp.html @@ -13,15 +13,15 @@ - - + +
-

"GRASP" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) +

"GRASP" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) 객체 사이의 의존성이 과한 경우 결합도가 높다고 말한다.

  • 오브젝트 p.17

결합도를 낮춘다면 다음과 같은 이점이 있다.

  • 다른 구성 요소의 변화에 영향을 받지 않는다.
  • 재사용이 편리해진다.
  • 해당 클래스에 대한 이해가 쉬워진다. (의존하는 클래스가 적기 때문에)

높은 응집도 패턴(High Cohesion)

Q. 객체를 관리하기 쉽게 하려면 어떻게 해야 할까?

A. 높은 응집도를 유지할 수 있게 책임을 할당해야 한다.

응집도(Cohesion) 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도가 높다고 말한다.

  • 오브젝트 p.26

변경의 이유에 따라 클래스를 분리한다면 응집도를 높일 수 있고, 응집도가 높아진다면 다음과 같은 이점이 있다.

  • 해당 클래스에 대한 이해가 쉬워진다. (할당된 책임만을 수행하고 있기 때문에)
  • 유지보수가 쉬워진다.
  • 낮은 결합도 또한 지원한다.
  • 응집도가 높은 클래스는 특정한 목적에 사용할 수 있기 때문에 재사용하기 좋다.

컨트롤러 패턴(Controller)

Q. 사용자의 요청을 처리하는 것은 누가 담당해야 하는가?

A. 사용자의 요청을 처리하는 Controller 객체를 만들어서 사용해야 한다.

어떤 서브시스템이 존재한다고 가정할 때

  • 직접적으로 객체에 접근하여 프로그램을 사용한다면 결합도가 상승한다.
  • 서브 시스템에 들어오는 요청을 처리해주는 컨트롤러가 있다면 사용하는 입장에서는 해당 컨트롤러만 알면 된다.
  • 만약 서브 시스템의 변경이 생겼을 때 외부에 미치는 영향도 줄어든다.

다형성 패턴(Polymorphism)

Q. 객체의 타입에 따라 행동이 바뀐다면 책임을 어떻게 할당해야 할까?

A. OOP가 지원하는 다형성을 적극적으로 활용한다. (인터페이스를 두고 행동에 대한 부분을 구현)

객체의 종류에 따라 분기하는 조건문이 아닌 다형성을 사용하는 것이 좋은 방법이다.

새로운 타입이 추가되었을 때 조건문을 사용한다면 기존의 조건문을 수정해야 하지만 다형성을 활용하면 쉽게 확장할 수 있다.

변경 보호 패턴(Protected Variations)

Q. 어떻게 하면 변경이 다른 요소에 영향을 미치지 않도록 방지할 수 있을까?

A. 변화가 예상되는 지점을 식별하고, 주위에 안정된 인터페이스를 형성하도록 책임을 할당해야 한다.

간접 참조 패턴(Indirection)

Q. 두 객체 사이의 직접적인 연결을 피하고 싶다면 어떻게 해야 할까?

A. 두 객체 사이에 또 다른 객체를 두어 직접적인 연결을 피할 수 있다.

중재자 패턴을 사용하여 두 객체 사이에 또 하나의 객체를 추가하여 복잡한 관계를 단순화할 수 있다.

중간에 인터페이스를 둔다면 변경 보호 패턴(Protected Variations)에 해당된다.

순수한 가공물 패턴(Pure Fabrication)

Q. 책임을 할당한 도메인 객체가 Low Coupling, High Cohesion, 재사용성 등의 목적을 위반한다면 어떻게 해야 할까?

A. 도메인 개념을 포함하지 않는 클래스를 하나 만들고 매우 응집된 책임을 할당할 수 있다.

행동을 추가할 때, 해당 책임을 수행할 도메인 개념이 존재하지 않는다면 도메인과 무관한 인공적인 객체를 만든다음 해당 객체에게 책임을 할당한다.

객체가 데이터베이스에 저장해야 할 값을 가지고 있다고, 정보 전문가 패턴을 적용하여 데이터베이스에 저장하라는 책임을 가지라고 하지 않는다.

예) 상점과 고객 클래스가 있고 서로 다른 통화를 사용하고 있다고 가정

  • 서로 다른 통화를 사용하고 있기 때문에 거래를 하려면 환전을 해야한다.
  • 두 클래스 다 환전에 대한 책임을 부여하기 애매하다면 환전을 책임하는 클래스를 추가하고 사용할 수 있다.

참고 자료

오브젝트 5장. 책임 할당하기, 조영호

Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman

GRASP, 한빛 네트워크

- - + + \ No newline at end of file diff --git a/tags/image.html b/tags/image.html index 65fd133a7..2c18eec4e 100644 --- a/tags/image.html +++ b/tags/image.html @@ -13,12 +13,12 @@ - - + +
-

"image" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
+

"image" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 12분

개요

위와 같이 여행에 대한 경로를 보여주기 위해 경로 이미지를 생성하는 기능을 추가했다.
경로 이미지에 대한 요구사항 및 기술 선택에 대한 내용은 링크에 있다.

구현 결과

./result.png

예시 데이터는 다음과 같다.
서울역(점) → 신사역 → 노량진역 → 홍대입구역 → 종로3가역 → 옥수역 → 구로역(점) → 신림역 → 발산역

예시 데이터
List<Double> x = List.of(
126.97094933811682, 127.02154822802501, 126.94218991864345, 126.92402556641424,
126.99265358592287, 127.01779856076462, 126.88474839801178, 126.92900751277035, 126.83930056313639
);
List<Double> y = List.of(
37.55302829553499, 37.51619698970427, 37.51294119442773, 37.5565933969331,
37.57034879708931, 37.54027238225762, 37.50129417536773, 37.48258811529137, 37.557607696911184
);
List<Double> xPoints = List.of(126.97094933811682, 126.88474839801178);
List<Double> yPoints = List.of(37.55302829553499, 37.50129417536773);

IMAGE_SIZE & ROUTE_SIZE

RouteImageGenerator.java
private static final int IMAGE_SIZE = 800;
private static final int ROUTE_SIZE = 600;

코드를 보면 이미지 크기와 경로 크기가 있습니다.
이미지 크기는 말 그대로 이미지의 width와 height를 의미한다.
@@ -29,7 +29,7 @@ BufferedImage를 사용할 때 왼쪽 상단의 좌표 (0, 0) 기준으로 아래로 내려갈수록 y 값이 커지고, 오른쪽으로 갈 수록 x 값이 커진다.

./800.png

따라서 최종적으로 이미지를 생성하기 위한 값을 다음과 같이 구했다.

x 값 → 계산한 offset 그대로 더한다.
y 값 → imageSize(800)에서 y + offset 값을 뺀다.

RouteImageDrawer(실제 이미지에 경로를 그려주는 클래스)

BufferedImage, Graphics2D를 필드로 가지고 있는 클래스다.
그림을 그리기 위해 설정한 상수들이 존재한다.

RouteImageDrawer.java
// RGB에 각각 8비트씩 할당한 값을 24비트 트루컬러라 부른다.
// 해당 설정은 24비트 + 8비트(alpha, 투명도)를 추가한 32비트 이미지 타입이다.
// 이를 RGBA라고 부른다.
private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;
// 배경 투명색
private static final Color TRANSPARENT = new Color(0, 0, 0, 0);
// 경로를 위한 STROKE
private static final int LINE_STROKE_WIDTH = 7;
private static final Stroke LINE_STROKE = new BasicStroke(LINE_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 위치 점을 위한 STROKE
private static final int POINT_STROKE_WIDTH = 20;
private static final Stroke POINT_STROKE = new BasicStroke(POINT_STROKE_WIDTH, CAP_ROUND, JOIN_ROUND);
// 안티앨리어싱 등 화질이 안좋은 이미지를 개선하기 위한 설정
private static final Map<Object, Object> renderingHints = Map.of(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON,
RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY,
RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

RouteImageDrawer 클래스에는 다음 세 개의 인터페이스가 존재한다.

  • drawLine: 선을 그린다.
  • drawPoint: 점을 찍는다.
  • dispose: 자원 할당을 해제한다.

dispose의 경우 내부에서 생성된 graphics2D에 대한 자원 할당을 해제하는 메서드인 graphics2D.dispose를 호출한다.

이미지 생성 Flow

1. 이미지 생성 준비

2. 선 그리기 요청

3. 위치 점 그리기 요청

4. 업로드 요청

전체 Flow

- - + + \ No newline at end of file diff --git a/tags/image/page/2.html b/tags/image/page/2.html index a57230359..14abf2cd1 100644 --- a/tags/image/page/2.html +++ b/tags/image/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"image" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 7분

개요

이전에 기술 구현 가능 여부를 조사하면서 파이썬을 사용한 내용을 정리한 내용이다.

사용 기술

언어: Python 3.10
+

"image" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 7분

개요

이전에 기술 구현 가능 여부를 조사하면서 파이썬을 사용한 내용을 정리한 내용이다.

사용 기술

언어: Python 3.10
이미지 생성: matplotlib
서비스: AWS Lambda, AWS API Gateway
이미지 저장 및 URL: AWS S3, AWS CloudFront

플로우는 다음과 같다.

요구사항

./route.png

우측 상단의 경로 이미지를 생성하려고 한다.
@@ -39,7 +39,7 @@ Python Lambda 함수에 대한 .zip 파일 아카이브 작업
No module named 'numpy.core._multiarray_umath'
사례별로 알아본 안전한 S3 사용 가이드

- - + + \ No newline at end of file diff --git a/tags/image/page/3.html b/tags/image/page/3.html index 66c16b4dc..a9d2ea602 100644 --- a/tags/image/page/3.html +++ b/tags/image/page/3.html @@ -13,18 +13,18 @@ - - + +
-

"image" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
+

"image" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

./route.png

이미지 생성의 책임

위 와이어 프레임에서 여행 히스토리여행에 대한 감상을 위한 경로 이미지의 경우, 맵 API에서 제공하는 도형 그리기 API(네이버 맵 API 기준 Polyline)를 사용할 수 없다.
따라서 이미지를 직접 생성하거나, 클라이언트에서 직접 위경도를 이용하여 그려야 한다.

해당 요구사항을 해결하기 위해서는 다음과 같은 기능을 가진 라이브러리가 필요하다.

  • 이미지 생성
  • 선과 점 표현
  • 투명한 배경색

현재 클라이언트의 바쁜 일정과 기능 구현에 있어 약간의 연산이 들어간다는 부분에서 백엔드에서 이미지를 생성하기로 결정을 내렸다.

고려한 기술

이미지 생성을 위해 다음과 같은 라이브러리 또는 기술들을 확인해 보았다.

  • Python의 Matplotlib
  • AWT(Abstract Window Toolkit) [최종 선택]
  • 이미지 처리 라이브러리 및 Java에서 내부적으로 Matplotlib 사용할 수 있는 라이브러리 (원하는 기능 없음)
  • Java Swing, Java FX (단순한 선 그리기 + 점 찍기라 불필요)

Python & Matplotlib

데이터 시각화 라이브러리
이미지 생성 및 로컬에 저장까지 걸리는 시간: 0.2초

  • 코드가 간단해서 유지 보수성이 좋다.
  • AWS Lambda 같은 서버리스 컴퓨팅 서비스나 FastAPI와 같은 웹 프레임워크로 추가적인 API를 구현해야 한다.
  • Spring Boot에서 추가적인 API 호출을 해야하고, 확장성과 비동기 처리 등 고려 해야 할 부분이 많다.

Java AWT 이외의 라이브러리

Python이 아닌 Java에서의 라이브러리도 고려를 해봤지만 요구사항에 적합하지 않거나, 적은 요구사항에 비해 무거운 라이브러리들이 많아서 제외했다.

라이브러리설명제외 이유
SwingAWT 이후에 나온 GUI 라이브러리, 네이티브 UI를 사용하지 않고 모든 운영체제 상에서 동일한 UI를 가지도록 함요구사항에 비해 무겁고 복잡도가 높음
JavaFXSwing 이후에 나온 GUI 라이브러리, 3차원 그래픽을 지원함요구사항에 비해 무겁고 복잡도가 높음
simple-java-plotAWT로 구현된 플로팅 라이브러리AWT 기반이긴 하지만 직접 AWT를 사용하는 것에 비해 메리트가 없음, 커스텀 설정 기능이 없음
matplotlib4jMatplotlib를 Java에서 사용할 수 있게 하는 라이브러리내부적으로 파이썬 사용하기에 무거움, 배경 투명화 기능 없음

Java & AWT(Abstract Window Toolkit)

그래픽과 이미지를 그리기 위한 도구
이미지 생성 및 로컬에 저장까지 걸리는 시간: 1.75초

  • 플로팅 라이브러리를 사용하는 것보다 구현의 난이도가 다소 존재한다.
  • 이미지 생성 시간이 다소 소요되기 때문에 빠른 응답 반환을 위해 비동기 처리를 고려할 수 있을 것 같다.
  • 추가적인 api 호출을 하지 않아도 된다.

기술 선택

AWT의 경우 Matplotlib에 비해 구현의 난이도가 다소 있고, 이미지 생성 시간이 더 많이 걸리는 단점이 있다.
하지만 추가적인 api 호출을 하지 않아도 되는 부분, Python을 사용하는 경우 추가적인 웹 프레임워크의 학습 비용을 고려하여 AWT를 사용하기로 결정했다.

유지 보수

AWT라는 생소한 기술을 사용하기 때문에 유지 보수성을 위해 팀원들과 공유하는 것이 중요하다고 생각했다.
따라서 다음과 같은 방법으로 공유하기로 했다.

  1. 코드 리뷰와 PR을 통해 작성한 AWT 코드에 대한 설명 및 리뷰 받는다.
  2. AWT를 사용한 부분을 문서화하여 공유한다.
- - + + \ No newline at end of file diff --git a/tags/inno-db.html b/tags/inno-db.html index c0c3631a7..ed86234db 100644 --- a/tags/inno-db.html +++ b/tags/inno-db.html @@ -13,12 +13,12 @@ - - + +
-

"InnoDB" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
+

"InnoDB" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
보통 명시적으로 잠금을 사용하는 경우는 드물고, 격리 수준에 따라 묵시적으로 잠금이 사용된다.

동시성 제어 방식에는 낙관적인 방식과 비관적인 방식이 있다.
InnoDB는 기본적으로 MVCC(다중 버전 동시성 제어)를 통해 낙관적인 방식을 사용하고 락을 통해 특정 상황에서 비관적인 방식을 사용한다.

낙관적 동시성 제어(OCC, Optimistic concurrency control)

트랜잭션이 서로 충돌하지 않는다고 가정하는 방식

비관적 동시성 제어(PCC, Pessimistic Concurrency Control)

트랜잭션이 충돌하는 가정하에 잠금을 거는 방식
일반적으로 Shared Lock, Exclusive Lock을 통해 이를 구현한다.

Shared & Exclusive Locks

InnoDB는 로우 단위의 잠금을 수행할 때 공유 잠금과 배타적 잠금을 사용한다.

공유 잠금(S, shared lock)

데이터 조회를 위한 락, 읽기 잠금(read lock)으로도 불린다.
@@ -38,7 +38,7 @@ MySQL Innodb Locks, cecil1018
MySQL 8.0 InnoDB Locks, MySQL
Locks Set by Different SQL Statements in InnoDB, MySQL

- - + + \ No newline at end of file diff --git a/tags/intelli-j.html b/tags/intelli-j.html index 3f3529a02..76dcee5ca 100644 --- a/tags/intelli-j.html +++ b/tags/intelli-j.html @@ -13,13 +13,13 @@ - - + +
-

"IntelliJ" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 1분

Import 자동 적용

Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly

auto-import

저장시 동작

Prefrences > Tools > Actions on Save

actions-on-save

Reformat Code: Code Reformmating

Optimize imports: 사용하지 않는 Import 제거

Rearrange: Code Style > Arrangement 설정 기반 코드 재정렬

메소드 추출, 변수 추출시 final 적용

Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier

final-modifier

- - +

"IntelliJ" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 1분

Import 자동 적용

Prefrences > Editor > General > Auto Import > Add unambiguous imports on the fly

auto-import

저장시 동작

Prefrences > Tools > Actions on Save

actions-on-save

Reformat Code: Code Reformmating

Optimize imports: 사용하지 않는 Import 제거

Rearrange: Code Style > Arrangement 설정 기반 코드 재정렬

메소드 추출, 변수 추출시 final 적용

Prefrences > Editor > Code Style > Java > Code Generation > Final Modifier

final-modifier

+ + \ No newline at end of file diff --git a/tags/isolation.html b/tags/isolation.html index f8e2ff510..e56a5cf12 100644 --- a/tags/isolation.html +++ b/tags/isolation.html @@ -13,12 +13,12 @@ - - + +
-

"Isolation" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
+

"Isolation" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
트랜잭션은 작업의 완전성과 데이터의 정합성을 보장해 준다.
논리적인 작업 셋을 완벽하게 처리하거나, 오류 시 작업의 일부만 적용되는 현상을 막아준다.

트랜잭션의 속성(ACID)

원자성(Atomicity): 트랜잭션 내에서 실행된 작업들은 모두 성공하거나, 실패해야 한다.
일관성(Consistency): 트랜잭션이 수행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
@@ -42,7 +42,7 @@ 예) A가 레코드를 여러 번 조회하던 중 B가 레코드를 변경하여 A가 조회한 값이 달라지는 경우

팬텀 리드(Phantom read, Phantom row)

한 트랜잭션 내에서 동일한 쿼리 수행시, 수행 결과가 다른 현상
예) A가 레코드를 조회하고 B가 레코드를 추가하여 A가 다시 조회할 때 존재하지 않은 레코드가 조회되는 경우

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
Isolation Level, MySQL

- - + + \ No newline at end of file diff --git a/tags/java.html b/tags/java.html index b2c27020c..b4217564f 100644 --- a/tags/java.html +++ b/tags/java.html @@ -13,12 +13,12 @@ - - + +
-

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
+

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
2.7 버전을 사용할 수도 있었지만 LTS 기간과 취약점 패치로 인한 버전업 등을 고려했을 때 3.1과 자바 17을 사용하는 것이 더 효율적이라고 판단했다.

자바 변경 사항

우아한테크코스 레벨 2까지는 자바 11을 사용했었다.
따라서 자바 11부터 자바 17까지의 변경사항을 정식 릴리즈 기준으로 정리해보려고 한다.

Switch Expressions(Java 14)

Java 14에서는 기존의 Switch 문을 간결하게 작성할 수 있는 Switch 식이 추가되었다.

enum RESULT {
WIN, LOSE, DRAW
}

RESULT result = RESULT.WIN;

int prize = switch (result) {
case WIN -> 10_000_000;
case LOSE, DRAW -> 5_000_000;
default -> 0;
};

주요 특징은 다음과 같다.

  • -> 연산자를 이용하여 각 case에 대한 결과를 바로 반환할 수 있다.
  • case를 콤마(,)로 연결하여 하나의 case에 여러 값을 지정할 수 있다.
  • break 문이 필요 없다.
  • default 블록을 통해 기본 값을 지정할 수 있다.

Text Block(Java 15)

Java 15에는 새로운 문자열 표현방식이 추가되었다.
긴 문자열을 + 연산자의 도움 없이 가독성있게 작성할 수 있다.

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("""
SELECT p FROM Post p
WHERE p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
""")
List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);
}

NPE 메시지(Java 15)

String name = null;
name.chars();

/**
# before
java.lang.NullPointerException
at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)

# after
Cannot invoke "String.chars()" because "name" is null
java.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null
*/

Record(Java 16)

Lombok의 @Data, kotlin의 data 클래스와 유사한 기능을 제공한다.
@@ -34,7 +34,7 @@ What's New in Spring Framework 6.x
Spring Boot 3.0 Release Notes
Spring Boot 3.1 Release Notes

- - + + \ No newline at end of file diff --git a/tags/java/page/2.html b/tags/java/page/2.html index 1664a4d7f..062ed1bf6 100644 --- a/tags/java/page/2.html +++ b/tags/java/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
+

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

클래스 파일

자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
컴파일된 클래스파일은 어떤 구조로 되어있을까?

클래스 파일의 데이터 형식

8비트 바이트의 스트림으로 구성된다.
16비트 및 32비트의 데이터는 각각 2개, 4개의 연속된 8비트를 읽어서 구성된다.
멀티바이트의 경우 항상 big endian 순서로 저장된다.

u1 → unsigned 1byte
@@ -36,7 +36,7 @@ Class file in Java, File Format
java se11 Class 파일 형식, Oracle
java se17 Class 파일 형식, Oracle

- - + + \ No newline at end of file diff --git a/tags/java/page/3.html b/tags/java/page/3.html index b52bd18d8..771abc1aa 100644 --- a/tags/java/page/3.html +++ b/tags/java/page/3.html @@ -13,12 +13,12 @@ - - + +
-

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
+

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
이 때 JDBC를 사용할 때 데이터베이스의 커넥션을 얻고, try-with-resource를 사용하는 부분이 반복되었다.
템플릿 콜백 패턴을 이용하여 나만의 JdbcTemplate을 만들어보았다.

기존 코드

public class User {
private final int id;
private final String name;

public User(final int id, final String name) {
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

public String getName() {
return name;
}
}

SELECT, DELETE 중복 제거

변하지 않는 부분: try-with-resource, preparedStatement를 사용하는 부분, executeUpdate로 실행 등등
변하는 부분: SQL Query, 매개변수

다음과 같이 쿼리를 실행하는 부분을 분리하고 가변인수를 사용한다면 SELECT와 DELETE의 중복을 제거할 수 있다.

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
executeUpdate(query, userId);
}

private void executeUpdate(final String query, final Object... parameters) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
preparedStatement.executeUpdate();
} catch (final SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

조회 분리하기 - 1. 콜백을 위한 인터페이스 정의

조회는 INSERT, DELETE와 달리 값을 반환받아야 하기 때문에 다른 방법을 사용해야 한다.
@@ -30,7 +30,7 @@ 아래와 같이 제네릭을 적용하여 다른 Dao에서도 사용 가능하도록 변경할 수 있다.

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(final ResultSet resultSet) throws SQLException;
}

private <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}
private <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}

메서드 분리한 부분 클래스로 분리하기 + Optional 사용하기

메서드로 분리한 부분을 JdbcTemplate이라는 클래스를 만들어 옮긴다.
또한 null을 반환하기 보단 Optional로 감싸서 반환하도록 변경한다.
최종적으로 아래와 같은 코드가 완성된다.

public class UserDao {
private final RowMapper<User> rowMapper = resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
};
private final JdbcTemplate jdbcTemplate;

public UserDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
jdbcTemplate.executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
jdbcTemplate.executeUpdate(query, userId);
}

public Optional<User> findById(final int userId) {
final String query = "SELECT * FROM user WHERE id = ?";
return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);
}

public List<User> findAll() {
final String query = "SELECT * FROM user";
return jdbcTemplate.query(query, rowMapper);
}
}
- - + + \ No newline at end of file diff --git a/tags/java/page/4.html b/tags/java/page/4.html index 8b78da3d9..170c6f775 100644 --- a/tags/java/page/4.html +++ b/tags/java/page/4.html @@ -13,12 +13,12 @@ - - + +
-

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
+

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
이 때 @ParameterizedTest를 사용하면 단일 테스트를 매개변수를 사용하여 여러 번 반복할 수 있다.

Argument Sources

@ParameterizedTest를 사용하려면 최소 하나 이상의 Source 애노테이션이 필요하다.
JUnit이 제공하는 다양한 Source가 있기 때문에, 테스트에 맞춰 다양하게 사용할 수 있다.

Value Source

값을 이용하여 제공하는 형태로, 다음과 같은 타입의 값을 매개변수로 제공할 수 있다.

  • short, int, long, float, double
  • byte, char, boolean, String, Class
@ParameterizedTest
@ValueSource(ints = {1, 100, Integer.MAX_VALUE})
void valueTest(final int value) {
Assertions.assertThat(value).isPositive();
}

Null & Empty Source

null 값, 빈 값을 제공한다.
Empty Source의 경우 다음과 같은 타입에 한해 매개변수로 제공할 수 있다.

  • String
  • java.util.List, java.util.Set, java.util.Map
  • primitive arrays — ex) int[]
  • object arrays — ex) String[]
@ParameterizedTest
@NullAndEmptySource
void nullAndEmptyTest(final String value) {
Assertions.assertThat(value).isNullOrEmpty();
}

Enum Source

EnumSource를 이용하여 Enum 또한 매개변수로 제공할 수 있다.

enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

@ParameterizedTest
@EnumSource(Day.class)
void enumTest(final Day day) {
assertThat(day).isInstanceOf(Day.class);
}

다음과 같이 mode 값을 이용하여 특징 Enum을 제외하거나, 포함시킬 수 있다. (default: Mode.Include)

@ParameterizedTest
@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)
void enumTest(final Day day) {
// MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
assertThat(day).isInstanceOf(Day.class);
}

CSV Source

csv 형식의 값을 이용하여 매개변수를 제공한다.
@@ -26,7 +26,7 @@ 개인적으로 2개 정도의 값을 매개변수로 전달하는 경우 CsvSource를 사용한다.

@ParameterizedTest
@CsvSource({"1,1", "2,4", "3,9", "4,16"})
void csvTest(final int number, final int result) {
assertThat(number * number).isEqualTo(result);
}

Method Source

복잡한 타입의 값을 전달할 때 사용한다.
메서드명을 입력하여 매개변수를 제공하는 메서드를 지정할 수 있다.
메서드명을 따로 입력하지 않으면 테스트명과 동일한 static 메서드가 지정된다.

@ParameterizedTest
@MethodSource
void methodTest(final List<Integer> numbers, final int count) {
assertThat(numbers).hasSize(count);
}

private static Stream<Arguments> methodTest() {
return Stream.of(
Arguments.of(List.of(1), 1),
Arguments.of(List.of(1, 2), 2),
Arguments.of(List.of(1, 2, 3), 3)
);
}

ETC.

위에서 언급한 방법 이외에도 다양한 방법으로 매개변수를 제공할 수 있다.

  • CSV 파일을 이용한 CsvFileSource
  • ArgumentsProvider 구현한 클래스를 이용하는 ArgumentsSource

참고 자료

- - + + \ No newline at end of file diff --git a/tags/java/page/5.html b/tags/java/page/5.html index 99db0a42f..52e41989e 100644 --- a/tags/java/page/5.html +++ b/tags/java/page/5.html @@ -13,19 +13,19 @@ - - + +
-

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
+

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
ISO-8601을 기반으로 작성
설계 목표 → 불변, Fluent API, 명확하고 명시적, 확장 가능성

ISO-8601

날짜와 시간에 관련된 데이터를 다루는 국제 표준

LocalDate, LocalTime, LocalDateTime

날짜와 시간을 표현하는 클래스

Instant

유닉스 시간(1970-01-01, 00:00:00 UTC) 기준으로 특정 지점까지의 시간을 초로 표현하는 클래스
기계의 관점에서 시간 표현

Duration, Period

간격을 표현하는 클래스

TemporalAdjusters

복잡한 날짜 조정이 필요할 때 사용
필요한 경우 다음 인터페이스를 구현하여 커스텀 TemporalAdjuster를 구현 가능

@FunctionalInterface
public interface TemporalAdjuster {
Temporal adjustInto(Temporal temporal);
}

DateTimeFormatter

날짜와 시간 포맷 클래스
특정 날짜 패턴이나, DateTimeFormatterBuilder를 이용해서 커스텀한 포맷을 생성 가능

ZoneId, ZoneOffset

ZoneId는 지역 ID는 ‘지역/도시’ 형식, ZoneOffset은 시차 UTC 기준 고정된 시간 차이 이용
ZoneId의 경우 IANA Time Zone Database에서 제공하는 지역 집합 정보 사용

Instant instant = Instant.now();
LocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

참고 자료

- - + + \ No newline at end of file diff --git a/tags/jdbc.html b/tags/jdbc.html index 89ad5275c..d30e33ccd 100644 --- a/tags/jdbc.html +++ b/tags/jdbc.html @@ -13,12 +13,12 @@ - - + +
-

"JDBC" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
+

"JDBC" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

체스 미션에서는 데이터베이스에서 값을 가져오기 위해 DAO를 사용했다.
이 때 JDBC를 사용할 때 데이터베이스의 커넥션을 얻고, try-with-resource를 사용하는 부분이 반복되었다.
템플릿 콜백 패턴을 이용하여 나만의 JdbcTemplate을 만들어보았다.

기존 코드

public class User {
private final int id;
private final String name;

public User(final int id, final String name) {
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

public String getName() {
return name;
}
}

SELECT, DELETE 중복 제거

변하지 않는 부분: try-with-resource, preparedStatement를 사용하는 부분, executeUpdate로 실행 등등
변하는 부분: SQL Query, 매개변수

다음과 같이 쿼리를 실행하는 부분을 분리하고 가변인수를 사용한다면 SELECT와 DELETE의 중복을 제거할 수 있다.

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
executeUpdate(query, userId);
}

private void executeUpdate(final String query, final Object... parameters) {
final Connection connection = connectionPool.getConnection();
try (final PreparedStatement preparedStatement = connection.prepareStatement(query)) {
for (int i = 1; i <= parameters.length; i++) {
preparedStatement.setObject(i, parameters[i - 1]);
}
preparedStatement.executeUpdate();
} catch (final SQLException e) {
throw new IllegalArgumentException(e.getMessage());
}
}

조회 분리하기 - 1. 콜백을 위한 인터페이스 정의

조회는 INSERT, DELETE와 달리 값을 반환받아야 하기 때문에 다른 방법을 사용해야 한다.
@@ -30,7 +30,7 @@ 아래와 같이 제네릭을 적용하여 다른 Dao에서도 사용 가능하도록 변경할 수 있다.

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(final ResultSet resultSet) throws SQLException;
}

private <T> List<T> query(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}
private <T> T queryForSingleResult(final String query, final RowMapper<T> rowMapper, final Object... parameters) {...}

메서드 분리한 부분 클래스로 분리하기 + Optional 사용하기

메서드로 분리한 부분을 JdbcTemplate이라는 클래스를 만들어 옮긴다.
또한 null을 반환하기 보단 Optional로 감싸서 반환하도록 변경한다.
최종적으로 아래와 같은 코드가 완성된다.

public class UserDao {
private final RowMapper<User> rowMapper = resultSet -> {
final int id = resultSet.getInt("id");
final String name = resultSet.getString("name");
return new User(id, name);
};
private final JdbcTemplate jdbcTemplate;

public UserDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public void insert(final String name) {
final String query = "INSERT INTO User (name) VALUES (?)";
jdbcTemplate.executeUpdate(query, name);
}

public void delete(final int userId) {
final String query = "DELETE FROM user WHERE user_id = ?";
jdbcTemplate.executeUpdate(query, userId);
}

public Optional<User> findById(final int userId) {
final String query = "SELECT * FROM user WHERE id = ?";
return jdbcTemplate.queryForSingleResult(query, rowMapper, userId);
}

public List<User> findAll() {
final String query = "SELECT * FROM user";
return jdbcTemplate.query(query, rowMapper);
}
}
- - + + \ No newline at end of file diff --git a/tags/jenkins.html b/tags/jenkins.html index d64b5a90b..02c9cbfb6 100644 --- a/tags/jenkins.html +++ b/tags/jenkins.html @@ -13,12 +13,12 @@ - - + +
-

"Jenkins" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

설정 환경

소프트웨어 이미지: Amazon Linux 2023 AMI
+

"Jenkins" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기
- - + + \ No newline at end of file diff --git a/tags/kotlin.html b/tags/kotlin.html index eb6cb653a..c3cf2b35e 100644 --- a/tags/kotlin.html +++ b/tags/kotlin.html @@ -13,12 +13,12 @@ - - + +
-

"Kotlin" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

nullable 타입

코틀린은 NullPointerException 예외를 최대한 발생시키지 않기 위해 타입 시스템이 설계되어 있다.
+

"Kotlin" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

nullable 타입

코틀린은 NullPointerException 예외를 최대한 발생시키지 않기 위해 타입 시스템이 설계되어 있다.
이는 실행 시점이 아닌 컴파일 시 미리 오류가 발생할 가능성이 있는 부분을 미리 감지하여 NPE 발생의 가능성을 줄여준다.

코틀린의 경우 nullable 타입을 다음과 같이 표현한다.

val number: Int?

타입 뒤에 ?를 붙여 해당 값이 null이 될 수 있다는 것을 의미한다.
만약 ?를 붙이지 않을 때 null을 받는 경우 컴파일 시 오류가 발생한다.

?. Safe Calls 연산자

자바에서 NPE를 발생시키지 않기 위해 null을 처리하는 가장 간단한 방법으로는 분기를 사용하는 방법이 있다.

코틀린은 안전한 호출 연산자인 ?. 연산자를 지원한다.
따라서 참조 값이 null이 아닐 경우에만 메서드 호출을 할 수 있다.
@@ -30,7 +30,7 @@ 사용하기 쉽지만, 리스크가 크고 혹시나 해당 값이 추후에는 null이 될 수 있기 때문에 지양해야 된다고 생각한다.

val length: Int = word!!.length

as? 안전한 캐스팅

타입 변환을 할 때 지정한 타입으로 변경할 수 없다면 ClassCastException이 발생한다.
코틀린에서는 as 뒤에 ?를 붙여 안전하게 타입 변환을 할 수 있다.
따라서 미리 변환 가능한 타입인지 확인하지 않고, 안전하게 타입을 변환 할 수 있다.

타입 변환이 불가능 할 경우 예외를 발생시키지 않고 null을 반환한다.

val value: Int? = something as? Int

List에서의 null 처리

List에는 null이 아닌 값만 반환하는 filterNotNull 유틸리티 메서드를 제공한다.

val foodsWithNull: List<String?> = listOf("Pizza", "Cheese", null, "Potato")
val foods = foodsWithNull.filterNotNull()

참고 자료

- - + + \ No newline at end of file diff --git a/tags/lock.html b/tags/lock.html index e37e9deb6..99c636a91 100644 --- a/tags/lock.html +++ b/tags/lock.html @@ -13,12 +13,12 @@ - - + +
-

"Lock" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
+

"Lock" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

InnoDB 스토리지 엔진의 잠금

MySQL에서 제공하는 잠금과 별개로 스토리지 엔진 내부에서 로우 단위의 잠금을 지원한다.
보통 명시적으로 잠금을 사용하는 경우는 드물고, 격리 수준에 따라 묵시적으로 잠금이 사용된다.

동시성 제어 방식에는 낙관적인 방식과 비관적인 방식이 있다.
InnoDB는 기본적으로 MVCC(다중 버전 동시성 제어)를 통해 낙관적인 방식을 사용하고 락을 통해 특정 상황에서 비관적인 방식을 사용한다.

낙관적 동시성 제어(OCC, Optimistic concurrency control)

트랜잭션이 서로 충돌하지 않는다고 가정하는 방식

비관적 동시성 제어(PCC, Pessimistic Concurrency Control)

트랜잭션이 충돌하는 가정하에 잠금을 거는 방식
일반적으로 Shared Lock, Exclusive Lock을 통해 이를 구현한다.

Shared & Exclusive Locks

InnoDB는 로우 단위의 잠금을 수행할 때 공유 잠금과 배타적 잠금을 사용한다.

공유 잠금(S, shared lock)

데이터 조회를 위한 락, 읽기 잠금(read lock)으로도 불린다.
@@ -38,7 +38,7 @@ MySQL Innodb Locks, cecil1018
MySQL 8.0 InnoDB Locks, MySQL
Locks Set by Different SQL Statements in InnoDB, MySQL

- - + + \ No newline at end of file diff --git a/tags/lock/page/2.html b/tags/lock/page/2.html index b4b426cab..e1cfe21e1 100644 --- a/tags/lock/page/2.html +++ b/tags/lock/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"Lock" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
+

"Lock" 태그로 연결된 2개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다.

글로벌 락(Global lock)

MySQL에서 제공하는 잠금 중 가장 넓은 범위를 가지고 있는 잠금이다.

  • 영향을 미치는 범위는 해당 서버 전체이다.
  • 작업 대상 테이블, 데이터베이스 상관 없이 동일하게 영향을 받는다.

한 세션에서 글로벌 락을 획득하면 해제 될 때 까지 조회를 제외한 대부분의 명령이 대기 상태가 된다.
데이터베이스에 존재하는 MyISAM이나 MEMORY 테이블에 대해 일관된 백업을 받아야할 때 사용한다.
InnoDB 스토리지 엔진에서는 백업 시 조금 더 가벼운 백업 락을 사용할 수 있다.

-- GLOBAL LOCK
FLUSH TABLES WITH READ LOCK;
-- UNLOCK
UNLOCK TABLES;

-- BACKUP LOCK
LOCK INSTANCE FOR BACKUP;
-- UNLOCK
UNLOCK INSTANCE;
- - + + \ No newline at end of file diff --git a/tags/log.html b/tags/log.html new file mode 100644 index 000000000..0da4abe06 --- /dev/null +++ b/tags/log.html @@ -0,0 +1,44 @@ + + + + + +"log" 태그로 연결된 1개 게시물개의 게시물이 있습니다. | GG + + + + + + + + + + + + + +
+

"log" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

CloudWatch

AWS 리소스와 애플리케이션의 지표와 로그에 대한 모니터링을 제공하는 서비스다.
+지표를 감시하여 알림을 보내는 기능도 제공한다.
+프리티어를 사용하지 않는 경우 대시보드당 3$/M 의 비용이 청구되고, 지표나 로그의 양에 따라 비용이 추가적으로 청구된다.
+요금 정보에 대한 자세한 정보는 다음 링크에서 확인할 수 있다.

CloudWatch Metrics

기본적으로 5분마다 지표에 대한 정보가 수집된다.
+세부 모니터링(Detailed Monitoring)을 활성화하면 1분마다 지표를 수집한다.
+대시보드에서 InstanceId로 검색하여 수집된 지표를 확인할 수 있다.

./cloudwatch1.png

CPUUtilization, NetworkIn, NetworkOut과 같은 기본적인 지표를 제공하고, 메모리, 디스크 공간과 같은 지표를 확인하려면 사용자 지정 지표를 설정해야 한다.

CloudWatch Agent 설치

CloudWatch Agent 사용자 지정 지표와 로그를 수집할 수 있다.

IAM 역할 설정

기본적으로 EC2 인스턴스가 CloudWatchAgentServerPolicy에 대한 권한이 있어야 한다.
+IAM → 역할에서 역할 생성을 클릭한다.

./cloudwatch2.png

CloudWatchAgentServerPolicy 권한 정책을 선택하고, 적당한 역할 이름을 입력해서 역할을 생성한다.

./cloudwatch3.png

EC2 인스턴스 목록으로 들어가서, CloudWatch Agent를 설치할 EC2 인스턴스를 클릭한다.
+작업 → 보안 → IAM 역할 수정에서 이전에 생성한 역할을 지정한다.

./cloudwatch4.png

설치

환경은 다음과 같다.

OS: ubuntu 22.04
+인스턴스 유형: t4g.small (ARM64)

아래 명령어를 입력하여 설치한다.

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

사용 설명서에 각 인스턴스 유형마다 다운로드 링크가 자세하게 안내되어 있다.

Wizard

CloudWatch Wizard를 사용하면 간단하게 설정 파일 생성할 수 있다.
+로그를 수집하도록 설정하는 경우 Wizard 실행 명령어 입력 전 log 파일의 절대 경로를 복사해두는 것이 좋다.
+아래의 명령어를 입력하여 Wizard를 실행할 수 있다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

설정을 진행하다 보면 설정 파일이 어떻게 구성될지 확인할 수 있다.
+로그를 추가할 것이냐고 물어보는 입력창이 나오면 준비해뒀던 로그 파일의 절대 경로를 입력한다.

./cloudwatch5.png

중간에 SSM parameter store에 설정 파일을 저장할 것이냐고 물어보는 창이 나온다.

Do you want to store the config in the SSM parameter store?
1. yes
2. no

추가적으로 설정하지 않는 경우 2번을 선택한다.
+Parameter Store 관리에 대한 내용은 다음의 문서를 참고하면 좋을 거 같다.
+설정이 완료되면 /opt/aws/amazon-cloudwatch-agent/bin/config.json 에 설정에 대한 내용이 저장된다.

설정 파일 적용

아래의 명령어를 입력하여 설정파일을 적용할 수 있다.
+file 뒤에는 설정 파일에 대한 절대경로(아래 명령어 기준 기본 생성 위치)를 입력하면 된다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

types.db: no such file or directory 에러

다음과 같은 에러가 발생한다면 types.db 파일을 생성해서 문제를 해결할 수 있다.

Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory

types.db 파일 생성

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

지표 확인

CloudWatch Metrics에 가보면 CWAgent라는 사용자 지정 네임스페이스가 추가된 것을 볼 수 있다.
+설정 파일에 네임스페이스를 추가하는 방법도 있다.

./cloudwatch6.png

로그

CloudWatch → 로그 그룹으로 가면 Wizard로 추가한 로그를 확인할 수 있다.

./cloudwatch7.png

참고 자료

CloudWatch란 무엇입니까?
+Amazon CloudWatch 요금
+Linux 인스턴스 지표
+서버에 CloudWatch 에이전트 설치 및 실행
+CloudWatch Agent를 Parameter Store에서 관리해 보기

+ + + + \ No newline at end of file diff --git a/tags/mock.html b/tags/mock.html index 58b6c6f85..1f790312c 100644 --- a/tags/mock.html +++ b/tags/mock.html @@ -13,12 +13,12 @@ - - + +
-

"Mock" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
+

"Mock" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
Gerard Meszaros의 xUnit Test Patterns라는 책에서는 테스트 대역을 다섯 가지(더미, 스텁, 스파이, 목, 페이크)로 구분한다.

테스트 대역의 기본 메커니즘은 다형성을 이용하는 방법이다.
외부 서비스를 사용하는 코드를 테스트 하는 경우, 인터페이스를 정의하고 외부 서비스 대신 테스트 용도의 구현체를 생성하는 것이다.

테스트 대역의 타입 계층 구조

더미(Dummy)

가장 단순하고, 원시적인 유형의 테스트 대역이다.
기본적으로 아무 일도 하지 않는 구현체로 인스턴스화가 필요한 경우 사용한다.
@@ -36,7 +36,7 @@ 테스트 더블, Martin Fowler
테스트 관련 용어 정리, Johngrib
Test Double, Gerard Meszaros

- - + + \ No newline at end of file diff --git a/tags/mockito.html b/tags/mockito.html index 9db8ce985..12c452943 100644 --- a/tags/mockito.html +++ b/tags/mockito.html @@ -13,12 +13,12 @@ - - + +
-

"Mockito" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
+

"Mockito" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
하지만 특수한 경우에는 정적 메서드를 모킹하는 것이 필요할 수 있다고 생각한다.

예를 들어 레거시 코드를 테스트 한다던지, IO 관련한 부분을 테스트 할 때 정말 필요한 부분에만 적용할 수 있을 것이다.

프로젝트를 진행하며 ImageIo.write 메서드가 호출되는 지 검증이 필요했다.
해당 static 메서드를 호출하는 부분을 따로 RouteImageUploader 클래스로 최대한 분리했다.
이미지 저장 기능 자체가 외부로 나가는 상호작용이고, 호출 횟수를 검사하는데는 mock을 사용하는게 적절하다고 판단했다.

public void upload(BufferedImage bufferedImage) {
File file = new File(파일경로);
try {
ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);
} catch (IOException e) {
throw new DrawException(IMAGE_SAVE_FAIL);
}
}

Mocking static methods

Mockito 3.4.0 이후에는 static method를 모킹할 수 있는 Mockito.mockStatic 메서드를 지원한다.
@@ -27,7 +27,7 @@ 항상 상황을 고려하고 간결함을 포기할 만큼 중요한 부분인지 적절한 트레이드오프를 고려하자.

참고 자료

Mocking static methods
Mockito mock static methods
Enable mocking static methods in Mockito

- - + + \ No newline at end of file diff --git a/tags/monitoring.html b/tags/monitoring.html new file mode 100644 index 000000000..c59218493 --- /dev/null +++ b/tags/monitoring.html @@ -0,0 +1,44 @@ + + + + + +"monitoring" 태그로 연결된 1개 게시물개의 게시물이 있습니다. | GG + + + + + + + + + + + + + +
+

"monitoring" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

CloudWatch

AWS 리소스와 애플리케이션의 지표와 로그에 대한 모니터링을 제공하는 서비스다.
+지표를 감시하여 알림을 보내는 기능도 제공한다.
+프리티어를 사용하지 않는 경우 대시보드당 3$/M 의 비용이 청구되고, 지표나 로그의 양에 따라 비용이 추가적으로 청구된다.
+요금 정보에 대한 자세한 정보는 다음 링크에서 확인할 수 있다.

CloudWatch Metrics

기본적으로 5분마다 지표에 대한 정보가 수집된다.
+세부 모니터링(Detailed Monitoring)을 활성화하면 1분마다 지표를 수집한다.
+대시보드에서 InstanceId로 검색하여 수집된 지표를 확인할 수 있다.

./cloudwatch1.png

CPUUtilization, NetworkIn, NetworkOut과 같은 기본적인 지표를 제공하고, 메모리, 디스크 공간과 같은 지표를 확인하려면 사용자 지정 지표를 설정해야 한다.

CloudWatch Agent 설치

CloudWatch Agent 사용자 지정 지표와 로그를 수집할 수 있다.

IAM 역할 설정

기본적으로 EC2 인스턴스가 CloudWatchAgentServerPolicy에 대한 권한이 있어야 한다.
+IAM → 역할에서 역할 생성을 클릭한다.

./cloudwatch2.png

CloudWatchAgentServerPolicy 권한 정책을 선택하고, 적당한 역할 이름을 입력해서 역할을 생성한다.

./cloudwatch3.png

EC2 인스턴스 목록으로 들어가서, CloudWatch Agent를 설치할 EC2 인스턴스를 클릭한다.
+작업 → 보안 → IAM 역할 수정에서 이전에 생성한 역할을 지정한다.

./cloudwatch4.png

설치

환경은 다음과 같다.

OS: ubuntu 22.04
+인스턴스 유형: t4g.small (ARM64)

아래 명령어를 입력하여 설치한다.

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

사용 설명서에 각 인스턴스 유형마다 다운로드 링크가 자세하게 안내되어 있다.

Wizard

CloudWatch Wizard를 사용하면 간단하게 설정 파일 생성할 수 있다.
+로그를 수집하도록 설정하는 경우 Wizard 실행 명령어 입력 전 log 파일의 절대 경로를 복사해두는 것이 좋다.
+아래의 명령어를 입력하여 Wizard를 실행할 수 있다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

설정을 진행하다 보면 설정 파일이 어떻게 구성될지 확인할 수 있다.
+로그를 추가할 것이냐고 물어보는 입력창이 나오면 준비해뒀던 로그 파일의 절대 경로를 입력한다.

./cloudwatch5.png

중간에 SSM parameter store에 설정 파일을 저장할 것이냐고 물어보는 창이 나온다.

Do you want to store the config in the SSM parameter store?
1. yes
2. no

추가적으로 설정하지 않는 경우 2번을 선택한다.
+Parameter Store 관리에 대한 내용은 다음의 문서를 참고하면 좋을 거 같다.
+설정이 완료되면 /opt/aws/amazon-cloudwatch-agent/bin/config.json 에 설정에 대한 내용이 저장된다.

설정 파일 적용

아래의 명령어를 입력하여 설정파일을 적용할 수 있다.
+file 뒤에는 설정 파일에 대한 절대경로(아래 명령어 기준 기본 생성 위치)를 입력하면 된다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

types.db: no such file or directory 에러

다음과 같은 에러가 발생한다면 types.db 파일을 생성해서 문제를 해결할 수 있다.

Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory

types.db 파일 생성

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

지표 확인

CloudWatch Metrics에 가보면 CWAgent라는 사용자 지정 네임스페이스가 추가된 것을 볼 수 있다.
+설정 파일에 네임스페이스를 추가하는 방법도 있다.

./cloudwatch6.png

로그

CloudWatch → 로그 그룹으로 가면 Wizard로 추가한 로그를 확인할 수 있다.

./cloudwatch7.png

참고 자료

CloudWatch란 무엇입니까?
+Amazon CloudWatch 요금
+Linux 인스턴스 지표
+서버에 CloudWatch 에이전트 설치 및 실행
+CloudWatch Agent를 Parameter Store에서 관리해 보기

+ + + + \ No newline at end of file diff --git a/tags/my-sql.html b/tags/my-sql.html index 116429cd4..b2c46fad5 100644 --- a/tags/my-sql.html +++ b/tags/my-sql.html @@ -13,12 +13,12 @@ - - + +
-

"MySQL" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
+

"MySQL" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

MySQL 엔진의 잠금

MySQL에서의 락은 스토리지 엔진 레벨과, MySQL 엔진 레벨로 나눌 수 있다.
MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다.

글로벌 락(Global lock)

MySQL에서 제공하는 잠금 중 가장 넓은 범위를 가지고 있는 잠금이다.

  • 영향을 미치는 범위는 해당 서버 전체이다.
  • 작업 대상 테이블, 데이터베이스 상관 없이 동일하게 영향을 받는다.

한 세션에서 글로벌 락을 획득하면 해제 될 때 까지 조회를 제외한 대부분의 명령이 대기 상태가 된다.
데이터베이스에 존재하는 MyISAM이나 MEMORY 테이블에 대해 일관된 백업을 받아야할 때 사용한다.
InnoDB 스토리지 엔진에서는 백업 시 조금 더 가벼운 백업 락을 사용할 수 있다.

-- GLOBAL LOCK
FLUSH TABLES WITH READ LOCK;
-- UNLOCK
UNLOCK TABLES;

-- BACKUP LOCK
LOCK INSTANCE FOR BACKUP;
-- UNLOCK
UNLOCK INSTANCE;
- - + + \ No newline at end of file diff --git a/tags/oop.html b/tags/oop.html index 9842cd55b..683b523f7 100644 --- a/tags/oop.html +++ b/tags/oop.html @@ -13,15 +13,15 @@ - - + +
-

"OOP" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) +

"OOP" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 9분

GRASP(General Responsibility Assignment Software Pattern)

크레이그 라만의 Applying UML and Patterns이라는 책에서 나온 책임 할당을 위한 패턴

각 패턴마다 Solution과 Problem로 구성되어 있다.

정보 전문가 패턴(Information Expert)

Q: 객체에 책임을 할당하는 기본 원칙은 무엇인가?

A: 책임을 수행하는 데 필요한 정보를 가진 클래스(정보 전문가)에게 책임을 할당한다.

정보와 행동을 가까운 곳에 위치시키기 때문에 캡슐화를 유지할 수 있다.

필요한 정보를 가진 객체들로 책임이 분산된다.

창조자 패턴(Creator)

Q: 누가 객체 A를 생성하는가?

A: 다음의 조건을 최대한 많이 만족하는 객체에게 객체 생성 책임을 할당해야 한다.

  • B가 A 객체를 포함 또는 참조한다.
  • B가 A 객체를 기록한다.
  • B가 A 객체를 긴밀하게 사용한다.
  • B가 A 객체의 초기값을 가지고 있다.

생성 예정인 객체와 연관되어 있는 객체가 생성 책임을 가지고 있게 된다면, 이미 해당 객체와 결합되어있다고 생각할 수 있다. 따라서 전체적인 결합도를 낮게 유지할 수 있다.

낮은 결합도 패턴(Low Coupling)

Q: 의존성을 낮추고 변화의 영향을 줄이며 재사용성을 증가시키는 방법은?

A: 전체적인 결합이 낮게 유지되도록 책임을 할당해야 한다.

결합도(Coupling) 객체 사이의 의존성이 과한 경우 결합도가 높다고 말한다.

  • 오브젝트 p.17

결합도를 낮춘다면 다음과 같은 이점이 있다.

  • 다른 구성 요소의 변화에 영향을 받지 않는다.
  • 재사용이 편리해진다.
  • 해당 클래스에 대한 이해가 쉬워진다. (의존하는 클래스가 적기 때문에)

높은 응집도 패턴(High Cohesion)

Q. 객체를 관리하기 쉽게 하려면 어떻게 해야 할까?

A. 높은 응집도를 유지할 수 있게 책임을 할당해야 한다.

응집도(Cohesion) 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도가 높다고 말한다.

  • 오브젝트 p.26

변경의 이유에 따라 클래스를 분리한다면 응집도를 높일 수 있고, 응집도가 높아진다면 다음과 같은 이점이 있다.

  • 해당 클래스에 대한 이해가 쉬워진다. (할당된 책임만을 수행하고 있기 때문에)
  • 유지보수가 쉬워진다.
  • 낮은 결합도 또한 지원한다.
  • 응집도가 높은 클래스는 특정한 목적에 사용할 수 있기 때문에 재사용하기 좋다.

컨트롤러 패턴(Controller)

Q. 사용자의 요청을 처리하는 것은 누가 담당해야 하는가?

A. 사용자의 요청을 처리하는 Controller 객체를 만들어서 사용해야 한다.

어떤 서브시스템이 존재한다고 가정할 때

  • 직접적으로 객체에 접근하여 프로그램을 사용한다면 결합도가 상승한다.
  • 서브 시스템에 들어오는 요청을 처리해주는 컨트롤러가 있다면 사용하는 입장에서는 해당 컨트롤러만 알면 된다.
  • 만약 서브 시스템의 변경이 생겼을 때 외부에 미치는 영향도 줄어든다.

다형성 패턴(Polymorphism)

Q. 객체의 타입에 따라 행동이 바뀐다면 책임을 어떻게 할당해야 할까?

A. OOP가 지원하는 다형성을 적극적으로 활용한다. (인터페이스를 두고 행동에 대한 부분을 구현)

객체의 종류에 따라 분기하는 조건문이 아닌 다형성을 사용하는 것이 좋은 방법이다.

새로운 타입이 추가되었을 때 조건문을 사용한다면 기존의 조건문을 수정해야 하지만 다형성을 활용하면 쉽게 확장할 수 있다.

변경 보호 패턴(Protected Variations)

Q. 어떻게 하면 변경이 다른 요소에 영향을 미치지 않도록 방지할 수 있을까?

A. 변화가 예상되는 지점을 식별하고, 주위에 안정된 인터페이스를 형성하도록 책임을 할당해야 한다.

간접 참조 패턴(Indirection)

Q. 두 객체 사이의 직접적인 연결을 피하고 싶다면 어떻게 해야 할까?

A. 두 객체 사이에 또 다른 객체를 두어 직접적인 연결을 피할 수 있다.

중재자 패턴을 사용하여 두 객체 사이에 또 하나의 객체를 추가하여 복잡한 관계를 단순화할 수 있다.

중간에 인터페이스를 둔다면 변경 보호 패턴(Protected Variations)에 해당된다.

순수한 가공물 패턴(Pure Fabrication)

Q. 책임을 할당한 도메인 객체가 Low Coupling, High Cohesion, 재사용성 등의 목적을 위반한다면 어떻게 해야 할까?

A. 도메인 개념을 포함하지 않는 클래스를 하나 만들고 매우 응집된 책임을 할당할 수 있다.

행동을 추가할 때, 해당 책임을 수행할 도메인 개념이 존재하지 않는다면 도메인과 무관한 인공적인 객체를 만든다음 해당 객체에게 책임을 할당한다.

객체가 데이터베이스에 저장해야 할 값을 가지고 있다고, 정보 전문가 패턴을 적용하여 데이터베이스에 저장하라는 책임을 가지라고 하지 않는다.

예) 상점과 고객 클래스가 있고 서로 다른 통화를 사용하고 있다고 가정

  • 서로 다른 통화를 사용하고 있기 때문에 거래를 하려면 환전을 해야한다.
  • 두 클래스 다 환전에 대한 책임을 부여하기 애매하다면 환전을 책임하는 클래스를 추가하고 사용할 수 있다.

참고 자료

오브젝트 5장. 책임 할당하기, 조영호

Applying UML and Patterns Chapter 16, Chapter 21 GRASP, Craig Larman

GRASP, 한빛 네트워크

- - + + \ No newline at end of file diff --git a/tags/pattern.html b/tags/pattern.html index 0f690cea3..8cffd69fe 100644 --- a/tags/pattern.html +++ b/tags/pattern.html @@ -13,12 +13,12 @@ - - + +
-

"Pattern" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
+

"Pattern" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

요구사항

지하철 미션에는 다음과 같은 요구사항이 있었다.

  • 거리별 추가 요금 정책
  • 노선별 추가 요금 정책
  • 연령별 요금 할인 정책

인터페이스 사용

요금 정책은 다음과 같이 인터페이스로 표현할 수 있다.
요금을 계산하는 메서드는 최단 경로 계산의 결과, 사용자의 정보, 요금을 받아 요금을 계산한다.

public interface FarePolicy {
int calculate(Path path, Passenger passenger, int fare);
}

public class BaseFarePolicy implements FarePolicy { ... }
public class DistanceFarePolicy implements FarePolicy { ... }
public class AgeDiscountFarePolicy implements FarePolicy { ... }

composite1

모든 요금 정책을 포함하는 새로운 요금 정책 만들기

나머지 구현체를 모두 가지고 있는 하나의 구현체를 만들었다.
이 또한 FarePolicy를 구현한 형태가 되고, 필드로는 나머지 구현체들을 가지고 있다.

public class SubwayFarePolicy implements FarePolicy {

private final List<FarePolicy> farePolicies;

public SubwayFarePolicy(final List<FarePolicy> farePolicies) {
this.farePolicies = farePolicies;
}

@Override
public int calculate(final Path path, final Passenger passenger, final int fare) {
int calculatedFare = fare;
for (FarePolicy farePolicy : farePolicies) {
calculatedFare = farePolicy.calculate(path, passenger, calculatedFare);
}
return calculatedFare;
}
}

따라서 그림으로 본다면 다음과 같은 구조가 된다.

composite2

정책의 순서

지하철 요구사항은 순서가 중요했다.
금액의 총합을 구하고, 그 후에 할인 정책이 들어가야했다.
@@ -31,7 +31,7 @@ 패턴을 맹목적으로 사용해서는 안되고, 현재의 요구사항에 따라 패턴을 유동적으로 수정해가면서 적용하는 것이 좋다.
항상 트레이드오프를 생각하자!

참고 자료

컴포지트 패턴, GoF의 디자인 패턴
디자인 패턴과 프레임워크, 오브젝트

- - + + \ No newline at end of file diff --git a/tags/python.html b/tags/python.html index bd0473f04..bd282d916 100644 --- a/tags/python.html +++ b/tags/python.html @@ -13,12 +13,12 @@ - - + +
-

"Python" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 7분

개요

이전에 기술 구현 가능 여부를 조사하면서 파이썬을 사용한 내용을 정리한 내용이다.

사용 기술

언어: Python 3.10
+

"Python" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 7분

개요

이전에 기술 구현 가능 여부를 조사하면서 파이썬을 사용한 내용을 정리한 내용이다.

사용 기술

언어: Python 3.10
이미지 생성: matplotlib
서비스: AWS Lambda, AWS API Gateway
이미지 저장 및 URL: AWS S3, AWS CloudFront

플로우는 다음과 같다.

요구사항

./route.png

우측 상단의 경로 이미지를 생성하려고 한다.
@@ -39,7 +39,7 @@ Python Lambda 함수에 대한 .zip 파일 아카이브 작업
No module named 'numpy.core._multiarray_umath'
사례별로 알아본 안전한 S3 사용 가이드

- - + + \ No newline at end of file diff --git a/tags/retrospective.html b/tags/retrospective.html index 47a86edc1..4f328d776 100644 --- a/tags/retrospective.html +++ b/tags/retrospective.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
빠르게 지나가서 조금 아쉽다.

학습

회고를 작성하기 전에 레벨 2 동안 보냈던 PR과 회고를 쭉 읽어봤다.
항상 아쉬운 곳은 있기 마련이지만, 잘 학습한 것 같다.
미션을 하면서 기술을 어떻게 선택하고, 적용할 것인지 고민하는 과정에서 꽤나 많은 성장을 한 것 같다.

고민은 깊었지만 이론적인 학습이 부족한 레벨 2였다.
@@ -29,7 +29,7 @@ 이번에는 프런트엔드 크루와 협업을 했다. 소통은 잘 된 것 같지만 API 명세를 정하는 부분이 아직 미숙한 것 같다.

레벨 3 때부터 본격적으로 프로젝트가 시작된다.
팀을 위해 어떤 것을 할 수 있을지 고민을 많이 해봐야겠다.

레벨 2를 마무리하며

회고 작성하면서 레벨 2에서 했던 것들을 반추해 봤는데 부족한 점은 많았어도 좋은 방향으로 가고 있는 것 같다. 읽고 싶은 책도 읽고, 부족한 부분 채우면서 쉬어야겠다.

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/10.html b/tags/retrospective/page/10.html index 065f6a7f3..c074be395 100644 --- a/tags/retrospective/page/10.html +++ b/tags/retrospective/page/10.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

레벨 1이 끝났다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

레벨 1이 끝났다.
우테코를 시작하기 전 내가 정해두었던 목표 이상으로 달성했기 때문에 매우 만족스럽다.
혼자 독학을 할 땐 이 방향으로 공부하는 게 맞는지 계속 반추하다 결국 무기력함에 빠져들었다.
하지만 이제는 같이 공부할 사람도 있고, 이야기할 사람도 있기 때문에 즐기는 일만 남은 것 같다.

Keep

나만의 루틴 만들기

스스로가 외부의 영향을 많이 받는다고 생각한다.
@@ -50,7 +50,7 @@ 블로그에 기술적인 부분을 많이 정리하지 않았는데, 조금 더 깊게 공부하고 정리하는 시간도 가져야겠다.

레벨 1을 마무리하며

시간이 빠르게 흘러갔다.
타인에게 좋은 영향을 주기위해, 방학동안 나를 챙기는 시간을 가져야겠다.
또한 함께 일하고 싶은 사람을 목표로 앞으로도 꾸준히 의식적 노력을 해야겠다.

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/11.html b/tags/retrospective/page/11.html index 0cae9351a..22c98e658 100644 --- a/tags/retrospective/page/11.html +++ b/tags/retrospective/page/11.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
체스는 이전 미션들보다 훨씬 복잡한 도메인이었다.
하지만 가비와 나는 체스 도메인이 익숙해서 더 편한 마음으로 시작할 수 있었다.
미션을 진행하면서 어려웠던 부분은 기물의 이동, 이동시 경로에 기물이 존재하는지 확인하는 부분이었다.

가비가 집에가서도 기물의 이동 관련해 생각 정리한 글을 보내줘서 더욱 빨리 진행할 수 있었다.
@@ -53,7 +53,7 @@ 모르는게 있으면 솔직하게 말해주는 부분
나의 의견을 정리하지 못한 상태로 전달할 때 이해가 안되었다고 정확히 전달해주는 부분
솔직함은 페어할 때 중요한 부분인 것 같다.

마지막으로 찰리🍫 체스 미션때 꼼꼼하게 리뷰 남겨주셔서 감사합니다!

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/12.html b/tags/retrospective/page/12.html index 7ab0d889e..90b9dfc34 100644 --- a/tags/retrospective/page/12.html +++ b/tags/retrospective/page/12.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
이번에는 실수하지 않고, 바로 미션을 진행하지 않고 친해지기 부터 시작했다.

블랙잭은 구현해야 될 내용이 많아 시간이 많이 부족할 것 같았지만
후추와 함께 전략적(삼일절에 미션 이야기 나누기)으로 미션을 진행해 시간 내에 제출할 수 있었다.

미션을 끝나고 회고를 했을 때 후추가 고민거리를 하나 내줬다.
"페어를 진행할 때 압박감을 느끼는 페어가 있다면 허브가 해줄 수 있는게 뭐가 있을까?"

곰곰히 생각해봤지만 쉽게 답을 내릴 수 없었다.
@@ -48,7 +48,7 @@ 회고때도 서로 솔직하게 의견을 주고 받아서 좋았다.

도메인 언어에 신경쓰는 부분
클래스명, 변수명과 같은 언어를 세심하게 신경쓴다.
요구사항 정리도 깔끔하게 잘하는 것 같다.

후추 최고 👍

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/13.html b/tags/retrospective/page/13.html index 12ed1c9e1..85a16ce4e 100644 --- a/tags/retrospective/page/13.html +++ b/tags/retrospective/page/13.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
이전 미션과 달리 TDD로 진행하는 것이 필수였기 때문에 익숙하지 않았지만, 우가와 미션에 관한 소통이 잘 되어서 큰 문제 없이 미션을 마무리할 수 있었다.

우가와 이야기가 잘 통해서 그런지 1단계는 크게 어렵지 않게 진행할 수 있었는데, 2단계에서 많이 고전한 것 같다.

2단계에서는 2가지 방법으로 구현해봤다.

  1. LadderGame에서 Position 기준으로 사다리 게임을 진행하는 방법
  2. Player에게 Ladder를 넘겨서 Ladder에게 Position을 넘겨주며 메시지를 보내는 방법

Position 기준으로 사다리 게임을 진행하는 방법

사실상 index를 Ladder에게 넘겨주고, 해당 index에 대한 결과를 받는 방법과 유사했다.
구현하고 나니 다른 클래스들이 Position에 대한 의존도가 너무 높은 것 같았다.
또한 Players가 별다른 책임을 가지고 있지 않다고 느꼈다.

public LadderGameResult play() {
final Map<Player, Item> result = new LinkedHashMap<>();
// 사용자 수만큼 Position을 가져와서 사다리 게임을 진행한다.
for (Position position : Position.range(players.count())) {
final Position resultPosition = ladder.play(position);
result.put(players.get(position), items.get(resultPosition));
}
return new LadderGameResult(result);
}

Player에게 Ladder를 전달하여 게임을 진행하는 방법

Position에 대한 값을 가지고 있는 Player에게 Ladder를 넘겨서, Player가 Ladder에게 메시지를 보내도록 구현하였다.
@@ -50,7 +50,7 @@ 또한 페어 진행이 느린 것 같다고 말해줘서 안정적으로 시간 안에 미션을 완료할 수 있었다.
페어프로그래밍 진행 속도에 대해 조금 더 생각을 해봐야겠다!

항상 지나갈 때마다 웃어주는데, 나도 자주 웃어야겠다고 생각했다.
웃는 것만으로도 사람이 밝아 보여서 너무 좋은 것 같다!

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/14.html b/tags/retrospective/page/14.html index 8717e8701..ab9fafed6 100644 --- a/tags/retrospective/page/14.html +++ b/tags/retrospective/page/14.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
우테코 들어와서 첫 페어프로그래밍이라 많이 떨렸지만, 다즐이 대화를 잘 이끌어줘 너무 즐거웠다.

첫날은 간단히 컨벤션과 환경을 설정하는 시간을 가졌고 다음 날부터 자동차 경주를 시작했다.
시작은 간단하게 요구사항을 정리하고, 어떻게 코드를 작성할지 같이 고민했다.

시작하기 전 아래와 같이 mermaid를 이용하여 의존성 방향에 대해서 간단한 다이어그램을 만들고 시작했다.
mermaid는 코드로 다이어그램을 생성 해주는 도구로 다음과 같은 장점이 있다고 생각한다.

  • 코드 기반이라 빠른 시간 안에 생각한 것을 시각화할 수 있다.
  • github에서 mermaid를 지원하기 때문에 리뷰어에게 코드를 이해할 수 있는 부가적인 정보를 제공할 수 있다.

미션을 진행하는 데 큰 어려움이 있지는 않았고, 페어를 마치기 전 서로 고민되는 부분을 정리했을 때 좋았다.

페어하면서 잘했다고 생각했던 점은 서로의 생각과 리뷰 받은 것을 공유한 것이다.
@@ -44,7 +44,7 @@ 그래서 즐거운 마음으로 페어 프로그래밍을 했었던 것 같다.

어떤 이유 때문인지 모르겠지만 같이 페어하는데 편한 마음이 들었다.
이건 바로 배울 수 없지만.
나도 같이 일할 때 편한 사람, 같이 일하고 싶은 사람이 되기 위해 깊이 고민해봐야겠다.

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/15.html b/tags/retrospective/page/15.html index 5c5fea050..61a9e8f49 100644 --- a/tags/retrospective/page/15.html +++ b/tags/retrospective/page/15.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

적당한 전환점, 2022년을 돌아보며

전역

약 1년 6개월간의 공군 정보보호병 생활을 마치고 전역을 했다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

적당한 전환점, 2022년을 돌아보며

전역

약 1년 6개월간의 공군 정보보호병 생활을 마치고 전역을 했다.
조기 전역 때문에 2021년 12월에 나왔지만, 실제 전역 날짜는 2022년이니 회고에 적어도 상관없겠지.

조금 더 미래에 대한 생각을 해볼걸 그랬다.
전역을 했지만 뭐 하나 제대로 할 줄 아는 것도 없으니 넓은 바닷속에 덩그러니 놓아진 기분이 괜히 들었었다.
일찍 생각을 정리하여 방향을 잡지 못했기에 아쉬움이 많이 남았다.

자바

전역을 하고 진로를 고민하다 향로님의 자바 공화국 포스팅을 읽고 나서 자바 공부를 시작했다.
@@ -33,7 +33,7 @@ 적지 않은 시간을 투자해 준비를 했고, 감사하게도 이번에는 최종 합격을 했다.

난 사람들과 소통하고, 협업하는 능력이 부족하다고 생각을 많이 했다.
우아한 테크코스를 통해 그 빈 부분을 채우도록 노력해야겠다.

2023년에는

마음의 여유가 없었던 2022년이었던 것 같다.
하고 싶은 건 많지만, 이번에는 여유를 가지고 할 수 있는 것에 최선을 다해야겠다.

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/2.html b/tags/retrospective/page/2.html index 0b6301c9a..fe736de7f 100644 --- a/tags/retrospective/page/2.html +++ b/tags/retrospective/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
따라서 레벨 1 레벨 인터뷰 회고는 레벨 1 회고를 작성할 때 끼워넣었다.
이번에는 범위도 제한되어 있어 어떻게 준비해야 할지 당황했고, 답변에도 부족한 부분이 많았었다.
기억이 사라지기 전에 큰 문제 없이 답변한 내용을 제외하고, 기억 남는 것 위주로 작성해 보려고 한다.

API 문서 도구 선택

큰 문제 없이 답변을 했는데 앞으로도 팀 프로젝트를 하면서 도움 될 것 같은 내용이 있어서 남겨두려고 한다.
@@ -31,7 +31,7 @@ 생각할 시간을 가졌을 때 "다시 말씀드려도 될까요?"라고 말하고 답변을 이어나가기
기술적으로 깊이가 부족하다고 생각이 많이 들어서 조금 더 깊게 공부하고 정리하기
이전에 공부했던거 되돌아 보는 시간 가지기

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/3.html b/tags/retrospective/page/3.html index c574de651..9ed6f4a18 100644 --- a/tags/retrospective/page/3.html +++ b/tags/retrospective/page/3.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
마코, 우가, 우코, 우스 그리고 나까지 합쳐서 5명이 한 팀이 되었다.

배포

이전 미션들과 달리 AWS를 이용해 배포를 해야 했다.
각자 하나의 EC2 인스턴스를 제공받을 수 있었고, 팀 별로 DB를 위한 추가 인스턴스를 제공받았다.
배포 스크립트를 작성하는 경험을 해볼 수 있었다.
@@ -35,7 +35,7 @@ 추가로 현업에서는 고가용성 내결함성 등을 위하여 클러스터를 구성하여 사용하는 경우가 많고, 이 경우 readOnly 설정이 되어있다면 읽기 전용 DB로 질의가 들어가서 부하 분산의 효과가 있다고 한다.

DAO에 @Transactional 적용

DAO에 트랜잭션을 보장해 보는 건 어떻겠냐고 리뷰가 달려서 고민을 많이 했다.
Service 계층에 이미 트랜잭션을 보장해 주고 있기에 필요 없지 않을까 생각했었다.
DAO를 다른 곳에서 사용하더라도 트랜잭션을 보장하기 위해(확장성 고려) @Transactional을 적용하는 것도 괜찮은 것 같다.

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/4.html b/tags/retrospective/page/4.html index 0b3d0a247..c48ab8614 100644 --- a/tags/retrospective/page/4.html +++ b/tags/retrospective/page/4.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
레벨 2가 거의 끝나가는 시점, 그동안 했던 것을 정리해 보려고 한다.

나의 채팅 확인하고 이어하는 기능

GPT에도 있는 기능인데, 내가 이전에 했던 채팅을 이어할 수 있는 기능을 추가했다.
예전에 어떤 질문을 남겼는지, 또한 해당 채팅을 이어서 할 수 있다.

chat1

좋아요와 댓글 기능

다른 사람들이 질문한 내용에 반응할 수 있는 무언가가 있었으면 좋겠다는 의견들이 많았다.
누가 좋아요를 눌렀는지, 어떤 채팅이 좋아요를 가장 많이 받았는지 확인할 수 있는 기능을 추가했다.
@@ -32,7 +32,7 @@ 제일 하고 싶은 것은 실제 GPT를 사용하는 것처럼 stream/text 값을 처리하고 싶은데 이 부분은 방학 때 기회가 되면 도전해 봐야겠다.

향후 계획

실제 크루들이 사용해 주는 서비스를 직접 만들어보면서 사용자의 입장에서 고민도 하게 되는 것 같다.
크루들이 직접 사용해 주니까 너무 고맙고, 한편으로는 신기하다.
일단 방학 때 stream/text 관련된 부분 동작되도록 구현해보려고 하고, 그 외의 부분은 조금 더 고민해야될 것 같다.

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/5.html b/tags/retrospective/page/5.html index 0a7dfe85d..77acaca3d 100644 --- a/tags/retrospective/page/5.html +++ b/tags/retrospective/page/5.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
지하철 미션은 밀리랑 페어를 진행했다.
간단한 CRUD만 있던 이전 미션들과 달리, 조금 복잡한 도메인 요구사항이 있었다.
이때 API, 테이블, 도메인 설계를 해야 했는데 어떤 것부터 해야 할지 고민을 많이 했다.
@@ -39,7 +39,7 @@ 또한 코딩할 때 내가 평소에 사용하는 코딩 컨벤션에 맞춰주는 것 같아서 페어 할 때 편했다!

편한 분위기

전체적으로 페어 할 때 편하게 진행했던 것 같다.
일정도 그렇고, 페어 진행할 때도 그렇고 큰 문제가 없었던 것 같아서 좋았다.
나는 과연 다른 사람들에게 편한 사람일까?

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/6.html b/tags/retrospective/page/6.html index fcf0c70a5..ff36dd129 100644 --- a/tags/retrospective/page/6.html +++ b/tags/retrospective/page/6.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
요구사항이 엄청 복잡한 미션은 아니었고, 스프링을 사용하여 기본적인 CRUD를 구현하는 미션이었다.
2단계에서는 Basic 인증을 통해 자신의 장바구니에만 상품을 담고, 제거할 수 있도록 구현하는 요구사항이 추가되었다.
Interceptor나 Argument Resolver에 대한 이해도가 높지 않았는데, 이번 미션을 통해 조금 더 알아간 느낌이다.
@@ -32,7 +32,7 @@ 추가적으로 이모지를 적극적으로 사용하여 더욱 좋았다!

의견 일치시키기

페어 시간은 한정되어 있고, 기간 내 요구사항을 만족해야 한다.
따라서 적당히 타협을 봐서 의견을 빠르게 수용해 데드라인을 맞추는 것도 중요하다고 생각한다.
블랙캣은 내 의견을 잘 들어줬고, 덕분에 막히는 부분 없이 빠르게 미션을 진행할 수 있었다.

빨리 친해졌고, 의사소통이 잘 돼서 재밌게 코딩할 수 있었다!

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/7.html b/tags/retrospective/page/7.html index 8dcd63b07..7a98198ea 100644 --- a/tags/retrospective/page/7.html +++ b/tags/retrospective/page/7.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
웹 자동차 미션에서는 비버와 페어가 매칭되었다.
레벨 2에서 진행하는 첫 미션이라 많이 긴장되었지만, 그래도 비버랑 초반에 맛있는 것도 많이 먹으면서 빨리 친해져서 재밌게 할 수 있었다.

스프링을 조금 사용할 줄 알아서, 비버랑 같이 학습하면서 미션을 진행했다.
첫 미션이라 그런지 특별한 부분은 없었고, 최대한 깔끔하게 작성하려고 노력했다.
@@ -37,7 +37,7 @@ 추가적으로 알고 싶은 부분을 따로 학습하는 열정이 좋다고 생각했다.
비버와 스프링에 대해 알아가는 시간을 많이 가진 부분이 매우 좋았다.
나도 5월부터 조금 더 화이팅 해야겠다.

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/8.html b/tags/retrospective/page/8.html index 476d687a2..4260ce95e 100644 --- a/tags/retrospective/page/8.html +++ b/tags/retrospective/page/8.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
추가로 채팅을 이어나갈 수 있게 하는 기능도 추가했다.
자잘하게 신경 쓸 부분이 많아서, 프론트엔드 하는 사람들이 대단하다고 생각되었다.
여유가 된다면 자신의 채팅을 볼 수 있는 기능이나, 채팅을 이어서 할 수 있는 기능, 댓글 기능도 추가할 예정이다.

백엔드

최대한 빨리 서비스를 크루들에게 제공하기로 정해서, 백엔드는 말랑이 일단 다 만들고 있다.
@@ -37,7 +37,7 @@ 오늘 적용해 보니 램이 부족하여 중간에 잘 안되기도 하고 그래서 그냥 "Pipeline만 사용할 걸 그랬나?" 라는 생각이 든다.

참고 자료

Elastic Beanstalk, AWS
EC2 AWS Graviton, AWS
Default Memory Settings, AWS

- - + + \ No newline at end of file diff --git a/tags/retrospective/page/9.html b/tags/retrospective/page/9.html index b8ad95349..f913a2e28 100644 --- a/tags/retrospective/page/9.html +++ b/tags/retrospective/page/9.html @@ -13,12 +13,12 @@ - - + +
-

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
+

"Retrospective" 태그로 연결된 15개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
레벨 3, 4에서 나만의 강점을 가지고 싶어 고민을 많이 했다.
단순히 스프링을 깊게 공부하는 건 효율이 많이 떨어진다고 생각했다.
글쓰기 수상으로 받은 쿠폰을 사용해 브라운에게 커피챗을 신청했고, 사이드 프로젝트를 해보라는 답을 받았다.

나는 아이디어를 못내는 편인데 브라운이 아이디어까지 던져주셨다.
@@ -41,7 +41,7 @@ 추가로 띄어쓰기도 적용되지 않아서 \n<br>태그로 변환했다.
변환하는 로직은 GPT의 도움을 많이 받았다.

const replaceCodeFences = (input: String) => {
const codeFencesRegex = /```([\w-]*)\n([\s\S]*?)\n```/g;
return input
.replace(codeFencesRegex, (match, p1, p2) => {
const languageClass = p1 ? ` class="language-${p1}"` : "";
return `<pre><code${languageClass}>${p2}</code></pre>`;
})
.replace(/\n/g, "<br>");
};

Tiptap을 적용하니 다음과 같이 깔끔한 코드 블록을 볼 수 있었다.

tecochat

폰트 및 favicon 적용

타이틀은 배달의민족 도현체, 내용은 IBM Plex Sans를 사용했다.
추가로 favicon도 간단하게 적용해서 만족스러웠다.

- - + + \ No newline at end of file diff --git a/tags/spring-boot.html b/tags/spring-boot.html index bfd4ba03d..6ef0c3ca5 100644 --- a/tags/spring-boot.html +++ b/tags/spring-boot.html @@ -13,12 +13,12 @@ - - + +
-

"Spring Boot" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
+

"Spring Boot" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
2.7 버전을 사용할 수도 있었지만 LTS 기간과 취약점 패치로 인한 버전업 등을 고려했을 때 3.1과 자바 17을 사용하는 것이 더 효율적이라고 판단했다.

자바 변경 사항

우아한테크코스 레벨 2까지는 자바 11을 사용했었다.
따라서 자바 11부터 자바 17까지의 변경사항을 정식 릴리즈 기준으로 정리해보려고 한다.

Switch Expressions(Java 14)

Java 14에서는 기존의 Switch 문을 간결하게 작성할 수 있는 Switch 식이 추가되었다.

enum RESULT {
WIN, LOSE, DRAW
}

RESULT result = RESULT.WIN;

int prize = switch (result) {
case WIN -> 10_000_000;
case LOSE, DRAW -> 5_000_000;
default -> 0;
};

주요 특징은 다음과 같다.

  • -> 연산자를 이용하여 각 case에 대한 결과를 바로 반환할 수 있다.
  • case를 콤마(,)로 연결하여 하나의 case에 여러 값을 지정할 수 있다.
  • break 문이 필요 없다.
  • default 블록을 통해 기본 값을 지정할 수 있다.

Text Block(Java 15)

Java 15에는 새로운 문자열 표현방식이 추가되었다.
긴 문자열을 + 연산자의 도움 없이 가독성있게 작성할 수 있다.

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("""
SELECT p FROM Post p
WHERE p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
""")
List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);
}

NPE 메시지(Java 15)

String name = null;
name.chars();

/**
# before
java.lang.NullPointerException
at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)

# after
Cannot invoke "String.chars()" because "name" is null
java.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null
*/

Record(Java 16)

Lombok의 @Data, kotlin의 data 클래스와 유사한 기능을 제공한다.
@@ -34,7 +34,7 @@ What's New in Spring Framework 6.x
Spring Boot 3.0 Release Notes
Spring Boot 3.1 Release Notes

- - + + \ No newline at end of file diff --git a/tags/spring.html b/tags/spring.html index e139a1491..8dbe471c2 100644 --- a/tags/spring.html +++ b/tags/spring.html @@ -13,12 +13,12 @@ - - + +
-

"Spring" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
+

"Spring" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

자바 17, 스프링 6.0, 스프링 부트 3.1

팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
2.7 버전을 사용할 수도 있었지만 LTS 기간과 취약점 패치로 인한 버전업 등을 고려했을 때 3.1과 자바 17을 사용하는 것이 더 효율적이라고 판단했다.

자바 변경 사항

우아한테크코스 레벨 2까지는 자바 11을 사용했었다.
따라서 자바 11부터 자바 17까지의 변경사항을 정식 릴리즈 기준으로 정리해보려고 한다.

Switch Expressions(Java 14)

Java 14에서는 기존의 Switch 문을 간결하게 작성할 수 있는 Switch 식이 추가되었다.

enum RESULT {
WIN, LOSE, DRAW
}

RESULT result = RESULT.WIN;

int prize = switch (result) {
case WIN -> 10_000_000;
case LOSE, DRAW -> 5_000_000;
default -> 0;
};

주요 특징은 다음과 같다.

  • -> 연산자를 이용하여 각 case에 대한 결과를 바로 반환할 수 있다.
  • case를 콤마(,)로 연결하여 하나의 case에 여러 값을 지정할 수 있다.
  • break 문이 필요 없다.
  • default 블록을 통해 기본 값을 지정할 수 있다.

Text Block(Java 15)

Java 15에는 새로운 문자열 표현방식이 추가되었다.
긴 문자열을 + 연산자의 도움 없이 가독성있게 작성할 수 있다.

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("""
SELECT p FROM Post p
WHERE p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
""")
List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);
}

NPE 메시지(Java 15)

String name = null;
name.chars();

/**
# before
java.lang.NullPointerException
at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)

# after
Cannot invoke "String.chars()" because "name" is null
java.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null
*/

Record(Java 16)

Lombok의 @Data, kotlin의 data 클래스와 유사한 기능을 제공한다.
@@ -34,7 +34,7 @@ What's New in Spring Framework 6.x
Spring Boot 3.0 Release Notes
Spring Boot 3.1 Release Notes

- - + + \ No newline at end of file diff --git a/tags/static.html b/tags/static.html index 20bddbbcc..15d6fb32e 100644 --- a/tags/static.html +++ b/tags/static.html @@ -13,12 +13,12 @@ - - + +
-

"static" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
+

"static" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

개요

정적 팩터리 메서드를 모킹한다는 것은 객체지향적인 관점에서 볼 때 안티패턴이다.
하지만 특수한 경우에는 정적 메서드를 모킹하는 것이 필요할 수 있다고 생각한다.

예를 들어 레거시 코드를 테스트 한다던지, IO 관련한 부분을 테스트 할 때 정말 필요한 부분에만 적용할 수 있을 것이다.

프로젝트를 진행하며 ImageIo.write 메서드가 호출되는 지 검증이 필요했다.
해당 static 메서드를 호출하는 부분을 따로 RouteImageUploader 클래스로 최대한 분리했다.
이미지 저장 기능 자체가 외부로 나가는 상호작용이고, 호출 횟수를 검사하는데는 mock을 사용하는게 적절하다고 판단했다.

public void upload(BufferedImage bufferedImage) {
File file = new File(파일경로);
try {
ImageIO.write(bufferedImage, ROUTE_IMAGE_FORMAT, file);
} catch (IOException e) {
throw new DrawException(IMAGE_SAVE_FAIL);
}
}

Mocking static methods

Mockito 3.4.0 이후에는 static method를 모킹할 수 있는 Mockito.mockStatic 메서드를 지원한다.
@@ -27,7 +27,7 @@ 항상 상황을 고려하고 간결함을 포기할 만큼 중요한 부분인지 적절한 트레이드오프를 고려하자.

참고 자료

Mocking static methods
Mockito mock static methods
Enable mocking static methods in Mockito

- - + + \ No newline at end of file diff --git a/tags/teco-chat.html b/tags/teco-chat.html index 24d30cee9..51e6e9bfa 100644 --- a/tags/teco-chat.html +++ b/tags/teco-chat.html @@ -13,12 +13,12 @@ - - + +
-

"TecoChat" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
+

"TecoChat" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

개요

원래 목적인 크루들의 학습에 도움을 주기 위해 어떤 기능을 추가해야 할지 고민을 많이 했다.
레벨 2가 거의 끝나가는 시점, 그동안 했던 것을 정리해 보려고 한다.

나의 채팅 확인하고 이어하는 기능

GPT에도 있는 기능인데, 내가 이전에 했던 채팅을 이어할 수 있는 기능을 추가했다.
예전에 어떤 질문을 남겼는지, 또한 해당 채팅을 이어서 할 수 있다.

chat1

좋아요와 댓글 기능

다른 사람들이 질문한 내용에 반응할 수 있는 무언가가 있었으면 좋겠다는 의견들이 많았다.
누가 좋아요를 눌렀는지, 어떤 채팅이 좋아요를 가장 많이 받았는지 확인할 수 있는 기능을 추가했다.
@@ -32,7 +32,7 @@ 제일 하고 싶은 것은 실제 GPT를 사용하는 것처럼 stream/text 값을 처리하고 싶은데 이 부분은 방학 때 기회가 되면 도전해 봐야겠다.

향후 계획

실제 크루들이 사용해 주는 서비스를 직접 만들어보면서 사용자의 입장에서 고민도 하게 되는 것 같다.
크루들이 직접 사용해 주니까 너무 고맙고, 한편으로는 신기하다.
일단 방학 때 stream/text 관련된 부분 동작되도록 구현해보려고 하고, 그 외의 부분은 조금 더 고민해야될 것 같다.

- - + + \ No newline at end of file diff --git a/tags/teco-chat/page/2.html b/tags/teco-chat/page/2.html index f58da4ef2..3cae6873b 100644 --- a/tags/teco-chat/page/2.html +++ b/tags/teco-chat/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"TecoChat" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
+

"TecoChat" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

프론트엔트

닉네임을 입력하여 간단히 로그인하는 화면, 채팅 목록을 보여주는 화면도 만들었고 단일 채팅을 확인할 수 있는 화면도 만들었다.
추가로 채팅을 이어나갈 수 있게 하는 기능도 추가했다.
자잘하게 신경 쓸 부분이 많아서, 프론트엔드 하는 사람들이 대단하다고 생각되었다.
여유가 된다면 자신의 채팅을 볼 수 있는 기능이나, 채팅을 이어서 할 수 있는 기능, 댓글 기능도 추가할 예정이다.

백엔드

최대한 빨리 서비스를 크루들에게 제공하기로 정해서, 백엔드는 말랑이 일단 다 만들고 있다.
@@ -37,7 +37,7 @@ 오늘 적용해 보니 램이 부족하여 중간에 잘 안되기도 하고 그래서 그냥 "Pipeline만 사용할 걸 그랬나?" 라는 생각이 든다.

참고 자료

Elastic Beanstalk, AWS
EC2 AWS Graviton, AWS
Default Memory Settings, AWS

- - + + \ No newline at end of file diff --git a/tags/teco-chat/page/3.html b/tags/teco-chat/page/3.html index 8b2d33317..b1e0fb576 100644 --- a/tags/teco-chat/page/3.html +++ b/tags/teco-chat/page/3.html @@ -13,12 +13,12 @@ - - + +
-

"TecoChat" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
+

"TecoChat" 태그로 연결된 3개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

4월 21일 금요일

레벨 2를 시작한 뒤 내가 학습에 대한 방향을 잃어버렸다는 생각이 들었다.
레벨 3, 4에서 나만의 강점을 가지고 싶어 고민을 많이 했다.
단순히 스프링을 깊게 공부하는 건 효율이 많이 떨어진다고 생각했다.
글쓰기 수상으로 받은 쿠폰을 사용해 브라운에게 커피챗을 신청했고, 사이드 프로젝트를 해보라는 답을 받았다.

나는 아이디어를 못내는 편인데 브라운이 아이디어까지 던져주셨다.
@@ -41,7 +41,7 @@ 추가로 띄어쓰기도 적용되지 않아서 \n<br>태그로 변환했다.
변환하는 로직은 GPT의 도움을 많이 받았다.

const replaceCodeFences = (input: String) => {
const codeFencesRegex = /```([\w-]*)\n([\s\S]*?)\n```/g;
return input
.replace(codeFencesRegex, (match, p1, p2) => {
const languageClass = p1 ? ` class="language-${p1}"` : "";
return `<pre><code${languageClass}>${p2}</code></pre>`;
})
.replace(/\n/g, "<br>");
};

Tiptap을 적용하니 다음과 같이 깔끔한 코드 블록을 볼 수 있었다.

tecochat

폰트 및 favicon 적용

타이틀은 배달의민족 도현체, 내용은 IBM Plex Sans를 사용했다.
추가로 favicon도 간단하게 적용해서 만족스러웠다.

- - + + \ No newline at end of file diff --git a/tags/test.html b/tags/test.html index 55fdad1a4..2cb75bceb 100644 --- a/tags/test.html +++ b/tags/test.html @@ -13,12 +13,12 @@ - - + +
-

"Test" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
+

"Test" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

테스트 대역이란?

모든 유형의 테스트를 위한 가짜 의존성을 의미하고, 테스트가 실행될 때 다른 객체를 대신한다.
Gerard Meszaros의 xUnit Test Patterns라는 책에서는 테스트 대역을 다섯 가지(더미, 스텁, 스파이, 목, 페이크)로 구분한다.

테스트 대역의 기본 메커니즘은 다형성을 이용하는 방법이다.
외부 서비스를 사용하는 코드를 테스트 하는 경우, 인터페이스를 정의하고 외부 서비스 대신 테스트 용도의 구현체를 생성하는 것이다.

테스트 대역의 타입 계층 구조

더미(Dummy)

가장 단순하고, 원시적인 유형의 테스트 대역이다.
기본적으로 아무 일도 하지 않는 구현체로 인스턴스화가 필요한 경우 사용한다.
@@ -36,7 +36,7 @@ 테스트 더블, Martin Fowler
테스트 관련 용어 정리, Johngrib
Test Double, Gerard Meszaros

- - + + \ No newline at end of file diff --git a/tags/time.html b/tags/time.html index 5dd3c073b..08d4544d2 100644 --- a/tags/time.html +++ b/tags/time.html @@ -13,19 +13,19 @@ - - + +
-

"Time" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
+

"Time" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 2분

이전에 많은 문제가 있던 자바의 클래스(Calendar, Date)를 대체하는 날짜와 시간 API
ISO-8601을 기반으로 작성
설계 목표 → 불변, Fluent API, 명확하고 명시적, 확장 가능성

ISO-8601

날짜와 시간에 관련된 데이터를 다루는 국제 표준

LocalDate, LocalTime, LocalDateTime

날짜와 시간을 표현하는 클래스

Instant

유닉스 시간(1970-01-01, 00:00:00 UTC) 기준으로 특정 지점까지의 시간을 초로 표현하는 클래스
기계의 관점에서 시간 표현

Duration, Period

간격을 표현하는 클래스

TemporalAdjusters

복잡한 날짜 조정이 필요할 때 사용
필요한 경우 다음 인터페이스를 구현하여 커스텀 TemporalAdjuster를 구현 가능

@FunctionalInterface
public interface TemporalAdjuster {
Temporal adjustInto(Temporal temporal);
}

DateTimeFormatter

날짜와 시간 포맷 클래스
특정 날짜 패턴이나, DateTimeFormatterBuilder를 이용해서 커스텀한 포맷을 생성 가능

ZoneId, ZoneOffset

ZoneId는 지역 ID는 ‘지역/도시’ 형식, ZoneOffset은 시차 UTC 기준 고정된 시간 차이 이용
ZoneId의 경우 IANA Time Zone Database에서 제공하는 지역 집합 정보 사용

Instant instant = Instant.now();
LocalDateTime utc = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

참고 자료

- - + + \ No newline at end of file diff --git a/tags/transaction.html b/tags/transaction.html index 5908fb050..0fd1eedfd 100644 --- a/tags/transaction.html +++ b/tags/transaction.html @@ -13,12 +13,12 @@ - - + +
-

"Transaction" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
+

"Transaction" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 10분

트랜잭션(Transaction)

데이터베이스에서 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
트랜잭션은 작업의 완전성과 데이터의 정합성을 보장해 준다.
논리적인 작업 셋을 완벽하게 처리하거나, 오류 시 작업의 일부만 적용되는 현상을 막아준다.

트랜잭션의 속성(ACID)

원자성(Atomicity): 트랜잭션 내에서 실행된 작업들은 모두 성공하거나, 실패해야 한다.
일관성(Consistency): 트랜잭션이 수행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
@@ -42,7 +42,7 @@ 예) A가 레코드를 여러 번 조회하던 중 B가 레코드를 변경하여 A가 조회한 값이 달라지는 경우

팬텀 리드(Phantom read, Phantom row)

한 트랜잭션 내에서 동일한 쿼리 수행시, 수행 결과가 다른 현상
예) A가 레코드를 조회하고 B가 레코드를 추가하여 A가 다시 조회할 때 존재하지 않은 레코드가 조회되는 경우

참고 자료

Real My SQL 8.0 - 5장 트랜잭션과 잠금, 백은빈, 이성욱
Isolation Level, MySQL

- - + + \ No newline at end of file diff --git a/tags/web-socket.html b/tags/web-socket.html index 30b6ca4f7..8908da83a 100644 --- a/tags/web-socket.html +++ b/tags/web-socket.html @@ -13,12 +13,12 @@ - - + +
-

"WebSocket" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

웹소켓

단일 TCP 연결을 통해 클라이언트와 서버 간 전이중 양방향 통신을 지원하는 프로토콜
+

"WebSocket" 태그로 연결된 1개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

웹소켓

단일 TCP 연결을 통해 클라이언트와 서버 간 전이중 양방향 통신을 지원하는 프로토콜
웹 환경에서 연속된 데이터를 실시간으로 처리할 수 있다.

웹소켓은 HTTP의 포트를 그대로 사용하고 각각 포트 80과 포트 443을 사용하여 HTTP(ws://) 및 HTTPS(wss://)로 서버에 연결한다.

웹소켓 등장 배경

웹소켓이 등장하기 이전, 실시간성을 보장하기 위해 Polling, Streaming 같은 기술을 사용했어야 했다.
이는 실시간성이나 양방향성을 만족시키지 못했고, HTTP를 이용하기 때문에 과도한 오버헤드가 발생했다.

웹소켓의 동작

1. Upgrade 요청

WebSocket 프로토콜로 전환하는 HTTP 요청을 보낸다.
이는 HTTP와 같이 80, 443 포트를 사용한다.
@@ -32,7 +32,7 @@ https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications
https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
https://docs.spring.io/spring-framework/reference/web/websocket.html

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse.html b/tags/woowahan-techcourse.html index 8f84eea74..7621425aa 100644 --- a/tags/woowahan-techcourse.html +++ b/tags/woowahan-techcourse.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 3분

23년의 6월이 오고, 레벨 2가 끝났다.
빠르게 지나가서 조금 아쉽다.

학습

회고를 작성하기 전에 레벨 2 동안 보냈던 PR과 회고를 쭉 읽어봤다.
항상 아쉬운 곳은 있기 마련이지만, 잘 학습한 것 같다.
미션을 하면서 기술을 어떻게 선택하고, 적용할 것인지 고민하는 과정에서 꽤나 많은 성장을 한 것 같다.

고민은 깊었지만 이론적인 학습이 부족한 레벨 2였다.
@@ -29,7 +29,7 @@ 이번에는 프런트엔드 크루와 협업을 했다. 소통은 잘 된 것 같지만 API 명세를 정하는 부분이 아직 미숙한 것 같다.

레벨 3 때부터 본격적으로 프로젝트가 시작된다.
팀을 위해 어떤 것을 할 수 있을지 고민을 많이 해봐야겠다.

레벨 2를 마무리하며

회고 작성하면서 레벨 2에서 했던 것들을 반추해 봤는데 부족한 점은 많았어도 좋은 방향으로 가고 있는 것 같다. 읽고 싶은 책도 읽고, 부족한 부분 채우면서 쉬어야겠다.

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/10.html b/tags/woowahan-techcourse/page/10.html index 0983b741d..94722390f 100644 --- a/tags/woowahan-techcourse/page/10.html +++ b/tags/woowahan-techcourse/page/10.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 11분

사다리 타기

사다리 타기 미션에서는 우가와 페어가 매칭되었다.
이전 미션과 달리 TDD로 진행하는 것이 필수였기 때문에 익숙하지 않았지만, 우가와 미션에 관한 소통이 잘 되어서 큰 문제 없이 미션을 마무리할 수 있었다.

우가와 이야기가 잘 통해서 그런지 1단계는 크게 어렵지 않게 진행할 수 있었는데, 2단계에서 많이 고전한 것 같다.

2단계에서는 2가지 방법으로 구현해봤다.

  1. LadderGame에서 Position 기준으로 사다리 게임을 진행하는 방법
  2. Player에게 Ladder를 넘겨서 Ladder에게 Position을 넘겨주며 메시지를 보내는 방법

Position 기준으로 사다리 게임을 진행하는 방법

사실상 index를 Ladder에게 넘겨주고, 해당 index에 대한 결과를 받는 방법과 유사했다.
구현하고 나니 다른 클래스들이 Position에 대한 의존도가 너무 높은 것 같았다.
또한 Players가 별다른 책임을 가지고 있지 않다고 느꼈다.

public LadderGameResult play() {
final Map<Player, Item> result = new LinkedHashMap<>();
// 사용자 수만큼 Position을 가져와서 사다리 게임을 진행한다.
for (Position position : Position.range(players.count())) {
final Position resultPosition = ladder.play(position);
result.put(players.get(position), items.get(resultPosition));
}
return new LadderGameResult(result);
}

Player에게 Ladder를 전달하여 게임을 진행하는 방법

Position에 대한 값을 가지고 있는 Player에게 Ladder를 넘겨서, Player가 Ladder에게 메시지를 보내도록 구현하였다.
@@ -50,7 +50,7 @@ 또한 페어 진행이 느린 것 같다고 말해줘서 안정적으로 시간 안에 미션을 완료할 수 있었다.
페어프로그래밍 진행 속도에 대해 조금 더 생각을 해봐야겠다!

항상 지나갈 때마다 웃어주는데, 나도 자주 웃어야겠다고 생각했다.
웃는 것만으로도 사람이 밝아 보여서 너무 좋은 것 같다!

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/11.html b/tags/woowahan-techcourse/page/11.html index ac338226d..a122fcc71 100644 --- a/tags/woowahan-techcourse/page/11.html +++ b/tags/woowahan-techcourse/page/11.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

자동차 경주

자동차 경주 미션에서는 다즐과 페어가 매칭되었다.
우테코 들어와서 첫 페어프로그래밍이라 많이 떨렸지만, 다즐이 대화를 잘 이끌어줘 너무 즐거웠다.

첫날은 간단히 컨벤션과 환경을 설정하는 시간을 가졌고 다음 날부터 자동차 경주를 시작했다.
시작은 간단하게 요구사항을 정리하고, 어떻게 코드를 작성할지 같이 고민했다.

시작하기 전 아래와 같이 mermaid를 이용하여 의존성 방향에 대해서 간단한 다이어그램을 만들고 시작했다.
mermaid는 코드로 다이어그램을 생성 해주는 도구로 다음과 같은 장점이 있다고 생각한다.

  • 코드 기반이라 빠른 시간 안에 생각한 것을 시각화할 수 있다.
  • github에서 mermaid를 지원하기 때문에 리뷰어에게 코드를 이해할 수 있는 부가적인 정보를 제공할 수 있다.

미션을 진행하는 데 큰 어려움이 있지는 않았고, 페어를 마치기 전 서로 고민되는 부분을 정리했을 때 좋았다.

페어하면서 잘했다고 생각했던 점은 서로의 생각과 리뷰 받은 것을 공유한 것이다.
@@ -44,7 +44,7 @@ 그래서 즐거운 마음으로 페어 프로그래밍을 했었던 것 같다.

어떤 이유 때문인지 모르겠지만 같이 페어하는데 편한 마음이 들었다.
이건 바로 배울 수 없지만.
나도 같이 일할 때 편한 사람, 같이 일하고 싶은 사람이 되기 위해 깊이 고민해봐야겠다.

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/2.html b/tags/woowahan-techcourse/page/2.html index 33fc82634..c7bdfe71f 100644 --- a/tags/woowahan-techcourse/page/2.html +++ b/tags/woowahan-techcourse/page/2.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

레벨 인터뷰

레벨 1 때는 준비해둔 내용으로 인터뷰를 진행해서 그렇게 특별한 부분이 없었다.
따라서 레벨 1 레벨 인터뷰 회고는 레벨 1 회고를 작성할 때 끼워넣었다.
이번에는 범위도 제한되어 있어 어떻게 준비해야 할지 당황했고, 답변에도 부족한 부분이 많았었다.
기억이 사라지기 전에 큰 문제 없이 답변한 내용을 제외하고, 기억 남는 것 위주로 작성해 보려고 한다.

API 문서 도구 선택

큰 문제 없이 답변을 했는데 앞으로도 팀 프로젝트를 하면서 도움 될 것 같은 내용이 있어서 남겨두려고 한다.
@@ -31,7 +31,7 @@ 생각할 시간을 가졌을 때 "다시 말씀드려도 될까요?"라고 말하고 답변을 이어나가기
기술적으로 깊이가 부족하다고 생각이 많이 들어서 조금 더 깊게 공부하고 정리하기
이전에 공부했던거 되돌아 보는 시간 가지기

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/3.html b/tags/woowahan-techcourse/page/3.html index 86cb49407..b9dab39c0 100644 --- a/tags/woowahan-techcourse/page/3.html +++ b/tags/woowahan-techcourse/page/3.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

장바구니 주문 미션

배포 및 협업을 할 수 있는 미션이었다.
마코, 우가, 우코, 우스 그리고 나까지 합쳐서 5명이 한 팀이 되었다.

배포

이전 미션들과 달리 AWS를 이용해 배포를 해야 했다.
각자 하나의 EC2 인스턴스를 제공받을 수 있었고, 팀 별로 DB를 위한 추가 인스턴스를 제공받았다.
배포 스크립트를 작성하는 경험을 해볼 수 있었다.
@@ -35,7 +35,7 @@ 추가로 현업에서는 고가용성 내결함성 등을 위하여 클러스터를 구성하여 사용하는 경우가 많고, 이 경우 readOnly 설정이 되어있다면 읽기 전용 DB로 질의가 들어가서 부하 분산의 효과가 있다고 한다.

DAO에 @Transactional 적용

DAO에 트랜잭션을 보장해 보는 건 어떻겠냐고 리뷰가 달려서 고민을 많이 했다.
Service 계층에 이미 트랜잭션을 보장해 주고 있기에 필요 없지 않을까 생각했었다.
DAO를 다른 곳에서 사용하더라도 트랜잭션을 보장하기 위해(확장성 고려) @Transactional을 적용하는 것도 괜찮은 것 같다.

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/4.html b/tags/woowahan-techcourse/page/4.html index d12abd9e0..6ccfcafa4 100644 --- a/tags/woowahan-techcourse/page/4.html +++ b/tags/woowahan-techcourse/page/4.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

지하철 미션

점점 일정이 많아지는 느낌이 들면서 회고가 늦어진다.
지하철 미션은 밀리랑 페어를 진행했다.
간단한 CRUD만 있던 이전 미션들과 달리, 조금 복잡한 도메인 요구사항이 있었다.
이때 API, 테이블, 도메인 설계를 해야 했는데 어떤 것부터 해야 할지 고민을 많이 했다.
@@ -39,7 +39,7 @@ 또한 코딩할 때 내가 평소에 사용하는 코딩 컨벤션에 맞춰주는 것 같아서 페어 할 때 편했다!

편한 분위기

전체적으로 페어 할 때 편하게 진행했던 것 같다.
일정도 그렇고, 페어 진행할 때도 그렇고 큰 문제가 없었던 것 같아서 좋았다.
나는 과연 다른 사람들에게 편한 사람일까?

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/5.html b/tags/woowahan-techcourse/page/5.html index 085f8a39f..70765ffd2 100644 --- a/tags/woowahan-techcourse/page/5.html +++ b/tags/woowahan-techcourse/page/5.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 5분

웹 장바구니 미션

장바구니 미션은 블랙캣이랑 진행했다.
요구사항이 엄청 복잡한 미션은 아니었고, 스프링을 사용하여 기본적인 CRUD를 구현하는 미션이었다.
2단계에서는 Basic 인증을 통해 자신의 장바구니에만 상품을 담고, 제거할 수 있도록 구현하는 요구사항이 추가되었다.
Interceptor나 Argument Resolver에 대한 이해도가 높지 않았는데, 이번 미션을 통해 조금 더 알아간 느낌이다.
@@ -32,7 +32,7 @@ 추가적으로 이모지를 적극적으로 사용하여 더욱 좋았다!

의견 일치시키기

페어 시간은 한정되어 있고, 기간 내 요구사항을 만족해야 한다.
따라서 적당히 타협을 봐서 의견을 빠르게 수용해 데드라인을 맞추는 것도 중요하다고 생각한다.
블랙캣은 내 의견을 잘 들어줬고, 덕분에 막히는 부분 없이 빠르게 미션을 진행할 수 있었다.

빨리 친해졌고, 의사소통이 잘 돼서 재밌게 코딩할 수 있었다!

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/6.html b/tags/woowahan-techcourse/page/6.html index 4fa08bcf3..50e6bfe50 100644 --- a/tags/woowahan-techcourse/page/6.html +++ b/tags/woowahan-techcourse/page/6.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

웹 자동차 미션

사이드 프로젝트를 한다고 시간이 많이 없어서 회고가 늦어졌다.
웹 자동차 미션에서는 비버와 페어가 매칭되었다.
레벨 2에서 진행하는 첫 미션이라 많이 긴장되었지만, 그래도 비버랑 초반에 맛있는 것도 많이 먹으면서 빨리 친해져서 재밌게 할 수 있었다.

스프링을 조금 사용할 줄 알아서, 비버랑 같이 학습하면서 미션을 진행했다.
첫 미션이라 그런지 특별한 부분은 없었고, 최대한 깔끔하게 작성하려고 노력했다.
@@ -37,7 +37,7 @@ 추가적으로 알고 싶은 부분을 따로 학습하는 열정이 좋다고 생각했다.
비버와 스프링에 대해 알아가는 시간을 많이 가진 부분이 매우 좋았다.
나도 5월부터 조금 더 화이팅 해야겠다.

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/7.html b/tags/woowahan-techcourse/page/7.html index f546c827f..21ee72064 100644 --- a/tags/woowahan-techcourse/page/7.html +++ b/tags/woowahan-techcourse/page/7.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

레벨 1이 끝났다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

레벨 1이 끝났다.
우테코를 시작하기 전 내가 정해두었던 목표 이상으로 달성했기 때문에 매우 만족스럽다.
혼자 독학을 할 땐 이 방향으로 공부하는 게 맞는지 계속 반추하다 결국 무기력함에 빠져들었다.
하지만 이제는 같이 공부할 사람도 있고, 이야기할 사람도 있기 때문에 즐기는 일만 남은 것 같다.

Keep

나만의 루틴 만들기

스스로가 외부의 영향을 많이 받는다고 생각한다.
@@ -50,7 +50,7 @@ 블로그에 기술적인 부분을 많이 정리하지 않았는데, 조금 더 깊게 공부하고 정리하는 시간도 가져야겠다.

레벨 1을 마무리하며

시간이 빠르게 흘러갔다.
타인에게 좋은 영향을 주기위해, 방학동안 나를 챙기는 시간을 가져야겠다.
또한 함께 일하고 싶은 사람을 목표로 앞으로도 꾸준히 의식적 노력을 해야겠다.

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/8.html b/tags/woowahan-techcourse/page/8.html index da15d0225..e01acd065 100644 --- a/tags/woowahan-techcourse/page/8.html +++ b/tags/woowahan-techcourse/page/8.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분

체스

체스 미션에는 가비와 페어가 매칭되었다!
체스는 이전 미션들보다 훨씬 복잡한 도메인이었다.
하지만 가비와 나는 체스 도메인이 익숙해서 더 편한 마음으로 시작할 수 있었다.
미션을 진행하면서 어려웠던 부분은 기물의 이동, 이동시 경로에 기물이 존재하는지 확인하는 부분이었다.

가비가 집에가서도 기물의 이동 관련해 생각 정리한 글을 보내줘서 더욱 빨리 진행할 수 있었다.
@@ -53,7 +53,7 @@ 모르는게 있으면 솔직하게 말해주는 부분
나의 의견을 정리하지 못한 상태로 전달할 때 이해가 안되었다고 정확히 전달해주는 부분
솔직함은 페어할 때 중요한 부분인 것 같다.

마지막으로 찰리🍫 체스 미션때 꼼꼼하게 리뷰 남겨주셔서 감사합니다!

- - + + \ No newline at end of file diff --git a/tags/woowahan-techcourse/page/9.html b/tags/woowahan-techcourse/page/9.html index 96f46616a..287254c08 100644 --- a/tags/woowahan-techcourse/page/9.html +++ b/tags/woowahan-techcourse/page/9.html @@ -13,12 +13,12 @@ - - + +
-

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
+

"Woowahan Techcourse" 태그로 연결된 11개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 6분

블랙잭

블랙잭 미션에서는 후추와 페어(조미료 듀오?)가 매칭되었다.
이번에는 실수하지 않고, 바로 미션을 진행하지 않고 친해지기 부터 시작했다.

블랙잭은 구현해야 될 내용이 많아 시간이 많이 부족할 것 같았지만
후추와 함께 전략적(삼일절에 미션 이야기 나누기)으로 미션을 진행해 시간 내에 제출할 수 있었다.

미션을 끝나고 회고를 했을 때 후추가 고민거리를 하나 내줬다.
"페어를 진행할 때 압박감을 느끼는 페어가 있다면 허브가 해줄 수 있는게 뭐가 있을까?"

곰곰히 생각해봤지만 쉽게 답을 내릴 수 없었다.
@@ -48,7 +48,7 @@ 회고때도 서로 솔직하게 의견을 주고 받아서 좋았다.

도메인 언어에 신경쓰는 부분
클래스명, 변수명과 같은 언어를 세심하게 신경쓴다.
요구사항 정리도 깔끔하게 잘하는 것 같다.

후추 최고 👍

- - + + \ No newline at end of file