반응형

클라우드 환경에서 HTTP API를 통해 통신하는 것이 대부분이다.

이때, 응답 상태 코드를 통해 성공/실패 여부를 확인할 수 있으므로 API 문서를 작성할 때 꼭 알아야 할 것이 HTTP status code이다.

 

  • 10x : 정보 확인
  • 20x : 통신 성공
  • 30x : 리다이렉트
  • 40x : 클라이언트 오류
  • 50x : 서버 오류

 

200번대 : 통신 성공

상태 코드 이름 의미
200 OK 요청 성공(GET)
201 Create 생성 성공(POST)
202 Accepted 요청 접수O,
리소스 처리 X
204 No Contents 요청 성공 O,
내용 없음

 

 

300번대 : 리다이렉트

상태코드 이름 의미
300 Multiple Choice 요청 URI에 여러 리소스가 존재
301 Move Permanently 요청 URI가 새 위치로 옮겨감
304 Not Modified 요청 URI의 내용이 변경 X

 

 

400번대 : 클라이언트 오류

상태코드 이름 의미
400 Bad Request API에서 정의되지 않은 요청 들어옴
401 Unauthorized 인증 오류
403 Forbidden 권한 밖의 접근 시도
404 Not Found 요청 URI에 대한 리소스 존재 X
405 Method Not Allowed API에서 정의되지 않은 메소드 호출
406 Not Accepted 처리 불가
408 Request Timeout 요청 대기 시간 초과
409 Conflict 모순
429 Too Many Request 요청 횟수 상한 초과

 

 

500번대 : 서버 오류

상태코드 이름 의미
500 Internal Server Error 서버 내부 오류
502 Bad Gateway 게이트웨이 오류
503 Service Unavailable 서비스 이용 불가
504 Gateway Timeout 게이트웨이 시간 초과

 

 

***참고

https://gyoogle.dev/blog/web-knowledge/HTTP%20status%20code.html

반응형

'Web Application' 카테고리의 다른 글

REST API  (0) 2023.12.29
HTTP Request Methods  (0) 2023.12.23
쿠키(cookie)와 세션(session)의 차이  (1) 2023.12.22
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13
반응형

https://www.acmicpc.net/problem/1475

 

1475번: 방 번호

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

💡 방 번호
다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.
다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)

[입력]
첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

[출력]
첫째 줄에 필요한 세트의 개수를 출력한다.

 

 

✅ 문제 풀이
  • 주어진 방번호 N의 각 자리 수를 구해야한다.
    N을 10으로 나눈 나머지를 구하면 된다.
  • 그리고 그 값을 카운트 해준 후, N을 10으로 나눈 몫으로 갱신한다.
  • 카운트 하기 위해서 0부터 9까지의 출현 빈도를 저장할 배열을 선언해준다.
  • 만약 각 자리의 수가 6또는 9이면, 6번 인덱스와 9번 인덱스의 값을 비교해서 똑같은 경우 6에 먼저 카운트 되도록 하고, 아니면 9에 카운트 되도록 한다.
    6과 9는 뒤집어서 서로를 사용할 수 있기 때문이다.
  • 그렇지 않다면 그냥 그 수에 해당하는 인덱스의 값에 카운트 되도록 한다.
  • 필요한 상자수는 배열에서 가장 MAX인 값과 같게 된다.

 

✏ 코드 전문
#include<iostream>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int arr[10] = { 0 };
	int N;
	cin >> N;

	while (N > 0) {
		if (N % 10 == 6 || N % 10 == 9) {
			if (arr[6] == arr[9]) arr[6]++;
			else arr[9]++;
		}
		else arr[N % 10]++;

		N /= 10;
	}

	int max = arr[0];
	for (int i = 1; i < 10; i++) {
		if (max < arr[i]) max = arr[i];
	}

	cout << max;

	return 0;
}
반응형
반응형

개발자 톡방에서 GitHub Copilot chat에 대해 반응이 뜨겁길래 뭔가 하고 찾아봤다

 

