Hello Ocean! ๐ŸŒผ

[TIL] ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์„ธ ๋ฒˆ์งธ ๊ณผ์ œ_RedBrick ๋ณธ๋ฌธ

TIL

[TIL] ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์„ธ ๋ฒˆ์งธ ๊ณผ์ œ_RedBrick

bba_dda 2021. 12. 12. 23:56
๋ฐ˜์‘ํ˜•

์„ธ ๋ฒˆ์งธ ๊ณผ์ œ ๐Ÿ”ฅ 

์„ธ ๋ฒˆ์งธ ๊ณผ์ œ๋Š” ๋ ˆ๋“œ๋ธŒ๋ฆญ์—์„œ ๋‚ด์ฃผ์‹  ๊ณผ์ œ์˜€๋‹ค.

๊ณผ์ œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ด๋ฒˆ ๊ณผ์ œ์˜ ํ•ต์‹ฌ์€ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜์ด์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ์—”ํ‹ฐํ‹ฐ๋“ค๋„ ๊ฐ‘์ž๊ธฐ ๋Š˜์–ด๋‚˜์„œ DB์„ค๊ณ„์—๋„ ๋งŽ์€ ๊ณ ๋ฏผ์ด ํ•„์š”ํ–ˆ๋‹ค.

 

Git Repository

 

GitHub - preOnboarding-Team13/Assignment-3-redbrick: ์œ„์ฝ”๋“œ x ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ 3๋ฒˆ์งธ ๊ณผ์ œ

์œ„์ฝ”๋“œ x ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ 3๋ฒˆ์งธ ๊ณผ์ œ. Contribute to preOnboarding-Team13/Assignment-3-redbrick development by creating an account on GitHub.

github.com

 

Socket ํ†ต์‹  ์ด์šฉ ๐Ÿš‰ 

์œ ์ €๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ, ์˜๋„์น˜ ์•Š๊ฒŒ ์‚ฌ์ดํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์ž‘์—… ๋‚ด์šฉ์ด ๋ณด์กด๋˜๋„๋ก ์ˆ˜์ •์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜์–ด์•ผ ํ–ˆ๋‹ค.

๊ณ ๋ฏผ 1. ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€? 

์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜๋ฉด์„œ, Socketํ†ต์‹ ์ด ๋– ์˜ค๋ฅด๊ธด ํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์…จ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ ˆ๋“œ๋ธŒ๋ฆญ์—์„œ ์„œ๋น„์Šค์ค‘์ธ ์œ„์ฆˆ๋žฉ์— ํšŒ์›๊ฐ€์ž…์„ ํ•ด์„œ, ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜์ด ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

ํ™•์ธ ๊ฒฐ๊ณผ, ํŽธ์ง‘์‚ฌํ•ญ์ด ์ƒ๊ธธ ๋•Œ ๋งˆ๋‹ค Socket ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. 

๋”ฐ๋ผ์„œ Socket ํ†ต์‹ ์„ ์‚ฌ์šฉํ• ๋งŒํ•œ ๋“ ๋“ ํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์ƒ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์—, Socket์„ ์ด์šฉํ–ˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ์ง์ ‘ ์‚ฌ์ดํŠธ์—์„œ ์–ด๋–ค ํ†ต์‹ ๋“ค์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€๋ฅผ ํ™•์ธํ•ด๋ณด๋Š” ๊ฒฝํ—˜์ด ์ฒ˜์Œ์ด๋ผ ์‹ ๊ธฐํ–ˆ๋‹ค.

 

๊ณ ๋ฏผ 2. ์–ด๋–ค '๋‹จ์œ„'๋กœ Socket ํ†ต์‹ ์„ ํ•  ๊ฒƒ์ธ๊ฐ€? 

์ด๋ฒˆ ๊ณผ์ œ์˜ ERD

ํŽธ์ง‘์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ ๋งˆ๋‹ค, ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ์„ ์ „์†กํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์—ˆ๊ฒ ์ง€๋งŒ

ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์”ฌ์„, ์”ฌ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šคํ”„๋ผ์ดํŠธ๋ฅผ, ์Šคํ”„๋ผ์ดํŠธ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ธ”๋Ÿญ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฝค๋‚˜ ๋ณต์žกํ•œ ๊ตฌ์กฐ์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ ๋‹จ์œ„๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค.

