πŸ–₯️ Server Code (3) - Domain, Config

μ΄ν˜„μš°Β·2023λ…„ 12μ›” 11일

Domain νŒ¨ν‚€μ§€

  • 데이터 양식을 μ§€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
  • λ§€κ°œλ³€μˆ˜λ‘œμ¨ 값을 전달할 λ•Œμ— μ‚¬μš©ν•œλ‹€.

νŒ¨ν‚€μ§€ ꡬ성

1. Result μΈν„°νŽ˜μ΄μŠ€

  • Response 에 λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ§€λŠ” 클래슀의 μ΅œμƒμœ„ μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€.
  • String getResult(); λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•΄, κ΅¬ν˜„μ„ κ°•μ œν•œλ‹€.
package main.src.Domain;

public interface Result {
    public String getResult(); // Response body 생성 μ—­ν• 
}
  • String getResult(); λ©”μ„œλ“œμ˜ 역할은, Response λ¬Έμžμ—΄μ„ μƒμ„±ν•˜λŠ” 것이닀.
// getResult() μ‚¬μš© μ˜ˆμ‹œ

package main.src.Domain.User;

import main.src.Domain.Result;

public class UserDTO implements Result {
    private Long userId;
    private String nickname;

		//...

    @Override
    public String getResult() {
        return String.format("userId:%s,nickname:%s", userId, nickname);
    }
}

Config νŒ¨ν‚€μ§€

  • κΈ°λ³Έ ꡬ성에 ν•΄λ‹Ήν•˜λŠ” 클래슀의 집합이닀.

1. Constant 클래슀

  • MySQL 접속 정보 (URL, User, Password λ“±) λ₯Ό κ°€μ§€κ³  μžˆλ‹€.
  • μ€‘μš”ν•œ 정보λ₯Ό ν¬ν•¨ν•˜κ³  있기 λ•Œλ¬Έμ—, .gitignore에 λ“±λ‘ν•œλ‹€.
package main.config;

public class Constant {
    public static final String mysqlUrl = "jdbc:mysql://localhost:3306/chatProtocol";
    public static final String mysqlUser = "example";
    public static final String mysqlPassword = "example";
}

2. CustomResponse 클래슀

  • Response λ¬Έμžμ—΄μ„ μƒμ„±ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€.
  • ν•„λ“œλŠ” statusCode(ex: 200), isSuccess(ex: SUCCESS), result 둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.
  • result λŠ” Generic νƒ€μž…μ΄λ‹€.
    • 성곡 / μ‹€νŒ¨ κ²°κ³Όλ₯Ό λ™μ‹œμ— 닀룬닀.
    • String / Result / List<Result> νƒ€μž…μœΌλ‘œ λ‚˜λ‰œλ‹€.
package main.config;

import main.src.Domain.Result;
import java.util.List;

public class CustomResponse<T> {
    private String statusCode; // 헀더
    private String isSuccess;  // 헀더
    private T result;          // λ°”λ””

    // μš”μ²­ 성곡 μƒμ„±μž
    public CustomResponse(T result) {
        this.statusCode = "200";    // 성곡 μ½”λ“œλŠ” 200으둜 ν†΅μΌν•œλ‹€.
        this.isSuccess = "SUCCESS"; // 성곡 λ©”μ„Έμ§€λŠ” SUCCESS둜 ν†΅μΌν•œλ‹€.
        this.result = result;       // 성곡 리턴 κ°’
    }

    // μš”μ²­ μ‹€νŒ¨ μƒμ„±μž
    public CustomResponse(ResponseStatus status) {
        this.statusCode = status.getStatusCode(); // 401, 404, 500 etc..
        this.isSuccess = "FAIL";                  // μ‹€νŒ¨ λ©”μ„Έμ§€λŠ” FAIL 둜 ν†΅μΌν•œλ‹€.
        this.result = (T) status.getMessage();    // μ‹€νŒ¨ 상세섀λͺ…
    }

