FastCampus X Yanolja TechSchool

ํŒจ์ŠคํŠธ์บ ํผ์ŠคX์•ผ๋†€์ž: ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ๋ถ€ํŠธ ์บ ํ”„ - Java ์‹ฌํ™” ๊ณผ์ œ 2

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2023. 9. 4.

๊ณผ์ œ2 : ์ฑ… ๊ฒ€์ƒ‰ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ

์ด ํ”„๋กœ๊ทธ๋žจ์€ Kakao Book Open API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฑ…์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ฒ€์ƒ‰ํ•œ ์ฑ… ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“œ๊ณผ์ œ์•ˆ๋‚ด

  • (๊ฐ•์‚ฌ๋‹˜) ๊ณผ์ œ ์•ˆ๋‚ด: 8์›” 25์ผ(๊ธˆ)
  • (์ˆ˜๊ฐ•์ƒ) ๊ณผ์ œ ์ œ์ถœ: ~8์›” 30์ผ(์ˆ˜) 23:59
  • (๋ฉ˜ํ† ์ง„) ๊ณผ์ œ ์ฑ„์ : 8์›” 31์ผ(๋ชฉ) ~ 9์›” 6์ผ(์ˆ˜)

โœ”๏ธ 1.๋ฌธ์ œ ์„ค๋ช…

๋‹จ๊ณ„ 1: Kakao API ํ‚ค ํš๋“

  1. Kakao Developers์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๋กœ๊ทธ์ธ ํ›„, ์‹œ์ž‘ ๊ฐ€์ด๋“œ์— ๋”ฐ๋ผ ์ž์‹ ๋งŒ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ ์‹œ, ๊ฐ ํ”Œ๋žซํผ๋ณ„๋กœ ์•ฑ ํ‚ค๊ฐ€ ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘ ์‚ฌ์šฉ์„ ์œ„ํ•ด REST API ํ‚ค๋ฅผ ๋ฉ”๋ชจํ•ด๋‘์„ธ์š”.

๋‹จ๊ณ„ 2: ์ฑ… ๊ฒ€์ƒ‰ API ์‚ฌ์šฉ

  1. ๋‹ค์Œ ๊ฒ€์ƒ‰ REST API ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ฑ… ๊ฒ€์ƒ‰ REST API๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฌธ์„œ์—์„œ ์ œ๊ณต๋œ ์ฑ… ๊ฒ€์ƒ‰ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ์š”์ฒญ๊ณผ ์‘๋‹ต ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ 3: Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„

  1. Kakao Book Open API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž…๋ ฅ์œผ๋กœ ์ฑ… ์ œ๋ชฉ์„ ์ œ๊ณตํ•˜๊ณ  API์—์„œ ๋ฐ›์•„์˜จ ์ฑ… ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒ€์ƒ‰ํ•œ ์ฑ…์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋„์„œ ์ œ๋ชฉ, ๊ฐ€๊ฒฉ, ์ถœํŒ์‚ฌ, ์ €์ž, ํ• ์ธ ๊ฐ€๊ฒฉ ๋ฐ ISBN๊ณผ ๊ฐ™์ด ์ ์ ˆํ•œ ์ •๋ณด๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  4. ์ฑ… ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธ 10๊ฐœ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ 4: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ

  1. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ ํ›„, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜๋„๋ก ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ (Y), ๊ด€๋ จ ์ฑ… ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ์ฑ… ๋ชฉ๋ก์„ ๋„์„œ ์ œ๋ชฉ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

โœ”๏ธ 2.์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์˜ˆ์‹œ

[์ž…๋ ฅ ํ™”๋ฉด]

๋„์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”: ์ž๋ฐ”์˜ ์ •์„

 

[์ถœ๋ ฅ ๊ฒฐ๊ณผ]

๋„์„œ ์ œ๋ชฉ๊ฐ€๊ฒฉ์ถœํŒ์‚ฌ์ž‘๊ฐ€ํ• ์ธ ๊ฐ€๊ฒฉISBN

์ž๋ฐ”์˜ ํ‘œ์ค€ 30000 ๋„์šธ ๋‚จ๊ถ์„ฑ 26000 98210011
...          

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Y/N

