diff --git a/README.md b/README.md
index f0a918b6a98575173804064562cd60949cc89865..f6a7be7cccff3e524b2e4d580f8d7dc4d0e77167 100644
--- a/README.md
+++ b/README.md
@@ -2,27 +2,43 @@
 ## Authors
 * **Hilmi Al Biruni** - *2006463843* - *APAP-B*
 
+## Tutorial 5
+### 1. Apa itu Postman? Apa kegunaannya?
+
+#### Postman adalah sebuah developent tool API yang digunakan untuk build, modify, dan test API. Penggunaan Postman dapat digunakan untuk mendesign, mock, debug, tes, dokumentasi, monitor, dan juga menerbitkan API. Postman memiliki fungsi REST Client yang dapat digunakan untuk menguji REST API.
+
+### 2. Jelaskan fungsi dari anotasi @JsonIgnoreProperties dan @JsonProperty
+
+#### @JsonIgnoreProperties digunnakan untuk memberikan spesifikasi list atribut dari sebuah class yang diabaikan saat menjalankan serialization dan deserialozation JSON. Jika @JsonIgnoreProperties tidak disertakan, nantinya akan menyebabkan error saat menjalankan serialization dan deserialization saat Java Object tidak memiliki field yang ada pada JSON.
+
+### 3. Apa kegunaan atribut WebClient?
+
+#### Kegunaan dari Webclient adalah untuk menghubungkan personal komputer ke jaringan internet yang meminta informasi. Dalam mengakses webserver diperlukan sebuah WebClient untuk menggunakan aplikasi yaitu WebBrowser.
+
+### 4. Apa itu ResponseEntity dan BindingResult? Apa kegunaannya?
+
+#### ResponseEntity merupakan representasi keluruhan HTTP Response dari status code, header, dan body. Dengan demikian, dapat digunakan untuk mengkonfigurasi secara lengkap HTTP response. BindingResult adalah sebuah objek spring yang akan menyimpan hasil validasi, binding, dan error dari model objek yang divalidasikan. Penggunaan BindingResult diletakkan setelah parameter objek divalidasi.
 
 ## Tutorial 4
-### Jelaskan perbedaan th:include dan th:replace!
+### 1. Jelaskan perbedaan th:include dan th:replace!
 
 #### Perbedaan dari include dan replace adalah penempatan suatu konten dari fragment
 #### Include akan memanggil isi dari fragment ke dalam th:include tersebut. Lalu, include akan memasukkan konten fragment tanpa menyisipkan tag fragment itu sendiri.
 #### Berbeda dengan include, replace menerapkan konsep parent-kid dalam pengimplementasian fragment tersebut. Replace akan memasukkan konten dari fragment dengan mengganti tag menjadi tag yang mendefinisikan fragment sehingga dapat di kustomisasi.
 
-### Jelaskan apa fungsi dari th:object! 
+### 2. Jelaskan apa fungsi dari th:object! 
 
 #### th:object digunakan untuk menyederhanakan pemanggilan suatu objek di dalam HTML. th:object akan menggunakan atribut langsung dari objek tanpa harus menspesifikasikan objek yang dipanggil.
 
-### Jelaskan perbedaan dari * dan $ pada saat penggunaan th:object! Kapan harus dipakai?
+### 3. Jelaskan perbedaan dari * dan $ pada saat penggunaan th:object! Kapan harus dipakai?
 
 #### * digunakan untuk menyatakan sebuah selection dan menunjuk kepada atribut darri suatu objek. Berbeda dengan $ yang digunakan untuk menyatakan sebuah variabel/value dan menunjuk kepada atribut suatu objek.
 
-### Bagaimana parameter/params tersebut bekerja sehingga Anda dapat menambahkan 1 baris penyelenggara pada form tambah course?
+### 4. Bagaimana parameter/params tersebut bekerja sehingga Anda dapat menambahkan 1 baris penyelenggara pada form tambah course?
 
 #### params perlu dibuat terlebih dahulu logic-nya dalam struktur data List. params akan mendefinisikan semacam "function" agar dapat diimplementasikan di dalam <button> dalam variable "name". 
 
-### Bagaimana parameter/params tersebut bekerja sehingga Anda dapat menghapus 1 baris penyelenggara pada form tambah course?
+### 5. Bagaimana parameter/params tersebut bekerja sehingga Anda dapat menghapus 1 baris penyelenggara pada form tambah course?
 
 #### params perlu dibuat terlebih dahulu logic-nya sebagai berikut:
 ##### final Integer rowId = Integer.valueOf(row);
