Fakultas Ilmu Komputer UI

Skip to content
Snippets Groups Projects
README.md 15 KiB
Newer Older
# Tutorial APAP
**Muhammad Navis Raditya Riayatsyah** - **2106717291** - **APAP-SP**

---

## Tutorial 1
### What I have learned today

Dari tutorial 1, Saya belajar mengenai inisialisasi proyek baru menggunakan framework Springboot. Selain itu, diperkenalkan juga tatacara menggunakan GitLab milik fasilkom secara mendasar.
Dari tutorial 1, Saya belajar mengenai inisialisasi proyek baru menggunakan framework Springboot. Selain itu, diperkenalkan juga tatacara menggunakan GitLab milik fasilkom secara mendasar.

1. [Note] Apa itu Issue Tracker? Apa saja masalah yang dapat diselesaikan dengan Issue Tracker?
   Issue Tracker memungkinkan developer untuk melaporkan serta mengerjakan problem atau notice yang terjadi dan ingin diselesaikan dalam fase pengembangan. Pada Issue Tracker, kita juga dapat melakukan assign dari suatu permasalahan kepada developer lain yang akan menangani masalah terkait. Jenis masalah yang dapat diselesaikan dengan Issue Tracker dapat berupa apa saja dalam proyek yang sedang dikembangkan. Akan tetapi, Issue Tracker sendiri ...
   Issue Tracker memungkinkan developer untuk melaporkan serta mengerjakan problem atau notice yang terjadi dan ingin diselesaikan dalam fase pengembangan. Pada Issue Tracker, kita juga dapat melakukan assign dari suatu permasalahan kepada developer lain yang akan menangani masalah terkait. Jenis masalah yang dapat diselesaikan dengan Issue Tracker dapat berupa apa saja dalam proyek yang sedang dikembangkan. Akan tetapi, Issue Tracker sendiri ...

