Skip to content

Gomding/2021-nolto

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿงธ ๋†€ํ† (Nolto) ์†Œ๊ฐœ

2021.07 ~ ํ˜„์žฌ
์ดˆ๊ธฐ ๊ฐœ๋ฐœ์ธ์› : 6๋ช… (ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž 2๋ช…, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž 4๋ช…)
https://nolto.app

๋†€ํ† ๋Š” ์•„๋งˆ์ถ”์–ด ๊ฐœ๋ฐœ์ž๋„ ๋ถ€๋‹ด์—†์ด ์ž์‹ ์˜ ์†Œ์ค‘ํ•œ ํ† ์ดํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

image


๐Ÿ“š๋ชฉ์ฐจ


๐Ÿ”ง์‚ฌ์šฉ ๊ธฐ์ˆ  ์Šคํƒ

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

  • Back-End
    • Java8 / Spring Boot 2.5.2 / JPA
    • Gradle
    • MariaDB 10.5.12 / Jacoco 0.8.5 / Redis 4.0.9
  • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ
    • JUnit5, Mockito
    • H2
  • ๋ฌธ์„œํ™” ๋„๊ตฌ
    • Spring Restdocs

๐Ÿง‘๐Ÿปโ€๐Ÿ”ง ๋‹ด๋‹น ์—ญํ• 

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

  • Java, Spring Boot, JPA๋ฅผ ์‚ฌ์šฉ, API ์„œ๋ฒ„ ์„ค๊ณ„/๊ฐœ๋ฐœ
  • ๋Œ“๊ธ€ CRUD API ์„ค๊ณ„/๊ตฌํ˜„
  • OAuth ํ™œ์šฉ ์†Œ์…œ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • Github, Google ๋กœ๊ทธ์ธ ๊ตฌํ˜„
    • ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(Kakao, Naver.. ๋“ฑ๋“ฑ) ์ถ”๊ฐ€์— ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„
  • DB์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ์œ„ํ•œ Replication ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • ํ™”๋ฉด ์‘๋‹ต ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ gif -> mp4 ํŒŒ์ผ ๋ณ€ํ™˜
  • ์ธํ”„๋ผ ๊ตฌ์ถ•
    • Jenkins CI/CD ํ™˜๊ฒฝ ๊ตฌ์ถ•
    • Nginx ํ™œ์šฉ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„ ๊ตฌ์ถ•

๐Ÿง ํŒ€ ๊ฐœ๋ฐœ ๋ฐฉ์‹

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

  • ๋งค์ผ ์•„์นจ 10์‹œ ๋ฐ์ผ๋ฆฌ ๋ฏธํŒ…์—์„œ ์ž์‹ ์˜ ์ƒํƒœ์™€ ์–ด์ œ ํ–ˆ๋˜ ์ž‘์—…์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—… ๋ถ„๋ฐฐ๊ฐ€ ์•ˆ๋œ ์ƒํƒœ๋ฉด ์˜ค์ „์‹œ๊ฐ„์— ์ž‘์—…์„ ๋ถ„๋ฐฐํ•˜๊ณ  ๊ธฐํ•œ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์™„๋ฃŒํ•œ ์ž‘์—…์€ PR์„ ์ƒ์„ฑํ•˜์—ฌ ์ฝ”๋“œ๋ฆฌ๋ทฐ ์š”์ฒญ.
  • ์ž‘์—… ๊ธฐ๊ฐ„์ด ๋๋‚˜๋ฉด ํ•จ๊ป˜ ๋ชจ์—ฌ์„œ ๊ฐ์ž ๊ตฌํ˜„์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  Develop ๋ธŒ๋žœ์น˜์— Mergeํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋žœ์น˜ ์ „๋žต์œผ๋กœ git-flow ์ „๋žต์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ‘ซ ์—”ํ‹ฐํ‹ฐ ์—ฐ๊ด€๊ด€๊ณ„

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

  • ํ•ต์‹ฌ ์—”ํ‹ฐํ‹ฐ
    • User(๋†€ํ† ์˜ ์‚ฌ์šฉ์ž)
    • Feed(ํ† ์ด ํ”„๋กœ์ ํŠธ ๊ณต์œ  ๊ธ€)
    • Like(๊ธ€์— ๋Œ€ํ•œ ์ข‹์•„์š”)
    • Tech(๊ธฐ์ˆ  ์Šคํƒ)
    • Comment(๊ธ€์— ๋Œ€ํ•œ ๋Œ“๊ธ€)
    • Reply(๋Œ“๊ธ€์— ๋Œ€ํ•œ ๋Œ€๋Œ“๊ธ€)
    • CommentLike(๋Œ“๊ธ€์— ๋Œ€ํ•œ ์ข‹์•„์š”)
    • Notification(์•Œ๋žŒ, ์œ ์ €์˜ ์ƒํ˜ธ์ž‘์šฉ์— ์˜ํ•ด ์ปจํ…์ธ ์˜ ์ฃผ์ธ(์œ ์ €)์—๊ฒŒ ๊ฐ€๋Š” ์•Œ๋žŒ)
      • ex. xxx๋‹˜์˜ xxx ๊ธ€์— ๋Œ“๊ธ€์ด ๋‹ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