대충 알아보니, vscode나 intelliJ 같은 개발환경에 설치하면, 이 Github Copilot chat이 내가 쓴 코드를 읽고 분석해서 더 최적화된 코드로 알려준다거나, 오류 등을 파악해서 바로 해결해주는 등의 마법사 같은 역할을 하는 것 같다.

 

지금까지 코드 상에 오류가 발생하면, 코드를 긁어서 CHAT GPT한테 물어보고, "오류를 수정해줘"라고 했을 것이다.

 

간단한 프로젝트면 그나마 나을지 모르지만, 큰 프로젝트나 코드의 길이, 여러 클래스들끼리 이리저리 얽혀있다면, 솔직히 그 많은 코드를 긁어서 완벽히 해결해달라고 하기엔 무리였다.

 

이제 CHAT GPT가 내장된 copilot chat이 내 프로젝트 코드들의 관계를 알아서 다 읽어보고 분석한 후, 오류가 발생한 부분에 대해서 척척 알려줄 것이다.

 

브라우저를 열었다 닫았다 할 귀찮음도 사라지고, 더이상 코드를 긁어 물어보지 않아도 되니 정말 좋은 서비스인것 같다.

 

다른 사람의 후기를 보니, 자신은 프론트엔드 개발자인데, copilot chat이 백엔드를 알아서 짜주고, 심지어는 db연결까지 다 해주었다고 한다. 풀스택이 가능해진 것이다.

 

이젠 백/프론트엔드 개발자라 하더라도 무리없이 보충해 풀스택으로 개발하는게 수월해질 것 같다.

 

다음은 공식 문서를 바탕으로 정리한 Github Copilot chat에 대한 부가 설명이다.

 

💡 GitHub Copilot Chat의 주요 기능!!

 

1. 코드 자동 완성

  • 이 기능은 마치 나의 생각을 읽어내듯, 다음 코드 라인을 예측하고 제안해 주는 것이다.

2. 버그 수정

  • 이 기능은 GitHub Copiolt Chat이 문제를 식별하고, 해결방안을 제시해 준다.
  • 더이상 오류에 머리를 싸매지 않아도 된다!

 

💡 GitHub Copilot Chat의 장점!!
  • 내 코드를 전체적으로 분석하고, 내 코딩 스타일에 맞추어서 코드를 제안해준다
  • 설치과정이 몇분으로 간단하다
  • 복잡한 코드, 어려운 알고리즘 문제 모두 copilot chat이 척척 도와줄것이다!!
  • 코드를 작성하는 속도, 문제 해결 능력 향상 

 

다가오는 12월 중순 정식 출시 된다고 하네요!! 

반응형
반응형
💡 GROUP BY
  • GROUP BY 컬럼
    컬럼의 값 중 NULL도 있다면 NULL도 하나의 그룹이 될수 있음
    => 사원, 대리, 과장, 차장, 부장, 직급이 정해지지 않은(NULL)이 있을 때, 이를 직급 별로 group화 하면, 6개로 그룹화 가능
  • GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없음
  • 집계 함수는 WHERE 절에 올 수 없음
    =>집계 함수는 GROUP BY 절에서 사용 가능
  • WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거하는 역할 

 

💡 GROUP BY - HAVING 절 [53]
  • GROUP BY가 없다고 해서 HAVING에 오류가 발생하지는 않는다
    예시)
SELECT SUM(주문금액) AS 합계
FROM 주문
HAVING AVG(주문금액) > 100;

 

=> GROUP BY가 생략된 경우, 적절한 PK로 그룹핑 되고, 그 그룹의 주문 금액 평균이 100보다 크다면 해당 주문금액들의 총합을 출력하는 쿼리이다.

주문ID | 주문금액
-----------------
1      | 80
2      | 120
3      | 90
4      | 110
5      | 95


 이와 같은 테이블이 있다면, 주문ID에 대해 자동 그룹핑될 것이고, 해당 그룹마다 평균 주문금액이 100보다 큰 것은, 주문ID 2와 4의 그룹이므로, 해당 그룹의 주문 금액 합은 120+110=230이다.

