[Spring Boot] Spring Restful và mô hình 3 lớp

Restful api

  • Rest (Representational State Transfer) hiểu nôm na nó là một kiểu kiến trúc được dùng để giao tiếp giữa các máy tính, được truyền tải qua giao thức HTTP. Mọi thứ trong Rest đều được coi là tài nguyên và được biểu diễn qua các dạng xml, Json,...
  • Còn Restful là ứng dụng sử dụng kiến trúc REST :sunny:

Mô hình 3 lớp

  • Cái này mục đính là phân chia ra các lớp để đảm nhận các nhiệm vụ khác nhau (ở đây là 3), tầng làm việc với giao diện, tầng làm công việc tính toán, tầng làm việc với dữ liệu việc phân chia này giúp code tường minh hơn, dễ bảo trì nâng cấp sửa chữa hơn.
  • Với Spring Boot có thể bạn sẽ thấy quen với các annotation @Controller, @Service@Repository. Về bản chất thì nó chính là @Component, spring đã tạo ra các annotation để đánh dấu các tầng với nhau.

Presentation Layer (Controller)

Là tầng giao tiếp với người dùng cuối (client) để hiển thị dữ liệu, thu thập dữ liệu, kiểm tra tính đúng đắn của dữ liệu trước khi gọi tầng service.

Business Logic Layer (Service)

Đây là nới kiểm tra các ràng buộc, tính toàn vẹn và hợp lệ của dữ liệu. Đây là cũng là nơi tính toán, xử lý theo các nghiệp vụ và logic của yêu cầu.

Data Access Layer (Repository)

Đây là nơi thực hiện giao tiếp với cơ sở dữ liệu, xử lý truy vấn và trả về dữ liệu service mong muốn

Ví dụ

  • Đây là những thư viện mình sử dụng
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

alt text
Đây cấu tạo của nó sẽ kiểu kiểu như này. (Entity là để ánh xạ từ cơ sở dữ liệu) Rồi khi dự án phình to ra nó sẽ đẻ ra nhiều package khác nữa, mình cũng chưa rõ khi đó còn gọi là mô hình 3 lớp không nữa :joy: :joy: :joy:

Controller

  • Đây là lớp bạn giao tiếp với người dùng cuối, nghĩa là mọi dữ liệu gửi lên gửi xuống đều qua đây, ở đây chỉ kiểm tra tính đúng đắn của dữ liệu, như ở method findBook mình xem nếu id < 0 thì mình return luôn cho nhanh :angry:
  • Trong rest thì nó các HttpMethod như get, post, put, delete,... (mấy cái này mình hay dùng) với múc đích là lấy dữ liệu, thêm dữ liệu, cập nhật dữ liệu, xóa,..
@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookService service;

    @GetMapping
    public ResponseEntity<List<Book>> findAll() {
        return ResponseEntity.ok(service.findAll());
    }

    @GetMapping
    public ResponseEntity<Book> findBook(@RequestParam int id) {
        return ResponseEntity.ok(service.findBook(id));
    }

    @PostMapping
    public ResponseEntity<Book> save(@RequestBody Book book) {
        return ResponseEntity.ok(service.save(book));
    }

    @PutMapping
    public ResponseEntity<Book> update(@RequestBody Book book) {
        return ResponseEntity.ok(service.update(book));
    }

    @DeleteMapping
    public void delete(@RequestBody Book book) {
        service.delete(book);
    }
}

Service

  • Đây chỗ này là nơi xử lý các logic business (vd như giá phải nhân với 15 thuế gì đó)
  • Mình thấy rất nhiều người xử lý logic luôn ở controller với cục controller, rồi họ tạo thêm lớp service chỉ để gọi đến repository, chỉ thế thối, không rõ là họ tạo lớp service ra làm gì, hay chỉ để cho giống mô hình :hushed: :hushed: :hushed:
@Service
public class BookService {

    @Autowired
    private BookRepository repository;

    public Book save(Book book){
        return repository.saveAndFlush(book);
    }

    public Book findBook(int id){
        Book book = repository.findById(id);
        book.setPrice(book.getPrice() * 15);
        return book;
    }

    public List<Book> findAll(){
        return repository.findAll();
    }

    public Book update(Book book) {
        return repository.saveAndFlush(book);
    }

    public void delete(Book book){
        repository.delete(book);
    }
}

Repository

  • Lớp này để thao tác với dữ liệu. Ở đây mình dùng thư viện jpa, nên mọi thứ thêm xóa mình gọi ở bên service đều nằm trong JpaRepository. Ở đây chỉ có findById mình viết cho các bạn thấy thôi

    @Repository
    public interface BookRepository extends JpaRepository<Book, Integer> {
    
    Book findById(int id);
    }
    

Tổng kết

  • Đây là những kiến thức cơ bản của mình restful, mô hình 3 lớp và sử nó trong spring, hi vọng nó sẽ giúp bạn 1 điều nhỏ nhoi gì đó :kissing_heart: qua bài sau có thể mình sẽ nói chi tiết hơn về thằng jpa này chút vì mình thấy thằng đó khá hay nó khiến mình sắp bỏ native query rồi :yum: :yum: :yum:
  • Github đây là project của mình, các bạn có góp ý gì comment ở dưới giúp mình với nhé, mình xin cảm ơn!
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

hunghh.dev

8 bài viết.
7 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 0
Xin chào các bạn đọc, trong seri này mình dự định sẽ chia sẻ cách dùng spring security để phân quyền trong web service, cách đọc ghi một JWT, rồi t...
hunghh.dev viết 7 tháng trước
7 0
White
3 0
Ở (Link) mình đã tạo một số model và tạo thử một api register, ở phần này mình sẽ hướng dẫn các bạn tạo một chuỗi JWT và khi login sẽ chả về cái ch...
hunghh.dev viết 7 tháng trước
3 0
White
3 0
Ở (Link) mình đã tạo ra token và làm cái api đăng nhập rồi trả về token. ở phần này mình sẽ đọc thông tin từ cái token đó xử lý nó và làm thử cái a...
hunghh.dev viết 6 tháng trước
3 0
Bài viết liên quan
White
3 2
Vấn đề Nay mình được các giao cho cái việc đồng bộ cái database với elasticsearch, đầu tiên là mình dùng thằng logstash cho nó chạy schedule 5 ph...
hunghh.dev viết 1 tháng trước
3 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
8 bài viết.
7 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!