이번주? 지난주? 에 포스팅 했던 포스트맨!! 얘기가 강의에 나와서 잽싸게 적어두기 ✍️
네이버 API에서 만든 Client ID 와 Client Secret 을 각각 포스트맨의 value 값으로 주고
API 참고사항을 살펴보면 key 값으로 줘야하는 것들이 있다. 하라는대로 설정해주고 Send 누르면 아래처럼 탸라~
맥북 에어에 대한 설정 값들이 json 형태로 좌라락 뜨게 된다!
포스트맨은 이렇게 쓰는구나라고 실전으로 깨우치기 완!
그럼 얘네가 어떤 원리로 상호작용을 하는걸까?
이런식으로 흘러가서 우리에게 보여진다는 말~!
인텔리제이 패키지는 이렇게 설정
- 컨트롤러 부분을 담당하는 패키지
- 반환 부분을 담당하는 패키
- 서비스와 관련된 부분을 담당하는 패키지
SQL을 볼수 있게끔 resource의 application.properties에 아래의 코드를 복붙해야한다.
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:db;MODE=MYSQL;
spring.datasource.username=sa
spring.datasource.password=
spring.thymeleaf.cache=false
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
API 만들다가 인텔리제이에서 import org.json 부분이 전부 처리가 안되서 찾아보니까
Google Code Archive - Long-term storage for Google Code Project Hosting.
code.google.com
json 홈페이지 접속해서 json-simpe-1.1.1.jar 를 받아준 다음 윗 사진처럼 적용시켜주면 된다!
바로 적용이 안 된다면 프로그램을 종료하고 다시 실행시키면 적용 오나료!
와 더 간단한 방법을 강의에서 말해줌~!
build.gradle을 눌러서
dependencies에
implementation group: 'org.json', name: 'json', version: '20220924'
추가해주고 코끼리 누르면 끝이었다.... 완전 쉬워,,,,,
이클립스 추가랑 크롬 웹 페이지에서 JSON 예쁘게 정렬해주는 도구 링크는 접어둠😎
📌 이클립스
Java Project 우클릭 > Properties > Java Build Path > Libraries > Classpath > Add External JARs... 버튼 > 1번에서 다운받은 파일 (json-simple-1.1.1.jar) 선택 후 적용
📌 JSON 정렬 크롬확장도구
JSONVue
Validate and view JSON documents
chrome.google.com

