Post

๐Ÿ“†๊ฐœ์ธํ”„๋กœ์ ํŠธ Refactoring

์˜ˆ์ „์— ์—…๋ฌด๋ณด๊ณ  ๊ด€๋ฆฌ (BSMG)๋ผ๋Š” ํ† ์ดํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์—ˆ๋‹ค.
golang๊ณผ ์นœํ•ด์ง€๊ธฐ ์œ„ํ•ด ์ง„ํ–‰ํ–ˆ๋˜ ์ž‘์—…๋ฌผ์ด์—ˆ๋Š”๋ฐ, ๋‹ค์‹œ ๋ณด๋‹ˆ ๋„ˆ๋ฌด ์ค‘๊ตฌ๋‚œ๋ฐฉ์ด๋ผ ์ด์ฐธ์— ๊ณต๋ถ€ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ Refactoring์„ ํ•ด๋ณด๊ณ ์ž ํ–ˆ๋‹ค.

๐Ÿ’ก ๋ณ€๊ฒฝ์ 

์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”

  • ์ด์ „ ์ฝ”๋“œ๋Š” handler์—์„œ DB์— ์ฟผ๋ฆฌ ์ „๋‹ฌ ์ฝ”๋“œ๊นŒ์ง€ ํ•œ ๊ณณ์— ๋ชฐ๋นตํ–ˆ์—ˆ๋‹ค.

    ์ด์ „ ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
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
// ์ฃผ๊ฐ„ ์—…๋ฌด๋ณด๊ณ  ์นดํ…Œ๊ณ ๋ฆฌ setting
func setWeekRptCategoryRequest(writer http.ResponseWriter, request *http.Request) *WebErrorResult {
	var err error

	// ๋ถ€์„œ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
	queryString := "SELECT COUNT(*) FROM bsmgPart"
	var count int
	_ = db.QueryRow(queryString).Scan(&count)

	var result BsmgTreeResult
	result.Result.ResultCode = 1
	if count > 0 {
		result.PartTreeList = make([]*PartTree, count)
	}

	queryString = "SELECT part_idx,part_name FROM bsmgPart WHERE part_idx != 0" // ๊ด€๋ฆฌ์ž๋Š” ์ œ์™ธ
	rows, err := db.Query(queryString)
	if err != nil {
		fmt.Println("์ฟผ๋ฆฌ๋ฌธ ์˜ค๋ฅ˜", err)
		return &WebErrorResult{http.StatusOK, ErrorInvalidParameter}
	}
	defer rows.Close()

	var ii = 0
	for rows.Next() {
		var part_idx sql.NullInt32
		var part_category sql.NullString

		err := rows.Scan(&part_idx, &part_category)
		if err != nil {
			fmt.Println("์„œ๋ฒ„ ๋ณ€์ˆ˜ DB ๋ฐ์ดํ„ฐ ํ• ๋‹น ์˜ค๋ฅ˜", err)
			return &WebErrorResult{http.StatusOK, ErrorInvalidParameter}
		}
		result.PartTreeList[ii] = &PartTree{}
		result.PartTreeList[ii].Label = part_category.String
		result.PartTreeList[ii].Value = "1-" + strconv.Itoa(int(part_idx.Int32))
		result.PartTreeList[ii].Parent = "1"
		ii++
	}
	result.PartTreeList[ii] = &PartTree{}
	result.PartTreeList[ii].Label = "๋ถ€์„œ๋ณ„ ์ฃผ๊ฐ„ ์—…๋ฌด๋ณด๊ณ "
	result.PartTreeList[ii].Value = "1"
	result.PartTreeList[ii].Parent = "0"

	result.Result.ResultCode = 0
	responseMsg, _ := json.Marshal(result)
	sendResultEx(writer, request, http.StatusOK, responseMsg)
	return nil
}

