Newer
Older
**Muhammad Navis Raditya Riayatsyah** - **2106717291** - **APAP-SP**
---
## Tutorial 1
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 ...
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/)
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).
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)
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/)
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)
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
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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 mengakses link untuk menambahkan course seperti
http://localhost:8080/course/add?code=GAMEDEV&nameCourse=Game%20Development&description=Ini%20contoh%20untuk%20penambahan%20matkul%20gamedev&jumlahSks=101
Selanjutnya kita bisa langsung mengakses link viewAll untuk melihat daftar lengkap course yang telah ditambahkan.
TODO: masukkan screenshot. untuk sementara belum bisa dilakukan karena lupa harus revert kemana soalnya udah terlanjur jauh ngerjainnya :D
### Pertanyaan Tutorial 2
1. Tolong jelaskan secara singkat apa kegunaan dari anotasi-anotasi yang ada pada model
(@AllArgsConstructor, @NoArgsConstructor, @Setter, @Getter, @Entity, @Table)
Jawab:
@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.