Light Purple Pointer
์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ JSP ์„ค์ •
ยท
BACKEND/SpringBoot
spring-boot-starter-web ์— ํฌํ•จ๋œ tomcat ์€ JSP ์—”์ง„์„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. jsp ํŒŒ์ผ์€ Springboot ์˜ templates ํด๋”์•ˆ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ jsp๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค. https://blog.naver.com/drv982/222925667199 1.pom.xml์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•œ๋‹ค. 2.application.properties์—์„œ ์ฃผ์†Œ ์ ์–ด์ค€๋‹ค 3.์ปจํŠธ๋กค๋Ÿฌ๋กœ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค. javax.servlet jstl org.apache.tomcat.embed tomcat-embed-jasper #JSP VIEW ๊ฒฝ๋กœ spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view...
์Šคํ”„๋ง ๋ถ€ํŠธ - MyBatis 2 / xml ๋งคํ•‘
ยท
BACKEND/SpringBoot
. ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ• ์žฅ๋ฌธ์˜ sql๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” xml๋กœ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. DROP TABLE IF EXISTS Products; CREATE TABLE Products ( prod_id INT PRIMARY KEY AUTO_INCREMENT, prod_name VARCHAR(255) NOT NULL, prod_price INT NOT NULL ); INSERT INTO Products (prod_name, prod_price) values ('๋ฒ ๋ฒ ์ˆฒ ๋ฌผํ‹ฐ์Šˆ', 2700); INSERT INTO Products (prod_name, prod_price) values ('์—ฌ๋ฆ„ ํ† ํผ', 35180); INSERT INTO Products (prod_name, prod_price) values ('ํŽ˜์ดํฌ ์‚ญ์Šค..
์Šคํ”„๋ง ๋ถ€ํŠธ - MyBatis ๋ฐ postman ์‚ฌ์šฉ
ยท
BACKEND/SpringBoot
MyBatis๋Š” ํ˜„์žฌ๊นŒ์ง€ ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. https://mybatis.org/mybatis-3/ko/index.html MyBatis – ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค 3 | ์†Œ๊ฐœ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ SQL, ์ €์žฅํ”„๋กœ์‹œ์ € ๊ทธ๋ฆฌ๊ณ  ๋ช‡๊ฐ€์ง€ ๊ณ ๊ธ‰ ๋งคํ•‘์„ ์ง€์›ํ•˜๋Š” ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” JDBC๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ƒ๋‹น๋ถ€๋ถ„์˜ ์ฝ”๋“œ์™€ mybatis.org JPA๋Š” SQL๋ฌธ์€ ๊ฑฐ์ง„ ์‚ฌ์šฉ์•ˆํ•จ MyBatis๋Š” SQL์œ„์ฃผ ๋‹จ์ˆœ CRUD๋Š” JPA๊ฐ€ ํŽธํ•˜๋‹ค ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ์—๋Š” MyBatis ( join ์‚ฌ์šฉ์ด ํ•„์š”ํ•  ๋•Œ )์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•˜๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ MyBatis๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ๋‹น. ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” MyBatis์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ ๋งŽ์€ ์„ค์ •์ด ํ•„์š”ํ–ˆ๋Š”๋ฐ, ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” ..
์Šคํ”„๋ง๋ถ€ํŠธ ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ ๊ฐ•์˜
ยท
BACKEND/SpringBoot
https://www.youtube.com/watch?v=YshcPPHClR4&list=PLV9zd3otBRt7jmXvwCkmvJ8dH5tR_20c0&t=2s https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8#reviews [๋ฌด๋ฃŒ] ์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜ ์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ „๋ฐ˜์„ ๋น ๋ฅด๊ฒŒ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ์Šคํ”„๋ง ํ•™์Šต ์ฒซ ๊ธธ์žก์ด! ๊ฐœ๋ฐœ ๊ณต๋ถ€์˜ ๊ธธ์„ ์žƒ์ง€ ์•Š๋„๋ก ๋„์™€๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ“ฃ ํ™•์ธํ•ด์ฃผ์„ธ www.inflearn.co..
h2 -> MySQL๋กœ DB๋ณ€๊ฒฝํ•˜๊ธฐ
ยท
BACKEND/SpringBoot
DB ๋ณ€๊ฒฝํ•˜๊ธฐ์— ์•ž์„œ์„œ ์ž‘์„ฑํ–ˆ๋˜ ํŒŒ์ผ๋“ค ์ •๋ฆฌํ•จ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ MySQL๋กœ ๋ณ€๊ฒฝํ• ๊ฑฐ์ž„ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • ์ฃผ์„์ฒ˜๋ฆฌ ํ›„ # MYSQL DB ์„ค์ • spring.datasource.url=jdbc:mysql://localhost:3306/ssb spring.datasource.username=root spring.datasource.password=1234 ใ… My SQL์—์„œ ssb ์Šคํ‚ค๋งˆ ๋งŒ๋“ค์–ด์ค˜์•ผํ•จ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์ด๋Ÿฐ์‹์œผ๋กœ DB๋ณ€๊ฒฝ์€ ํ•  ์ˆ˜ ์žˆ๋‹ค. SecurityConfig์—์„œ h2 ๊ด€๋ จ์€ ์ง€์›Œ์ฃผ๋ฉด๋œ๋‹ค. ์ด์ œ ์ตœ์‹ ๋ฒ„์ „์€ ํ•ด๋‹น์ฝ”๋“œ๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ์ž‘์„ฑ์„ ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”์ฃผ๋ฉด๋˜๊ณ  ์‹คํ–‰ ์ž˜ ๋˜๋Š”์ง€๋งŒ ํ…Œ์ŠคํŠธ ํ•ด์ฃผ๋ฉด ๋จ package com.mysite.sbb.config; import org.springfr..
์งˆ๋ฌธ/๋‹ต๋ณ€ ์ถ”์ฒœ ๊ธฐ๋Šฅ
ยท
BACKEND/SpringBoot
์งˆ๋ฌธ ์ถ”์ฒœ ๊ธฐ๋Šฅ Question @ManyToMany Set voter; Set์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒํ˜•์ด๋‹ค. Answer @ManyToMany Set voter; h2-consoleํ™•์ธ QUESTION_VOTER, ANSWER_VOTER ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ @ManyToMany ๊ด€๊ณ„๋กœ ์†์„ฑ์„ ์ƒ์„ฑํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ํ…Œ์ด๋ธ”์—๋Š” ์„œ๋กœ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์˜ ๊ณ ์œ ๋ฒˆํ˜ธ(id) 2๊ฐœ๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋Œ€๋‹ค(N:N) ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. https://blog.naver.com/drv982/222922939469 ์งˆ๋ฌธ ์ถ”์ฒœ ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ ์งˆ๋ฌธ, ๋‹ต๋ณ€์˜ ์ถ”์ฒœ์€ ์ถ”์ฒœํ•œ ์‚ฌ๋žŒ(SiteUser ๊ฐ์ฒด)์„ ์งˆ๋ฌธ, ๋‹ต๋ณ€ ์—”ํ‹ฐํ‹ฐ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. Q..
์ˆ˜์ •์ผ์‹œ ํ‘œ์‹œํ•˜๊ธฐ( ์งˆ๋ฌธ, ๋‹ต๋ณ€)
ยท
BACKEND/SpringBoot
question_detail.html modified at modified at modifyDate ์˜ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ˆ˜์ • ์ผ์‹œ ์ถœ๋ ฅ
๋‹ต๋ณ€ ์‚ญ์ œ
ยท
BACKEND/SpringBoot
question_detail.html ์— ์‚ญ์ œ ๋ฒ„ํŠผ ์ถ”๊ฐ€ AnswerService //๋‹ต๋ณ€ ์‚ญ์ œํ•˜๊ธฐ public void delete(Answer answer) { aRepo.delete(answer); } AnswerController //๋‹ต๋ณ€ ์‚ญ์ œ ์ฒ˜๋ฆฌ @PreAuthorize("isAuthenticated()") @GetMapping("/delete/{id}") public String answerDelete(Principal principal,@PathVariable("id") int id ) { Answer answer = aService.getAnswer(id); if(!answer.getAuthor().getUsername().equals(principal.getName())) { throw..
๋‹ต๋ณ€ ์ˆ˜์ •
ยท
BACKEND/SpringBoot
question_detail.html ๋‹ต๋ณ€์— ์ˆ˜์ •ํ•˜๊ธฐ ๋ฒ„ํŠผ ์ถ”๊ฐ€ํ•จ AnswerService //๋‹ต๋ณ€ ์กฐํšŒํ•˜๊ธฐ public Answer getAnswer(int id) { Optional answer = aRepo.findById(id); if(answer.isPresent()) { return answer.get(); } else { throw new DataNotFoundException("answer not found"); } } //๋‹ต๋ณ€ ์ˆ˜์ •ํ•˜๊ธฐ public void modify(Answer answer,String content) { answer.setContent(content); answer.setModifyDate(LocalDateTime.now()); aRepo.save(answer); }..
์งˆ๋ฌธ ์‚ญ์ œ ์ฒ˜๋ฆฌ
ยท
BACKEND/SpringBoot
question_detail.html ์ˆ˜์ • ๋ฒ„ํŠผ ์•„๋ž˜์— ์ถ”๊ฐ€ ์ธ์ฆ๋œ ์œ ์ €๋งŒ ๋ณด์—ฌ์ฃผ๊ธฐ ํ˜„์žฌ ๋กœ๊ทธ์ธ ๋œ ์‚ฌ๋žŒ์ด ๊ธ€์“ด์ด์™€ ๋™์ผํ•  ๋•Œ QuestionService //์งˆ๋ฌธ ์‚ญ์ œ ์ฒ˜๋ฆฌ public void delete(Question question) { qRepo.delete(question); } QuestionController //์งˆ๋ฌธ ์‚ญ์ œ ์ฒ˜๋ฆฌ @PreAuthorize("isAuthenticated()") @GetMapping("/delete/{id}") public String questionDelete(Principal principal, @PathVariable("id") int id ) { Question question = qService.getQuestion(id); if(!question.g..
ใ„ด