24-12-11 학습 기록

랏 뜨·2024년 12월 11일

오늘의 컨디션 및 특이사항(개인 일정 등)

  • 수면 시간
    • 5시간
  • 수강 시간
    • 09 : 00 ~ 18 : 00
  • 특이사항
    • 피곤하여 오전 시간은 집중을 잘 못함

세부 학습 내용

스케쥴

  • 6시간 실시간 강의 + 2시간 자습
  • 코딩테스트
    • 15 Solve 및 깃허브 커밋

점프 투 스프링부트

  • 2-12 답변 기능 만들기 ~ 2-16 질문 등록 기능 추가하기
  • Thymeleafhtml , css , bootstrap 사용법 터득, 실습
  • form 을 통한 데이터 이동 (DTO 역할)
  • 모든 실습 내용을 전부 다 이해하며 학습, 이해되지 않는 부분은 강사님께 질문 및 챗GPT 등을 활용하며 적극 질문

추가 학습 내용

  • Dirty Chekcing

어려웠던 것 || 알게 된 것

실습 중 UPDATE 작업 시 SELECT 쿼리가 전후로 2번 실행됨

  • 아래와 같이 쿼리가 실행됨
Hibernate: 
    select
        q1_0.id,
        q1_0.content,
        q1_0.create_date,
        q1_0.subject 
    from
        question q1_0 
    where
        q1_0.id=?

Hibernate: 
    insert 
    into
        answer
        (content, createdate, question_id, id) 
    values
        (?, ?, ?, default)

Hibernate: 
    select
        q1_0.id,
        q1_0.content,
        q1_0.create_date,
        q1_0.subject 
    from
        question q1_0 
    where
        q1_0.id=?
  • JPADirty Checking 때문
  • 학습 후 블로그에 관련 내용 작성

@Service@Repository , @Controller 그리고 @Component

  • 서비스, 레포지토리, 컨트롤러. 이 3가지의 어노테이션 모두 @Component 역할을 포함하고 있음
  • 그렇다면 이들을 대체해서 @Component 를 사용해도 괜찮은가?
  • 정답은 일부만 “YES”
  • @Service , @Repository 의 경우
    • @Service 는 추가로 트랜잭션을 관리하는 기능을 제공
    • @Repository 는 추가로 예외 변환 기능을 제공
    • 그 외에는 @Component 와 크게 다를 게 없으므로 @Component 로 대체가 가능!
    • 하지만 가독성 이라는 아주 크다면 큰 이유 때문에 구분해서 개발하는 편
  • @Controller 의 경우
    • @ControllerSpring MVC의 핵심 기능을 제공
      • HTTP 요청 처리
      • URL 매핑
      • 요청 데이터 바인딩
      • 그 외의 Web 관련 기능
    • 그러므로, @Component 로 대체할 수 없음

실습 중 Q & A

Q1.

템플릿의 form 태그에 th:object 속성을 추가했으므로 QuestionController의 GetMapping으로 매핑한 메서드도 다음과 같이 변경해야 오류가 발생하지 않는다. 왜냐하면 question_form.html은 [질문 등록하기] 버튼을 통해 GET 방식으로 URL이 요청되더라도 th:object에 의해 QuestionForm 객체가 필요하기 때문이다.

  • 이 부분에서 왜 GET에도 QuestionForm 객체를 넘겨주는 이유

A1.

  • JVM은 요청 URL이 Post, Get 등 액션만 다르고 이름이 같다면, 어디로 넘겨야 할 지 정확히 알지 못함
  • 그렇기 때문에 form과 @Valid를 사용해 예외 처리를 할 경우, Get에서 사용하지 않더라도 빈 QuestionForm 객체를 파라미터로 넣어주어야 함

Q2.

  • th:field="*{subject}"
    이와 같이 지정하면, 해당 태그의 name 과 id 값이 모두 subject로 들어가고

  • th:field="*{content}"
    이와 같이 지정하면, 해당 태그의 name 과 id 값이 모두 content로 들어가는가?

A2.

  • idname의 값은 "subject", th:value 의 값은 "${questionForm.subject}”로 들어감

Q3.

  • th:field 를 사용 시, { } 안의 값이 빨간 줄이 뜨는데 실행은 의도대로 됨
  • 이 경우 그냥 무시하고 진행해도 상관없는가?

A3.

  • 상관 없음
  • 타임리프 경고는 끄는 것을 추천
profile
기록

0개의 댓글