합계
-----
230

 

 

  • COUNT와 같은 집계함수를 AVG함수로 감싸 평균을 구할 수 없다
    COUNT는 말 그대로 카운트 한 값을 한 레코드로 출력하는 것이고, 이의 평균이랄 것으로 나눌 값이 명시되지 않기 때문에 AVG함수와 함께 쓸 수 없다
    예시)
SELECT 메뉴ID, 사용유형코드, AVG(COUNT(*)) AS AVGCNT
FROM 시스템사용이력
GROUP BY 메뉴ID, 사용유형코드;

 

 

💡 ORDER BY [56] [57]
  • GROUP BY를 사용할 경우 GROUP BY 표현식이 아닌 값은 기술될 수 없음
    예시)
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 년 DESC;

=> 지역에 대해서 그룹핑 되어 매출금액의 SUM을 구하기 때문에, 이를 년이라는 컬럼으로 ORDER할 수 없다

 

  • ORACLE에서는 NULL값을 가장 큰 값으로 간주
    => 오름차순 정렬 시 NULL이 가장 마지막에
    => 내림차순 정렬 시 NULL이 가장 먼저
  • SQL server에서는 NULL을 가장 작은 값으로 간주
    => 오름차순 정렬 시 NULL이 가장 먼저
    => 내림차순 정렬 시 NULL이 가장 마지막에
  • ORDER BY정레 컬럼명 대신 ALIAS 명이나 컬럼 순서를 나타내는 정수를 혼용하여 사용할 수 있음

 

💡 SELECT 문장 실행 순서 [59]

FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

 

 

💡 TOP() 질의문 
  • SQL server의 TOP N 질의문에서 N에 해당하는 값이 동일한 경우 함께 출력되도록 하는 WITH TIES 옵션을 ORDER BY 절과 함께 사용해야 함
  • 예시)
    SELECT TOP(3) WITH TIES 팀명, 승리건수
    FROM 팀별성적
    ORDER BY 승리건수 DESC;

    =>팀별성적에서 팀명과 높은 순으로 승리건수를 조회하는데, 가장 위 3개를 조회한다. 단 3위의 승리건수와 동일한 팀이 있다면 해당 팀까지도 같이 출력한다.
     

 

💡 EQUI JOIN 문장
  • SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
    FROM 테이블1, 테이블2
    WHERE 테이블1.칼럼명1=테이블2.칼럼명2;
    => WHERE 절에 JOIN 조건을 넣음
  • SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
    FROM 테이블1 INNER JOIN 테이블2
    ON 테이블1.칼럼명1=테이블2.칼럼명2;
    => ON 절에 JOIN 조건을 넣음

 

💡 JOIN
  • 일반적으로 JOIN은 PK와 FK 값의 연관성에 의해 성립됨
  • DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 2개씩 묶어서 JOIN을 처리함
  • EQUI JOIN은 JOIN에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치하는 경우에 사용되는 방법임
  • EQUI JOIN은 = 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN임
  • 대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있음
반응형
반응형
💡 isolation level이 낮은 경우 발생할 수 있는 문제점
  • Dirty read : 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것
  • Phantom read : 한 트랙잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상
  • Non-Repeatable read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상

 

💡 ORACLE과 SQL server에서의 commit과 rollback [29]
  • ORACLE에서는 DDL(create, drop, alter..) 문장 수행 후 자동으로 commit을 수행
  • SQL server에서는 DDL 문장 수행 후 자동으로 commit을 수행하지 않음
  • SQL server에서는 CREATE TABLE 문장도 TRANSACTION의 범주에 포함
    => ROLLBACK 문장에 의해서 최종적으로 B 테이블은 생성되지 않음

 

💡 저장점(SAVEPOINT)
  • 저장점을 정의하면 롤백 할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 savepoint 까지 트랜잭션의 일부만 롤백할 수 있음
  • [ORACLE]
    SAVEPOINT SVPT1;
    ...
    ROLLBACK TO SVPT1;
    => ...에 있던 부분은 모두 ROLLBACK
  • [SQL server]
    SAVE TRANSACTION SVPT1;
    ...
    ROLLBACK TRANSACTION SVPT1;
    => ...에 있던 부분은 모두 ROLLBACK

 

