안녕하세요, Brad입니다. 어제부터 로그인 기반 구현하는 부분을 계속 진행했었는데요. 여러가지 경우의 수(예를들어 비정상적인 경로로 들어왔을 때)를 고려하다보니 여러 예외처리를 고려해야했고 자연스럽게 코드가 길어지고, 리팩토링 하는 방법을 고민하다보니 시간을 많이 보냈던 것 같아요. 포비가 했던 결국은 '자바'라는 말을 자연스럽게 깨닫게 되네요! 기능을 아는 것은 그것으로 끝나지만 설계에 대한 고민은 명확한 답이란 없으니까요. 그럼 오늘 했던 고민들을 적어볼게요.
고민 부분
댓글 처리
댓글에서 Name속성은 어디서 가져와야할까요?
model에 넣어줄 때 그곳에서 해야할까요?
결국은 question안에 FK로 User가 담겨져 있었고 Mustache 템플릿 엔진에서 객체 안에 담긴 속성을 꺼내오는 방법이 있더라구요. question 안에
User
타입의 user필드가 있고User
타입 안에는 name필드가 있다면 다음과 같이 꺼내올 수 있습니다.{{#question}} {{#user}}{{name}}{{/user}} {{/question}}
Id 고유값 관련
Composite-id class must implement Serializable
위 오류는 무엇을 의미할까요?
- 기존에 FK키를 @Id로 설정하거나 따로 설정하지 않았을 때 다음과 같은 오류가 발생하였습니다.
- FK인 User, Question 둘 다 @Id부여했을 때도 오류가 발생합니다.
고유값을 가진 Long타입의 id를 부여하였을 때 오류가 발생하지 않았는데요. 각
Answer
에 대해 id를 부여해야할까요?결국은 id를 부여했습니다. 이때까진 몰랐는데 이후에 수정, 삭제시 각각
Answer
에 대해 id를 부여하는 것이 참 편리하더라구요!
Question 글 수정
- 세션 사용자 비교를 User 통째로 값 비교를 하니까 개인정보수정 이후에 같은 유저인지 인식을 못하였습니다.
- 그 이유는 세션에 들어있던 기존 값과 수정된 값이 Sync되지 않아서 입니다.
- 따라서 Long 타입의 id비교를 통해 같은 사용자인지 비교하도록 하였습니다.
- id비교시 getter를 쓸 수도 있지만 Question, User 객체에게 메시지를 보내는 방법으로 해결할 수 있습니다!
질문 리스트 불러올 때 Question내에 있는 필드 user(PK)의 id를 어떻게 불러올 수 있을까요?
- 조금 전 위에서 댓글 처리시 name 가져오는 방법과 같습니다.
- 이 사이트를 참고하였습니다.
import.sql에 외래키 어떻게 넣을까요?
- Qustion내에 외래키로 User를 담는 필드가 있었습니다. 그 이름이 user였는데 전 import.sql파일에서 값을 넣을 때 필드명을 계속 user로 했는데 잘 안되더라구요.
- 나중에 알게된 사실은 QUESTION필드 내에 user가 user_id로 필드가 만들어져 있었고 그것을 이용해야 제대로 들어간다는 것이었습니다. user_id 타입은 big_int 타입이었는데요.
User
의 id타입인 Long형과 일치하더라구요! - 콘솔창에서 어떻게 필드가 만들어져 있는지 확인을 제대로 해봐야겠습니다!
(질문) Form태그를 통해 post매핑으로 보내주었고 그 안에 user정보가 제대로 담겨져 있다면 굳이 session 확인을 해야할까요?
(질문) git에서 어느 시점 이후부터 수정한 부분은 한번에 끌어올리는 방법은 없을까요?
- 작업하다가 지금 작업과 관련된 뭔가 다른 성격의 작업을 하고 싶은데 그렇다고 같이 커밋하기는 그렇구요. 뭐 작업한다음에 따로따로 add시키는 방법은 있는데 너무 귀찮잖아요.
(질문) 외래키로 객체 자체를 넣어주면 너무 값이 많이 담겨지게 되는데 비효율인 것 아닌가요?
- {id=1, question=Question{id=1, title='질문있습니다1', contents='예전에는 매번 id/pwd를 서버에서 보내 클라이언트 브라우저가 가지고 있다가(쿠키- http 상태값) 요청합니다. 그런데 보안적으로 id/pwd가 요청되는게 좋지 않겠죠.', user='User{id=1, userId='brad903', password='1234', name='브래드', email='brad903@naver.com'}', time='2018-11-02 13:12'}, user=User{id=1, userId='brad903', password='1234', name='브래드', email='brad903@naver.com'}, time='2018-11-21 13:04', comment='sadfsfffasf'}
- 위 넘겨주는 데이터값을 보면 알겠지만 외래키로
User
또는Question
타입으로 해놓으면 해당 데이터가 다 같이 넘어가더라구요.
(질문) 왜 답변이 하나를 만들고 나면 그 하나가 계속 갱신이 될까요?
- form태그를 통해 답변 데이터를 받을 때
Answer
객체로 받아 넣으니 계속 한개가 만들어지고 나서 그 하나가 계속 갱신되는 것을 확인할 수 있었습니다. - 따라서 파라미터로 Answer 객체를 받는게 아니라 String값들을 받고 Mapping 메서드 내에서 Answer를 생성하니 문제가 해결되었습니다. 하지만 2개이상 만들고 나서 불러오는것에서 오류가 생기네요.
- 그것은 Repository클래스에서
findByQuestionId()
메서드 return타입을Optional<Answer>
로 해서 그렇습니다. 이렇게 하면 하나의 값만 받거나 오류가 발생합니다. (참고) - 따라서 여러개의 값을 받기위해선
List<Answer>
타입으로 받아야합니다.!
- form태그를 통해 답변 데이터를 받을 때
(질문) Mustache에서 개수를 나타내는 건 어떻게 할까?(각각의 index는 @index로 구현 가능한데 말이죠)
- 찾아보다가 결국 방법을 찾지 못해 size를 model안에 따로 넣어두었습니다.
- 그런데 int값 size처럼 객체 타입이 아니면 그냥 {{model에 넣은 이름}} 로도 값을 부를 수 있네요!
(질문) id이름은 어떻게 짓는게 제일 나을까요?
- 통일성있게 모두id로 하는게 나을까요? 아니면 (객체명+id) 로 만드는 것이 좋을까요?
- 통일성 있게 하면 헷갈리지 않아서 좋고 (객체명+id)는 mustache중복구간에서 값 구별할 때 좋을 것 같은데 말이죠
- (답변)정해진 답은 없고 혼란을 피할 것인지, 굳이 중첩된 아이디를 피할것인지에 따라 다릅니다.
- (답변)그리고 id를 Long타입보다는 primative 타입인 long타입으로 하는 것이 좋습니다. Wrapper클래스보다 primitive가 속도가 더 빠르기 때문입니다.
(질문) 'http://brad:7080/questions/1/answers//1' 와 같이 값이 비워있는 경우는 어떻게 처리할까요?
- (답변)이 경우는 url path 설계를 애초부터 잘못했을 가능성이 있습니다. 제대로된 설계에서는 이런 경우가 빈번하게 발생하진 않기 때문입니다.
피드백 반영
@Lob 타입은 뭘까요?
- (답변)예상할 수 없는 상당히 큰 데이터의 경우 사용합니다. 입력한 값에 따라 유동적으로 사이즈가 바뀐다고 하는데요. 넣을 수 있는 크기가 몇 GB에 달한다고 합니다.
- Large OBject의 줄임말이라고 하네요.
- 주로 Character타입의 긴 글(CLOB) 또는 binary타입의 비디오, 그림 등(BLOB)에 쓰인다고 합니다.
- 저의 경우 String값이라 그런지 CLOB로 데이터베이스에 저장이 됐네요.
- 기존에 @Column(length = 10000) 으로 설정하여 VARCHAR(10000)로 설정되었는데요. @Lob타입을 적용하니 다음과 같이 바뀌었습니다.
LocalDateTime은 어떻게 사용하나요?
초 생략 어떻게 할까요?
- LocalDateTime 사용법은 되게 간단한데요.
LocalDateTime.now()
하면LocalDateTime
타입으로 나오는데 거기에 '날짜 + 시간'으로 이루어져 있습니다. 근데 초, 마이크로초까지 기록이 되더라구요. - 생략방법은 다음 사이트를 참고하였습니다.
- LocalDateTime 사용법은 되게 간단한데요.
데이터베이스 반영 모습
(질문) LocalDateTime 타입을 유지하면서 어떻게 T를 없앨 수 있을까요?
- formatter를 이용한 방법은 다 String타입으로 바꾸더라구요..
(질문) TIMESTAMP타입을 import.sql 내 쿼리에는 어떻게 집어넣어야 할까요??
(질문) '수정하기'폼으로 들어갈 때 유저 체크를 했으면 업데이트를 할떄는 따로 체크 안해도 되지 않나요?
내일 질문할게 너무 많네요. 제가 모르는게 많은건지, 제대로 찾아보지 않은건지, 봤는데 못 알아챈건지.. 내일 질문 시간에 최대한 궁금한 것들 여쭤봐야할 것 같아요!
'TIL' 카테고리의 다른 글
Today's Dev Notes(2018-11-25) (0) | 2018.11.25 |
---|---|
Today's Dev Notes(2018-11-22) (0) | 2018.11.22 |
Today's Dev Notes(2018-11-19) (0) | 2018.11.19 |
Today's Dev Notes(2018-11-18) (0) | 2018.11.18 |
Today's Dev Notes(2018-11-17) (0) | 2018.11.18 |