2. [Note] Apa perbedaan dari git merge dan git merge --squash?
   Sejujurnya tidak ada perbedaan yang Saya rasakan secara langsung ketike melakukan perintah `git merge` dengan `git merge --squash`, kesalahan Saya pada tutorial kali ini adalah Saya secara reflek melakukan git merge biasa dan bukan squash. Akan tetapi, dari apa yang Saya perhatikan pada repository teman Saya selama pengerjaan di kelas, Saya melihat bahwa `git merge --squash` merapihkan merge history dan mencatat merge yang sedang dilakukan menjadi sebuah langkah saja. Hal ini juga diperkuat ketika Saya membaca mengenai perbedaan `git merge` dan `git merge --squash` pada artikel berikut.
   (https://www.lloydatkinson.net/posts/2022/should-you-squash-merge-or-merge-commit/)
   Sejujurnya tidak ada perbedaan yang Saya rasakan secara langsung ketike melakukan perintah `git merge` dengan `git merge --squash`, kesalahan Saya pada tutorial kali ini adalah Saya secara reflek melakukan git merge biasa dan bukan squash. Akan tetapi, dari apa yang Saya perhatikan pada repository teman Saya selama pengerjaan di kelas, Saya melihat bahwa `git merge --squash` merapihkan merge history dan mencatat merge yang sedang dilakukan menjadi sebuah langkah saja. Hal ini juga diperkuat ketika Saya membaca mengenai perbedaan `git merge` dan `git merge --squash` pada artikel berikut.
   (https://www.lloydatkinson.net/posts/2022/should-you-squash-merge-or-merge-commit/)

3. [Note] Apa keunggulan menggunakan Version Control System seperti Git dalam pengembangan suatu aplikasi?
   Penggunaan Version Control System seperti Git dalam mengembangkan suatu aplikasi bermanfaat bagi seluruh developer yang berhubungan secara langsung dengan proyeknya. Version Control memudahkan developer untuk melacak progres yang telah dilaksanakan serta siapa yang mengerjakan progres tersebut. Pada Version Control System juga kita sebegai developer dapat melakukan tindakan revert version untuk kembali secara sementara ke versi sebelum berlakunya sebuah tindakan pada branch yang sedang kita kerjakan. Selain itu, dengan menggunakan Version Control System membuat proses pengerjaan proyek pengembangan aplikasi menjadi lebih modular karena setiap anggota hanya perlu memperhatikan repository miliknya saja (kalau di gitlab, tanggung jawab akan suatu repository juga dapat diberikan melalui Issue Tracker).
   Penggunaan Version Control System seperti Git dalam mengembangkan suatu aplikasi bermanfaat bagi seluruh developer yang berhubungan secara langsung dengan proyeknya. Version Control memudahkan developer untuk melacak progres yang telah dilaksanakan serta siapa yang mengerjakan progres tersebut. Pada Version Control System juga kita sebegai developer dapat melakukan tindakan revert version untuk kembali secara sementara ke versi sebelum berlakunya sebuah tindakan pada branch yang sedang kita kerjakan. Selain itu, dengan menggunakan Version Control System membuat proses pengerjaan proyek pengembangan aplikasi menjadi lebih modular karena setiap anggota hanya perlu memperhatikan repository miliknya saja (kalau di gitlab, tanggung jawab akan suatu repository juga dapat diberikan melalui Issue Tracker).
1. [Note] Apa itu library dan dependency?
   Dalam artikel pada halaman CareerFoundry menjelaskan bahwa library merupakan sebuah prewritten code yang dapat digunakan oleh developer pada proyek lain untuk mempermudah dan mempercepat proses pengembangan. (https://careerfoundry.com/en/blog/web-development/programming-library-guide/#what-is-a-programming-library)
   Dalam artikel pada halaman CareerFoundry menjelaskan bahwa library merupakan sebuah prewritten code yang dapat digunakan oleh developer pada proyek lain untuk mempermudah dan mempercepat proses pengembangan. (https://careerfoundry.com/en/blog/web-development/programming-library-guide/#what-is-a-programming-library)

Sedangkan dependency, merupakan sebuah relasi/hubungan antar komponen software yang saling berketergantungan agar dapat berjalan dengan benar.

Dalam sebuah forum diskusi, ada seseorang yang menjabarkan library diibaratkan seperti `seseorang` sedangkan dependency merupakan `hubungan`. Definisi yang dapat menggambarkan korelasi antara library dan dependency bisa dikatakan seperti "I am a person. My niece is also a person. But to her, I'm a relative. You cannot simply be a relative by nature; you're always a relative of someone else." `person` dapat menjadi pengibaratan sebuah library dan hubungan antara `person` yang kemudian menjadi `dependency`-nya. (https://softwareengineering.stackexchange.com/questions/408739/what-is-the-difference-between-a-library-and-a-dependency)

2. [Note] Mengapa kita menggunakan Gradle? Apakah ada alternatif dari Gradle?
   Gradle berfungsi sebagai build tools dimana Gradle dapat melakukan compile dan build banyak file Java dan Library yang dipakai selama proses pengembangan aplikasi sekaligus. Alternatif dari Gradle sebenarnya ada banyak, salah satunya seperti Apache Ant dan Apache Maven. Namun, pada kesempatan kali ini Gradle digunakan karena tutorial 1 menggunakan Groovy dan Kotlin sedangkan Maven dan Ant menggunakan XML.
   (https://www.petanikode.com/java-gradle/)
   Gradle berfungsi sebagai build tools dimana Gradle dapat melakukan compile dan build banyak file Java dan Library yang dipakai selama proses pengembangan aplikasi sekaligus. Alternatif dari Gradle sebenarnya ada banyak, salah satunya seperti Apache Ant dan Apache Maven. Namun, pada kesempatan kali ini Gradle digunakan karena tutorial 1 menggunakan Groovy dan Kotlin sedangkan Maven dan Ant menggunakan XML.
   (https://www.petanikode.com/java-gradle/)

3. [Note] Selain untuk pengembangan web, apa saja yang bisa dikembangkan dengan Spring framework?
   Selain untuk pengembangan aplikasi web, Spring framework juga dapat digunakan untuk membuat enterprise app dan aplikasi terkait pengolahan data, termasuk Big Data.
   (https://socs.binus.ac.id/2017/10/04/framework-spring-java/#:~:text=Dengan%20menggunakan%20Spring%20Framework%2C%20developer,dapa%20tberjalan%20pada%20JVM%20manapun)
   Selain untuk pengembangan aplikasi web, Spring framework juga dapat digunakan untuk membuat enterprise app dan aplikasi terkait pengolahan data, termasuk Big Data.
   (https://socs.binus.ac.id/2017/10/04/framework-spring-java/#:~:text=Dengan%20menggunakan%20Spring%20Framework%2C%20developer,dapa%20tberjalan%20pada%20JVM%20manapun)

4. [Note] Apa perbedaan dari @RequestParam dan @PathVariable? Kapan sebaiknya menggunakan @RequestParam atau @PathVariable?

`@RequestParam` nilai/kunci akan dimasukkan ke dalam string query secara encoded sedangkan `@PathVariable` akan mengambil nilai yang tertera dalam pola URI.
(https://www.baeldung.com/spring-requestparam-vs-pathvariable)

Penggunaan keduanya bersifat opsional dan tidak ada keharusan atau ketetapan kapan penggunaan masing-masing anotasi. Akan tetapi, @RequestParam lebih baik digunakan ketika ingin mengaplikasikan web tradisional dimana lebih banyak dikirimkan data parameter query. Sedangkan @PathVariable lebih cocok digunakan pada web yang menerapkan arsitektur REST karena menggunakan URL.

(https://stackoverflow.com/questions/13715811/requestparam-vs-pathvariable#:~:text=2)20%40RequestParam%20is%20more%20useful,services%20where%20URL%20contains%20values)

### What I did not understand

Masih belum terbiasa dengan GitLab karena lebih familiar menggunakan Github biasa. Selain itu, penggunaan Springboot juga masih sangat baru salah satunya karena dependency yang tersedia sangat beragam.

## Tutorial 2

### Pertanyaan MVC

Pertanyaan 1: Cobalah untuk menambahkan sebuah Course dengan mengakses link berikut: http://localhost:8080/course/add?code=APAP&nameCourse=APAP%20Tutorial2&description=2020%20Fasilkom&jumlahSks=3
Apa yang terjadi? Jelaskan mengapa hal tersebut dapat terjadi.

Jawab: Ketika pertanyaan ini ditanyakan, seharusnya akan muncul White Page Error dengan kode `500 Internal Server Error` karena Controller tidak dapat menampilkan laman `add-course.html` dikarenakan laman view tersebut belum diciptakan.

Pertanyaan 2: Menurut kamu anotasi @Autowired pada class Controller tersebut merupakan implementasi dari konsep apa? Dan jelaskan secara singkat cara kerja @Autowired tersebut dalam konteks service dan controller yang telah kamu buat.

Jawab: Anotasi @Autowired pada class Controller berfungsi sebagai pengganti setter, getter, dan/atau constructor secara manual dan eksplisit. Karena @Autowired merupakan implementasi dari konsep Dependency Injection (DI) dan memungkinkan developer untuk memasukkan dependensi objek secara implisit.

Pertanyaan 3: Cobalah untuk menambahkan sebuah Course dengan mengakses link berikut: http://localhost:8080/course/add?code=APAP&nameCourse=APAP%20Tutorial2&jumlahSks=3 Apa yang terjadi? Jelaskan mengapa hal tersebut dapat terjadi.

Jawab: Akan muncul White Page Error dengan kode `400 Bad Request` karena pada path yang dituju tidak dideskripsikan parameter yang lengkap dimana parameter `description` belum ada di dalam link tersebut. Sedangkan pada controller page terkait, dalam kasus ini untuk add course, keberadaan parameter `description` diwajibkan untuk ada pada link.

Pertanyaan 4: Jika ingin melihat Course dengan kode APAP, link apa yang harus diakses?

Jawab: Pertama, harus mengakses link yang bertujuan untuk menambahkan course baru. Seperti contohnya, http://localhost:8080/course/add?code=APAP&nameCourse=APAP%20Tutorial2&description=2020%20Fasilkom&jumlahSks=3 barulah kemudian mengakses sebuah link http://localhost:8080/course/view?code=APAP untuk mencari course dengan kode "APAP". Jika ingin mencari yang lain, tinggal mengubah kode "APAP" menjadi yang lain sesuai dengan yang ingin dicari.

Pertanyaan 5: tambahkan 1 contoh Course lainnya sesukamu. Lalu cobalah untuk mengakses http://localhost:8080/course/viewAll, apa yang akan ditampilkan? Sertakan juga bukti screenshotmu.

Jawab: Terdapat beberapa langkah untuk menyelesaikan rangkaian ini.

Pertama, Saya menambahkan mata kuliah gamedev
![alt text](image.png)

Kemudian, Saya langsung mengakses link untuk view all
![alt text](image-1.png)

dapat dilihat bahwa ketika mengakses view all, terdapat dua course baru berkode gamedev


### Pertanyaan Tutorial 2

1. Tolong jelaskan secara singkat apa kegunaan dari anotasi-anotasi yang ada pada model
   (@AllArgsConstructor, @NoArgsConstructor, @Setter, @Getter, @Entity, @Table)
   - @AllArgsConstructor merupakan anotasi untuk generate constructor dengan satu parameter untuk setiap field pada kelas
   - @NoArgsConstructor merupakan anotasi untuk generate construktor yang tidak memiliki parameter untuk setiap field pada kelas
   - @Setter merupakan anotasi `Lombok` untuk generate method Setter
   - @Getter merupakan anotasi `Lombok` untuk generate method Getter
   - @Entity merupakan anotasi untuk menandakan bahwa class tersebut adalah JPA entity dan telah di-map ke sebuah tabel database
   - @Table merupakan anotasi untuk menspesifikasikan nama tabel database yang digunakan untuk mapping
2. Pada class CourseDb, terdapat method findByCodeUsingQuery dan findByCode, apakah perbedaan kedua method tersebut? Jelaskan juga kegunaan @Query pada method findByCodeUsingQuery!
   Jawab: Anotasi @Query berfungsi untuk mendeklarasikan kueri finder ke repository method secara langsung

3. Jelaskan perbedaan kegunaan dari anotasi @JoinTable dan @JoinColumn
   Jawab:
   @JoinTable menyimpan ID dari kedua tabel ke dalam tabel terpisah. Penggunaan @JoinTable sangat sesuai untuk memetakan relasi many-to-many, sehingga mengurangi risiko redundansi data.

   @JoinColumn menyimpan ID dari tabel lain dalam kolom baru. Penggunaan @JoinColumn dapat meningkatkan kinerja dan efisiensi karena tidak memerlukan penggabungan tabel tambahan.

4. Pada class Pengajar, digunakan anotasi @JoinColumn pada atribut Course, apa kegunaan dari name, referencedColumnName, dan nullable dalam anotasi tersebut? dan apa perbedaan nullable dan penggunaan anotasi @NotNull
   Jawab: Name adalah ID yang digunakan untuk menentukan kolom kunci asing.
   referencedColumnName digunakan untuk menentukan nama kolom dalam tabel yang menjadi referensi oleh kolom kunci asing.

   @Nullable digunakan untuk mendeklarasikan bahwa parameter atau nilai pengembalian yang dianotasi dapat bernilai null dalam kondisi tertentu.

   Perbedaan antara @NotNull dan @Nullable adalah @NotNull secara eksplisit menyatakan bahwa metode tidak boleh mengembalikan nilai null dan field dengan anotasi @NotNull tidak boleh bernilai null, sedangkan @Nullable menyatakan bahwa metode tersebut dapat mengembalikan nilai null.

5. Jelaskan kegunaan FetchType.LAZY, CascadeType.ALL, dan FetchType.EAGER
   Jawab:
   FetchType.LAZY hanya memuat atribut-atribut yang diperlukan. Ini berbeda dengan FetchType.EAGER yang memuat semua atribut secara bersamaan.

   CascadeType.ALL menyediakan properti kaskade pada hubungan, sehingga ketika melakukan operasi pembaruan dan penghapusan, entitas lain yang berelasi dengan entitas tersebut juga akan ikut berubah.

Referensi :

https://projectlombok.org/features/GetterSetter
https://projectlombok.org/features/constructor
https://www.baeldung.com/jpa-join-column
https://www.objectdb.com/api/java/jpa/JoinColumn/referencedColumnName
https://www.baeldung.com/hibernate-lazy-eager-loading

### What I did not understand

Saya tidak memahami kenapa pada tutorial ini rasanya sangat padat sekali dan tidak memberikan ruang untuk mempelajari setiap stepnya. Pada tutorial kali ini, banyak sekali eror yang tidak Saya mengerti yang datang tiba-tiba. Dan anehnya, eror-eror tersebut muncul setelah Saya mengerjakan keseluruhan tutorial 2. Sebelumnya, hingga Saya berhasil melakukan setup MVC pada repo ini, tidak ada eror sama sekali dan semuanya berjalan lancar.