๊ธฐ์กด์˜ ์ด๋Ÿฐ ์ฝ”๋“œ๋“ค์„ ๋ชจ๋‘ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋‚˜๋ˆ„์–ด ๋ชจ๋“ˆ์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ์ฃผ๊ฐ„ ์—…๋ฌด๋ณด๊ณ  ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด
func getPartTree(c echo.Context) (err error) {
	log.Println("getPartTree")

	var apiResponse define.BsmgTreeResult

	server, _ := c.Get("Server").(*server.ServerProcessor)
	server.Mutex.Lock()
	defer server.Mutex.Unlock()

	apiResponse.PartTreeList, err = server.DBManager.DBGorm.MakePartTree()
	if err != nil {
		log.Printf("%v \n", err)
		apiResponse.Result.ResultCode = define.ErrorDataBase
		return c.JSON(http.StatusOK, apiResponse)
	}

	apiResponse.Result.ResultCode = define.Success
	return c.JSON(http.StatusOK, apiResponse)
}

๋ชจ๋“ˆํ™”์— ๋Œ€ํ•ด ๊ฐ€์Šด๊นŠ์ด ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋ถ„๋ฆฌ์‹œํ‚ค๋Š๋ผ ์ •๋ง ํž˜๋“ค์—ˆ๋‹ค.


ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ

  • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์จ์•ผํ•˜๋Š” ๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํŽธํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์ธก๋ฉด๊ณผ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

Mutex๋ฅผ ํ†ตํ•œ ์ƒํ˜ธ ๋ฐฐ์ œ

  • ๋ณ„๊ฑฐ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์ธํ•ด ๋ฐ๋“œ๋ฝ์˜ ๋ฌด์„œ์›€์„ ์‹ค์ œ๋กœ ๊ฒช์–ด๋ดค๋‹ค. Mutex๋Š” ์กฐ์‹ฌํžˆ ๋‹ค๋ค„์•ผ๊ฒ ๋‹ค๋Š” ๊ตํ›ˆ์„ ์–ป์—ˆ๋‹ค.

์•”ํ˜ธํ™” ์ ์šฉ

  • ๊ธฐ์กด์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๊ทธ๋ƒฅ ์ €์žฅํ–ˆ์—ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” SHA256๋ฐฉ์‹๋ณด๋‹ค ๋ณด์•ˆ์„ฑ์ด ์ข‹์€๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ argon2 ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์จ๋ณด์•˜๋‹ค.

JWT ์‚ฌ์šฉ

  • ์„ธ์…˜์ด ์•„๋‹Œ JWT๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ ์‹ถ์—ˆ๋‹ค.
  • ํ† ํฐ์„ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๋‹ค๊ฐ€, AccessToken, RefreshToken 2๊ฐœ์˜ ํ† ํฐ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

Nginx ์‚ฌ์šฉ

  • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์œ„ํ•ด Nginx๋ฅผ ๊ฑฐ์ณ์„œ API์„œ๋ฒ„๋กœ ๊ฐ€๋„๋ก ํ•˜์˜€๋‹ค.

๋„์ปค๋ฅผ ํ†ตํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐฐํฌ

  • ์„œ๋น„์Šค๋ฅผ ์‹ค์ œ๋กœ ๋„์ปค ์ด๋ฏธ์ง€ํ™”ํ•˜์—ฌ ๋ฐฐํฌ๊นŒ์ง€ ํ•ด๋ณด๋Š” ๊ณผ์ •์„ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ๋ฌด์ˆ˜ํ•œ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช๊ฒŒ ๋˜์—ˆ๋‹ค.. ๋‹จ์ˆœ ๋กœ์ปฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ ์‹คํ–‰, ๋กœ์ปฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰, ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„์— ๋ฐฐํฌ๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์ด ๋งŽ์•„ ๊ณต๋ถ€๋ฅผ ๋งŽ์ด ํ•ด์•ผํ–ˆ๋‹ค.

    ๊ฐœ๋ฐœ์ž๋„-CPU-์•„ํ‚คํ…์ฒ˜๋ฅผ-๊ตฌ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ˜ญ ์•„์‰ฝ๊ณ  ๋ฏธํกํ•œ ์ 

