TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TINKHOA CÔNG NGHỆ PHẦN MỀM BÁO CÁO THỰC TẬP Java Software Engineer Trainee Công ty thựctập : ELCA Việt Nam Ngườiphụtrách :NguyễnĐăngTuấn Thựctậpsinh :Trươn
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO THỰC TẬP
Java Software Engineer Trainee
Công ty thựctập : ELCA Việt Nam Ngườiphụtrách :NguyễnĐăngTuấn Thựctậpsinh :TrươngCôngTấnPhát
TP HồChí Minh, tháng 07năm 2021
\
Trang 2LỜI MỞ ĐẦU
Vớisựpháttriểnnhanhchóngmặtcủathịtrườngphầnmềm,
córấtnhiềuhướngđivàcáchpháttriểnphầnmềmkhácnhau, ngoàiviệclên ý tưởngđểpháttriểnmộtphầnmềmtừđầu, thìcáchtạo ra mộtsảnphẩmmớibằngcáchpháttriển,
phầnmềmcósẵnđểphùhợpvớinhucầuriêngbiệtcủatừngcánhânhoặctổchứccũngđanglàmột xu hướngmớitrongngànhcôngnghiệpphầnmềmtrênthếgiới
Hiện nay ở Việt Nam cũngđãcórấtnhiềucông ty pháttriểncácphầnmềm hay hệthốngmãnguồnmởnhưvậy, mộttrongsốđólàcông ty ELCA Việt Nam Làmộtcông ty
khôngchỉpháttriểncácsảnphẩmphầnmềmmới,
màcònđảmnhậncảnhữngdựánmãnguồnmởtheoyêucầukháchhàng
cáchướngđicủaviệcpháttriểnphầnmềm, đồngthờicảmthấycácmụctiêuvàgiátrịcủa ELCA rấtphùhợpvớiđịnhhướngcủabảnthân, nênemđãquyếtđịnhchọn ELCA Việt Nam lànơibắtđầuthựctập, tìmkiếmthêmnhữngkiếnthứcvàkinhnghiệmthựctếđầuđờichobảnthân
LỜI CẢM ƠN
đãtạođiềukiệnchoemcócơhộiđượcthựctậptạicông ty
Kỳthựctậptuyngắn, nhưngemđãđượchọcrấtnhiềuthứtừsựchỉdẫnnhiệttìnhcủacácanh
kiếnthứctrongcácdựánthựctế,
màcòntíchgópđượcchobảnthânnhữngkinhnghiệmkhilàmmộtnhânviêntrongcông ty, cáchgiaotiếp, làmviệcnhómtrongcácdựánchung Chânthànhcảmơncácanhchịđãgiúpđỡ, hướngdẫncũngnhưtheosátđểgóp ý emtrongsuốtquátrìnhthựctập
ĐặcbiệtemxingửilờicảmơnsâusắcđếnanhNguyễnĐăngTuấn,
đãgiúpemtraining rấtnhiềuvềkiếnthức ReactJS, Spring,
cũngđượcanhchỉdẫnrấttậntình Vớikiếnthứcrộngvàsâucủaanh, emđãhọchỏiđược
rấtnhiều Ngoài ra, emxingửilờicảmơnđếnanhTrầnHánh Minh
vàNguyễnĐứcTrung, đãhỗtrợanhTuấntraining chuyênsâutăngcườngvề Spring
Trang 3đãhỗtrợemrấtnhiềuvềkiếnthức nghiệpvụcủasảnphẩmIpension, cũngnhưquytrìnhlàmviệcvàcáchthứcsửdụngcáccôngcụ Jira, Bitbucket, Vertec, …
Cũngxincảmơnthầycôtrong khoa Côngnghệphầnmềmđãnhiệttìnhhỗtrợ, tạođiềukiệnemlàmbàibáocáonày
TrươngCôngTấnPhát TpHCM, ngày07tháng 07năm
2021
NHẬN XÉT CỦA KHOA
MỤC LỤC MỤC LỤC 3
Chương 1: Giớithiệucông ty thựctập 3
1 Giớithiệucông ty ELCA 3
2 Sảnphẩmcủacông ty 4
Trang 4Chương 2: Nội dung thựctập 5
1 Tìmhiểucông ty vàcáckỹnăngcơbảntrongcông ty 6
2
Giaiđoạn training kiếnthứccơbản 6
3 Thựchiện project 15
Chương 3: Chi tiếtvềdựán 15
1 Giớithiệuvề PIM Tool 15
2 User Stories 16
TÀI LIỆU THAM KHẢO 17
TỔNG KẾT 18
Chương 1: Giớithiệucông ty thựctập
1 Giớithiệucông ty ELCA
ELCA đượcthànhlậpvàonăm 1968 tạiThụySĩ, làmộttậpđoànchuyêncungcấpcácgiảipháp
thiếtkếlạicácphầnmềmchophùhợpvớinghiệpvụtừngdoanhnghiệpyêucầu
Sau hơn 50 nămthànhlậpvàpháttriển, ELCA đãkhẳngđịnhđượcvịthếvàniềm tin ở kháchhàngbằngnhữnggiátrịmàcông ty manglại Thông qua nhữngdựánlớnnhư: Giảiphápquảnlý ID chongườidânvàtộiphạm – HợptácvớichínhphủThụySĩ, GiảipháphệthốngbánvéchoUEFA,… ELCA đãdầnchứngminhđượcđâylàmộtcông ty đáng tin cậyvàđãgâydựngđượcmốiquanhệvớirấtnhiềukháchhànglớntrêntoànthếgiới
Trang 5ELCA cóvănphòngđặttạiThụySĩ, Tây Ban Nha, Pháp, Anh, Đức, Ý vàViệt Nam, vớihơn 1300 nhânviênlàmviệctạitấtcảcácvănphòngtrênthếgiới ELCA đãcókinhnghiệmlàmviệcvớigần 1000 dựánchokháchhàng, doanhthunăm 2019 đạt 170 triệu Franc
ELCA xâydựngphầnmềmdựatheoquytrình SCRUM MỗidựaánsẽcónhiềuSCRUM teamđảmnhậnmộtphầnchứcnăngkhácnhau
2 Sảnphẩmcủacông ty
Nhữngsảnphẩmphầnmềmcủa ELCA đượcpháttriểnnhắmtớitệpkháchhàngrấtđadạng, từtrongnướcchotớingoàinước, từchínhphủchotớicácdoanhnghiệp, tậpđoànlớn Làmộtcông ty chuyêncungcấpcácgiảipháp, cácsảnphẩmtrảirộngtrênnhiềulĩnhvựcnhư: Quảnlýbảohiểm (IPENSION), Quảnlýdữliệudoanhnghiệp (CRM), Quảnlýđịnhdanh (trustID), Bánvétrựctuyến (Secutix), Chứngnhận Y tế (HealthnGo),
Mộtsốnhữnggiảiphápnổibậtcủa ELCA như:
Secutix: ban đầulàmộtgiảipháp, vàsauđóđãtáchriêng ra thànhmộtcông ty
lànơicungcấpcácnềntảngbánvétrựctuyếnđượcpháttriểnchophùhợpvớitừngtổchức
Ipension: nềntảngquảnlýbảohiểmchochínhphủThụySĩ, pháttriểnbộ suite tổngquátđể bao quátcáctrườnghợpquảnlýbảohiểmhiện nay tùythuộcvào business ngườidùnghướngđến
trustID: làmộtdịchvụtạovàquảnlý ID chocáctổchứclớnnhưChínhphủ, Y tế, Giáodục, Doanhnghiệp, côngdân,…
Chương 2: Nội dung thựctập
Chươngtrình onboarding
dànhchonhânviênmớiđikèmvớiđánhgiáchấtlượngnhânsựđầuvàocủa ELCA được
chia làmhaigiaiđoạn: Giaiđoạn training kiếnthứccơbảnvàgiaiđoạn thựchiện
project
− Giaiđoạn training kiếnthứccơbản:
o Trainer sẽtiếnhànhhướngdẫncáckiếnthứcvềcôngnghệ, các best practices, coding convention, performance, vànhữngquytắc coding kháccầntuântheotrong ELCA
o Kếtthúc training, trainer sẽyêucầuthựchiệncàiđặtmộtsảnphẩm, trongđóyêu cầusảnphẩmphảiápdụngtấtcảkiếnthứcđãđược training trướcđó Thựchiện trong 1 tuần
o Trongngàycuốicùngcủa training sẽlàngàyđánhgiá
Trang 6thuyếttrìnhvềnhữngkiếnthứcđãhọcđượctrongquátrình training Cuốicùnglà demo sảnphẩmvới leader, trainer và delivery unit manager bằngtiếng Anh Cácanhchịsẽđặtcâuhỏi, đọc source code chi tiếtđểxemxétviệcnhững quytắc, các best-practices đãđượcápdụngvàosảnphẩm hay chưa
quyếtđịnhcótiếptụcchothựctậpsinh vàogiaiđoạn training tiếptheo.Nếucả
3 đềuđồng ý, thựctậpsinhsẽđượcsắpxếp vàomột team đểtiếptục training nghiệpvụ
− Giaiđoạnthựchiện project cơbản:
o Trainer sẽthựchiệnhướngdẫnvềnghiệpvụ (business) củasảnphẩm
o Training vềnghiệpvụtrong 1 tuần
o Sau khi training, sẽthựchiệnmộttínhnăngcủasảnphẩmtrong 1 tháng
mentorsẽtheodõikếtquảhằngngàyđểđánhgiáchấtlượngcôngviệccủathựctậ
p sinh
o Đểđượcnhậnchínhthứcvàomột Team,
thựctậpsinhphảithuyếttrìnhthànhcông
vềnghiệpvụcủahệthốngvàthựchiệnđượctínhnăngđượcđặt ra
thựctậpsinhsẽtrởthànhnhânviênchính thứccủacông ty nếucónguyệnvọng Kếtthúcgiaiđoạn training nghiệpvụcũng làlúckếtthúcthựctậptạicông ty
1 Tìmhiểucông ty vàcáckỹnăngcơbảntrongcông ty
Thờigian : 1 ngày
Nộidung :
Giớithiệuvềcông ty, cáchtổchứccủacông ty
Đượcnghengườiphụtráchgiớithiệuvềcông ty, quátrìnhthànhlậpvàpháttriển, cáchthứctổchức, cácquytrìnhphầnmềmđặctrưngcủacôngty
Ngoài ra, thựctậpsinhcònđượcgiớithiệuvềcáchthứclàmviệctrongcông ty nhưthờigianlàmviệc, cácquyđịnhcầnphảituânthủ, cáchsửdụngcáccôngcụtraođổi, cáckhotàiliệunộibộcủacôngty,…
Kếtquả :
Hiểuthêmnhiềuđịnhhướng, nguyêntắccủa ELCA, quátrìnhthànhlậpvàpháttriển Biếtđượccáchlàmviệc, hoạtđộngtrongmôitrườngthựctế ở mộtcông ty phầnmềm
2 Giaiđoạntranningkiếnthứccơbản
2.1 Tìmhiểuvềmôitrườnglậptrình
Thờigian: 1 buổi (cùngvớingàygiớithiệucông ty)
Trang 7Nội dung:
− Thựctậpsinhsauđósẽđược mentor dẫnđếnvịtrílàmviệc, hướngdẫn setup máy, càiđặt cáccôngcụvàmôitrườnglậptrình Maven, Java, IntelliJ,…
−
Thựctậpsinhđượcyêucầutìmhiểuvềmôitrườnglàmviệcvừađượccàiđặtcủamình
Thựchiện: Thựchànhsửdụngcácphầnmềmnêutrên Đọctàiliệuvề Maven,
IntelliJ
Kếtquả :Hiểuđượccáchthức maven hoạtđộng,
nhữngtrạngtháicủanóvàcáchsửdụngcơbảnđểquảnlýmộtsảnphẩm
2.2 Tìmhiểuvề Java
Thờigian: 2 ngày
Nội dung:
− Ônlạicáckiếnthứccơbảnvề Java, ônlại OOP, cáccúphápcơbản, lớpvàđốitượng, interface, kếthừa, Generics, Packages, phạm vi truycậptrong OOP, Nested class, Collections
− Ônlạimộtsốthànhphầnkháccủa Java: Java NIO.2, Lambda Expression, method references, DateTime API, thưviện Apache Commons
− Tìmhiểuvề Stream API trong Java
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênđặcbiệtquantâmtới java 8 sauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.Tìmhiểuvề Design Pattern cơbản, nguyênlý SOLID vàxửlý
Exception
Thờigian: 1 ngày
Trang 8Nội dung:
Về Design Pattern: Tìmhiểucác design pattern đượcdùngnhiều Observer Pattern, Builder Pattern, Factory Pattern, Singleton Pattern
Vềnguyênlý SOLID: Tìmhiểuvề Single Responsibility Principle, Open-closed principle, Liskov Substitution Principle, Interface Segregation Principle, Dependency Injection
Vềxửlý Exception: Tìmhiểuvềcấutrúccây Exception trong Java
Phânbiệt Checked và Unchecked exception: Checked exception
sẽđượckiểmtrabởi compiler, thựchiệnxửlýbằng try/catch Unchecked exception cóhailoại: RuntimeException (gây ra bởiviệclậptrìnhkhôngđúng) và System Errors (gây ra bởihệthống, vdnhưkhihếtbộnhớ) Runtime exception khôngnênđược catch
Thực hiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.4 Tìmhiểuvề Debugging trên IntelliJ
Thờigian: 1 ngày
Nội dung:
− Tìmhiểucáchthứcsửdụng breakpoint, sửdụng window debug, set value, vàcácthủthuật debuggingkháccủa IntelliJ
Thực hiện:
− XemcáctàiliệucủaJetbrainsvề IntelliJ đượcđềcậptronggiáoán
training
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
− Cóthểthựchiện debug mộtchươngtrìnhtrên IntelliJ
2.5 Làmbàitập Java tổnghợpkiếnthứcđãđượchọc ở trên
Thờigian: 1 ngày
Trang 9Nội dung:
Công ty sẽcấpchothựctậpsinhmộttập tin companies.csv Vớiđịnhdạngnhưsau:
ID Name Foundation Date Capital Country isHeadQuarter
1 ELCA VN 1998 200000 VN 1
2 ABB Ltd 01-01-93 320000 CH 1
Nhiệmvụchúng ta phảiviếtmộtchươngtrình, chứacáctínhnăngsau:
− Nhập file vàohệthống Lưu ý:
Phảithiếtkếhệthốngđểcóthểđảmbảocókhảnăngmởrộngđểtươngthíchvớicácđịnhd ạngkháctrongtươnglai (XML, XLSX,…) − Xuất ra mànhình capital
tổngcủacác Country là CH
− Xuất ra mànhìnhtêncủatấtcảcông ty nằmtrong country CH
− Sửachươngtrìnhđểtheodõithưmục “import” Nếucósựthayđổivề file
trongthưmụcvàchươngtrìnhhỗtrợđịnhdạng, thìsẽ import file
mớivàovàxuấtlạikếtquả − Sửachươngtrìnhcủabạnđểcóthể import đượcmột file rấtlớn (30MB) trong 1s (Ápdụng design pattern đãhọctừtrướcvàobàitập )
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.6 Nghiêncứu Multilingual (đangônngữ)
Thờigian: 1 buổi
Nội dung:
Trainer đưa ra cáccâuhỏivàthựctậpsinhtựnghiêncứu,
saukhihoànthànhbáocáolại với trainer vềkếtquảnghiêncứucủamình:
− Tạisao multilingual lạicầnthiết ?
− Thànhphầnnàocủahệthống (messages, labels, data…) thườngsẽđượccàiđặt
multilingual ?
Trang 10− Cónhữngcáchphổbiếnnàodùngđểlưutrữvàtruyxuấtcác component multilingual tĩnh ?
− Cónhữngcáchphổbiếnnàodùngđểlưutrữvàtruyxuấtcác component multilingual động (multilingual data nhưtênsảnphẩm, môtả,…) ? Cungcấpsơđồ ERD môtả
− Làmcáchnàođể search engine cóthểtìmđượccácthông tin multilingual data ?
Thực hiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.7 Nghiêncứu Coding Convention (quychuẩn code)
Thờigian: 1 tiếng
Nội dung:
− Nghiêncứutàiliệu SunCodeConvention.pdf
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.8 Nghiêncứu Spring
Thờigian: 2 ngày
Nội dung:
Vì Spring làmộtđềtàirấtrộng, vìvậytronggiớihạnthờigian training, trainer chỉyêu cầuthựctậpsinhnắmđượccácphầnsau:
− Cáchthứchoạtđộngcủacác annotation sau: @Configuration, @Bean,
@Component, @Controller, @Service, @Repository, @Autowired (cóthểdùnghoặckhôngdùngvới @Qualifier)
− Chứcnăngcủa Dispatcher Servlet, Handler Mapping, Controller,
ModelAndView, ViewResolvervà View
− Cáchthứcnhững component trêntươngtácvớinhauđểcóthểtạo ra một Response từ Request của User (cóvẽhình flow minhhoạ)
Trang 11− Hiểurõvàcóthểgiảithíchđược ở mứcđộ chi tiếtcáchthứchoạtđộngcủacáccomponents thườngđượcsửdụng:
@RequestMapping/@RequestParam, @RequestBody/@ResponseBody,
@ModelAttribute, @InitBinder
− Giảithíchđượcvìsao Controller cóthểtrảvềmột String hoặcModelAndView Khi nào nêndùng String vàkhinàonêndùngModelAndView
− Giảithíchcáchsửdụng JSR-303 (Bean validators) với Spring
Lỗisẽđượctrảvềđếnuser bằngcáchnào
− Chúng ta cónênthựchiệnlưu data dướidạngmột instance member trong Controller hay không
− SựkhácbiệtgiữaRestController, và Controller
− Thờiđiểm Bean đượctạo ra vàbịhuỷ
Thực hiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.9 Làmbàitập Spring
Thờigian: 1 ngày
Nội dung:
− Hoànthiệnmộtsảnphẩmđangđượcthựchiện Checkout source code từ bitbucket của công ty
Nội dung chi tiết:
− Hoànthànhtínhnăng search theotêntrên 1 hệthốngquảnlýtàinguyênđơngiản
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.10 TìmhiểuvềBảomậthệthống, Surrogate Key và Concurrent
Update Thờigian: 5 tiếng
Nội dung:
Trang 12− NghiêncứuvềBảomậthệthống (application security), Surrogate Key
vàConcurrent Update
Thực hiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.11 Tìmhiểuvề SQL
Thờigian: 3 tiếng
Nội dung:
− Ôntậpviếtcáccâu SQL cơbảnđếnnângcao Nội dung bao gồmcáclệnh query cơbản, lệnh insert, lệnhtruyvấnlồng
Thực hiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.12 Tìmhiểuvề Unit Test
Thờigian: 2 tiếng
Nội dung:
Nghiêncứucácnội dung sau:
− Tạisaolạicần Unit test
− Đọcvàtìmhiểu JUnit: Cáchthứcsửdụngcơbản
− Đọcvàtìmhiểu FEST: Các syntax cơbản, cáchsửdụngthưviện FEST − Code coverage: Tìmhiểuvềcácloại coverage (Line coverage, Branch coverage và Condition coverage)
− TìmhiểuvàsửdụngthưviệnJaCoConhằmthốngkê Code Coverage
Thực hiện:
− Thựchiệntìmhiểucácvấnđềnêutrên Trìnhbàyvới
trainerđểkiểmtra
Trang 13Kếtquả:
− Hiểuvàápdụngđượcnhữngkiếnthứcđãhọc
2.13 TìmhiểuvềHibernate
Thờigian: 2 ngày
Nội dung:
− Đọcvàhiểucơbảnvề ORM
− Tìmhiểucác JPA annotations
− Tìmhiểuvềcáchthức mapping cácmốiquanhệtrong entity:
− Tìmhiểuvề Spring Data JPA
− TìmhiểuvềQueryDSL: Tíchhợpvới Maven, dùngcác query types, querying, sửdụng joins, cácsửdụngkhác, ordering, grouping, subquery
− Tìmhiểuvềvòngđờicủacác Hibernate Entities
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.13 ThựchiệnbàitậpvềHibernate
Thờigian: 1 ngày 1 buổi
Nội dung:
− Làmquenvới Spring Data vàQueryDSLđểđưa ra càiđặtchomột repository củamột entitytronghệthống
− Làmquenvới Transaction trong Spring
− Giảiquyếnvấnđề Lazy Initialization của Hibernate
− Giảiquyếtvấnđề N + 1 query của Hibernate
− Đảmbảo audit log luônluônđượclưulạitrongtấtcả transaction, dù transaction cóbị roll back hoặckhông
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
Trang 14− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên.
2.14 Tìmhiểuvề CSS
Thờigian: 1 ngày
Nội dung:
− Cácvấnđềcơbảntrong CSS: Giớithiệuvề CSS, Syntax
− Selectors trong CSS: Rules, Document Tree, Selectors
− Formatting với CSS: Background, Text, Font
− Cáckháiniệmcơbản: Box Model, Border, Outline,
Margin, Padding − Positioning trong CSS: Absolute
positioning, Relative positioning
− Bootstrap
− TìmhiểuvềFlexBox LàmbàitậpFlexBox
− CSS pseudo class và pseudo element
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.15 TìmhiểuvềJavascript
Thờigian: 1 ngày
Nội dung:
− Cáckháiniệmcơbản: Javascriptlàgì,
sửdụngJavascriptvàonhữngmụcđíchgì ?−
TìmhiểuvềnhữngthànhphầnlõitrongJavascript
Thựchiện:
− Tiếnhànhtìmhiểucáckiếnthứcnêutrênsauđó checkpoint cùng mentor
Kếtquả:
− Hiểuvàcóthểápdụngnhữngkiếnthứcđãđượcnêutrên
2.16 TìmhiểuvềReactJS