💡 논리연산자의 우선순위
  • NOT > AND > OR

 

💡 NULL 
  • NULL 값이 포함된 사칙 연산의 결과는 NULL
  • NULL 값을 조건절에서 사용하는 경우 IS NULL / IS NOT NULL 이란 키워드를 사용해야 함

 

💡 [37]
  • [SQL]
    ㄱ. SELECT * FROM 서비스 WHERE 서비스번호 = 1;
    ㄴ. INSERT INTO 서비스 VALUES ('999', '', '2015-11-11');
    ㄷ. SELECT * FROM 서비스 WHERE 서비스명 = '';
    ㄹ. SELECT * FROM 서비스 WHERE 서비스명 IS NULL;
  • ㄴ과 같이 데이터를 입력하면, 서비스명 컬럼의 데이터에 대해서 ORACLE에서는 NULL로 입력됨
  • ㄴ과 같이 데이터가 입력되어있을 때, ORACLE에서 데이터를 조회하려면 서비스명 IS NULL 조건으로 조회해야 함
  • ㄴ과 같이 데이터가 입력되어있을 때, SQL server에서 데이터를 조회하려면 서비스명=''로 조회해야 함

 

💡 내장함수 [40]
  • 함수는 벤더에서 제공하는 함수인 내장 함수와 사용자가 정의할 수 있는 함수로 나눌 수 있음
  • 내장 함수는 다시 단일행함수와 다중행함수로 나눌 수 있음
  • 다중행 함수는 집계함수, 그룹함수, 윈도우 함수로 구분
  • 함수의 입력 행수에 따라 단일행 함수와 다중행 함수로 구분
  • 단일행 함수 예 : =, >, <...
  • 다중행 함수 예 : IN, EXIST...
  • 단일행 함수는 select, where, order by, update의 set절에 사용이 가능
  • 일대다 조인이라 하더라도 다쪽에서 출력된 행이 하나씩 단일행 함수의 입력값으로 사용되므로 단일행 함수 사용가능
  • 다중행 함수와 단일행 함수는 동일하게 단일 값만을 반환

 

💡 라인 수 구하기 sql [41]

 

TAB1

ROWNUM C1
1 A

A
2 B

B

B

 

SELECT SUM(CC)
FROM(

           SELECT(LENGTH(C1)-LENGTH(REPLACE(C1, CHR(10)))+1) CC FROM TAB1

)

 

LENGTH : 문자열의 길이를 반환하는 함수

CHR : 주어진 ASCII 코드에 대한 문자를 반환하는 함수 (CHR(10)-> 줄바꿈)

REPLACE : 문자열을 치환하는 함수 (REPLACE(C1, CHR(10))-> 줄바꿈 제거)

 

함수 결과 값

ROWNUM C1 LENGTH(C1) REPLACE(C1, CHR(10)) LENGTH(REPLACE(C1, CHR(10)))
1 A
A
3(A+줄바꿈+A) 변경 전
A
A
변경 후
AA
2
2 B
B
B
5 변경 전
B
B
B
변경 후
BBB
3

 

2+3 =5

 

답 5

 

 

💡 ORACLE 에서의 날짜 연산 [42]

 

SELECT TO_CHAR(TO_DATE('2015.01.10 10', 'YYYY.MM.DD HH24')+1/24/(60/10), 'YYYY.MM.DD HH24:MI:SS') FROM DUAL;

 

  • 오라클에서 날짜의 연산은 숫자의 연산과 같음
  • 특정 날짜에 1을 더하면 하루를 더한 결과와 같으므로 1/24/60 = 1분을 의미
    1=하루
    1/24 = 하루를 24로 나눈다= 한시간
    1/24/60 = 한시간을 60으로 나눈다 = 1분
    1/24/(60/10) = 한시간을 6으로 나눈다 = 10분
  • 따라서 10분 더해주면 된다.

답 : 2015.01.10 10:10:00

 

 

💡 SEARCHED_CASE_EXPRESSION -> SIMPLE_CASE_EXPRESSION 으로 변환 [43]

 

[ SEARCHED_CASE_EXPRESSION ]

WHEN LOC = 'NEW YORK' THEN 'EAST'

 