TDD

  • ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ๋„ ํ–ˆ๊ณ , ์ด๋ฒˆ์—๋Š” ๊ทธ๋Ÿฐ์‹์œผ๋กœ ํ•ด๋ด์•ผ์ง€ ํ–ˆ์ง€๋งŒ, ๋ง‰์ƒ ์ž‘์„ฑ์ด ์‰ฝ์ง€ ์•Š์•„ ๋ˆ„๋ฝํ•˜๊ธฐ ์ผ์‘ค์˜€๋‹ค.
  • ๋˜ํ•œ, TDD๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋œ ์ผ€์ด์Šค๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹จ๊ณ„๋ฅผ ๋ฐŸ์•„๊ฐ€๋ฉฐ ๊ฐœ๋ฐœํ•ด ๋‚˜๊ฐ€์•ผํ•˜๋Š”๋ฐ, ์Šต๊ด€์ ์œผ๋กœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ -> ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋˜์—ˆ๋‹ค.
  • Github Actions๋ฅผ ํ†ตํ•œ WorkFlow๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ, ์ด๋ถ€๋ถ„์ด ์ฐธ ์•„์‰ฌ์› ๋‹ค.
    ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋งŒ ์ž˜ ์งœ๋†จ์œผ๋ฉด, ๋นŒ๋“œ ์˜ค๋ฅ˜, ๊ธฐ๋Šฅ ์˜ค๋ฅ˜๋ฅผ ์ž๋™ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์—ˆ์„ ํ…๋ฐ..

์Šค๋ ˆ๋“œ์˜ ์‚ฌ์šฉ

  • go๋ฃจํ‹ด๊ณผ ์ฑ„๋„๋ง์„ ํ†ตํ•ด์„œ go๋งŒ์˜ ์žฅ์ ์„ ๊ฐ•ํ™”ํ•ด๋ณด๋ ค ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด ๊ธฐ๋Šฅ์—์„  ์ฃผ๊ฐ„ ์—…๋ฌด๋ณด๊ณ  ์ž๋™ ์ƒ์„ฑ ๋ง๊ณ ๋Š” ํ• ๋งŒํ•œ ๊ธฐ๋Šฅ์ด ์—†์—ˆ๋‹ค.
    DB์ž‘์—…์ด ๊ทธ๋‚˜๋งˆ ๊ณ ๋ ค๋Œ€์ƒ์ด์—ˆ๋Š”๋ฐ, DB์ ‘๊ทผ ์‹œ Mutex๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ๋ฐฐ์ œ๋ฅผ ํ•˜๋‹ˆ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์˜ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.
  • ์ถ”ํ›„ ๋‚˜ ํ˜น์€ ์ง€์ธ์˜ ๋‹ค๋ฅธ ์„œ๋น„์Šค์™€ ์—ฐ๋™์‹œํ‚จ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž ๋™๊ธฐํ™” ๋“ฑ์—์„œ ์‚ฌ์šฉํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์„ ๋“ฏํ•˜๋‹ค.

์™ธ๋ถ€ API ์—ฐ๋™

  • ๋„ค์ด๋ฒ„ ์›์Šค๋ผ๋˜๊ฐ€ ์—ฌ๋Ÿฌ ์˜คํ”ˆ API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋„ ๊ณ ๋ คํ–ˆ์—ˆ๋Š”๋ฐ, ๋งˆ์Œ ์† ์šฐ์„ ์ˆœ์œ„์—์„œ ๋งŽ์ด ๋ฐ€๋ฆฌ๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ์•ˆํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์บ์‹œ ์„œ๋ฒ„

  • Redis๋ฅผ ํ†ตํ•œ ์บ์‹œ ์„œ๋ฒ„๋ฅผ ๋‘์–ด ๋ถˆํ•„์š”ํ•œ DB ํŠธ๋ž˜ํ”ฝ ๋น„์šฉ์„ ๋‘ฌ๋ณด๊ณ ์‹ถ์—ˆ์ง€๋งŒ, ์•„์ง ๋ฏธ์ •์ด๋‹คโ€ฆ