	/**
	 * 성곡 κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” λ©”μ„œλ“œ
     * 헀더와 λ°”λ””λ₯Ό "\t" κ΅¬λΆ„μžλ‘œ,
     * λ°”λ””κ°€ List 값이면 "/" κ΅¬λΆ„μžλ‘œ,
     * 각 ν•„λ“œλ“€μ€ "," κ΅¬λΆ„μžλ‘œ
     * ν•„λ“œμ˜ Key-Value 값은 ":" κ΅¬λΆ„μžλ‘œ λ‚˜λˆˆλ‹€.
	 * 성곡 μ˜ˆμ‹œ) "200 SUCCESS\tuserId:1,nickname:Chehok"
     * μ‹€νŒ¨ μ˜ˆμ‹œ) "400 FAIL\tmessage:μš”μ²­μ΄ 잘λͺ» λ˜μ—ˆμŠ΅λ‹ˆλ‹€."
     */
    public String getResponse() {
        String response = String.format("%s %s\t", statusCode, isSuccess);

        if (result instanceof String) {
            response += String.format("message:%s", result);
        } else if (result instanceof List) {
            for (Result result : (List<Result>) result) {
                response += String.format("%s/", result.getResult());
            }
            // λ¬Έμžμ—΄μ˜ λ§ˆμ§€λ§‰ μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” 뢀뢄을 잘라쀌.
            // κ²°κ³Ό: λ§ˆμ§€λ§‰μ— λ“€μ–΄κ°„ κ΅¬λΆ„μž / λ₯Ό μ œκ±°ν•΄μ€Œ.
            response = response.substring(0, response.length() - 1);
        } else if (result instanceof Result){
            response += String.format("%s", ((Result) result).getResult());
        }

        return response;
    }
}

3. ResponseStatus Enum 클래슀

  • μ˜ˆμ™Έ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” Enum 클래슀
  • 각 μ˜ˆμ™Έμ— 맞게, μ»€μŠ€ν…€ μ—λŸ¬ λ©”μ„Έμ§€ / μ—λŸ¬ μ½”λ“œλ₯Ό 던질 수 μžˆλ‹€.
  • CustomResponse에 ResponseStatus 객체λ₯Ό μ „λ‹¬ν•˜λ©΄ μ‹€νŒ¨ κ²°κ³Όκ°€ 생성 λœλ‹€.
package main.config;

public enum ResponseStatus {
    ID_DUPLICATION("2001", "아이디가 μ€‘λ³΅λ©λ‹ˆλ‹€."),
    USERS_NULL("2002", "아이디 λ˜λŠ” λΉ„λ°€λ²ˆν˜Έκ°€ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€."),
    ROOMS_NULL("2003", "ν•΄λ‹Ήν•˜λŠ” 방이 μ—†μŠ΅λ‹ˆλ‹€."),
    CHATS_NULL("2004", "μ±„νŒ…μ΄ μ—†μŠ΅λ‹ˆλ‹€."),
    ALREADY_INVITED("2005", "이미 μ΄ˆλŒ€ν•œ μ‚¬λžŒμž…λ‹ˆλ‹€."),
    METHOD_ERROR("400", "μš”μ²­ λ©”μ„œλ“œκ°€ 잘λͺ» λ˜μ—ˆμŠ΅λ‹ˆλ‹€."),
    BODY_ERROR("400", "μš”μ²­μ΄ 잘λͺ» λ˜μ—ˆμŠ΅λ‹ˆλ‹€."),
    DB_ERROR("500", "DB μ—λŸ¬");

    private final String statusCode;
    private final String message;

    private ResponseStatus(String statusCode, String message) {
        this.statusCode = statusCode;
        this.message = message;
    }

    public String getStatusCode() { return statusCode; }

    public String getMessage() { return message; }
}

4. CustomException 클래슀

  • μ˜ˆμ™Έ 처리 μ‹œ, CustomException 을 던짐으둜써 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μ»€μŠ€ν…€ν•œλ‹€.
    • 디버깅 및 Error Response 에 νš¨κ³Όμ μ΄λ‹€.
  • ResponseStatus λ₯Ό CustomResponse에 μ „λ‹¬ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.
package main.config;

public class CustomException extends Exception {
    private ResponseStatus status;

    public CustomException(ResponseStatus status) {
        this.status = status;
    }

    public ResponseStatus getStatus() {
        return status;
    }
}

ChatProgram

profile
Back-End 개발자

0개의 λŒ“κΈ€