게시글
질문&답변
2021.12.20
강사님 파일 업로드시 실제 DB에서 테이블을 만들려고 합니다.
@Entity @Getter @Setter public class Item { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) // strategy=GenerationType.IDENTITY 시퀀스를 자기만의 시퀀스를 사용한다는 말. @Column(name = "item_id") private Long id; private String itemName; @JsonIgnore @OneToMany(mappedBy = "item") private List images = new ArrayList (); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) // OneToOne은 접근을 많이 하는 쪽에 FK를 설정한다. @JoinColumn(name = "file_id") // FK를 delivery_id로 설정. private File file; /** * * SELECT * FROM item i JOIN `file` f ON i.file_id = f.file_id; SELECT * FROM item i JOIN image img ON i.item_id = img.item_id; */ } @Entity @Getter @Setter public class Image extends UploadFile { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name = "image_id") private Long id; private String uploadFileName; private String storeFileName; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; public Image(String uploadFileName, String storeFileName) { super(uploadFileName, storeFileName); } } @Entity @Getter @Setter public class File extends UploadFile { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name = "file_id") private Long id; private String uploadFileName; private String storeFileName; @JsonIgnore // 양방향 연관관계에서는 한쪽을 @JsonIgnore 꼭 달아줘야 한다. @OneToOne(mappedBy = "file", fetch = FetchType.LAZY) private Item item; public File(String uploadFileName, String storeFileName) { super(uploadFileName, storeFileName); } } 이렇게 3개로 나눴는데요 하이디sql에서 조인해서 가지고 오게하면 잘 가지고 옵니다. 근데 여기서 궁금한점이 Image나 File이나 둘다 UploadFile 클래스를 상속 받았는데요. public File(String uploadFileName, String storeFileName) { super(uploadFileName, storeFileName); } 이렇게 적어주면 상위 부모클래스로 공통으로 사용할 수 있게 하는건가요? 뭔가 이상하긴 한데 ... ㅠㅠ
- 1
- 2
- 363
질문&답변
2021.12.02
redirect시 @RequestParam이 동작을 안합니다. ㅠㅠ
서포터즈님!!!! 원인을 찾았습니다. 갑자기 오늘 집에서 나오다가 문뜩 타임리프 문법 배웠던게 생각나서 코드를보닌까 *loginForm.html 전체 오류 메시지 로그인 ID 계정 아이디 오류 메시지 비밀번호 계정 비밀번호 오류 메시지 로그인 onclick="location.href='items.html'" th:onclick="|location.href='@{/}'|" type="button">취소 -> 이렇게 작성했었는데요 저번에 폼쪽 배울때 폼에 있는 th:action 쪽 url을 비워두면 현재 url로 간다는 말이 문뜩 생각이 났어요!! 전체 오류 메시지 로그인 ID 계정 아이디 오류 메시지 비밀번호 계정 비밀번호 오류 메시지 로그인 onclick="location.href='items.html'" th:onclick="|location.href='@{/}'|" type="button">취소 -> 이런식으로 비워두면 현재 url 경로로 간다는 말이 문뜩 생각나서 고치고 돌려보닌까 잘 동작합니다. 저 타임리프 용법이 이럴때 써먹는거였군요.... 아무 생각 없이 보기 좋으라고 다시 고쳐서 적어줬던 기억이 납니다.... 이렇게 설계한 이유가 다 있었군요......................
- 2
- 3
- 446
질문&답변
2021.12.02
redirect시 @RequestParam이 동작을 안합니다. ㅠㅠ
서포터즈님 저렇게 하면 동작은 되나 @RequestParam으로 값이 전달이 안되는 문제는 해결이 안됩니다. ㅠㅠ
- 2
- 3
- 446
고민있어요
2021.11.30 16:53
혹시나 java8문법 사용 안하시는 분을 위해 글 남깁니다.
- 0
- 1
- 134
질문&답변
2021.11.29
강사님 질문입니다!!!
*LoginController @PostMapping("/login") public String login(@Valid @ModelAttribute("loginForm") LoginForm form, BindingResult bindingResult, HttpServletResponse response) { if(bindingResult.hasErrors()) { return "login/loginForm"; } Optional member = mm.findByLoginId(form.getLoginId()); if(!member.isPresent()) { bindingResult.reject("loginFail", "존재하지 않는 아이디 입니다."); return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if(loginMember == null) { bindingResult.reject("loginFail", "비밀번호가 맞지 않습니다."); return "login/loginForm"; } // 1. 로그인 성공 처리(쿠키 생성) : 쿠키 생성시 시간 정보를 설정하지 않으면 세션 쿠키로서 브라우저 종료시 모두 없어진다. Cookie cookie = new Cookie("memberId", String.valueOf(loginMember.getId())); response.addCookie(cookie); return "redirect:/"; } *LoginService public Member login(String loginId, String password) { // 2-1. 첫번째 방법 Optional findMember = mm.findByLoginId(loginId); Member member = new Member(); if(findMember.isPresent()) { member = findMember.get(); // 2-4. 주의 : Optional에서 값이 null인 객체에 get()을 호출하면 에러가 발생한다. } else { return null; } if(member.getPassword().equals(password)) { return member; } else { return null; } /* 2-2. 두번째 방법(java8) Optional byLoginId = mm.findByLoginId(loginId); return byLoginId.filter(m -> m.getPassword().equals(password)) .orElse(null); */ /* 2-3. 세번째 방법(java8) - 간소화 return mm.findByLoginId(loginId).filter(m -> m.getPassword().equals(password)).orElse(null); */ } 이렇게 해결했습니다. 아이디가 DB에 없는 경우는 아이디가 없다고 뜨고 비밀번호가 틀린경우는 비밀번호가 틀리다고 하게끔 처리해줬는데요 이렇게 하는 방법도 맞는건가요? 의문이....
- 1
- 3
- 278
질문&답변
2021.11.29
강사님 질문입니다!!!
Optional findMember = mm.findByLoginId(loginId); Member member = new Member(); if(findMember.isPresent()) { member = findMember.get(); } else { return null; } if(member.getPassword().equals(password)) { return member; } else { return null; } -> 이런식으로 해결하긴 했는데 이게 맞는 방법인가요?
- 1
- 3
- 278
질문&답변
2021.11.15
강사님 안녕하세요 질문이 있습니다!!
강사님 감사합니다. DB에 저장할땐 List 이 들어 있는 item 객체를 쓰고 itemDto 객체를 따로 만들어서 select 해올땐 Dto객체를 써서 regions의 타입을 String으로 바꿔주었고 1. 저장할때는 insert into item(item_name, item_price, item_quantity, item_open, regions) values( #{itemName}, #{price}, #{quantity}, #{open}, concat_ws(',', #{region} ) ) -> 이런식으로 ,로 List 을 DB에 저장하구요 2.select 할땐 select item_id as id, item_name as itemName, item_price as price, item_quantity as quantity, item_open as open, regions from item where item_id = #{id} -> 단순히 String으로 ,이 포함된 문자열로 받은다음 3. 컨트롤러에서 ItemDto findItem = im.findByItem(itemId); Item item = new Item(); item.setId(findItem.getId()); item.setItemName(findItem.getItemName()); item.setPrice(findItem.getPrice()); item.setQuantity(findItem.getQuantity()); item.setOpen(findItem.getOpen()); List list = new ArrayList (Arrays.asList(findItem.getRegions().split(","))); item.setRegions(list); model.addAttribute("item", item); DB에 있는 값을 itemDto로 새로 받아서 DB에 있는 regions 값이 ','로 구분되어져서 String으로 들어갔으니 다시 List 형태로 변환한다음 새로운 item에 setting한 뒤 view로 보냈더니 mapper에서도 강의처럼 동작 잘합니다. 으아 ㅠㅠ 감사합니다. 그래도 답변을 달아주신걸 참고해서 해결했습니다. 일단 mybatis사용한거랑 강의에서 진행한거 이렇게 두개로 강의 다시 시작하겠습니다 감사합니다.
- 1
- 13
- 818
질문&답변
2021.11.14
강사님 안녕하세요 질문이 있습니다!!
mariadb를 사용안하고 강의에서 진행하는대로 진행해야겠습니다. 일단 다만들어보고 실DB로 바꿀때 고민해봐야될거 같습니다.
- 1
- 13
- 818
질문&답변
2021.11.12
강사님 안녕하세요 질문이 있습니다!!
근데 위에 데이터 처럼 지역이 2개이상인건 못가져오는거 같아요. 핫팩은 보시는것처럼 3개 선택을 했는데 못가져옵니다. (사진)
- 1
- 13
- 818
질문&답변
2021.11.12
강사님 안녕하세요 질문이 있습니다!!
(사진) db에 이렇게 들어가거든요. 여기서 지역이 하나씩인건 보기에서 잘떠요. (사진) (사진)
- 1
- 13
- 818