@WebSocketGateway({ namespace: "project" })
export class SocketGateway {
	constructor(
		@InjectModel(Project.name) private project: Model<ProjectDocument>
	) {}

	@SubscribeMessage("update")
	handleMessage(@MessageBody() data) {
		return this.project
			.findOneAndUpdate({ projectId: data.projectId }, data, {
				returnOriginal: false
			})
			.exec();
	}

	handleDisconnect(client: Socket) {
		console.log(`Client disconnected: ${client.id}`);
	}

	handleConnection(client: Socket) {
		console.log(`Client Connected: ${client.id}`);
	}
}

 

Test Code๐Ÿงช 

์ด๋ฒˆ ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ, ์ œ๋Œ€๋กœ ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

Game Module๊ด€๋ จ Unit Test์™€ E2E Test๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

E2E Test 

Postman์œผ๋กœ testํ•˜๋˜ ๊ฒƒ์„, ์ฝ”๋“œ๋กœ ์˜ฎ๊ธด๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค์–ด์„œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฌ์› ๋‹ค.

๋ฌผ๋ก , ์‹คํŒจ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด์„œ testํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์•˜์ง€๋งŒ Unit Test๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ์ˆ˜์›”ํ–ˆ๋‹ค.

 

Unit Test 

์ด๋ฒˆ ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ๋‹ด๋‹นํ–ˆ๋˜ ๋ถ€๋ถ„ ์ค‘์— ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์ด๋‹ค.

Unit Test๊ฐ€ ๋ญ”๊ฐ€? ๋ผ๋Š” ๊ณ ๋ฏผ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ

์‹ค์ œ ๊ตฌํ˜„ํ•  ๋•Œ mock ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉฐ,, ์–ด๋–ค ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ•ด์•ผํ•˜๋Š”์ง€๋„,, ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค.

 

์ž‘์„ฑํ•œ gameService Unit Test ์ฝ”๋“œ

 

๋น„๊ต์  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๊ฒฝํ—˜์ด ์žˆ์—ˆ๋˜ ํšจ๋ฏผ๋‹˜๊ป˜ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์งˆ๋ฌธํญํƒ„์„ ํ•˜๋ฉฐ ๊ฒจ์šฐ ์™„์„ฑํ•œ ์ฝ”๋“œ์ด๋‹ค. ใ…Žใ…Ž

 

์ด ๊ณผ์ œ๋ฅผ ๋๋‚ผ ๋•Œ ๊นŒ์ง€ ์ดํ•ดํ•œ ๋ถ€๋ถ„์œผ๋กœ๋Š”,

Unit Test ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฐ์ฒด์™€ ์˜์กด์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ mock ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.

mock ๊ฐ์ฒด๋Š” ๊ฐ€์งœ๋กœ ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

์—ฌ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์œผ๋กœ๋Š”,

Unit Test์—์„œ ์–ด๋–ค ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

expect()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ค ๊ฒƒ์„ ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š”๊ฐ€?

→ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ return๋  ๊ฐ’๋“ค์„ ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด ๋†“๊ณ , ์‹คํ–‰ ๊ฒฐ๊ณผ์™€ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ๋งž๋Š” ๊ฒƒ์ธ์ง€ ๊ต‰์žฅํ•œ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค. 

 

๋„ˆ๋ฌด ์–ด๋ ต๊ณ , ์ดํ•ด๋Š” ์•ˆ๋˜๊ณ , ๊ณผ์ œ ์‹œ๊ฐ„์€ ์ด‰๋ฐ•ํ•˜๊ณ  ใ…Žใ…Ž.. 

๊ทธ๋ž˜์„œ ์‚ฌ์‹ค ์ฝ”๋“œ๋ฅผ ์ค‘๊ฐ„์ •๋„ ์ž‘์„ฑํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” "๋ฐ”์œ๋ฐ ๊ตณ์ด ์ด๊ฒƒ๊นŒ์ง€ ํ•ด์•ผํ•˜๋‚˜?"๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. 

ํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ, ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ gameService์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. 

๊ทธ ๋•Œ ๊นจ๋‹ฌ์•˜๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ตฌ๋‚˜!

 