erd


๐Ÿ— ์ธํ”„๋ผ

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

  • ํ”„๋ก ํŠธ์—”๋“œ ์ธํ”„๋ผ
    ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ์‚ฌ์šฉ. (์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ํ†ตํ•ด ํ™”๋ฉด ๋กœ๋”ฉ์„ ๋น ๋ฅด๊ฒŒ ํ•จ, ์ดํ›„์—๋Š” JSํŒŒ์ผ์ด ๋กœ๋“œ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ํŽ˜์ด์ง€ ์ด๋™์€ SPA๋ฅผ ์‚ฌ์šฉ)

  • ๋ฐฑ์—”๋“œ ์ธํ”„๋ผ
    Nginx๋ฅผ ํ™œ์šฉ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑ. ์™ธ๋ถ€์˜ ์š”์ฒญ์€ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ์š”์ฒญ(SSL ์š”์ฒญ์˜ ์•”๋ณตํ˜ธํ™”๋„ ๋‹ด๋‹น ssl termination)
    AWS EC2 ์ธ์Šคํ„ด์Šค๋กœ 2๋Œ€์˜ WAS ๊ตฌ์„ฑ(Java, Spring ์„œ๋ฒ„). Nginx์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ๋‹ด๋‹น.
    Refresh Token ์ €์žฅ์„ ๋‹ด๋‹นํ•˜๋Š” Redis ์‚ฌ์šฉ
    ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋กœ AWS S3 ๋ฒ„ํ‚ท์„ ์‚ฌ์šฉ(CloudFront ํ•จ๊ป˜ ์‚ฌ์šฉ)
    AWS EC2 ์ธ์Šคํ„ด์Šค๋กœ DB์„œ๋ฒ„ ์‚ฌ์šฉ(MariaDB). Replication ํ™˜๊ฒฝ ๊ตฌ์ถ• (MasterDB 1๋Œ€, SlaveDB 1๋Œ€)

image


๐Ÿคต๐Ÿป CI/CD ํ”„๋กœ์„ธ์Šค

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Jenkins์™€ Github๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„
๋†€ํ†  Github ์ €์žฅ์†Œ์˜ main ๋ธŒ๋žœ์น˜ ๋˜๋Š” develop ๋ธŒ๋žœ์น˜์— merge๋ฅผ ํŠธ๋ฆฌ๊ฑฐ๋กœ CI/CD๊ฐ€ ๋™์ž‘
ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ๊ฐ€ ์‹คํŒจ์—†์ด ์™„๋ฃŒ๋˜๋ฉด ๋นŒ๋“œ๋œ jar ํŒŒ์ผ์„ SFTP๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์— ์ „์†กํ•˜๊ณ  ์„œ๋ฒ„์˜ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ (๋ฐฑ์—”๋“œ ๊ธฐ์ค€, ํ”„๋ก ํŠธ์—”๋“œ๋„ ๋ณ„๋กœ์˜ job์œผ๋กœ CD๋ฅผ ์ง„ํ–‰)

image


๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ๋‹ด๋‹น ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋‚ด์šฉ

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๋Œ“๊ธ€ CRUD API ์„ค๊ณ„/๊ตฌํ˜„

ํ† ์ดํ”„๋กœ์ ํŠธ ๊ธ€์— ๋Œ€ํ•œ ๋Œ“๊ธ€ CRUD API ๊ตฌํ˜„ ๋ฐ Restdocs ํ™œ์šฉ API ๋ช…์„ธ ๋ฌธ์„œํ™”.
๋Œ“๊ธ€ ์‚ญ์ œ ๋กœ์ง์— ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๊ฒฝํ—˜.(JPA์—์„œ cascade์™€ ophanRemoval ์˜ต์…˜์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ)
cascade, orphanRemoval์„ ์ž˜ ์ดํ•ดํ•˜๊ธฐ์œ„ํ•ด ๋น„์Šทํ•œ Entity ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ•™์Šต ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰.
ํ•™์Šตํ…Œ์ŠคํŠธ๋กœ ์ด๋ฅผ ์ฆ๋ช…ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ๋น ๋ฅด๊ฒŒ cascade, orphanRemoval์˜ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์Šต๋“.

์ž˜๋ชป ์‚ฌ์šฉ๋œ ๊ณผ์ •
์œ ์ €๋Š” ๋Œ“๊ธ€๊ณผ OneToMany๊ด€๊ณ„. CascadeType.ALL, orphanRemoval = true ์ ์šฉ.
๋Œ“๊ธ€์€ ๋Œ€๋Œ“๊ธ€๊ณผ OneToMany ๊ด€๊ณ„. CascadeType.ALL, orphanRemoval = true ์ ์šฉ.

  1. ๋Œ“๊ธ€ ์‚ญ์ œ -> ๋Œ“๊ธ€์ด ํฌํ•จํ•˜๋Š” ๋Œ€๋Œ“๊ธ€์— Removed ์ƒํƒœ ์ „ํŒŒ
  2. ์œ ์ €๊ฐ€ ๊ฐ€์ง€๋Š” ๋Œ€๋Œ“๊ธ€์ด ์กด์žฌ -> flush()๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋Œ€๋Œ“๊ธ€ ์ƒํƒœ๊ฐ€ Persist ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
  3. ๋Œ€๋Œ“๊ธ€์ด ์‚ญ์ œ๋˜์ง€ ์•Š์Œ -> ๋Œ€๋Œ“๊ธ€์ด ๋Œ“๊ธ€์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์‚ญ์ œ๊ฐ€ ๋˜์ง€์•Š์Œ

ํ•ด๋‹น ์ด์Šˆ์—์„œ๋Š” CascadeType.Remove๋งŒ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

comment


OAuth ํ™œ์šฉ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋‹ค๋ฅธ ์†Œ์…œ ๋กœ๊ทธ์ธ๋„ ์œ ์—ฐํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ์„ค๊ณ„๋ฅผ ๊ตฌํ˜„. ์ด๋ฅผ ์œ„ํ•ด Layered Architecture ๊ตฌ์กฐ์™€ ์ถ”์ƒํ™”๋ฅผ ์ ๊ทน ํ™œ์šฉ.
๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์ธ์ฆ๋ฐ›๋Š” ๊ณผ์ •๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›๋Š” ๊ณผ์ •์€ ์™ธ๋ถ€์™€ ์ƒํ˜ธ์ž‘์šฉ์ด๋ฏ€๋กœ infrastructure layer์— ๊ตฌํ˜„์ฒด๋ฅผ ์ž‘์„ฑ.
service layer๋Š” ์ ์ ˆํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒ(๊ตฌํ˜„์ฒด๋“ค์€ List ์•ˆ์— ๋ชจ๋“  ๋นˆ์„ ์ฃผ์ž…๋ฐ›๋„๋ก ๊ตฌํ˜„). ๊ตฌํ˜„์ฒด์— ๋ฉ”์„ธ์ง€ ์ „๋‹ฌ.
๊ตฌํ˜„์ฒด ์„ ํƒ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ตฌํ˜„์ฒด๋“ค์„ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์ ์ ˆํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” Providerํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ SocialType๊ณผ Oauth๊ตฌํ˜„์ฒด๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ.