@@ -39,7 +55,8 @@
 #### Referensi : https://javabydeveloper.com/lombok-allargsconstructor-examples/ https://projectlombok.org/api/lombok/NoArgsConstructor.html
 
 ### Pertanyaan 2: Pada class CourseDb, terdapat method findByCodeUsingQuery dan findByCode, apakah perbedaan kedua method tersebut? Jelaskan juga kegunaan @Query pada method findByCodeUsingQuery! 
-Pada findByCode tidak menggunakan @Query sedangkan pada findByCodeUsingQuery menggunakan @Query. @Query digunakan untuk mengimplementasikan command MySQL pada interface dan menghubungkannya ke database sehingga akan menjadi @Query("SELECT.....") lalu diikuti dengan  findByCodeUsingQuery
+
+#### Pada findByCode tidak menggunakan @Query sedangkan pada findByCodeUsingQuery menggunakan @Query. @Query digunakan untuk mengimplementasikan command MySQL pada interface dan menghubungkannya ke database sehingga akan menjadi @Query("SELECT.....") lalu diikuti dengan  findByCodeUsingQuery
 
 ### Pertanyaan 3: Jelaskan perbedaan kegunaan dari anotasi @JoinTable dan @JoinColumn
 #### @JoinTable menyimpan id dari kedua entity ke tabel yang terpisah. Penggunaan @JoinTable ketika kita ingin mengatur hubungan antara entity dengan table lain.
