basic03

๊ฐœ๊ด€

MySQL๊ณผ Redis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์ • ์ƒ์„ฑ๊ณผ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: MySQL(Sqlkata), Redis(CloudStructures)

  • MySql ์Šคํ‚ค๋งˆ

CREATE TABLE IF NOT EXISTS account_db.`account`
(
    AccountId BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '๊ณ„์ •๋ฒˆํ˜ธ',
    Email VARCHAR(50) NOT NULL UNIQUE COMMENT '์ด๋ฉ”์ผ',
    SaltValue VARCHAR(100) NOT NULL COMMENT  '์•”ํ˜ธํ™” ๊ฐ’',
    HashedPassword VARCHAR(100) NOT NULL COMMENT 'ํ•ด์‹ฑ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ',
    CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '์ƒ์„ฑ ๋‚ ์งœ'
)

Porgram.cs

  1. ๋นŒ๋” ์ƒ์„ฑ

    var builder = WebApplication.CreateBuilder(args);

  2. ๋ฏธ๋“ค์›จ์–ด-์ปจํŠธ๋กค๋Ÿฌ ์ถ”๊ฐ€

    builder.Services.AddControllers();

  3. app ์ƒ์„ฑ

    var app = builder.Build();

  4. ์„œ๋น„์Šค ์ถ”๊ฐ€-Routing

    app.UseRouting();

  5. ์„œ๋น„์Šค ์ถ”๊ฐ€-Endpoints ์‚ฌ์šฉ(MapControllers)

    app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

  6. DBManager ์ดˆ๊ธฐํ™”

    • config ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด

    IConfiguration configuration = app.Configuration; DBManager.Init(configuration);

  7. app ์‹คํ–‰

    app.Run(configuration["ServerAddress"]);

    • app.Run()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ hostIp:port ๋„ฃ์œผ๋ฉด ๊ทธ๊ฑฐ๋กœ listenํ•˜๊ฒŒ ๋จ

LoginController.cs

Request POST /login ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ

  1. ์‘๋‹ตํ•  ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (์ดํ›„ ๋กœ์ง์—์„œ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ฐ’ ์„ค์ •)

    var response = new PkLoginResponse(); response.Result = ErrorCode.None;

  2. SqlKata.QueryFactory์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ธ”๋ก์„ ๋งŒ๋“ค์–ด์คŒ

    using (var db = await DBManager.GetGameDBQuery()) { ... 3๋ฒˆ ๊ณผ์ • ... }

  3. 2๋ฒˆ์˜ using๋ธ”๋ก ์•ˆ์—์„œ QueryFactory๋ฅผ ํ†ตํ•ด user info ๊ฐ€์ ธ์™€์„œ ์œ ํšจ์„ฑ ํ™•์ธํ•˜๊ธฐ (Authentication(์ธ์ฆ))

  4. ์œ ํšจํ•œ ์‚ฌ์šฉ์ž๋ผ๊ณ  ํŒ๋‹จ ๋์œผ๋ฉด, ํ† ํฐ ๋ฐœ๊ธ‰ํ•˜๊ธฐ

  5. ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค„ ํ† ํฐ ์ •๋ณด redis์— ๋„ฃ๊ธฐ

    • ์ดํ›„์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ ์š”์ฒญ์‹œ ์ด ํ† ํฐ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ผ ๊ฒƒ์ด๋ฉฐ, ์„œ๋ฒ„๋Š” ์ด ํ† ํด์„ Redis์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ๊ถŒํ•œ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ

  6. ์‚ฌ์šฉ์ž์—๊ฒŒ ํ† ํฐ ๋ณด๋‚ด์ฃผ๊ธฐ

CreateAccount.cs

Request POST /CreateAccount ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ

  1. ์‘๋‹ตํ•  ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (์ดํ›„ ๋กœ์ง์—์„œ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ฐ’ ์„ค์ •)

  2. ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•  hash ๊ฐ’ ๋งŒ๋“ค๊ธฐ

  3. SqlKata.QueryFactory์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ธ”๋ก์„ ๋งŒ๋“ค์–ด์คŒ

  4. db์— ์ƒˆ๋กœ์šด ๊ณ„์ • ์ •๋ณด ๋“ฑ๋ก(insert)

    • ์™œ try-catch๋กœ? db์—ฐ๊ฒฐ ์‹คํŒจ or QueryFactory ๊ธฐ๋Šฅ ์‹คํŒจ์˜ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•œ๊ฑด๊ฐ€?

  5. ์‘๋‹ต ๋ฐ˜ํ™˜

Security.cs

  • ๋ณด์•ˆ, ์•”ํ˜ธํ™” ๊ด€๋ จ๋œ ์ž‘์—…์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

    private const String AllowableCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";

  1. ํŒจ์Šค์›Œ๋“œ ํ•ด์‹ฑ ์ ์šฉ

  2. ํ•ด์‹ฑ์„ ์œ„ํ•œ ์•”ํ˜ธ ํ‚ค ์ƒ์„ฑ

  3. ์ธ์ฆ ํ† ํฐ ์ƒ์„ฑ

DBManager.cs

  1. ์—ฐ๊ฒฐํ•  DB server ๋“ค์— ๋Œ€ํ•œ ip/port ์ •๋ณด ๋“ฑ์„ ๊ฐ–๊ณ  ์žˆ์Œ

  2. QueryFactory๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์ œ๊ณต

๋นŒ๋“œ๋Š” ๋ผ๋Š”๋ฐ, API์— ์ œ๋Œ€๋กœ ์‘๋‹ต ๋ชปํ•จ

  • ์˜ˆ์ œ ์ฝ”๋“œ์ผ ๋ฟ, ์•„์ง DB server๋ž‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Œ

Last updated