๊ทธ๋ž˜์„œ ์•ž์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ด€๋ จํ•ด์„œ ๊นŠ์ด ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ์•ˆ์ผํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. 

 

๋ฏธํกํ•œ ์ ์ด ๋งŽ์€ ์ฝ”๋“œ์ด์ง€๋งŒ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๊นŒ์ง€ ๋„์›€์„ ์ค€ ํšจ๋ฏผ๋‹˜์—๊ฒŒ ๋ชน์‹œ ๊ฐ์‚ฌํ•˜๋‹ค. 

 

Maximum Call Stack Error ๐Ÿ™ˆ 

๊ณ„ํšํ–ˆ๋˜ ๊ตฌํ˜„์„ ๋ชจ๋‘ ๋งˆ์น˜๊ณ , ์ƒˆ๋ฒฝ์— ์ „์ฒด์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ...!

์•…๋ชฝ์˜ ์ˆœ๊ฐ„

์„œ๋ฒ„์—์„œ Maximum Call Stack Error๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.. 

์‹ค์‹œ๊ฐ„์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ˆ˜์ •์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋Š”๋ฐ, ๊ณผ์ œ ์ œ์ถœ ์‹œ๊ฐ„์ด ์ด‰๋ฐ•ํ•˜์—ฌ, ์ด ๋ฌธ์ œ๋Š” ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ๋ชปํ–ˆ๋‹ค...

ํ•˜์ง€๋งŒ, Mongoose์—์„œ ์ปฌ๋ ‰์…˜๊ฐ„ ๊ด€๊ณ„ ์„ค์ •์„ ์ž˜๋ชปํ•ด์„œ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ์ถ”์ธก๋˜๊ณ  ์žˆ๋‹ค...

์ˆœํ™˜์ ์œผ๋กœ ๊ด€๊ณ„๊ฐ€ ์ฐธ์กฐ๋˜์–ด ์žˆ์–ด, ํƒ€๊ณ  ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉด์„œ call stack error๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š”..

์ด๋ฏธ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์ฝ”์Šค๋Š” ๋๋‚ฌ์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ ๊ฐœ์ธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

 

 

์†Œ๊ฐ ์—ด๋งˆ๋”” ๐Ÿคช 

Maximum Call Stack Error๋ฅผ ๋ฐœ๊ฒฌํ•œ ์‹œ์ ์—๋Š”, ๊ณผ์ œ ์ œ์ถœ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ์—๋Ÿฌ๋ฅผ ์ด์ œ์„œ์•ผ ๋ฐœ๊ฒฌํ•œ ๊ฒƒ์ด ๋„ˆ๋ฌด ์›๋ง์Šค๋Ÿฌ์› ๋‹ค. ํ•˜์ง€๋งŒ, ์—๋Ÿฌ๋ฅผ ๊ฒช์–ด์•ผ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋Š” ๋ง์ฒ˜๋Ÿผ, ์ด ์—๋Ÿฌ ๋•๋ถ„์— ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ mongoose๋ฅผ ์ด์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

๊ทธ๋ž˜์„œ, ์ง€๊ธˆ์€ ์ด ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ•œ ๊ฒƒ์ด ์˜คํžˆ๋ ค ์ข‹๋‹ค! ์•ž์œผ๋กœ๋„ ์—๋Ÿฌ์— ์ ˆ๋งํ•˜๊ธฐ ๋ณด๋‹ค ๋ฐฐ์›€์˜ ๊ธฐํšŒ๋กœ ์‚ผ๋Š” ๊ธ์ •์ ์ธ:) ๊ฐœ๋ฐœ์ž์˜ ์ž์„ธ๋ฅผ ์ด์–ด๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. 

 

Test Code์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค. Test ๊ด€๋ จ ์„œ์ ์„ ์ฝ์–ด๋ณผ ์˜ˆ์ •์ด๋‹ค! 

 

2๋ฐ• 3์ผ๋ณด๋‹ค๋„ ์งง์€ ์‹œ๊ฐ„์ด์ง€๋งŒ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์•„ ์ •๋ง ์œ ์ตํ•œ ์‹œ๊ฐ„์ด๋‹ค. ๋ชธ์€ ์ข€ ํ”ผ๊ณคํ•˜์ง€๋งŒ..

๋ฐ˜์‘ํ˜•