[ SIMPLE_CASE_EXPRESSION ]

LOC WHEN 'NEW YORK' THEN 'EAST'

 

=> SIMPLE은 부등호를 없앤다

 

 

💡 ISNULL함수 [45]
  • ISNULL 함수는 결과값이 NULL일 경우 지정된 값을 반환
    ISNULL(COL2,'X')
    => COL2값이 NULL이면 'X'를 반환
  • WHERE 절안에서 컬럼의 NULL 값을 확인할 때는 IS NULL을 사용해야 함

 

💡 단일행 NULL 관련 함수 [46]
  • NVL(표현식1, 표현식2) / ISNULL(표현식1, 표현식2)
    => 표현식1의 결과값이 NULL이면 표현식2의 값을 출력
    => 단 표현식1과 표현식2의 결과 데이터 타입이 같아야 함
    => NULL 관련 가장 많이 사용되는 함수로 상당히 중요
  • NULLIF(표현식1, 표현식2) 
    => 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 반환
  • COALESCE(표현식1, 표현식2, ...)
    => 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타냄
    => 모든 표현식이 NULL이라면 NULL 리턴

사원 테이블에서 MGR의 값이 7698과 같으면 NULL을 표시하고, 같지 않으면 MGR을 표시하려고 한다. 

=> NULLIF(MGR, 7698) 사용

 

 

💡 NULL AVG 연산
  • NULL은 AVG 연산 대상에서 제외, COUNT도 마찬가지.

 

 

반응형
반응형

이전 내용↓↓↓

2023.11.11 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (2)

 

[REST API] Spring Boot로 REST API CRUD 간단 구현 (2)

지난 시간, 간단한 model을 생성하고, 해당 model을 클래스 내에서 직접 생성하고, 클라인언트로부터 받은 정보를 통해 CRUD를 구현해 보았다. ↓↓↓ 2023.11.08 - [Web Application/Backend] - [REST API] Spring Boot

im-gonna.tistory.com

 

DB연동에 이어서, db에 있는 정보를 CRUD 처리해보자.

 

💡 Model을 entity로 설정
  • model인 CloudVendor를 entity로써 하나의 테이블로 선언해주기 위해, CloudVendor 클래스를 수정해준다.

  • CloudVendor를 Entity로 선언해주고, Table 이름은 "cloud_vendor_info"로 설정하여 생성 시 이 이름으로 table이 생성된다.
  • 이 테이블의 primary key를 vendorId로 설정해주기 위해, vendorId위에 @Id 를 추가해준다.

 

💡 CloudVendor Repository 생성하기
  • CloudVendor Entity에 대한 데이터베이스 작업인 CREATE, READ, UPDATE, DELETE를 수행하기 위해서 JpaRepository 인터페이스를 상속받아(extends) 사용한다.

  • 일단 repository 폴더를 생성해주고, 인터페이스로 CloudVendorRepository 파일을 추가한다.

  • CloudVendorRepository를 생성할 때, JpaRepository에 Entity이름과, Entity의 pk 데이터타입을 이용해서 define할 수 있다.

 

💡 CloudVendorService 생성하기
  • Service 단에서는 Repository에 접근하여 동작을 수행하도록 한다.

  • Service 폴더를 생성하고, CloudVendorService 라는 이름의 인터페이스를 먼저 생성한다.
  • 인터페이스를 implements하여 사용한 것이 CloudVendorServiceImpl이다.
  • 이렇게 하는 이유는, 인터페이스로 정의해서 서비스 구현체에 직접 의존하지 않고 인터페이스에 의존하게 하여 결합도를 낮추기 위함이다.