[AllInOneController.java]
상반기에 배웠던 정말 쓸데없이 길고 복잡하고 단순반복이 많은 코드이다.
package com.example.myselectshopbeta.controller;
import com.example.myselectshopbeta.dto.ProductMypriceRequestDto;
import com.example.myselectshopbeta.dto.ProductRequestDto;
import com.example.myselectshopbeta.dto.ProductResponseDto;
import com.example.myselectshopbeta.entity.Product;
import org.springframework.web.bind.annotation.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/api")
public class AllInOneController {
// 관심 상품 등록하기
@PostMapping("/products")
public ProductResponseDto createProduct(@RequestBody ProductRequestDto requestDto) throws SQLException {
// 요청받은 DTO 로 DB에 저장할 객체 만들기
Product product = new Product(requestDto);
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:h2:mem:db", "sa", "");
// DB Query 작성
PreparedStatement ps = connection.prepareStatement("select max(id) as id from product");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
// product id 설정 = product 테이블의 마지막 id + 1
product.setId(rs.getLong("id") + 1);
} else {
throw new SQLException("product 테이블의 마지막 id 값을 찾아오지 못했습니다.");
}
ps = connection.prepareStatement("insert into product(id, title, image, link, lprice, myprice) values(?, ?, ?, ?, ?, ?)");
ps.setLong(1, product.getId());
ps.setString(2, product.getTitle());
ps.setString(3, product.getImage());
ps.setString(4, product.getLink());
ps.setInt(5, product.getLprice());
ps.setInt(6, product.getMyprice());
// DB Query 실행
ps.executeUpdate();
// DB 연결 해제
ps.close();
connection.close();
// 응답 보내기
return new ProductResponseDto(product);
}
// 관심 상품 조회하기
@GetMapping("/products")
public List<ProductResponseDto> getProducts() throws SQLException {
List<ProductResponseDto> products = new ArrayList<>();
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:h2:mem:db", "sa", "");
// DB Query 작성 및 실행
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from product");
// DB Query 결과를 상품 객체 리스트로 변환
while (rs.next()) {
Product product = new Product();
product.setId(rs.getLong("id"));
product.setImage(rs.getString("image"));
product.setLink(rs.getString("link"));
product.setLprice(rs.getInt("lprice"));
product.setMyprice(rs.getInt("myprice"));
product.setTitle(rs.getString("title"));
products.add(new ProductResponseDto(product));
}
// DB 연결 해제
rs.close();
connection.close();
// 응답 보내기
return products;
}
// 관심 상품 최저가 등록하기
@PutMapping("/products/{id}")
public Long updateProduct(@PathVariable Long id, @RequestBody ProductMypriceRequestDto requestDto) throws SQLException {
Product product = new Product();
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:h2:mem:db", "sa", "");
// DB Query 작성
PreparedStatement ps = connection.prepareStatement("select * from product where id = ?");
ps.setLong(1, id);
// DB Query 실행
ResultSet rs = ps.executeQuery();
if (rs.next()) {
product.setId(rs.getLong("id"));
product.setImage(rs.getString("image"));
product.setLink(rs.getString("link"));
product.setLprice(rs.getInt("lprice"));
product.setMyprice(rs.getInt("myprice"));
product.setTitle(rs.getString("title"));
} else {
throw new NullPointerException("해당 아이디가 존재하지 않습니다.");
}
// DB Query 작성
ps = connection.prepareStatement("update product set myprice = ? where id = ?");
ps.setInt(1, requestDto.getMyprice());
ps.setLong(2, product.getId());
// DB Query 실행
ps.executeUpdate();
// DB 연결 해제
rs.close();
ps.close();
connection.close();
// 응답 보내기 (업데이트된 상품 id)
return product.getId();
}
}
이렇게 실행이 된다.
한 번에 작동한다는 장점이 있지만
이러한 단점들이 있다.
- 한 개의 클래스에 너무 많은 양의 코드가 존재
- 코드 이해가 어려움: 처음부터 끝까지 다 읽어야 코드 내용을 이해할 수 있음
- 현업에서는 코드 추가 혹은 변경 요청이 계속 생김
[변경 요청의 예]
- 관심 상품 등록 시 Client 에게 응답 (Response) 하는 값 변경
- 등록된 Product 전체 정보 → 등록된 Product 의 id
- 최저가 (Myprice) 업데이트 조건 변경
- Client 가 최저가를 0원 이하로 입력 → 에러 발생
- DB 테이블 이름 변경
- Product 테이블의 lprice → lowprice 변경
- 관심 상품 등록 시 Client 에게 응답 (Response) 하는 값 변경
"절차적 프로그래밍(Procedural Programming)"
vs.
"객체지향 프로그래밍(Object-Oriented Programming)"
📌 "절차적 프로그래밍(Procedural Programming)"
- 초기 프로그래밍 방식
- 컴퓨터가 해야할 일들을 쭈~욱 순차적으로 나열해 놓는 코딩 방식
- 예) AllInOneController 클래스의 각 API 처리내용
📌"객체지향 프로그래밍(Object-Oriented Programming)"
- 소프트웨어의 규모가 점점 커지면서 필요성이 부각이 됨
- 대부분의 사람들은 한 번에 여러가지 다른 생각을 하는데 취약
- 하나의 사물 (객체) 에 하나의 의미를 부여하는 것처럼 프로그래밍하게 됨
- 예)
- 뭔가 자를 것이 필요하면 '✂️' 를 떠올림 (class Sciccors)
- 종이에 적을 게 필요하면 '✏️' 을 떠올림 (class Pen)
- "하나의 역할" → 객체
- 예)
- 절차적 프로그래밍
: 아무 메모장을 띄워서, 생각나는대로 사고의 흐름을 적는다. (퀵메모)
- 장점:
- 메모를 작성하기에 편함 (직관적)
- 단점:
- 메모양이 많아지면 정리가 어려움
- 내가 원하는 메모 내용을 찾기 어려움
- 장점:
- 객체지향 프로그래밍
: "주제별"로 정리해서 메모한다.(ex. 주식투자, 바리스타 공부)
- 장점: 메모를 관리하기 쉬움
- 단점:
- 주제를 어떻게 나눠야 할지, 고민이 필요
- 잘못 주제를 나누면..
- 중복된 메모 내용이 생길 수 있음 (ex. "나중에 읽을 책", "도움이 되는 책")
- 하나의 주제에 너무 적거나, 너무 많은 메모 내용이 들어갈 수 있음 (ex. "88 올림픽 한국 순위와 금메달 개수", "공부")
- 잘못 주제를 나누면..
- 주기적으로 주제별 (카테고리별) 정리가 필요할 수 있음
- 떠오르는 생각들을 적을때 주제가 다른 메모 내용들을 적기 어려움
- 주제를 어떻게 나눠야 할지, 고민이 필요
😎 추천 프로그래밍 방식
- 처음엔 "절차적 프로그래밍"
- "객체지향 프로그래밍"으로 리팩토링
💡 '리팩토링' 이 뭐죠?? : 기능 상의 변경 없이 프로그래밍 구조를 개선하는 것
1️⃣ 하나의 파일에 너무 많은 코드가 들어가지 않게!
2️⃣ 역할별로 코드 분리!!
3️⃣ 코드를 좀 더 읽기 편하게!!!
ㄴㄹㅇㄹㄴㅇㄹㄴ