ํ™”๋ฉด์‘๋‹ต ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ gif -> mp4 ํŒŒ์ผ ๋ณ€ํ™˜

ํ† ์ด ํ”„๋กœ์ ํŠธ ๊ณต์œ  ๊ธ€์˜ ๋Œ€ํ‘œ ์ด๋ฏธ์ง€๋กœ ๋™์ ์ธ ์ด๋ฏธ์ง€๋ฅผ ์›ํ•˜๋Š” ์œ ์ €๋ฅผ ๋งŒ์กฑ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด gif ํŒŒ์ผ๋„ ์—…๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„.

gif ํŒŒ์ผ ์šฉ๋Ÿ‰์ด ์ปค์„œ ํ™”๋ฉด ์‘๋‹ต ์„ฑ๋Šฅ์ด ํ•˜๋ฝ๋จ์„ ํ™•์ธ(gif์˜ ๊ฒฝ์šฐ 30๋…„์ด ๋„˜์€ ๊ธฐ์ˆ ๋กœ ์••์ถ•๋ฅ ์ด ๋‚ฎ์Œ). ๋ณ€ํ™˜ํ•  ๋Œ€์ฒด ํŒŒ์ผ ํฌ๋งท์„ ๊ฒ€์ƒ‰.
WebP, Gif, WebM 3๊ฐ€์ง€ ํฌ๋งท์ด ์žˆ๋Š”๋ฐ ์••์ถ•๋ฅ ์€ WebP < MP4 < WebM ์ˆœ์œผ๋กœ ๋†’์Œ.
WebP, WebM ๊ฐ™์€ ๊ฒฝ์šฐ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์žˆ์–ด์„œ ์ œ์™ธ, ์••์ถ•๋ฅ ๋„ ์ ๋‹นํ•˜๊ณ  ๊ฑฐ์˜ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜๋Š” MP4 ์ฑ„ํƒ.
๋™์˜์ƒ ๋ณ€ํ™˜ ๊ตฌํ˜„ ๋ฐฉ์‹์€ ์™ธ๋ถ€ API์— ์š”์ฒญ์„ ๋ณด๋‚ผ์ง€, ๋‚ด๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•ด์„œ ๋ณ€ํ™˜ํ• ์ง€ ๊ณ ๋ฏผ.
ํ”„๋กœ์ ํŠธ ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ, ์™ธ๋ถ€ API ์š”์ฒญ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์›์ธ์ด ์™ธ๋ถ€์— ์žˆ์œผ๋ฏ€๋กœ ์ปจํŠธ๋กค์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜(FFmpeg ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ํ”„๋ ˆ์ž„์›Œํฌ)ํ•ด์„œ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„.

ํ•ด๋‹น Convert ๊ธฐ๋Šฅ์œผ๋กœ 3.6MB gif ํŒŒ์ผ์„ 0.07MB์˜ mp4 ํŒŒ์ผ๋กœ ๋ณ€ํ™˜. ํ‰๊ท ์ ์œผ๋กœ 50%~60% ์••์ถ•๋ฅ ์„ ๋ณด์—ฌ์คŒ.


๐Ÿš€ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‚ฌ๋ก€

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๋ฌธ์ œ์ƒํ™ฉ - gif -> mp4 ํŒŒ์ผ ๋ณ€ํ™˜ ๊ตฌํ˜„ ํ›„ ํ™˜๊ฒฝ ์„ค์ •์˜ ํ•„์š”๋กœ ๊ฐœ๋ฐœ์ž์˜ ์ถ”๊ฐ€ ํ™˜๊ฒฝ์„ค์ • ๋ฐœ์ƒ

  • gif -> mp4 Convert ๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ›„ ๋ชจ๋“  local ํ™˜๊ฒฝ์—์„œ FFmpeg ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์„ค์ • ํŒŒ์ผ์— ๋ช…์‹œํ•ด์ค˜์•ผ ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. FFmpeg๋Š” ์„ค์น˜ ๋ฐฉ๋ฒ•, ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ ๊ฒฝ๋กœ๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ถˆํŽธํ•จ์„ ์ค๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ FFmpeg ์„ค์น˜๋„ local ํ™˜๊ฒฝ์— ํ•„์ˆ˜๋กœ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถˆํŽธํ•จ๋„ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