์ €์žฅ์„ฑ๊ณต

[TABLE LIST]

๋„์„œ ์ œ๋ชฉ๊ฐ€๊ฒฉ์ถœํŒ์‚ฌ์ž‘๊ฐ€ํ• ์ธ ๊ฐ€๊ฒฉISBN

์ž๋ฐ”์˜ ํ‘œ์ค€ 30000 ๋„์šธ ๋‚จ๊ถ์„ฑ 26000 98210011
...          

โœ”๏ธ 3.์˜์กด์„ฑ

  • Java 8 ์ด์ƒ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ: JDBC) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด ํ•„์š”

โœ”๏ธ 4.ํ‰๊ฐ€๊ธฐ์ค€

  • ์ œ์ถœ ๊ธฐํ•œ์— ๋งž์ถ”์–ด ์ œ์ถœํ•˜์˜€๋Š”๊ฐ€? (5์ )
  • ์‹ค์Šต ๋ฌธ์ œ ๋ณ„ ์ œ์‹œ๋œ ์กฐ๊ฑด์— ๋งž์ถ”์–ด ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ๋Š”๊ฐ€? (5์ )
  • ์ œ์‹œ๋œ ๊ธฐ๋Šฅ๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”๊ฐ€? (5์ )
  1. ์ž…์ถœ๋ ฅ ํ™”๋ฉด์ด ์ž˜ ์„ค๊ณ„ ๋˜์—ˆ๋Š”๊ฐ€?
  2. JSON ์ฑ… ๋ฐ์ดํ„ฐ ์ž˜ ํŒŒ์‹ฑํ•˜์—ฌ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜์˜€๋Š”๊ฐ€?
  3. ์ฑ… ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž˜ ์ €์žฅ ํ•˜์˜€๋Š”๊ฐ€?
  4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ์ฑ… ๋ชฉ๋ก์„ ์ž˜ ๋ถˆ๋Ÿฌ ์™”๋Š”๊ฐ€?

๐ŸŽฏKAKAO API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„์„œ ๊ฒ€์ƒ‰

 

๐Ÿ’‰์˜์กด์„ฑ

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20210307</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
</dependencies>

 

ํŒจํ‚ค์ง€ ์„ค๊ณ„

 

Book.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    private String title;
    private int price;
    private String publisher;
    private String author;
    private int salePrice;
    private String isbn;
}
cs

 

GetFileInfo.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.FileInputStream;
import java.util.Properties;
 
public class GetFileInfo {
    public String getValue(String keyword) {
        Properties properties = new Properties();
        String info = null;
        try {
            properties.load(new FileInputStream("config.yml"));
            info = properties.getProperty(keyword);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return info;
    }
}
cs
config.yml ํŒŒ์ผ์— ์žˆ๋Š” ๊ฐœ์ธ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ถ”์ถœํ•ด ์˜ค๋Š” ํด๋ž˜์Šค

 

 

 

MySQLBookDAO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import org.example.model.Book;
import org.example.service.GetFileInfo;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
 
public class MysqlBookDAO implements BookRepository {
    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;
 
    public void getConnection() {
        GetFileInfo getFileInfo = new GetFileInfo();
        String url = getFileInfo.getValue("sql_url");
        String username = getFileInfo.getValue("sql_username");
        String password = getFileInfo.getValue("sql_password");
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, username, password);
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public int saveBook(List<Book> bookList) {
        String query = "insert into booktbl(title, price, publisher, author, saleprice, isbn) values(?, ?, ?, ?, ?, ?)";
        int cnt = -1;
        getConnection();
        try {
            ps = conn.prepareStatement(query);
            for (int i = 0; i < bookList.size(); i++) {
                ps.setString(1, bookList.get(i).getTitle());
                ps.setInt(2, bookList.get(i).getPrice());
                ps.setString(3, bookList.get(i).getPublisher());
                ps.setString(4, bookList.get(i).getAuthor());
                ps.setInt(5, bookList.get(i).getSalePrice());
                ps.setString(6, bookList.get(i).getIsbn());
                ps.executeUpdate();
            }
            cnt = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            dbClose();
        }
        return cnt;
    }
 
