🍎 How's the day going?
개인 과제 완료하고 하루 끝냈네. 과제 끝내고 금요일만 되면 뭔가 집중이 잘 안되는 느낌이넹 ㅠㅠ
뭔가 더 할 수 있는걸 좀 생각해 내고!!
좀 더 의욕을 가지자!

🍊코드카타 목록
- 보호소에서 중성화한 동물
- 조건에 맞는 도서와 저자 리스트 출력하기
- 조건별로 분류하여 주문상태 출력하기
- 햄버거 만들기
- 성격 유형 검사하기
- 바탕화면 정리
💡오늘 정리 목록
- REST ful 한 API
🚩오늘의 회고
코드카타
코트가타
1. 보호소에서 중성화한 동물
SELECT o.ANIMAL_ID, o.ANIMAL_TYPE, o.NAME
FROM ANIMAL_INS i JOIN ANIMAL_OUTS o
ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE i.SEX_UPON_INTAKE <> o.SEX_UPON_OUTCOME
ORDER BY ANIMAL_ID
2. 조건에 맞는 도서와 저자 리스트 출력하기
SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK b JOIN AUTHOR a
ON b.AUTHOR_ID = a.AUTHOR_ID
WHERE b.CATEGORY = '경제'
ORDER BY b.PUBLISHED_DATE
3. 조건별로 분류하여 주문상태 출력하기
SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE,'%Y-%m-%d') AS OUT_DATE,
CASE WHEN OUT_DATE <= '2022-5-1' THEN '출고완료'
WHEN OUT_DATE IS NULL THEN '출고미정'
ELSE '출고대기' END AS 출고여부
FROM FOOD_ORDER
ORDER BY ORDER_ID
4. 햄버거 만들기
import java.util.ArrayList;
import java.util.List;
class Solution {
public int solution(int[] ingredient) {
int answer = 0;
List<Integer> list = new ArrayList<>();
int i = 0;
while(i<ingredient.length){
list.add(ingredient[i]);
if(list.size()>=4 && list.get(list.size()-1)==1 && list.get(list.size()-2)==3 && list.get(list.size()-3)==2 && list.get(list.size()-4)==1){
list.remove(list.size()-4);
list.remove(list.size()-3);
list.remove(list.size()-2);
list.remove(list.size()-1);
answer++;
}
i++;
}
return answer;
}
}
5. 성격 유형 검사하기
import java.util.HashMap;
class Solution {
public String solution(String[] survey, int[] choices) {
String[] answer = new String[]{"RT", "CF", "JM", "AN"};
HashMap<Character, Integer> map = new HashMap<>();
for(int i=0;i< survey.length;i++){
if(choices[i]<4){
map.put(survey[i].charAt(0),map.getOrDefault(survey[i].charAt(0),0)+4-choices[i]);
}else if(choices[i]>4){
map.put(survey[i].charAt(1), map.getOrDefault(survey[i].charAt(1), 0) + choices[i]-4);
}
}
StringBuilder sb=new StringBuilder();
for(String s:answer){
if(map.getOrDefault(s.charAt(1),0)>map.getOrDefault(s.charAt(0),0)){
sb.append(s.charAt(1));
}else{
sb.append(s.charAt(0));
}
}
return sb.toString();
}
}
6. 바탕화면 정리
class Solution {
public int[] solution(String[] wallpaper) {
int[] answer = {};
int x_max = 0,x_min = 51,y_max = 0,y_min = 51;
for(int i = 0; i < wallpaper.length; i++){
for(int j = 0; j < wallpaper[i].length(); j++){
if(wallpaper[i].charAt(j) == '#'){
x_max = Math.max(x_max, j);
x_min = Math.min(x_min, j);
y_max = Math.max(y_max, i);
y_min = Math.min(y_min, i);
}
}
}
answer = new int[]{y_min, x_min, y_max+1, x_max+1};
return answer;
}
}
코드카타는.. 뭔가 좀 배울 께 있다.. 이런 느낌 들기 전까지는.. 그냥 뭐했는지 체크만 하는걸로
1) REST ful한 API는 뭘까..?
RESTful API의 특징
- 클라이언트-서버 구조 (Client-Server Architecture): 클라이언트와 서버가 분리되어 독립적으로 동작합니다. 클라이언트는 사용자 인터페이스를 관리하고, 서버는 데이터를 저장하고 처리합니다.
- 무상태성 (Statelessness): 각 요청은 클라이언트의 상태를 서버에 저장하지 않으며, 모든 필요한 정보는 요청에 포함되어야 합니다. 즉, 서버는 클라이언트의 이전 요청을 기억하지 않습니다.
- 캐시 가능 (Cacheable): 응답은 캐시될 수 있어야 하며, 이를 통해 성능이 향상됩니다. 서버 응답에는 캐싱 가능 여부에 대한 정보가 포함됩니다.
- 일관된 인터페이스 (Uniform Interface): API는 일관된 인터페이스를 제공해야 합니다. 이는 리소스의 URI, HTTP 메서드 (GET, POST, PUT, DELETE), 헤더, 상태 코드 등을 일관되게 사용하는 것을 의미합니다.
- 계층화 시스템 (Layered System): 클라이언트는 중간 서버를 통해 서버와 통신할 수 있으며, 이를 통해 보안, 로드 밸런싱, 캐싱 등의 기능을 추가할 수 있습니다.
- Code on Demand (선택 사항): 필요 시 서버에서 클라이언트로 코드를 전송하여 실행할 수 있습니다. 예를 들어, JavaScript를 전송하여 클라이언트에서 실행할 수 있습니다.
RESTful API 설계 원칙
- 리소스 기반 (Resource-Based): 모든 것은 리소스이며, 리소스는 URI로 식별됩니다. 예를 들어, http://api.example.com/users/123는 ID가 123인 사용자 리소스를 나타냅니다.
- HTTP 메서드 사용:
- GET: 리소스를 조회합니다.
- POST: 리소스를 생성합니다.
- PUT: 리소스를 수정합니다.
- DELETE: 리소스를 삭제합니다.
- 표현 방식 (Representation): 리소스는 다양한 형식(JSON, XML 등)으로 표현될 수 있으며, 클라이언트는 서버가 제공하는 표현을 사용합니다.
- 상태 코드 (Status Codes): HTTP 상태 코드를 사용하여 요청의 결과를 나타냅니다. 예를 들어, 200(성공), 201(생성됨), 400(잘못된 요청), 404(찾을 수 없음), 500(서버 오류) 등이 있습니다.
RESTful API 예시
여기서는 가상의 도서 관리 시스템을 예로 들어 설명하겠습니다.
1. 리소스 URI 설계
- 책 목록 조회: GET /books
- 특정 책 조회: GET /books/{bookId}
- 새 책 추가: POST /books
- 책 정보 수정: PUT /books/{bookId}
- 책 삭제: DELETE /books/{bookId}
2. HTTP 요청 및 응답 예시
- 책 목록 조회:
GET /books HTTP/1.1
Host: api.example.com
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"id": 1,
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"published_date": "1925-04-10"
},
{
"id": 2,
"title": "To Kill a Mockingbird",
"author": "Harper Lee",
"published_date": "1960-07-11"
}
]
- 특정 책 조회:
GET /books/1 HTTP/1.1
Host: api.example.com
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"published_date": "1925-04-10"
- 새 책 추가:
POST /books HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"title": "1984",
"author": "George Orwell",
"published_date": "1949-06-08"
}
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 3,
"title": "1984",
"author": "George Orwell",
"published_date": "1949-06-08"
}
- 책 정보 수정:
PUT /books/3 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"title": "Nineteen Eighty-Four",
"author": "George Orwell",
"published_date": "1949-06-08"
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 3,
"title": "Nineteen Eighty-Four",
"author": "George Orwell",
"published_date": "1949-06-08"
}
- 책 삭제:
DELETE /books/3 HTTP/1.1
Host: api.example.com
HTTP/1.1 204 No Content
이와 같이 RESTful API는 명확한 설계 원칙과 일관된 인터페이스를 통해 클라이언트와 서버 간의 통신을 효율적으로 관리할 수 있도록 도와줍니다.