[์ ‘๊ทผ ๋ฐฉ๋ฒ• - 1]

  • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

FFmpeg๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€ ์˜์กด์„ฑ์— ํฌํ•จ์‹œ์ผœ์„œ ์‹คํ–‰์‹œํ‚ค๊ธฐ
FFmpeg์€ ์„ค์น˜ ํ•ด์•ผํ•˜์ง€๋งŒ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„

์ „์ž๋ฅผ ์šฐ์„ ์‹œํ•˜์—ฌ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ffmpeg๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณธ ๊ฒฐ๊ณผ javacpp์™€ javacv-platform ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ffmpeg๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

[ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• -1]
javacv-platform์€ ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ FFmpeg ํ”„๋กœ๊ทธ๋žจ์˜ jar๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. javacpp๋Š” JNI ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  C++ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ „๋‹ฌํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œ์‹œํ‚ต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์˜ ffmpeg๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์˜๋„ํ•œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ๊ทธ๋กœ์ธํ•ด ๋™๋ฃŒ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ถˆํŽธํ•จ์„ ์ฃผ๋Š” ๋ถ€๋ถ„์€ ์—†๋Š”์ง€ ์ฒดํฌํ•ด๋ด์•ผ ํ•œ๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.. ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ถ”๊ฐ€ ๋™์ž‘์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ž๋™ํ™” ํ• ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ตœ๋Œ€ํ•œ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


๋ฌธ์ œ์ƒํ™ฉ - ์œ ์ €๊ฐ€ gif ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์‹œ ์˜ค๋ฅ˜ (Java GifImageReader ๊ตฌํ˜„์˜ ์˜ค๋ฅ˜)

ํŠน์ • gif ์ด๋ฏธ์ง€๋ฅผ ์ธ๋„ค์ผ๋กœ ํ† ์ดํ”„๋กœ์ ํŠธ ๊ฒŒ์‹œ๊ธ€ ์—…๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•˜๋ฉด ์—…๋กœ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

[์ ‘๊ทผ ๋ฐฉ๋ฒ• - 2]
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๋‹ˆย ArrayIndexOutOfBoundsException: 4096ย ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ํด๋ž˜์Šค๋Š” GifImageReader ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ์˜ ์˜ˆ์™ธ ๋ฉ”์„ธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—๋Ÿฌ ์ถ”์ ๊ฒฐ๊ณผ ํ•ด๋‹น gifํŒŒ์ผ์˜ ์••์ถ•๋ฅ ์ด ๋†’์€๋ฐย java์—์„œ gif ๋””์ฝ”๋”ฉ ํ‘œ์ค€์„ ์œ„๋ฐ˜ํ•ด์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. gif ๋””์ฝ”๋”ฉ ๋ช…์„ธ๋Š” 4096 ์‚ฌ์ด์ฆˆ ์ด์ƒ์˜ ๋ฌธ์ž์—ด๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•˜๋Š”๋ฐ java์˜ GifImageReader๋Š” 4096 ์‚ฌ์ด์ฆˆ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์••์ถ•ํŒŒ์ผ์€ ๋””์ฝ”๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅ ํ–ˆ์Šต๋‹ˆ๋‹ค.

[ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• - 2]
ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ์•ž์„œ ์ด๋ฏธ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ์•„๋ดค๊ณ  ์•ž์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ GifDecoder ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
java๋„ ๋ถˆ์•ˆ์ •ํ•œ ๋ถ€๋ถ„์ด ์žˆ์Œ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ์˜ ๋ฏธ๋””์–ด์—๋Š” ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ๊ณ  ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๊ผผ๊ผผํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ์˜ˆ์™ธ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ™ˆ ์•„์‰ฌ์šด ์ 

๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

  1. ํ˜„์žฌ๋Š” ๋Œ“๊ธ€์‚ญ์ œ ์‹œ ๋Œ€๋Œ“๊ธ€๊นŒ์ง€ ๋ชจ๋‘ ๋ฌผ๋ฆฌ์  ์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ ์‚ญ์ œ์— ์˜ํ•ด์„œ ๋‚˜์˜ ๋Œ€๋Œ“๊ธ€์ด ์ง€์›Œ์ง€๋Š”๊ฑด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•„์‰ฌ์šด ๊ฒฝํ—˜์„ ์ค„๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ“๊ธ€ ์‚ญ์ œ๊ธฐ๋Šฅ์— ๋…ผ๋ฆฌ ์‚ญ์ œ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๋Œ“๊ธ€์ด ์‚ญ์ œ๋˜๋”๋ผ๋„ ๋Œ€๋Œ“๊ธ€์€ ๊ณ„์† ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ† ์ดํ”„๋กœ์ ํŠธ ํ”ผ๋“œ ์‚ญ์ œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ์š”! ๋ˆ„๊ตฐ๊ฐ€์—๊ฒ ํ”ผ๋“œ์— ๋‹ฌ์•˜๋˜ ํ”ผ๋“œ๋ฐฑ ๋Œ“๊ธ€์ด ํฐ ๋ฟŒ๋“ฏํ•จ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  2. ํ† ์ดํ”„๋กœ์ ํŠธ ๊ฒŒ์‹œ๊ธ€์„ ์˜ฌ๋ฆฌ๋Š” ๋ชฉ์ ์—๋Š” ์ž๋ž‘์ด๋‚˜ ๊ณต์œ ๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ ํ”ผ๋“œ๋ฐฑ์„ ๋ชฉ์ ์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ๋Œ“๊ธ€์„ ํ™œ์„ฑํ™”์‹œํ‚ค๋ฉด ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์ž์˜ ์„ฑ์žฅ์— ๋งŽ์€ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ† ์ดํ”„๋กœ์ ํŠธ ๊ฒŒ์‹œ๊ธ€์— ํ”ผ๋“œ๋ฐฑ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋Œ“๊ธ€ํƒ€์ž…์œผ๋กœ '๋„์™€์ค„๊ฒŒ์š”'๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์™€์ค„๊ฒŒ์š” ๋Œ“๊ธ€ ํƒ€์ž…์„ ๋งŽ์ด ๋‚จ๊ธฐ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋Œ“๊ธ€ ์ข‹์•„์š” ๊ฐ™์€ ์ˆ˜๋‹จ์œผ๋กœ ์ ์ˆ˜๋ฅผ ๋ถ€์—ฌํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋“ฑ๊ธ‰์„ ๋ถ€์—ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์„ฑ์ทจ๊ฐ์„ ์˜ฌ๋ ค์„œ ํ”ผ๋“œ๋ฐฑ ๋Œ“๊ธ€์˜ ํ™œ์„ฑํ™”์‹œํ‚ค๊ณ  ์ด๋Š” ๊ฐœ๋ฐœ์ž์˜ ์„ฑ์žฅ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!!
    (๋„ค์ด๋ฒ„ ์ง€์‹์ธ์˜ ํƒœ์–‘์‹  ๊ฐ™์€ ๋“ฑ๊ธ‰์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

  3. ํ”„๋กœ์ ํŠธ ํŒ€์› ๋ชจ์ง‘. ์ด ๊ธฐ๋Šฅ์€ ๋ฐ๋ชจ๋ฐ์ด์— ๋ฐ›์€ ํ”ผ๋“œ๋ฐฑ์ธ๋ฐ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์€๋ฐ ํ˜ผ์ž ๋งŒ๋“ค๊ธฐ๋Š” ์‹œ๊ฐ„๋„ ๋ถ€์กฑํ•˜๊ณ  ๊ธฐ์ˆ ์  ์ž์›๋„ ํ•œ์ •์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋†€ํ† ์—์„œ ํ† ์ดํ”„๋กœ์ ํŠธ ๋“œ๋ฆผํŒ€์„ ๋ชจ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํŒ€์› ๋ชจ์ง‘์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ํ† ์ดํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์„ฑ๋˜์–ด ๋†€ํ† ์— ์˜ฌ๋ ค์ง€๋ฉด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์—๊ฒŒ ์ข‹์€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ† ์ดํ”„๋กœ์ ํŠธ๋ฅผ ๋” ํ™œ์„ฑํ™”ํ•ด์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ข‹์€ ์„œ๋น„์Šค๊ฐ€ ํƒ„์ƒํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :)

  4. ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ ์˜ค์ „10์‹œ ~ ์˜คํ›„11์‹œ๊นŒ์ง€ ๊ฐœ๋ฐœ์ด ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. 2๊ฐœ์›”์ด ํ˜๋ €์„๋•Œ ํšŒ์‹์ž๋ฆฌ์—์„œ ๊ฐ์ •ํšŒ๊ณ ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ํŒ€์› ํ•œ๋ช…์ด ์ž‘์—…์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์•„ ํž˜๋“ค๋‹ค๊ณ  ์†”์งํ•˜๊ฒŒ ๋งํ•ด์คฌ์Šต๋‹ˆ๋‹ค.
    2๊ฐœ์›”์˜ ์‹œ๊ฐ„๋™์•ˆ ์ฐธ๊ณ ์žˆ์—ˆ์„ ํŒ€์›์—๊ฒŒ ๋„ˆ๋ฌด ๋ฏธ์•ˆํ•œ ๊ฐ์ •์ด ๋“ค์—ˆ๊ณ , ์ดํ›„์—๋Š” ๋งค์ฃผ ๊ธˆ์š”์ผ ๊ฐ์ •ํšŒ๊ณ ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๋ถˆํŽธํ•œ์ ์„ ์†”์งํ•˜๊ฒŒ ํ„ธ์–ด๋†“๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ •ํšŒ๊ณ ๋ฅผ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์— ๋„์ž…ํ–ˆ๋‹ค๋ฉด ์ด๋ฅผ ๋น ๋ฅด๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์—ˆ๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์„ํ…๋ฐ ์•„์‰ฌ์šด ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ •ํšŒ๊ณ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•จ๊ป˜ํ•˜๋Š” ๋™๋ฃŒ์˜ ๊ฐ์ •์„ ๋ฏธ๋ฆฌ ์ฑ™๊ธฐ์ง€ ๋ชปํ•œ ์ž˜๋ชป๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ˆ˜๊ฐ€ ์ข‹์•„ํ•˜๋Š” ํ™˜๊ฒฝ๋„ ์ข‹์ง€๋งŒ ์†Œ์ˆ˜๋ฅผ ์œ„ํ•œ ํ™˜๊ฒฝ ๋˜ํ•œ ๋ฐฐ๋ คํ•ด์ฃผ๋Š”๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงธ ๋†€ํ† : ๋†€๋Ÿฌ์˜ค์„ธ์š” ํ† ์ดํ”„๋กœ์ ํŠธ ๐ŸŽˆ

