---
# System prepended metadata

title: Giới thiệu

---

# Giới thiệu

Project của mình sẽ viết bằng Java, sử dụng framework [Spring Boot](https://spring.io/projects/spring-boot) và dùng Maven làm dependency manager/ build tool, database của mình sử dụng là postgresql

# Depedency Manager
Thường khi develop, mình sẽ sử dụng nhiều library ở ngoài, khi đó sẽ cần 1 cái tool để quản lý (cài đặt, compile) những cái library đó, kèm theo tool cũng sẽ giúp mình compile code hay chạy test. Tool đó của mình tên là Maven.

# Về Spring Boot
Spring Boot là 1 framework web MVC như thông thường, em đã biết Model-View-Controllers rồi, nên anh sẽ giới thiệu qua 1 chút về folder structures và chú ý kỹ về models

# ORM
Trước tiên nói về model, như em đã học, database SQL của mình sẽ chứa data theo từng dòng, vd như là mỗi dòng sẽ là thông tin về 1 kỳ thủ, và mỗi cột là 1 chi tiết về thông tin đó. Khi thông tin đó được đưa vào Java, mình sẽ muốn làm theo OOP, và mỗi kỳ thủ là 1 object `Player`, có những property như là `player.name`, tức là mình cần biến 1 dòng data từ database SQL thành 1 object trong Java. Library làm việc đó sẽ gọi là Object-relational mapping (ORM). ORM cũng sẽ xử lý luôn những việc như biến những thông tin của những bảng được JOIN thành object liên quan. VD như mình có object Match (1 ván đấu), thì ORM ngoài việc load data vào object `match` cho mình, đồng thời `match.black` và `match.white` sẽ là 2 object kỳ thủ `player` để mình sử dụng.

ORM trong Spring mà mình sử dụng tên là Hibernate

# Folder structure
Em coi ở folder [này](https://github.com/VietnamGoRatings/VietnamGoRatings/tree/master/src/main/java/net/egv/goratings) sẽ thấy có 4 folders hiện tại: `controllers`, `entities`, `repositories` và `services`. `controllers` chứa controller code, `entities` và `repositories` là models, `services` chứa thêm những logic không nằm trong MVC pattern (tại sao có cái này? Vì nếu không code sẽ nằm hết trong Controller hoặc Models, nó phình to ra sẽ rất phức tạp). Views trong này sẽ nằm ở folder [templates](https://github.com/VietnamGoRatings/VietnamGoRatings/tree/master/src/main/resources/templates).

Về 2 folders của model, `entities` sẽ chứa những class làm ra những Object tương đương với data của mình, như là `Player`, `Match`, `Club`. Còn `repositories` là những class làm việc query hay chạy lệnh để đưa thông tin từ database vô entity objects hay ngược lại, mỗi entity sẽ có repository tương ứng. VD `PlayerRepository.find_all()` sẽ trả về 1 list of `Player` objects.

# Dependency injection
Thông thường, mỗi 1 class của mình khi code sẽ phải sử dụng chức năng của class khác (`ClubController` sẽ phải dùng `ClubRepository` để có khả năng query ra thông tin về câu lạc bộ). Để có object của `ClubRepository`, bản thân class `ClubController` có thể tự tạo ra object đó `repo = new ClubRepository()`. Ngoài ra có 1 cách khác là khi `ClubController` được tạo, nó sẽ được nhận sẵn 1 object của repository để sử dụng, khi đó bản thân controller không phải tạo object đó nữa, cách này có tên là "Dependency Injection", và là cách chính spring sẽ đưa những object services/repositories qua lại cho code của mình sử dụng. 

Thật ra em chẳng phải làm gì cả, em cứ nhìn như constructor của `ClubController` ở [đây](https://github.com/VietnamGoRatings/VietnamGoRatings/blob/75d122bd82986784354de188dca68828e58d8eb6/src/main/java/net/egv/goratings/controller/ClubController.java#L15), mình chỉ cần khai báo đúng là controller cần nhận depedency nào, spring sẽ tự tạo ra và đưa mình.

# Giờ làm gì
Anh đã code sẵn 1 controller để xem tên cái club, bây giờ em sẽ tìm cách setup, chạy được và sau đó vào
`localhost:8080/clubs`.

Để chạy được, đầu tiên em cần cài database postgresql: https://www.postgresql.org/download/
File config cho thông tin database là ở đây : https://github.com/VietnamGoRatings/VietnamGoRatings/blob/master/src/main/resources/application.properties , em sửa dòng 4,5,6 cho đúng thông tin của database, sau đó chỉ cần chạy. App của mình sẽ tự biết tạo ra database với đúng table để sử dụng