public interface CloudVendorService {//인터페이스로 정의해서 서비스 구현체에 직접 의존하지 않고 인터페이스에 의존하게 하여 결합도를 낮춤
    public String createCloudVendor(CloudVendor cloudVendor);
    public String updateCloudVendor(CloudVendor cloudVendor);
    public String deleteCloudVendor(String cloudVendorId);
    public CloudVendor getCloudVendor(String cloudVendorId);
    public List<CloudVendor> getAllCloudVendors();
}
  • CloudVendorService 인터페이스이다.
  • 구체적인 동작은 없고, 메서드 정의만 해두었다.
  • CloudVendor model을 CRUD하는 각각의 메서드이다.
    createCloudVendor : 입력으로 받은 cloudVendor 정보로 CloudVendor를 생성하는 메서드이다.
    updateCloudVendor : 입력으로 받은 cloudVendor 정보로 CloudVendor를 수정하는 메서드이다.
    deleteCloudVendor : 입력으로 받은 특정 cloudVendorId에 대한 CloudVendor 정보를 삭제하는 메서드이다.
    getCloudVendor : 입력으로 받은 특정 cloudVendorId에 대한 CloudVendor 정보를 읽어오는 메서드이다.
    getAllCloudVendor :  모든 CloudVendor 정보를 읽어오는 메서드로, List 형태로 가져온다.
@Service
public class CloudVendorServiceImpl implements CloudVendorService{
    CloudVendorRepository cloudVendorRepository;

    public CloudVendorServiceImpl(CloudVendorRepository cloudVendorRepository) {
        this.cloudVendorRepository = cloudVendorRepository;
    }

    @Override
    public String createCloudVendor(CloudVendor cloudVendor) {
        //more Business logic
        cloudVendorRepository.save(cloudVendor);
        return "Success";
    }

    @Override
    public String updateCloudVendor(CloudVendor cloudVendor) {
        //more Business logic
        cloudVendorRepository.save(cloudVendor);//jpa의 save 메서드의 경우, 이미 있는 값에 대해서는 변경된 내용만 추적해서 수정합니다
        return "Success";
    }

    @Override
    public String deleteCloudVendor(String cloudVendorId) {
        //more Business logic
        cloudVendorRepository.deleteById(cloudVendorId);
        return "Success";
    }

    @Override
    public CloudVendor getCloudVendor(String cloudVendorId) {
        //more Business logic
        return cloudVendorRepository.findById(cloudVendorId).get();
    }

    @Override
    public List<CloudVendor> getAllCloudVendors() {
        //more Business logic
        return cloudVendorRepository.findAll();
    }//이 안에 있는 모든 메서드를 implements 하기 전에는 빨간줄이 떠있음

}
  • CloudService를 implements한 것이 CloudVendorServiceImpl이다.
  • CloudVendorRepository 객체를 하나 생성하고, repository메서드를 이용해 각 메서드를 동작하도록 한다.
  • 처음에 모든 메서드를 implements하기 전에는 빨간 줄이 떠있게 된다. 빨간 표시를 누르면 자동으로 override할 수 있는 틀을 가져오는 버튼이 있다. 이 버튼을 누르면 override해야 할 메서드를 모두 가져와 준다.
  • 각 메서드에 맞는 repository의 메서드를 호출하여 데이터베이스 작업이 진행되도록 한다.
  • repository의 save() 메서드는 입력받은 Entity 정보를 삽입, 수정한다.
    해당하는 pk가 없었다면 삽입, 이미 있는 pk에 일부 정보만 바뀌었다면 수정 하도록 한다.
  • repository의 deleteById() 메서드는 입력받은 Entity의 pk를 통해 해당 정보를 삭제한다.
  • repository의  findById() 메서드는 입력받은 Entity의 pk를 통해 해당 정보를 가져온다.
  • repository의 findAll() 메서드는 모든 Entity 정보를 가져온다.

 

💡 CloudVendor Controller 수정하기
  • Controller의 CloudVendor Controller를 CloudVendorController로 클래스 이름을 수정한다.
  • Controller에서는 서비스 단의 메서드를 호출하여 CRUD를 수행하도록 한다.
public class CloudVendorController {
    CloudVendorService cloudVendorService;

    public CloudVendorController(CloudVendorService cloudVendorService) {
        this.cloudVendorService = cloudVendorService;
    }

    //Read Specific Cloud Vendor Details
    @GetMapping("{vendorId}")
    public CloudVendor getCloudVendorDetails(@PathVariable("vendorId") String vendorId)//위 url 경로로부터 값을 받아와서 사용하므로 어노테이션 추가
    {
        return cloudVendorService.getCloudVendor(vendorId);
    }

