Sparta/What I Learned

22.12.15

코딩하는 또롱이 2022. 12. 15. 12:19

이번주? 지난주? 에 포스팅 했던 포스트맨!! 얘기가 강의에 나와서 잽싸게 적어두기 ✍️

 

네이버 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();
    }

}

이렇게 실행이 된다.

한 번에 작동한다는 장점이 있지만

 

이러한 단점들이 있다.

  1. 한 개의 클래스에 너무 많은 양의 코드가 존재
    • 코드 이해가 어려움: 처음부터 끝까지 다 읽어야 코드 내용을 이해할 수 있음
  2. 현업에서는 코드 추가 혹은 변경 요청이 계속 생김

    [변경 요청의 예]
    • 관심 상품 등록 시 Client 에게 응답 (Response) 하는 값 변경
      • 등록된 Product 전체 정보 → 등록된 Product 의 id
    • 최저가 (Myprice) 업데이트 조건 변경
      • Client 가 최저가를 0원 이하로 입력 → 에러 발생
    • DB 테이블 이름 변경
      • Product 테이블의 lpricelowprice 변경
"절차적 프로그래밍(Procedural Programming)"
vs.
"객체지향 프로그래밍(Object-Oriented Programming)"

📌 "절차적 프로그래밍(Procedural Programming)"

  • 초기 프로그래밍 방식
  • 컴퓨터가 해야할 일들을 쭈~욱 순차적으로 나열해 놓는 코딩 방식
  • 예) AllInOneController 클래스의 각 API 처리내용

 📌"객체지향 프로그래밍(Object-Oriented Programming)"

  • 소프트웨어의 규모가 점점 커지면서 필요성이 부각이 됨
  • 대부분의 사람들은 한 번에 여러가지 다른 생각을 하는데 취약
  • 하나의 사물 (객체) 에 하나의 의미를 부여하는 것처럼 프로그래밍하게 됨
    • 예)
      • 뭔가 자를 것이 필요하면 '✂️' 를 떠올림 (class Sciccors)
      • 종이에 적을 게 필요하면 '✏️' 을 떠올림 (class Pen)
      • "하나의 역할" → 객체
  • 절차적 프로그래밍
    : 아무 메모장을 띄워서, 생각나는대로 사고의 흐름을 적는다. (퀵메모)
    1. 장점:
      • 메모를 작성하기에 편함 (직관적)
    2. 단점:
      • 메모양이 많아지면 정리가 어려움
      • 내가 원하는 메모 내용을 찾기 어려움
  • 객체지향 프로그래밍
    : "주제별"로 정리해서 메모한다.(ex. 주식투자, 바리스타 공부)
    1. 장점: 메모를 관리하기 쉬움
    2. 단점:
      • 주제를 어떻게 나눠야 할지, 고민이 필요
        • 잘못 주제를 나누면..
          • 중복된 메모 내용이 생길 수 있음 (ex. "나중에 읽을 책", "도움이 되는 책")
          • 하나의 주제에 너무 적거나, 너무 많은 메모 내용이 들어갈 수 있음 (ex. "88 올림픽 한국 순위와 금메달 개수", "공부")
      • 주기적으로 주제별 (카테고리별) 정리가 필요할 수 있음
      • 떠오르는 생각들을 적을때 주제가 다른 메모 내용들을 적기 어려움

 

😎 추천 프로그래밍 방식

  1. 처음엔 "절차적 프로그래밍"
  2. "객체지향 프로그래밍"으로 리팩토링
💡 '리팩토링' 이 뭐죠?? : 기능 상의 변경 없이 프로그래밍 구조를 개선하는 것

1️⃣ 하나의 파일에 너무 많은 코드가 들어가지 않게!
2️⃣ 역할별로 코드 분리!!
3️⃣ 코드를 좀 더 읽기 편하게!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ㄴㄹㅇㄹㄴㅇㄹㄴ

'Sparta > What I Learned' 카테고리의 다른 글

22.12.17  (0) 2022.12.21
22.12.16  (1) 2022.12.21
22.12.14  (0) 2022.12.14
22.12.13  (0) 2022.12.14
22.12.12  (0) 2022.12.14