Post

2024-04-26-TIL

2024-04-26-TIL

Today I Learned

WebRTC(Web Real-Time Communication)

  • https://webrtc.org/?hl=ko
  • https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API
  • https://en.wikipedia.org/wiki/WebRTC
  • https://wormwlrm.github.io/2021/01/24/Introducing-WebRTC.html

Virtual Thread and MySQL

Java의 Virtual Thread로 작성해도 MySQL에서는 synchronized로 인식한다.

  • https://jaeyeong951.medium.com/virtual-thread-synchronized-x-6b19aaa09af1
  • https://d2.naver.com/helloworld/1203723

따닥방지

디바운싱과 쓰로틀링

  • https://medium.com/%EC%98%A4%EB%8A%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EB%94%94%EB%B0%94%EC%9A%B4%EC%8B%B1%EA%B3%BC-%EC%93%B0%EB%A1%9C%ED%8B%80%EB%A7%81-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-e02f6bb14627

Executors

  • https://learn.microsoft.com/ko-kr/dotnet/api/java.util.concurrent.executors?view=net-android-34.0

@TransactionalEventListener

트랜잭션이 끝나면 메시지를 보내도록 하고싶다면? 보통은 @Service가 붙은 서비스 클래스위에 상위 클래스를 두어서 주입받는 형태로 구현할 수 있고, 또 다른 방법으로는 @TransactionalEventListener를 붙인 이벤트 리스너를 구현하고 해당 이벤트를 통해서만 메시지를 전송하도록 하는것이다.

하지만 엄밀히 말하면 이 방법은 안티패턴이라고 볼 수 있다. 왜냐하면 이 방법에서는 메시지의 전송 보장수준까지 트랜잭션으로 묶을수는 없기 때문이다. 하지만 보통의 범용 애플리케이션에서는 DB 트랜잭션이 끝나는 시점(commit되는 시점) 이후에 메시지를 전송하기만 하면 충분하므로 위의 두 가지 방법으로도 충분하다.

  • https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-jta.html
  • https://www.ibm.com/docs/vi/i/7.3?topic=classes-jdbc-xa-distributed-transaction-management

File Upload with …

우선 파일 업로드 API를 별도로 구현할지 or 엔티티의 등록 및 수정 API와 동시에 요청할지를 고려해야한다. HTTP 규격 상 파일을 JSON 요청과 함께 전송하려면 Content-Type은 application/json으로는 용량제한상 불가능하다. 그래서 가장 많이 사용하는 유형이 multipart/form-data이다. 하지만 application/json 요청을 무조건 별도로 구성하고, 파일업로드는 별도의 API로 구성하고 싶다면?

파일 업로드 API를 별도로 구성하고 싶은데, 파일 경로에 ID가 반드시 들어간다면? 수정 시 해당 엔티티의 ID를 미리 조회해서 그 ID를 포함한 요청으로 파일 업로드 API를 호출할 수 있다. 하지만 등록 시에는 엔티티의 ID가 발급되기 이전이므로 파일 업로드 API를 바로 호출할수가 없다. 따라서 엔티티 등록 API를 먼저 호출하고 즉시 파일 업로드 API를 호출하거나, 파일 업로드 시 엔티티 ID가 필요없도록 구성해야한다. (파일 경로에 ID가 들어가는 등)

최근에는 FE에서 파일 업로드 API를 서버를 통해서 요청하지않고, 브라우저에서 AWS의 S3 버킷에 직접 업로드 하고 S3 Path를 받아와서 엔티티 등록 및 수정 API를 요청해서 Path를 매핑하는 경우가 많다.

  • https://www.youtube.com/watch?v=v2yJLMltX1Y

Cassandra vs Scylla

  • https://activewizards.com/blog/scylla-vs-cassandra/#:~:text=These%20databases%20use%20the%20same,when%20Cassandra%20is%20in%20Java.

동시성 문제 해결

  • https://velog.io/@this-is-spear/%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EA%B2%BD%ED%97%98

ReentrantLock

  • https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html

PostgreSQL Vacuum

PostgreSQL에는 Vacuum이라는 기능이 있는데, 이는 일종의 백업같은 기능이다. Dead Tuple이 누적되어서 성능이 저하되는 이슈가 발생할 수 있다고 한다. 따라서 PostgreSQL의 좋은 기능들이 많지만 반드시 잘 알고 사용해야하며 지속적인 모니터링이 필요하다.

  • https://techblog.woowahan.com/9478/
  • https://www.postgresql.org/docs/current/routine-vacuuming.html
  • https://nrise.github.io/posts/postgresql-autovacuum/
  • https://tech.inflab.com/202201-event-postmortem/
This post is licensed under CC BY 4.0 by the author.