diff --git a/belajarbelajar/build.gradle b/belajarbelajar/build.gradle
index ae74c874310b82917b2cfe6f630e9c43ec2534a5..6dfb47f86c38fc80a267719f6cb08b56d6550ca1 100644
--- a/belajarbelajar/build.gradle
+++ b/belajarbelajar/build.gradle
@@ -22,6 +22,8 @@ dependencies {
 	compileOnly("org.projectlombok:lombok:1.18.24")
 	annotationProcessor('org.projectlombok:lombok:1.18.24')
 	implementation 'org.springframework.boot:spring-boot-starter-validation:2.7.3'
+	implementation 'com.fasterxml.jackson.core:jackson-databind'
+	implementation 'org.springframework.boot:spring-boot-starter-webflux'
 }
 
 tasks.named('test') {
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java
index 2472fa3006752091124530b302fcd8063110e9d7..c9cd34b01808765c3132f52828191c3d62cf3f9d 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java
@@ -1,5 +1,6 @@
 package apap.tutorial.belajarbelajar.model;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -17,6 +18,7 @@ import java.util.List;
 @AllArgsConstructor
 @NoArgsConstructor
 @Entity
+@JsonIgnoreProperties(value={"listPenyelenggara"}, allowSetters = true)
 @Table(name = "course")
 public class CourseModel {
     @Id
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java
index 0564f2b3d413db06deaaa0f5a00c81f22e2080b9..a1049acdac3c1c4f85ff4302b6d73bc0b7494547 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java
@@ -1,5 +1,6 @@
 package apap.tutorial.belajarbelajar.model;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -18,6 +19,7 @@ import java.util.List;
 @AllArgsConstructor
 @NoArgsConstructor
 @Entity
+@JsonIgnoreProperties(value={"course"}, allowSetters = true)
 @Table(name = "pengajar")
 public class PengajarModel implements Serializable{
     @Id
@@ -33,6 +35,10 @@ public class PengajarModel implements Serializable{
     @Column(name = "is_pengajar_universitas", nullable = false)
     private Boolean isPengajarUniversitas;
 
+//    @NotNull
+    @Column(name = "gender_pengajar")
+    private Boolean genderPengajar;
+
     @ManyToOne(fetch = FetchType.EAGER, optional = false)
     @JoinColumn(name = "code", referencedColumnName = "code", nullable = false)
     @OnDelete(action = OnDeleteAction.CASCADE)
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/CourseDetail.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/CourseDetail.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1f20f8dc2a692eb2edd69e81de543981e1f7946
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/CourseDetail.java
@@ -0,0 +1,20 @@
+package apap.tutorial.belajarbelajar.rest;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CourseDetail {
+    private String status;
+
+    @JsonProperty("course-license")
+    private Integer courseLicense;
+
+    @JsonProperty("valid-until")
+    private Date validUntil;
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/GenderizeDetail.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/GenderizeDetail.java
new file mode 100644
index 0000000000000000000000000000000000000000..de0079208716f17bae33a940902dde36d3215394
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/GenderizeDetail.java
@@ -0,0 +1,23 @@
+package apap.tutorial.belajarbelajar.rest;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GenderizeDetail {
+    private String status;
+
+    @JsonProperty("gender")
+    private String gender;
+
+    @JsonProperty("probability")
+    private Double probability;
+
+    @JsonProperty("count")
+    private Integer count;
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/Setting.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/Setting.java
new file mode 100644
index 0000000000000000000000000000000000000000..18c23c65b64b5835fcf9661a5c195f4800966ae9
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/rest/Setting.java
@@ -0,0 +1,6 @@
+package apap.tutorial.belajarbelajar.rest;
+
+public class Setting {
+    final public static String courseUrl = "https://77431479-0b90-454a-9394-bbc8c1cc4110.mock.pstmn.io";
+    final public static String genderizeUrl = "https://api.genderize.io";
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/restcontroller/CourseRestController.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/restcontroller/CourseRestController.java
new file mode 100644
index 0000000000000000000000000000000000000000..870c29de560c6bd0c1471b9f4da4be1266c10b4b
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/restcontroller/CourseRestController.java
@@ -0,0 +1,95 @@
+package apap.tutorial.belajarbelajar.restcontroller;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import javax.validation.Valid;
+
+import apap.tutorial.belajarbelajar.rest.CourseDetail;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.ResponseStatusException;
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.service.CourseRestService;
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/api/v1")
+public class CourseRestController {
+    @Autowired
+    private CourseRestService courseRestService;
+
+    @PostMapping(value = "/course/add")
+    private CourseModel createCourse(@Valid @RequestBody CourseModel course, BindingResult bindingResult){
+        if(bindingResult.hasFieldErrors()){
+            throw new ResponseStatusException(
+                    HttpStatus.BAD_REQUEST, "Request body has invalid type or missing field."
+            );
+        } else {
+            return courseRestService.createCourse(course);
+        }
+    }
+
+    //Retrieve
+    @GetMapping(value = "/course/{code}")
+    private CourseModel retrieveCourse(@PathVariable("code") String code){
+        try {
+            return courseRestService.getCourseByCode(code);
+        } catch (NoSuchElementException e){
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "Code course " + code + " not found"
+            );
+        }
+    }
+
+    //Delete
+    @DeleteMapping(value = "/course/{code}")
+    private ResponseEntity deleteCourse(@PathVariable("code") String code){
+        try {
+            courseRestService.deleteCourse(code);
+            return ResponseEntity.ok("Course with code " + code + " has been deleted succesfully");
+        } catch (NoSuchElementException e){
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "Code course " + code + " not found"
+            );
+        } catch (UnsupportedOperationException e){
+            throw new ResponseStatusException(
+                    HttpStatus.BAD_REQUEST, "Course is still open or has pengajar"
+            );
+        }
+    }
+    //Update
+    @PutMapping(value = "/course/{code}")
+    private CourseModel updateCourse(@PathVariable("code") String code, @RequestBody CourseModel course) {
+        try {
+            return courseRestService.updateCourse(code, course);
+        } catch (NoSuchElementException e){
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "Code Course " + code + " not found"
+            );
+        }
+    }
+    //Retrieve List All
+    @GetMapping(value = "/list-course")
+    private List<CourseModel> retrieveListCourse(){
+        return courseRestService.retrieveListCourse();
+    }
+
+    @GetMapping(value = "/course/{code}/status")
+    private Mono<String> getStatus(@PathVariable("code") String code) {
+        return courseRestService.getStatus(code);
+    }
+    @GetMapping(value = "/full")
+    private Mono<CourseDetail> postStatus() {
+        return courseRestService.postStatus();
+    }
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/restcontroller/PengajarRestController.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/restcontroller/PengajarRestController.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce4a8e4b308481bc009e14fbc39d673e068b28c3
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/restcontroller/PengajarRestController.java
@@ -0,0 +1,111 @@
+package apap.tutorial.belajarbelajar.restcontroller;
+
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+import apap.tutorial.belajarbelajar.rest.CourseDetail;
+import apap.tutorial.belajarbelajar.service.CourseRestService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.ResponseStatusException;
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.service.PengajarRestService;
+import reactor.core.publisher.Mono;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+@RestController
+@RequestMapping("/api/v1")
+public class PengajarRestController {
+    @Autowired
+    private PengajarRestService pengajarRestService;
+
+    @PostMapping(value = "/pengajar")
+    private PengajarModel createPengajar(@Valid @RequestBody PengajarModel pengajar, BindingResult bindingResult){
+        if(bindingResult.hasFieldErrors()){
+            throw new ResponseStatusException(
+                    HttpStatus.BAD_REQUEST, "Request body has invalid type or missing field."
+            );
+        }
+        return pengajarRestService.createPengajar(pengajar);
+    }
+
+    //Retrieve
+    @GetMapping(value = "/pengajar/{noPengajar}")
+    private PengajarModel retrievePengajar(@PathVariable("noPengajar") Long noPengajar){
+        try {
+            return pengajarRestService.getPengajarByNoPengajar(noPengajar);
+        } catch (NoSuchElementException e){
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "No Pengajar " + noPengajar.toString() + " not found"
+            );
+        }
+    }
+
+    //Delete
+    @DeleteMapping(value = "/pengajar/{noPengajar}")
+    private ResponseEntity deletePengajar(@PathVariable("noPengajar") Long noPengajar){
+        try {
+            pengajarRestService.deletePengajar(noPengajar);
+            return ResponseEntity.ok("Pengajar sudah terhapus");
+        } catch (NoSuchElementException e){
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "No Pengajar " + noPengajar.toString() + " not found"
+            );
+        } catch (UnsupportedOperationException e){
+            throw new ResponseStatusException(
+                    HttpStatus.BAD_REQUEST, "Course is still open"
+            );
+        }
+    }
+    //Update
+    @PutMapping(value = "/pengajar/{noPengajar}")
+    private PengajarModel updatePengajar(@PathVariable("noPengajar") Long noPengajar, @Valid @RequestBody PengajarModel pengajar) {
+        try {
+            return pengajarRestService.updatePengajar(noPengajar, pengajar);
+        } catch (NoSuchElementException e){
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "No Pengajar " + noPengajar.toString() + " not found"
+            );
+        }
+    }
+    //Retrieve List All
+    @GetMapping(value = "/list-pengajar")
+    private List<PengajarModel> retrieveListPengajar(){
+        return pengajarRestService.retrieveListPengajar();
+    }
+
+    //Set Gender
+    @GetMapping("/pengajar/jenis-kelamin/{noPengajar}")
+    private PengajarModel setGenderPengajar(@PathVariable("noPengajar") Long noPengajar) {
+        try {
+            return pengajarRestService.setGenderPengajar(noPengajar);
+        } catch (NoSuchElementException e) {
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "No pengajar" + noPengajar.toString() + " not found"
+            );
+        } catch (UnsupportedOperationException e) {
+            throw new ResponseStatusException(
+                    HttpStatus.BAD_REQUEST, "Course is still open"
+            );
+        }
+    }
+//    @GetMapping(value = "/pengajar/{code}/status")
+//    private Mono<String> getStatus(@PathVariable("code") String code) {
+//        return courseRestService.getStatus(code);
+//    }
+//    @GetMapping(value = "/full")
+//    private Mono<CourseDetail> postStatus() {
+//        return courseRestService.postStatus();
+//    }
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseRestService.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseRestService.java
new file mode 100644
index 0000000000000000000000000000000000000000..600ccd25d50f4f42f9bf7c96a24afb489cc4c6a2
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseRestService.java
@@ -0,0 +1,16 @@
+package apap.tutorial.belajarbelajar.service;
+import java.util.List;
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.rest.CourseDetail;
+import reactor.core.publisher.Mono;
+
+public interface CourseRestService {
+    CourseModel createCourse(CourseModel course);
+    List<CourseModel> retrieveListCourse();
+    CourseModel getCourseByCode(String code);
+    CourseModel updateCourse(String code, CourseModel courseUpdate);
+    void deleteCourse(String code);
+    Mono<String> getStatus(String code);
+    Mono<CourseDetail> postStatus();
+}
+
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseRestServiceImpl.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseRestServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f35e5099bb084638ca668744b768f3916b4f3b25
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseRestServiceImpl.java
@@ -0,0 +1,100 @@
+package apap.tutorial.belajarbelajar.service;
+
+import java.time.LocalDateTime;
+import java.util.NoSuchElementException;
+import java.util.List;
+import java.util.Optional;
+
+import javax.transaction.Transactional;
+
+import apap.tutorial.belajarbelajar.rest.CourseDetail;
+import apap.tutorial.belajarbelajar.rest.Setting;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import apap.tutorial.belajarbelajar.repository.CourseDb;
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+
+@Service
+@Transactional
+public class CourseRestServiceImpl implements CourseRestService{
+
+    private final WebClient webClient;
+
+    public CourseRestServiceImpl(WebClient.Builder webClientBuilder){
+        this.webClient = webClientBuilder.baseUrl(Setting.courseUrl).build();
+    }
+
+    @Autowired
+    private CourseDb courseDb;
+
+    @Override
+    public CourseModel createCourse(CourseModel course){
+        return courseDb.save(course);
+    }
+    @Override
+    public List<CourseModel> retrieveListCourse(){
+        return courseDb.findAll();
+    }
+
+    @Override
+    public CourseModel getCourseByCode(String code){
+        Optional<CourseModel> course = courseDb.findByCode(code);
+        if (course.isPresent()){
+            return course.get();
+        } else {
+            throw new NoSuchElementException();
+        }
+    }
+
+    @Override
+    public CourseModel updateCourse(String code, CourseModel courseUpdate){
+        CourseModel course = getCourseByCode(code);
+        course.setNameCourse(courseUpdate.getNameCourse());
+        course.setDescription(courseUpdate.getDescription());
+        course.setJumlahSks(courseUpdate.getJumlahSks());
+        course.setTanggalDimulai(courseUpdate.getTanggalDimulai());
+        course.setTanggalBerakhir(courseUpdate.getTanggalBerakhir());
+        return courseDb.save(course);
+    }
+    @Override
+    public void deleteCourse(String code){
+        CourseModel course = getCourseByCode(code);
+        if (isClosed(course.getTanggalDimulai(), course.getTanggalBerakhir())){
+            courseDb.delete(course);
+        } else{
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    public boolean isClosed(LocalDateTime tanggalDimulai, LocalDateTime tanggalBerakhir){
+        LocalDateTime now = LocalDateTime.now();
+        if (now.isBefore(tanggalDimulai) || now.isAfter(tanggalBerakhir)){
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public Mono<String> getStatus(String code) {
+        return this.webClient.get().uri("/rest/course/" + code + "/status")
+        .retrieve()
+        .bodyToMono(String.class);
+    }
+
+    @Override
+    public Mono<CourseDetail> postStatus() {
+        MultiValueMap<String, String> data = new LinkedMultiValueMap();
+        data.add("code", "APAP");
+        data.add("nameCourse", "Arsitektur PAP");
+        return this.webClient.post().uri("/rest/course/full")
+        .syncBody(data)
+        .retrieve()
+        .bodyToMono(CourseDetail.class);
+    }
+}
+
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarRestService.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarRestService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f29b59bd97a71f81b27900fa55c4585e7d09a642
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarRestService.java
@@ -0,0 +1,18 @@
+package apap.tutorial.belajarbelajar.service;
+import java.util.List;
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+//import apap.tutorial.belajarbelajar.rest.CourseDetail;
+//import reactor.core.publisher.Mono;
+
+public interface PengajarRestService {
+    PengajarModel createPengajar(PengajarModel pengajar);
+    List<PengajarModel> retrieveListPengajar();
+    PengajarModel getPengajarByNoPengajar(Long noPengajar);
+    PengajarModel updatePengajar(Long noPengajar, PengajarModel pengajarUpdate);
+    void deletePengajar(Long noPengajar);
+    PengajarModel setGenderPengajar(Long noPengajar);
+
+//    Mono<String> getStatus(Long noPengajar);
+//    Mono<CourseDetail> postStatus();
+}
+
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarRestServiceImpl.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarRestServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7da8e4414ee354b26e1301aa925bbfbb01dc4ee
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarRestServiceImpl.java
@@ -0,0 +1,117 @@
+package apap.tutorial.belajarbelajar.service;
+
+import java.time.LocalDateTime;
+import java.util.NoSuchElementException;
+import java.util.List;
+import java.util.Optional;
+
+import javax.transaction.Transactional;
+
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.repository.PengajarDb;
+//import apap.tutorial.belajarbelajar.rest.pengajarDetail;
+import apap.tutorial.belajarbelajar.rest.GenderizeDetail;
+import apap.tutorial.belajarbelajar.rest.Setting;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import apap.tutorial.belajarbelajar.repository.PengajarDb;
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+
+@Service
+@Transactional
+public class PengajarRestServiceImpl implements PengajarRestService{
+
+    private final WebClient webClient;
+
+    public PengajarRestServiceImpl(WebClient.Builder webClientBuilder){
+        this.webClient = webClientBuilder.baseUrl(Setting.genderizeUrl).build();
+    }
+
+    @Autowired
+    private PengajarDb pengajarDb;
+
+    @Override
+    public PengajarModel createPengajar(PengajarModel pengajar){
+        return pengajarDb.save(pengajar);
+    }
+    @Override
+    public List<PengajarModel> retrieveListPengajar(){
+        return pengajarDb.findAll();
+    }
+
+    @Override
+    public PengajarModel getPengajarByNoPengajar(Long noPengajar){
+        Optional<PengajarModel> pengajar = pengajarDb.findByNoPengajar(noPengajar);
+        if (pengajar.isPresent()){
+            return pengajar.get();
+        } else {
+            throw new NoSuchElementException();
+        }
+    }
+
+    @Override
+    public PengajarModel updatePengajar(Long noPengajar, PengajarModel pengajarUpdate){
+        PengajarModel pengajar = getPengajarByNoPengajar(noPengajar);
+        pengajar.setNamaPengajar(pengajarUpdate.getNamaPengajar());
+        pengajar.setIsPengajarUniversitas(pengajarUpdate.getIsPengajarUniversitas());
+        pengajar.setCourse(pengajarUpdate.getCourse());
+        return pengajarDb.save(pengajar);
+    }
+    @Override
+    public void deletePengajar(Long noPengajar){
+        PengajarModel pengajar = getPengajarByNoPengajar(noPengajar);
+        CourseModel course = pengajar.getCourse();
+        if (isClosed(course.getTanggalDimulai(), course.getTanggalBerakhir())){
+            pengajarDb.delete(pengajar);
+        } else{
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    public boolean isClosed(LocalDateTime tanggalDimulai, LocalDateTime tanggalBerakhir){
+        LocalDateTime now = LocalDateTime.now();
+        if (now.isBefore(tanggalDimulai) || now.isAfter(tanggalBerakhir)){
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public PengajarModel setGenderPengajar(Long noPengajar) {
+        PengajarModel pengajar = getPengajarByNoPengajar(noPengajar);
+        CourseModel course = pengajar.getCourse();
+        if (!isClosed(course.getTanggalDimulai(), course.getTanggalBerakhir())) { throw new UnsupportedOperationException();}
+        String firstName = pengajar.getNamaPengajar().split(" ")[0];
+        Mono<GenderizeDetail> formatAPI = this.webClient.get().uri("/?name=" + firstName).retrieve().bodyToMono(GenderizeDetail.class);
+
+        boolean booleanGender = formatAPI.block().getGender().equals("female");
+        pengajar.setGenderPengajar(booleanGender);
+        updatePengajar(noPengajar, pengajar);
+
+        return getPengajarByNoPengajar(noPengajar);
+    }
+
+//    @Override
+//    public Mono<String> getStatus(String code) {
+//        return this.webClient.get().uri("/rest/pengajar/" + code + "/status")
+//                .retrieve()
+//                .bodyToMono(String.class);
+//    }
+//
+//    @Override
+//    public Mono<pengajarDetail> postStatus() {
+//        MultiValueMap<String, String> data = new LinkedMultiValueMap();
+//        data.add("code", "APAP");
+//        data.add("namepengajar", "Arsitektur PAP");
+//        return this.webClient.post().uri("/rest/pengajar/full")
+//                .syncBody(data)
+//                .retrieve()
+//                .bodyToMono(pengajarDetail.class);
+//    }
+}
+
diff --git a/belajarbelajar/src/main/resources/application.properties b/belajarbelajar/src/main/resources/application.properties
index 9be6051e081b0d6bde7187c1cb54fe1470398e90..38030bd44cba42021801cb2e5ad4289f4adfd05a 100644
--- a/belajarbelajar/src/main/resources/application.properties
+++ b/belajarbelajar/src/main/resources/application.properties
@@ -14,3 +14,5 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialec
 
 #pembuatan database (create || create drop || validate || update)
 spring.jpa.hibernate.ddl-auto=update
+
+server.port=2020