    //Read All Cloud Vendor Details
    @GetMapping
    public List<CloudVendor> getCloudVendorDetails()//위 url 경로로부터 값을 받아와서 사용하므로 어노테이션 추가
    {
        return cloudVendorService.getAllCloudVendors();
    }

    //Create Cloud Vendor
    @PostMapping
    public String postCloudVendorDetails(@RequestBody CloudVendor cloudVendor)
    {
        cloudVendorService.createCloudVendor(cloudVendor);
        return "Cloud Vendor Created Successfully";
    }

    //Update Cloud Vendor
    @PutMapping//수정이라 하더라도 특정 id 안받아도됨-> jpa의 save 메서드가 이미 있는 값에 대해서는 변경을 하고, 없으면 삽입을 하는 두가지 역할을 수행하기 때문
    public String updateCloudVendorDetails(@RequestBody CloudVendor cloudVendor)
    {
        cloudVendorService.updateCloudVendor(cloudVendor);
        return "Cloud Vendor Updated Successfully";
    }

    @DeleteMapping("{VendorId}")
    public String deleteCloudVendorDetails(@PathVariable("VendorId") String vendorId)
    {
        cloudVendorService.deleteCloudVendor(vendorId);
        return "Cloud Vendor Deleted Successfully";
    }
}
  • CloudVendorService 객체를 하나 생성한다.
  • @PathVariable은 url로 받는 값을 메서드의 인자로 받아 사용하기 위한 어노테이션이다.
  • @RequestBody는 프론트 단에서 입력한 값을 가져와 메서드의 인자로 받아 사용하기 위한 어노테이션이다.
  • 각각의 CRUD 메서드에 맞는 Service 단의 메서드를 호출하여 수행한다.

 

💡 실행 결과
  • 첫 실행 후에는, 데이터 베이스에 Cloud Vendor Entity에 대한 테이블이 처음 생성되므로, 해당 테이블의 레코드는 Empty set 상태임을 확인할 수 있다.
  • POST MAN을 사용하여 정보를 입력한다.
  • post 모드에서 C1-C5  총 5개의 레코드를 삽입한다.

  • 실행 결과, 잘 삽입되었다는 메시지가 출력된다
Cloud Vendor Created Successfully

 

  • GET 모드에서 C3에 대한 값을 가져온다.

  •  실행 결과 C3에 대한 모델 값이 잘 반환된다.

  • GET 모드에서 모든 모델 값을 가져온다.

  • 실행 결과 모든 모델 값이 잘 반환된다.
  • PUT 모드에서 C4에 대한 모델 값을 address를 London으로 변경해본다.

  • 실행 결과 잘 update되었다는 메시지가 출력된다.
Cloud Vendor Updated Successfully
  • 그리고 GET 모드를 통해 검색한 결과, 변경된 값이 잘 반영된 것을 확인할 수 있다.

  • DELETE 모드를 통해 C3를 삭제해본다.

  • 실행 결과 잘 삭제되었다는 메시지가 출력된다.
Cloud Vendor Deleted Successfully

 

  • GET 모드에서 C3를 읽어들이려고 하니, 예외처리를 하지 않아 에러가 발생한다. 없는 값을 읽으려고 해서 발생하는 오류이다.

  • 이로써 모든 CRUD가 잘 동작하는 것을 확인하였다.
  • 실시간으로 powershell을 통해 db 상태를 확인하며 잘 동작하는 것도 확인하였다.

 

다음시간에는 예외처리를 위한 코드를 추가할 예정이다.

 

 

다음 내용↓↓↓

2023.11.22 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (4)-예외처리/handle Exception

 

[REST API] Spring Boot로 REST API CRUD 간단 구현 (4)-예외처리/handle Exception

이전 내용↓↓↓ 2023.11.13 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (3) [REST API] Spring Boot로 REST API CRUD 간단 구현 (3) 이전 내용↓↓↓ 2023.11.11 - [Web Application/Backend] - [REST API] S

im-gonna.tistory.com

 

반응형

+ Recent posts