    @Override
    public List<Book> findAll() {
        String query = "select * from booktbl order by title asc";
        getConnection();
        List<Book> bookList = new ArrayList<>();
        try {
            ps = conn.prepareStatement(query);
            rs = ps.executeQuery();
            while (rs.next()) {
                String title = rs.getString("title");
                int price = rs.getInt("price");
                String publisher = rs.getString("publisher");
                String author = rs.getString("author");
                int salePrice = rs.getInt("saleprice");
                String isbn = rs.getString("isbn");
                Book book = new Book(title, price, publisher, author, salePrice, isbn);
                bookList.add(book);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            dbClose();
        }
        return bookList;
    }
 
    public void dbClose() {
        try {
            if (rs != null) rs.close();
            if (ps != null) ps.close();
            if (conn != null) conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

 

BookFindService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.example.model.Book;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
 
public class BookFindService {
    private static final String KAKAO_BOOK_API_URL = "https://dapi.kakao.com/v3/search/book?query=";
 
    public List<Book> searchBook(String keyword) {
        List<Book> bookList = null;
        GetFileInfo getFileInfo = new GetFileInfo();
        String kakaoRestApiKey = getFileInfo.getValue("KAKAO_REST_API_KEY");
 
        try {
            String query = keyword.replaceAll("\\s""");
            String requestURL = KAKAO_BOOK_API_URL + query;
            HttpClient client = HttpClientBuilder.create().build();
            HttpGet getRequest = new HttpGet(requestURL);
            getRequest.addHeader("Authorization""KakaoAK " + kakaoRestApiKey);
 
            HttpResponse response = client.execute(getRequest);
 
 
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                String jsonResponse = EntityUtils.toString(entity);
                
                JSONObject jsonObject = new JSONObject(jsonResponse);
                JSONArray documents = jsonObject.getJSONArray("documents");
                if (!documents.isEmpty()) {
                    bookList = setBookDTO(documents);
                }
            } else {
                System.out.println("response is error : " + response.getStatusLine().getStatusCode());
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bookList;
    }
 
    public List<Book> setBookDTO(JSONArray documents) {
        List<Book> bookList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            JSONObject document = documents.getJSONObject(i);
 
            Book book = new Book();
            book.setTitle(document.getString("title"));
            JSONArray authorList = document.getJSONArray("authors");
            String author = authorList.getString(0);
            book.setAuthor(author);
            book.setPublisher(document.getString("publisher"));
            book.setPrice(document.getInt("price"));
            book.setSalePrice(document.getInt("sale_price"));
            book.setIsbn(document.getString("isbn"));
            bookList.add(book);
        }
        return bookList;
    }
}
cs

 

 

Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import org.example.model.Book;
import org.example.repository.MysqlBookDAO;
import org.example.service.BookFindService;
import java.util.List;
import java.util.Scanner;
 
public class Main {
    static BookFindService bookFindService;
    static MysqlBookDAO mysqlBookDAO;
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("๋„์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”: ");
        String keyword = scanner.next();
        bookFindService = new BookFindService();
        mysqlBookDAO = new MysqlBookDAO();
 
        List<Book> bookList = bookFindService.searchBook(keyword);
        if (bookList != null) {
            printBookList(bookList);
            check_saveDb(bookList);
        } else {
            System.out.println("๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
        }
 
        List<Book> foundBookList = mysqlBookDAO.findAll();
        printBookList(foundBookList);
    }
 
    public static void check_saveDb(List<Book> bookList) {
        System.out.println("๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Y/N");
        boolean check = false;
        while (!check) {
            Scanner scan = new Scanner(System.in);
            String input = scan.nextLine();
            if (input.equals("Y")) {
                int cnt = mysqlBookDAO.saveBook(bookList);
                if (cnt > 0) {
                    System.out.println("์ €์žฅ์„ฑ๊ณต");
                } else {
                    System.out.println("์ €์žฅ์‹คํŒจ");
                }
                check = true;
            } else if (input.equals("N")) {
                check = true;
            } else {
                System.out.println("Y ๋˜๋Š” N ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ์ฃผ์„ธ์š”.");
            }
        }
    }
 
    public static void printBookList(List<Book> bookList) {
        StringBuilder sb = new StringBuilder();
        sb.append("[TABLE LIST]\n");
        sb.append(String.format("%-80s | %-15s | %-15s| %-15s| %-15s| %-15s \n""๋„์„œ์ œ๋ชฉ""๊ฐ€๊ฒฉ""์ถœํŒ์‚ฌ""์ž‘๊ฐ€""ํ• ์ธ ๊ฐ€๊ฒฉ""ISBN"));
        sb.append("=========================================================================================================================================================================\n");
        for (Book book : bookList) {
            sb.append(String.format("%-80s | %-15s | %-15s| %-15s| %-15s| %-15s\n", book.getTitle(), book.getPrice(), book.getPublisher(), book.getAuthor(), book.getSalePrice(), book.getIsbn()));
        }
        System.out.println(sb);
    }
}
cs

 

 

๐Ÿช„์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ํ™”๋ฉด

์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ •์ƒ ์ž‘๋™ ๊ฒฐ๊ณผ

 

 

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ ์•ˆํ–ˆ์„ ์‹œ ๊ฒฐ๊ณผ

 

์ž˜๋ชป ๊ฒ€์ƒ‰์‹œ ๊ฒฐ๊ณผ

 


๐Ÿค”ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

์ €๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„  ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๊ธฐ๋Šฅ๋“ค๋งŒ ์ž‘๋™ํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜์˜€๋‹ค. ๋„ˆ๋ฌด ๊ฐ€๋ณ๊ฒŒ ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ถ„๋“ค์€ ์ž‘์€ ๋ถ€๋ถ„์ด๋ผ๋„ ์‹ค์ œ ์—…๋ฌด์ฒ˜๋Ÿผ ์ฝ”๋”ฉํ•˜์‹ ๊ฑฐ ๋ณด๊ณ  ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉ์‹œํ‚ค๊ฒ ๋” ๋ฆฌํŒฉํ† ๋ง์„ ๋งŽ์ด ์ง„ํ–‰ ํ•˜์˜€๋‹ค.

๋จผ์ € ๊ฐœ์ธ Key๊ฐ’์ด ๋“ค์–ด ์žˆ๋Š” ๋ถ€๋ถ„์€ config.yml ํŒŒ์ผ์— ๋„ฃ์–ด๋†”์„œ ์ •๋ณด ์€๋‹‰์„ ์‹œ์ผฐ๋‹ค. ๊ทธ๊ณณ์—์„œ ๊ฐœ์ธ์ ์ธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ DB๋“  API์—์„œ๋“  ์žฌํ™œ์šฉํ•˜์˜€๋‹ค. URL ๊ฐ™์€ ๊ฒฝ์šฐ๋„ ๋ถˆ๋ณ€ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.

์Šคํ”„๋ง์—์„œ @Autowired ํ•ด์„œ Service๋ฅผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Main.java์—์„œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ๊ณณ์— ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ฃผ์—ˆ๋‹ค.

API ์—ฐ๋™์€ ์ €๋ฒˆ์—๋„ ํ–ˆ์–ด์„œ ์‰ฝ๊ฒŒ ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ถœ๋ ฅ ํ™”๋ฉด์— ํ•œ๊ธ€๊ณผ ์˜์–ด๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” String.format์˜ ๊ฐ„๊ฒฉ์ด ๊ฐ๊ธฐ ๋‹ฌ๋ผ ๊ฐ„๊ฒฉ์ด ์•ˆ๋งž๋Š” ๋ชจ์Šต์ด ๋„ˆ๋ฌด ์‹ ๊ฒฝ์“ฐ์˜€๋‹ค.

java.awt ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ˜์†”์—์„œ๋„ UI๋ฅผ ์‹ ๊ฒฝ์จ์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์–ด๋””์„œ ๋ณด์•˜๋Š”๋ฐ, ์ ‘๋ชฉ์‹œ์ผœ ๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ๋ชปํ•˜์˜€๋‹ค.

java.awt api๋Š” ์–ธ์  ๊ฐ€ ๊ผญ ์จ๋ณด๊ณ  ์‹ถ๋‹ค.

๋Œ“๊ธ€