728x90

SQLAlchemy 

SQLAlchemy SQL Toolkit Object Relational Mapper 포괄한 database python 작업을 위한

 

SQLAlchemy core

데이터베이스 시스템과 상호작용, SQL 문법을 파이썬 언어로 표현 가능하게 해줌

  • engine
    • SQLAlchemy application의 시작점
    • 특정 데이터베이스에 연결성을 제공하는 레지스트리
  • Dialect
    • 다양한 유형의 DBAPI 구현 및 데이터베이스와 통신
    • 특정 DBAPI 및 데이터베이스 백엔드의 관점에서 일반 SQL 및 데이터베이스 명령을 해석함
      • Firebird, Microsoft SQL Server, MySQL, PostgreSQL, Sqlite, Sybase
  • Connection pool
    • 빠른 재사용을 위해 메모리에 데이터베이스 커넥션 풀을 유지함
728x90

요즘 캠핑을가면 숯불에 삼겹살은 너무 많이 먹어서 다른 고기들을 시도해봅니다

토마호크도 몇번 먹어봤지만 이번엔 심부온도계를 구매해서 리버스 시어링을 해봤습니다

숯불에 직화로 토마호크를 굽다보면 겉은 타고 속은 생고기일때가 많은데 심부온도계를 써서 리버스 시어링을 하니 미듐레어로 알맞게 익히기 쉽고 편했습니다


사진처럼 숯의 간접열을 통해 뚜껑을 닫고 익히는건데
저 심부온도계가 54도에왔을때 직화로 구우면
속은 적당히 겉은 마이야르반응처럼 노릇노릇 익는걸 보실수 있습니다





앞으오 종종 캠핑요리 포스팅도 해보겠습니다

728x90

API서버 구성요소 중 응답이 있는데 Response구성하는 여러가지 방법 중

직접 Headerd와 body, ErrorCode를 써서 구성하는 방법입니다.

 

기본적으로 ResponseEntity.status(HttpStatus.OK)를 사용해서 응답을 할 수도 있지만,

프로젝트를 진행할 때에 팀원끼리 약속된 응답형식과 코드를 통해 사용을 할수도 있습니다.

 

Response중 먼저 Header class를 작성해 줍니다.

public class ApiHeader {
    private int resultCode; // 성공 200, 실패다 999, 600
    private String  codeName; // success, fail, NOT_FOUND_USER

    public ApiHeader(int resultCode, String codeName) {
        this.resultCode = resultCode;
        this.codeName = codeName;
    }

    public int getResultCode() {
        return resultCode;
    }

    public String getCodeName() {
        return codeName;
    }

}

httpStatus에도 200 OK, 404 Not Found가 있는거처럼 resultCode와 resultName을 담을수 있는 Header를 생성해주고

클라이언트로 데이터를 전달 할 Body클래스도 만들어 줍니다.

public class ApiBody <T>{

    private T data;

    private T msg;

    public ApiBody(T data, T msg){
        this.data = data;
        this.msg = msg;
    }

    public T getData(){
        return data;
    }

    public T getMsg(){
        return msg;
    }

}

데이터는 여러 타입의 데이터가 들어올 수 있으니 

제네릭 타입을 사용해 줍니다.

body 또한 프로젝트에 따라서 약속해주면 되는데 예제에서는 data,msg 두가지를 body에 담겠습니다.

 

다음 컨트롤러에서 헤더와 바디를 담아서 보낼 ApiResponse class입니다.

 

public class ApiResponse<T> {

    private ApiHeader header;

    private ApiBody body;

    private static int SUCCESS = 200;

    public ApiResponse(ApiHeader header, ApiBody body) {
        this.header = header;
        this.body = body;

    }

    public ApiResponse(ApiHeader header) {
        this.header = header;

    }

    public static <T> ApiResponse<T> OK(T data) {
        return new ApiResponse<T>(new ApiHeader(SUCCESS, "SUCCESS"), new ApiBody(data,null));
    }

    public static <T> ApiResponse<T> fail(ErrorCode errorCode) {
        return new ApiResponse(new ApiHeader(errorCode.getCode(), errorCode.name()), new ApiBody(null, errorCode.getMessage()));
    }
}

성공일때와 실패 두가지 함수가 있는데 

성공시에는 200 SUCCESS와 함께 전달할 data를 리턴해주고 

실패시에는 예외처리에 맞게 ErrorCode에서 code값과 name을 가져와서 리턴해줍니다.

 

ErrorCode는 ENUM을 통해서 관리를 해주는데 

아래와 같이 약속된 ErrorCode를 사용해서 처리를 해주면 됩니다.

public enum ErrorCode {
    FAIL(999, "실패"),
    NOT_SUPPORTED_METHOD(998, "NOT_SUPPORTED_METHOD"),
    NOT_FOUND_USER(100, "NOT_FOUND_USER"),
    NOT_FOUND_TOKEN(101, "NOT_FOUND_TOKEN"),
    MALFORMED_ERROR(102, "MALFORMED_ERROR")
    ;

    private int code;
    private String message;

    ErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

성공시와 실패시 예를 보자면 아래처럼 간단하게 사용도 할 수 있고,

ExceptionHandler를 통해서 예외처리 관리도 가능합니다.

다음 포스팅에서는 ExceptionHandler에 관해 작성해 보겠습니다.


@RequestMapping(method = RequestMethod.GET, value="/getUser")
    public @ResponseBody ApiResponse<UserDTO> getUser(HttpServletRequest request, String user_id){
		if(user_id == null){
        	return ApiResponse.fail(ErrorCode.FAIL); 
        }
        return ApiResponse.OK(userService.getUser(user_id));
    }

 

728x90

1. branch 생성

git branch branch_name

2. branch 변경

git checkout branch_name

3. branch 삭제

git branch -D branch_name

4. 현재 branch 확인

#local branch
> git branch
#remote branch
> git branch -r
#all branch
> git branch -a

+ Recent posts