๋ถ€๋‹ด์—†์ด ์ž๋ž‘ํ•˜๋Š” ์ž‘๊ณ  ์†Œ์ค‘ํ•œ ๋‚ด ํ† ์ดํ”„๋กœ์ ํŠธ

์„œํˆฐ ํ”„๋กœ์ ํŠธ๋ผ๋„ ๋ˆ„๊ตฌ๋‚˜ ๋ฟŒ๋“ฏํ•˜๊ฒŒ ์ž๋ž‘ํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ณต๊ฐ„,

์—ฌ๊ธฐ๋Š” ๋†€ํ† ์ž…๋‹ˆ๋‹ค!

๐ŸŽฅ ๋†€ํ†  ์†Œ๊ฐœ ์˜์ƒ

nolto video

๐Ÿ™‹โ€โ™€๏ธ ๋†€ํ† ๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ๋“ค ๐Ÿ™‹โ€โ™‚๏ธ

์•„๋งˆ์ฐŒ ์กฐ์—˜ ํฌ๋ชจ ๋ฏธํ‚ค ์ง€๊ทธ ์ฐฐ๋ฆฌ



โš™๏ธ ๊ธฐ์ˆ  ์Šคํƒ โš™๏ธ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 62.3%
  • TypeScript 35.6%
  • JavaScript 1.7%
  • Other 0.4%