๋””์ž์ธ ํŒจํ„ด ์ ์šฉ

  • ํ”„๋กœ์ ํŠธ์—์„  Adaptor, Singleton ํŒจํ„ด ์ •๋„๋ฅผ ์จ๋ณธ ๊ฒƒ ๊ฐ™๋‹ค.
  • ์‚ฌ์‹ค ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์จ์•ผํ•˜๋Š” ๊ฑฐ๋ผ๊ธฐ๋ณด๋‹จ, ๋ฌธ์ œ ๋ฐœ์ƒ์˜ ์—ฌ์ง€๋ฅผ ์ค„์ด๋Š” ์ธก๋ฉด์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ ๊ฐ™๋‹ค.
  • ๋””์ž์ธํŒจํ„ด ๊ณต๋ถ€๋Š” ๊ณ„์†ํ•˜์—ฌ ํ™•์žฅ์„ฑ์ด ์ข‹๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.

API ๋ฌธ์„œ ์ œ์ž‘

  • Swagger๋ฅผ ํ†ตํ•ด์„œ ์ง„ํ–‰ํ•˜๋ ค ํ–ˆ๋Š”๋ฐ Scalar ์–˜๊ธฐ๋„ ๋งŽ์ด ๋ณด์ด๊ณ  ๋‘˜ ์ค‘ ํ•˜๋‚˜๋กœ ๊ณ ๋ฏผ์ค‘์ด๋‹ค.

์ธ๊ฐ€

  • ์ธ๊ฐ€๋Š” ํ˜„์žฌ ํ”„๋ก ํŠธ๋‹จ์—์„œ๋งŒ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.
    ๊ทธ๊ฒƒ๋„ ๋ฐ˜์ชฝ์งœ๋ฆฌ์ธ ๊ฒƒ์ด, ํƒ€์ธ์˜ ๋ณด๊ณ ์„œ๋ฅผ ๋งˆ๊ตฌ ํ›”์ณ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    (๋‹ค๋งŒ, ์ˆ˜์ •,์‚ญ์ œ์— ๋Œ€ํ•œ ๊ฒƒ์€ ์„ค์ •๋œ ์ง๊ธ‰ ์ด์ƒ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ–ˆ๋‹ค.)
  • JWT๋Š” ์„œ๋ฒ„ ๋ฏธ๋“ค์›จ์–ด์—์„œ ํ˜„์žฌ ๋กœ๊ทธ์ธ ์ƒํƒœ์ธ์ง€ ์•„๋‹Œ์ง€๋งŒ ํŒ๋ณ„ํ•œ๋‹ค.
  • user ๋„๋ฉ”์ธ, report ๋„๋ฉ”์ธ์— ์ ‘๊ทผํ•  ๋•Œ ํ† ํฐ์„ ํ†ตํ•œ ์ธ๊ฐ€๋ฅผ ์„œ๋ฒ„์—์„œ๋„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

๐Ÿ’ก ํ›„๊ธฐ

ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์˜ ๋งค๋ ฅ๋ณด๋‹ค๋Š” ๊ณต๋ถ€์˜ ๋Š๋‚Œ์œผ๋กœ Refactoring์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

์‚ฌ์‹ค ๋ฉ‹์ง€๊ฒŒ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ๋ถ€์กฑํ•œ ๋ฉด์ด ๋งŽ์•˜๋‹ค.

ํฌ๊ฒŒ๋Š”

  • ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜
  • ๋””์ž์ธ ํŒจํ„ด
  • CI/CD

