소개
게시글
질문&답변
강사님 파일 업로드시 실제 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
- 526
질문&답변
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
- 632
질문&답변
redirect시 @RequestParam이 동작을 안합니다. ㅠㅠ
서포터즈님 저렇게 하면 동작은 되나 @RequestParam으로 값이 전달이 안되는 문제는 해결이 안됩니다. ㅠㅠ
- 2
- 3
- 632
고민있어요
혹시나 java8문법 사용 안하시는 분을 위해 글 남깁니다.
- 0
- 1
- 242
질문&답변
강사님 질문입니다!!!
*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
- 407
질문&답변
강사님 질문입니다!!!
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
- 407
질문&답변
강사님 안녕하세요 질문이 있습니다!!
강사님 감사합니다. 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
- 1.1K
질문&답변
강사님 안녕하세요 질문이 있습니다!!
mariadb를 사용안하고 강의에서 진행하는대로 진행해야겠습니다. 일단 다만들어보고 실DB로 바꿀때 고민해봐야될거 같습니다.
- 1
- 13
- 1.1K
질문&답변
강사님 안녕하세요 질문이 있습니다!!
근데 위에 데이터 처럼 지역이 2개이상인건 못가져오는거 같아요. 핫팩은 보시는것처럼 3개 선택을 했는데 못가져옵니다. (사진)
- 1
- 13
- 1.1K
질문&답변
강사님 안녕하세요 질문이 있습니다!!
(사진) db에 이렇게 들어가거든요. 여기서 지역이 하나씩인건 보기에서 잘떠요. (사진) (사진)
- 1
- 13
- 1.1K