์ž‘๊ฒŒ๋Š”

  • ์ฝ”๋“œ๋ฅผ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์งœ๋Š” ๋Šฅ๋ ฅ
  • ์ฃผ์„์„ ์ž˜ ๋‹ค๋Š” ๋Šฅ๋ ฅ
  • ๋ฐฐ์šด ๊ฒƒ์„ ๋ฐ”๋กœ ์ •๋ฆฌํ•˜์—ฌ ๊ธฐ๋กํ•˜๋Š” ์„ฑ์‹คํ•จ

ํšŒ์‚ฌ ๋‚ด์—์„œ ๋‹น์—ฐํžˆ ์ž˜ ํ•ด๋‚ด์•ผํ•˜๋Š” ๊ฒƒ๋“ค์„ ํ•˜๋ฉฐ ๋‚ด ๋Šฅ๋ ฅ์„ ๊ณผ์‹ ํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.
์ด์ œ์™€ ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ชจ๋ฅด๋Š” ๊ฒƒ๋“ค ํˆฌ์„ฑ์ด๊ณ  ๊ณ„์† ๋Š˜์–ด๋‚˜๋Š” ๊ธฐ์ˆ ์Šคํƒ๋“ค๊ณผ ๋น ๋ฅธ ํŠธ๋ Œ๋“œ์˜ ๋ณ€ํ™”๊ฐ€ ์ฐธ ๋ฌด์„ญ๊ฒŒ ๋Š๊ปด์ง„๋‹ค.
๊ทธ๋ ‡์ง€๋งŒ ์ง€๊ธˆ์€ ์–•๊ณ  ๋„“๊ฒŒ๋ณด๋‹ค๋Š” ๊นŠ๊ณ  ์ข๊ฒŒ ์•Œ์•„์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด๋‹ค.

์ฒœ์ฒœํžˆ ๊ทธ๋Ÿฌ๋‚˜ ๊พธ์ค€ํžˆ ๋ผ๋Š” ๋ง์„ ๋ชจํ† ๋กœ ๊ณ„์† ๋‚˜์•„๊ฐ€์•ผ๊ฒ ๋‹ค.

ํž˜๋“ค์—ˆ๋˜ ์ !!

1.๋ ˆ๊ฑฐ์‹œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์‚ด๋ฆฌ๋Š” ๊ฒƒ
2.์ง€์‹์˜ ์‹ค์ฒœ (๊ธฐ๋ฒ•, ๊ธฐ์ˆ  ๋“ฑ๋“ฑ..)

๋‹ค๋ฅธ ํ† ์ด ํ”„๋กœ์ ํŠธ๋„ ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ์ด์   Refactoring์„ ๋ฉ”์ธ์œผ๋กœ ํ•˜์ง„ ์•Š๊ณ , ์ƒ๊ฐ ๋‚  ๋•Œ ํ•˜๋ ค ํ•œ๋‹ค.
๋” ์„ฑ์žฅํ•˜์—ฌ ๋ฉ‹์ง„ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „์‹œํ‚ค๊ณ  ์‹ถ๋‹ค!!

[๋ ˆํฌ์ง€ํ† ๋ฆฌ] https://github.com/MunProoo/bsmgRefactoring

TODO ๊ณต๋ถ€ํ•œ ๊ฒƒ ํฌ์ŠคํŒ…
  1. ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜
  2. Echo ํ”„๋ ˆ์ž„์›Œํฌ ์„ ํƒ ์ด์œ 
  3. JWT
  4. ๋””์ž์ธ ํŒจํ„ด ๊ด€๋ จ
  5. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ compose ๊ด€๋ จ ๋ฐ CPU ์•„ํ‚คํ…์ฒ˜ ๋“ฑ ์ฃผ์˜์ 
  6. ๊นƒํ—ˆ๋ธŒ ์•ก์…˜
  7. blue/green ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
  8. ์บ์‹œ ์„œ๋ฒ„
This post is licensed under CC BY 4.0 by the author.