Git Product home page Git Product logo

sbug's Introduction

Hi there πŸ‘‹

🌱 I’m currently learning Java/Spring.



Skills

Java
SpringBoot
Spring Data JPA / Spring Batch
Redis / PostgreSQL / MySQL



CONTACT



ca1af's GitHub stats align= "center"

Solved.ac Profile

sbug's People

Contributors

ca1af avatar deok-beom avatar songmi-kim avatar youngfromnowhere avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

allnight5

sbug's Issues

SA ν”Όλ“œλ°±μ„ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ¬Έμ„œ

κ°œμ„ ν•΄μ•Ό ν•  λΆ€λΆ„λ§Œ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€πŸ˜„

  • μ—­ν• λΆ„λ‹΄, λ§ˆμΌμŠ€ν†€ λ“±μ˜ ν”„λ‘œμ νŠΈ 일정관리에 λŒ€ν•œ κ³„νšμ„ μΆ”κ°€ν•΄μ•Ό 함
  • μΆ”κ°€ 선택 κΈ°λŠ₯μ—μ„œ MSAλŠ” κ³ λ €ν•˜μ§€ μ•ŠλŠ” 게 μ’‹μŒ. (개발 λ³΅μž‘λ„κ°€ 높아지고 정해진 μ‹œκ°„ 내에 κ΅¬ν˜„ ν•˜κΈ° 쉽지 μ•Šλ‹€.)

μΆ”κ°€μ μœΌλ‘œ λ‹€λ₯Έ 쑰의 SAλ₯Ό 보고 ν”Όλ“œλ°±μ„ λ°›μ•˜λ˜ 것듀 쀑 μ°Έκ³ ν• λ§Œν•œ 사항듀을 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

  • Redis μ‚¬μš©ν•˜μ—¬ λ‘œκ·Έμ•„μ›ƒ κΈ°λŠ₯
  • 검색/μ •λ ¬ κΈ°λŠ₯
  • 쿠폰, κΈ°ν”„νŠΈ μΉ΄λ“œμ˜ λ™μ‹œμ„± 문제 + 배포 κΈ°κ°„ μ€‘μ˜ λŒ€κ·œλͺ¨ νŠΈλž˜ν”½ κ³ λ €ν•˜λŠ” 문제
  • μš©μ–΄μ§‘μ„ μ •λ¦¬ν•˜μ—¬ 개발, 회의 λ•Œ μ‚¬μš©ν•˜κΈ° (ν•œκ΅­μ–΄, μ˜μ–΄, μ„€λͺ…μˆœ)
  • PR μž‘μ„± μ‹œ Approveκ°€ κ³Όλ°˜μˆ˜κ°€ 되면 Merge λ˜λ„λ‘ ν•˜κΈ°

Schedule Controller ν†΅ν•©ν…ŒμŠ€νŠΈ(postman) μ‹€νŒ¨

image
Login Test 성곡

image
κ·ΈλŸ¬λ‚˜ Register Schedule λ¦¬ν€˜μŠ€νŠΈλ₯Ό λ³΄λ‚΄μž 400 응닡
detail에 Failed to read request라 λ˜μ–΄ μžˆμ–΄μ„œ request ν˜•μ‹μ˜ 문제라 생각해
RequestDtoκ°€ λ‚ μ§œλ₯Ό λ°›λŠ” ν˜•μ‹μ„ λ°”κΏ”λ΄€μœΌλ‚˜ κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€.

image
둜그λ₯Ό 보면 AccessToken은 λ‘œκ·ΈμΈλ•Œ λ°›μ€λŒ€λ‘œ λ‹€μ‹œ 전달이 된거 κ°™μŠ΅λ‹ˆλ‹€. μ € 문ꡬ μ „ν›„λ‘œ select * from user 쿼리가 λ‚˜κ°‘λ‹ˆλ‹€

image
λ§ˆμ§€λ§‰ 둜그 λ©”μ„Έμ§€λŠ” WebSocket κ΄€λ ¨μž…λ‹ˆλ‹€.

image

App ꡬ동을 λ©ˆμΆ”κ³  gradle clean ν›„ λ‹€μ‹œ gradle compileJava (μ†ŒμŠ€μ½”λ“œ 컴파일) ν–ˆμ„ λ•Œ λ‘œκ·Έμž…λ‹ˆλ‹€.
μ»΄νŒŒμΌμ€ 잘 λ˜λŠ”λ° WebSocketSecurityConfigμ—μ„œ deprecated APIλ₯Ό μ“°κ³  μžˆλ‹€λŠ” 메세지가 λœΉλ‹ˆλ‹€.

ν˜Ήμ‹œ μ›Ήμ†ŒμΌ“ μͺ½μ˜ μˆ˜μ •μ‚¬ν•­μ΄ develop branch에 반영 μ•ˆλœ 것이 μžˆλŠ”κ±ΈκΉŒμš”?
μ›Ήμ†ŒμΌ“μ΄ Schedule entityμͺ½μ΄λž‘ μ „ν˜€ 관련이 없을것 같은데 둜그 메세지에 μ›Ήμ†ŒμΌ“μ΄ 자꾸 μ–ΈκΈ‰λ©λ‹ˆλ‹€.
(develop branchμ—μ„œ merge 받은후 λ°”λ‘œ feat/schedule λΈŒλžœμΉ˜μ—μ„œ μž‘μ—…ν–ˆμŠ΅λ‹ˆλ‹€.)

ν˜„μž¬ ChatRoom μ—”ν‹°ν‹°λŠ” μ‚­μ œλ˜μ—ˆμ§€λ§Œ QChatRoom 이 μ‚­μ œλ˜μ§€ μ•ŠλŠ” 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

image

μœ„ 문제둜 EntityManagerFactory κ°€ ν•΄λ‹Ή Q클래슀의 근원이 λ˜λŠ” Entity의 Pathλ₯Ό 찾지 λͺ»ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: com/sparta/sbug/chatroom/entity/ChatRoom

μ—λŸ¬ λ©”μ‹œμ§€ μž…λ‹ˆλ‹€.

Error creating bean with name 'entityManagerFactory' ...
com/sparta/sbug/chatroom/entity/ChatRoom

κ°„λž΅ν•œ λ²„μ „μž…λ‹ˆλ‹€. ν•΄κ²°μ±… μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€.

μ±„νŒ… κΈ°λŠ₯의 ꡬ쑰적인 λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

Version Hits

  • ChatRoom ⬅️(One μ–‘λ°©ν–₯ Many)➑️ UserChatRoom ⬅️(Many μ–‘λ°©ν–₯ One)-- User
  • Chat(Message) ➑️ UserChatRoom
    (단방ν–₯ ManyToOne)

초기 μ„€κ³„μ‹œ μ΄λ ‡κ²Œ λ„€ 데이터가 μ—°κ΄€ 관계λ₯Ό 맺도둝 ν•˜μ˜€μœΌλ‚˜
두 μœ μ €κ°€ μ£Όκ³  받은 메세지듀을 μ‘°νšŒν•˜κ±°λ‚˜, 두 μœ μ €μ˜ μ±„νŒ…λ°©μ„ μ°ΎλŠ” 쿼리λ₯Ό μž‘μ„±ν•˜κ³  λ³΄λ‹ˆ
Depthκ°€ 2 이상인 Joinκ³Ό Sub Queryλ₯Ό λ™μ‹œμ— μ‚¬μš©ν•΄μ•Ό ν•΄μ„œ ꡉμž₯히 λ³΅μž‘ν•˜κ³  λΉ„νš¨μœ¨μ μΈ 쿼리가 μˆ˜ν–‰λμ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ ꡬ쑰적으둜 λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•˜μ—¬ 더 κ°„λ‹¨ν•˜κ³  효율적인 쿼리λ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • Chat ➑️ User
    (단방ν–₯ ManyToOne)

ChatRoomκ³Ό UserChatRoom은 ν•„μš”κ°€ μ—†μ–΄μ Έ μ‚­μ œν•˜μ˜€κ³ 
Chat μ—”ν„°ν‹°λŠ” receiver와 sender 두 가지 μœ μ €λ₯Ό μ†μ„±μœΌλ‘œ κ°–κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Channel μ‚­μ œ λΆ€λΆ„μ—μ„œ cascade둜 delete 날렸을 λ•Œ λ‚˜μ˜€λŠ” 문제

  1. Batchsize 만큼의 in절이 λ‚ μ•„κ°„λ‹€.
  2. delete 쿼리의 개수만큼 같은 λ‚΄μš©μ˜ select 쿼리가 λ‚˜κ°„λ‹€.
    UserChannelUpperLayerService λΆ€λΆ„μ—μ„œ λ¬Έμ œκ°€ λ°œμƒ μ€‘μž…λ‹ˆλ‹€. ChannelController μ—μ„œ μ°Έμ‘°ν•˜λŠ” λ§€μ„œλ“œμž…λ‹ˆλ‹€.

ResponseDto μ‚¬μš© ν•  λ•Œ 정적 νŒ©ν† λ¦¬ λ§€μ„œλ“œ μ‚¬μš©ν•˜μ‹œλ©΄ μ’‹μŠ΅λ‹ˆλ‹€.

    private ChatResponseDto(Chat chat) {
        this.id = chat.getId();
        this.sender = chat.getSender().getNickname();
        this.message = chat.getMessage();
        this.receiver = chat.getReceiver().getNickname();
        this.status = chat.getStatus().toString();
    }
    public static ChatResponseDto of(Chat chat){
        return new ChatResponseDto(chat);
    }

μœ„μ™€ 같은 ν˜•νƒœλ‘œ μƒμ„±μžλŠ” private ν•˜κ²Œ 막아두고, publicν•œ μŠ€νƒœν‹± λ§€μ„œλ“œλ₯Ό μ˜€ν”ˆν•©λ‹ˆλ‹€.

ν˜„μž¬ μ–΄λ“œλ―Ό μ–΄μ“°ν•„ν„°κ°€ μ •μƒμž‘λ™ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

401 μ—λŸ¬κ°€ λ‚˜μ˜€λŠ” 상황이고, 브레이크 포인트 μ—¬λŸ¬κ΅°λ° 찍어봐도 해결이 μ•ˆ 되고 μžˆλŠ” μƒν™©μ΄λΌμ„œ μ›”μš”μΌ νŠœν„°λ‹˜ μ˜€μ‹œλ©΄ ν•΄κ²°ν•΄λ†“κ² μŠ΅λ‹ˆλ‹€. ν˜„μž¬ 디벨둭 λΈŒλžœμΉ˜μ—μ„œλŠ” WebSecurityConfig λΆ€λΆ„ μ£Όμ„μ²˜λ¦¬κ°€ λ˜μ–΄μžˆμ–΄μ„œ μ •μƒμ μœΌλ‘œ ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•˜μ‹€ 것 κ°™μŠ΅λ‹ˆλ‹€. μ•ˆλ˜λŠ” 뢀뢄은 이슈둜 λ‚¨κ²¨μ£Όμ‹œλ©΄ ν™•μΈν•˜λŠ”λŒ€λ‘œ ν•΄κ²°ν•˜κ² μŠ΅λ‹ˆλ‹€!

포슀트맨 κ°„λ‹¨ν•˜κ²Œ ν…ŒμŠ€νŠΈ ν•  수 μžˆλŠ” 방법 μ „λ‹¬λ“œλ¦½λ‹ˆλ‹€.

ν™˜κ²½ λ³€μˆ˜λŠ” λ‹€μŒκ³Ό 같이 μ„€μ •ν•©λ‹ˆλ‹€.
image

λ‘œκ·ΈμΈν•˜λŠ” HTTP Request의 Test에 μ•„λž˜μ™€ 같이 μž…λ ₯ν•΄μ£Όμ„Έμš”
image

const responseJson = pm.response.json();
pm.environment.set('atk', responseJson.atk);
pm.environment.set('rtk', responseJson.rtk);

값이 ν•„μš”ν•œ Request의 Header에 λ‹€μŒκ³Ό 같이 μž…λ ₯ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.
image

Authorization {{atk}}
RTK {{rtk}}

κ·ΈλΌμš΄λ“œ λ£° 및 μ½”λ”© μ»¨λ²€μ…˜, κΉƒ μ „λž΅ μž‘μ„±

μ½”λ“œ μ»¨λ²€μ…˜

  1. 가독성을 μ΅œμš°μ„ μœΌλ‘œ ν•©λ‹ˆλ‹€.
  2. λ‹€λ₯Έ μ΄μœ κ°€ μ—†λ‹€λ©΄ 기본적으둜 톡합 개발 ν™˜κ²½(intelliJ)의 μžλ™ μ„œμ‹μ„ λ”°λ¦…λ‹ˆλ‹€.
    • Window: ctrl + alt + L
    • MAC: Option + Cmd + L
  3. [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html) λ₯Ό μ°Έκ³ ν•˜μ—¬ μ•„λž˜μ™€ 같은 κ·œμΉ™μ„ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • κ·œμΉ™
    • 쀄 λ°”κΏˆμ€ μ—¬λŸ¬ OS ν™˜κ²½μ„ κ³ λ €ν•˜μ—¬ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•©λ‹ˆλ‹€.

      System.lineSeparator();

    • νƒ­(tab)은 IntelliJ의 κΈ°λ³Έ 값을 μ‚¬μš©ν•˜κ±°λ‚˜ 띄어쓰기 4칸을 μ‚¬μš©ν•©λ‹ˆλ‹€.

    • μ€‘κ΄„ν˜Έ{} λŠ” 본문이 λΉ„μ–΄ μžˆκ±°λ‚˜ 단일 문만 ν¬ν•¨ν•˜λŠ” κ²½μš°μ—λ„ λ°˜λ“œμ‹œ μ‚¬μš©λ©λ‹ˆλ‹€.

      if (count == 0) { 
      	system.out.println("is Zero") 
      }

      λ˜ν•œ μ€‘κ΄„ν˜Έ 블둝은 Kernighan 및 Ritchie μŠ€νƒ€μΌ(μ΄μ§‘νŠΈ λŒ€κ΄„ν˜Έ)을 λ”°λ¦…λ‹ˆλ‹€.

      • μ—¬λŠ” μ€‘κ΄„ν˜Έ μ•žμ—λŠ” 쀄 λ°”κΏˆμ΄ μ—†μŠ΅λ‹ˆλ‹€.

      • μ—¬λŠ” μ€‘κ΄„ν˜Έ 뒀에 쀄 λ°”κΏˆ

      • λ‹«λŠ” μ€‘κ΄„ν˜Έ μ•žμ˜ 쀄 λ°”κΏˆ

      • λ‹«λŠ” μ€‘κ΄„ν˜Έ λ’€μ˜ 쀄 λ°”κΏˆμ€ ν•΄λ‹Ή μ€‘κ΄„ν˜Έκ°€ λͺ…령문을 μ’…λ£Œν•˜κ±°λ‚˜ λ©”μ„œλ“œ, μƒμ„±μž λ˜λŠ” λͺ…λͺ…λœ 클래슀의 본문을 μ’…λ£Œν•˜λŠ” κ²½μš°μ—λ§Œ ν•΄λ‹Ήλ©λ‹ˆλ‹€.

        예) if … else

      • 빈 블둝은 κ°„κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

        void doNothing() { }
    • 클래슀 λ‚΄μš©κ³Ό μˆœμ„œλŠ” 논리적 μˆœμ„œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μˆœμ„œμ— λŒ€ν•œ μ„€λͺ…을 μš”μ²­ μ‹œ μž‘μ„±μžκ°€ μ„€λͺ…ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

      예) μƒˆλ‘œμš΄ λ©”μ„œλ“œλŠ” 클래슀의 끝에 μŠ΅κ΄€μ μœΌλ‘œ μΆ”κ°€λ˜λŠ” 것이 μ•„λ‹ˆλΌ, μž‘μ„±λœ μˆœμ„œλ‘œ λ‚˜μ—΄ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

    • νŒ¨ν‚€μ§€ 이름은 μ†Œλ¬Έμžμ™€ 숫자만 μ‚¬μš©ν•©λ‹ˆλ‹€, μ—°μ†λœ λ‹¨μ–΄λŠ” λ‹¨μˆœνžˆ ν•¨κ»˜ μ—°κ²°λ©λ‹ˆλ‹€.

      예) com.example.deepspace β†’ Yes

      예) com.example.deepSpace, com.example.deep_space β†’ No

    • 클래슀 이름은 UpperCamelCase둜 μž‘μ„±ν•©λ‹ˆλ‹€. 일반적으둜 λͺ…사 λ˜λŠ” λͺ…μ‚¬κ΅¬λ‘œ μž‘μ„±ν•˜μ§€λ§Œ κ²½μš°μ— 따라 ν˜•μš©μ‚¬ λ˜λŠ” ν˜•μš©μ‚¬κ΅¬λ‘œ μž‘μ„±ν•΄λ„ ν—ˆμš©ν•©λ‹ˆλ‹€.

      예) MemoProject

    • λ©”μ†Œλ“œ 이름은 동사, lowerCamelCase둜 μž‘μ„±ν•©λ‹ˆλ‹€. 일반적으둜 동사 λ˜λŠ” λ™μ‚¬κ΅¬λ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.

      예) doSomething

    • μƒμˆ˜κ°€ μ•„λ‹Œ ν•„λ“œ 이름은 lowerCamelCase둜 μž‘μ„±ν•©λ‹ˆλ‹€.

      • μƒμˆ˜λŠ” UPPER_SNAKE_CASE둜 μž‘μ„±ν•©λ‹ˆλ‹€.

        예) IMMUTABLE_NUMBER

    • κ·Έ μ™Έ λ§€κ°œλ³€μˆ˜, 지역 λ³€μˆ˜λŠ” lowerCamelCase둜 μž‘μ„±ν•©λ‹ˆλ‹€.

    • @Override λŠ” κΌ­ μ‚¬μš©ν•©λ‹ˆλ‹€.

    • long μ •μˆ˜ λ¦¬ν„°λŸ΄μ€ μ ‘λ―Έμ‚¬λ‘œ λ°˜λ“œμ‹œ λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. (숫자 1과의 ν˜Όλ™μ„ ν”Όν•˜κΈ° μœ„ν•΄)

      예) 111111111l β†’ No

일정 κΈ°λŠ₯ ν†΅ν•©ν…ŒμŠ€νŠΈ κ²°κ³Ό μ „λ‹¬λ“œλ¦½λ‹ˆλ‹€.

registerSchedule (일정 등둝)

  • μ •μƒμž‘λ™
  • Nullκ°’, 곡백문자 ν…ŒμŠ€νŠΈ ν•„μš”
  • μ‹œκ°„μ΄ μ€‘λ³΅λ˜λŠ” 일정이 λ“±λ‘λ˜λŠ” 문제 (μ˜ˆμ™Έμ²˜λ¦¬ ν•„μš”)

updateSchedule (일정 λ³€κ²½)

  • μ •μƒμž‘λ™
  • Nullκ°’, 곡백문자 ν…ŒμŠ€νŠΈ ν•„μš”
  • μ‹œκ°„μ΄ μ€‘λ³΅λ˜λŠ” 일정이 μ €μž₯λ˜λŠ” 문제 (μ˜ˆμ™Έμ²˜λ¦¬ ν•„μš”)

completeSchedule (일정 μ™„λ£Œ ν‘œμ‹œ)

  • μ •μƒμž‘λ™
  • 이미 μΌμ •μ™„λ£ŒμΈ 경우 μ˜ˆμ™Έμ²˜λ¦¬ ν•„μš”

incompleteSchedule (일정 λ―Έμ™„ ν‘œμ‹œ)

  • μ •μƒμž‘λ™
  • 이미 일정미완인 경우 μ˜ˆμ™Έμ²˜λ¦¬ ν•„μš”

deleteSchedule (일정 μ‚­μ œ)

  • μ •μƒμž‘λ™

getMySchedules

  • μ •μƒμž‘λ™
  • Page 크기 쑰절 ν•„μš”ν•΄λ³΄μž„
  • Page 크기 초과된 양에 λŒ€ν•΄ Paging μž˜λ˜λŠ”μ§€
    ν…ŒμŠ€νŠΈ ν•„μš”
  • Json output에 Page 정보가 μ€‘λ³΅λ˜λŠ” 문제

getPeriodSchedules

  • μ •μƒμž‘λ™
  • Page λ¬Έμ œλŠ” μœ„μ™€ 동일

-- μ •μƒμž‘λ™μ΄λΌλŠ”κ±΄ ν‰λ²”ν•œ case에 λŒ€ν•΄ μ½”λ“œκ°€ μ˜λ„ν•˜λŠ”λŒ€λ‘œ
μž‘λ™ν•œλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.
-- κ²½κ³„κ°’μ΄λ‚˜ Null값에 λŒ€ν•œ TestλŠ” μ „λΆ€ ν•„μš”ν•œ μƒν™©μž…λ‹ˆλ‹€.
-- λͺ‡κ°€μ§€ μ˜ˆμ™Έμ²˜λ¦¬κ°€ 더 ν•„μš”ν•œ μƒν™©μž…λ‹ˆλ‹€.

μœ μ € κΈ°λŠ₯ 톡합 ν…ŒμŠ€νŠΈ κ²°κ³Ό μ „λ‹¬λ“œλ¦½λ‹ˆλ‹€.

1. νšŒμ›κ°€μž…

  • email λ˜λŠ” nickname에 NULL 이 전달 될 λ•Œ, 이메일이 쀑볡될 λ•Œ -> 였λ₯˜ 메세지 ν‘œμ‹œ (ν˜„μž¬ 401둜 λ‚˜νƒ€λ‚¨)
  • emailκ³Ό password에 μ •κ·œν‘œν˜„μ‹ 적용 ν•„μš” -> emailκ³Ό password에 곡백 문자 λ“€μ–΄κ°ˆ 우렀 있음

2. 둜그인

  • μ‚¬μš©μžλ₯Ό 찾을 수 없을 λ•Œ (μ΄λ©”μΌμ΄λ‚˜ λΉ„λ°€λ²ˆν˜Έκ°€ 틀렸을 λ•Œ) 401이 λ‚˜νƒ€λ‚¨

3. νšŒμ› νƒˆν‡΄

  • 문제 발견 λͺ»ν•¨

4. λ‚΄ 정보 μˆ˜μ •

  • 값에 null 이 전달 됐을 λ•Œμ˜ μ—λŸ¬λ‘œ 401이 λ‚˜νƒ€λ‚¨
  • 값에 곡백 λ¬Έμžκ°€ 전달 됐을 λ•Œ 처리 ν•„μš” -> μžμ—°μŠ€λŸ¬μš΄ 것은 곡백 λ¬Έμžκ°€ μ „λ‹¬λ˜λ©΄ 값이 μ—…λ°μ΄νŠΈ λ˜μ§€ μ•ŠλŠ” κ²ƒμž„ (ex: λ‹‰λ„€μž„μ΄ 곡백 문자고 password에 μ μ ˆν•œ 값이 λ“€μ–΄μ˜€λ©΄ password만 λ³€κ²½)
  • μ •κ·œν‘œν˜„μ‹ 적용 이후에 νŒ¨μŠ€μ›Œλ“œμ— μ •κ·œν‘œν˜„μ‹μ„ 지킀지 μ•Šκ³  값을 λ„£μœΌλ €κ³  ν•  λ•Œ μ—λŸ¬κ°€ λ‚˜λŠ”μ§€ 확인 ν•„μš”

5. λͺ¨λ“  μ‚¬μš©μž 쑰회
6. λ‚΄ 정보 보기
7. μœ μ €κ°€ κ°€μž…λœ 채널 쑰회

  • 문제 발견 λͺ»ν•¨

μ“°λ ˆλ“œ κΈ°λŠ₯ 톡합 ν…ŒμŠ€νŠΈ κ²°κ³Ό μ „λ‹¬λ“œλ¦½λ‹ˆλ‹€.

** 1. μ“°λ ˆλ“œ μž‘μ„± μ‹œ **

  • null 값을 전달 μ‹œ μ˜ˆμ™Έμ²˜λ¦¬ λ˜μ§€ μ•ŠμŒ (401 λ°˜ν™˜λ¨)
  • 곡백 문자 전달 μ‹œ μ“°λ ˆλ“œ μž‘μ„±μ΄ 돼버림
  • λ‚΄κ°€ μ†ν•˜μ§€ μ•Šμ€ 채널에도 μ“°λ ˆλ“œλ₯Ό μž‘μ„±ν•  수 있음

** 2. μ“°λ ˆλ“œ μˆ˜μ •

  • null 값을 전달 μ‹œ μ˜ˆμ™Έμ²˜λ¦¬ λ˜μ§€ μ•ŠμŒ (401 λ°˜ν™˜λ¨)
  • 곡백 문자 전달 μ‹œ μˆ˜μ •μ΄ 돼버림
  • μžμ‹ μ΄ μž‘μ„±ν•œ μ“°λ ˆλ“œκ°€ 아닐 λ•Œ, 401 μ—λŸ¬κ°€ λ°˜ν™˜ 됨 (πŸ€”μ μ ˆν•œ 걸지도 λͺ¨λ₯΄μ§€λ§Œ 토큰을 μƒκ°ν•˜λ©΄..)
  • μ—†λŠ” μ“°λ ˆλ“œλ₯Ό μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄ 401 μ—λŸ¬κ°€ λ°˜ν™˜ 됨 (그리고 또 NoSuchElementException.. 메세지λ₯Ό λ„£μ–΄μ£ΌλŠ” 방법도 있음)

** 3. μ“°λ ˆλ“œ μ‚­μ œ

  • λ‚΄κ°€ μž‘μ„±ν•œ 글이 μ•„λ‹ˆμ—¬λ„ μ‚­μ œ 됨
  • μ—†λŠ” μ“°λ ˆλ“œλ₯Ό μ‚­μ œν•˜λ €κ³  ν•˜λ©΄ 401 λ°˜ν™˜ (μ½˜μ†”μ—μ„œλŠ” μ œλŒ€λ‘œ μ˜ˆμ™Έκ°€ λ‚˜νƒ€λ‚¨)

Service λ§€μ„œλ“œμ—μ„œ μ—”ν‹°ν‹°λ₯Ό νŒ¨λŸ¬λ―Έν„°λ‘œ 받아도 λ˜λŠ”κ°€?

   @Override
    public String unregister(User user) {
        userRepository.deleteByEmail(user.getEmail());
        return "home";
    }

μœ„μ²˜λŸΌ νŒ¨λŸ¬λ―Έν„°λ‘œ Userλ₯Ό 받아와도 λ˜λŠ”κ°€? 에 λŒ€ν•΄μ„œ κ³ λ―Όν–ˆμŠ΅λ‹ˆλ‹€.

Controller - Service 계측간 데이터 μ£Όκ³  받을 μ‹œ μ—”ν‹°ν‹°λ₯Ό μ£Όκ³  받아도 λ˜λŠ”κ°€?

λŒ“κΈ€ κΈ°λŠ₯ 톡합 ν…ŒμŠ€νŠΈ κ²°κ³Ό μ „λ‹¬λ“œλ¦½λ‹ˆλ‹€.

** 1. λŒ“κΈ€ 생성 **

  • null κ°’ 전달 μ‹œ 401 μ—λŸ¬ (μ½˜μ†”μ—μ„œλ„ μ˜ˆμ™Έμ²˜λ¦¬ X)
  • 곡백 문자 전달 μ‹œ λ§Œλ“€μ–΄μ§
  • λ‚΄κ°€ μ†ν•˜μ§€ μ•Šμ€ μ±„λ„μ˜ κ²Œμ‹œκΈ€μ—λ„ λŒ“κΈ€μ„ μž‘μ„±ν•  수 있음
  • μ—†λŠ” κ²Œμ‹œκΈ€μ— λŒ“κΈ€μ„ λ‹€λ €κ³  ν•  λ•Œ 401 μ—λŸ¬ (μ½˜μ†”μ—μ„œλ„ μ œλŒ€λ‘œ μ˜ˆμ™Έμ²˜λ¦¬ X)

** 2. λŒ“κΈ€ μˆ˜μ • **

  • null κ°’ 전달 μ‹œ 401 μ—λŸ¬ (μ½˜μ†”μ—μ„œλ„ μ˜ˆμ™Έμ²˜λ¦¬ X)
  • 곡백 문자 전달 μ‹œ μˆ˜μ • 됨
  • λ‚΄κ°€ μž‘μ„±ν•˜μ§€ μ•Šμ€ λŒ“κΈ€λ„ μˆ˜μ •ν•  수 있음
  • μ—†λŠ” λŒ“κΈ€μ„ μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ 401 μ—λŸ¬ (μ½˜μ†”μ—μ„œλ„ μ œλŒ€λ‘œ μ˜ˆμ™Έμ²˜λ¦¬ X)
  • 정상 μˆ˜μ •μ΄ λ˜μ§€ μ•ŠμŒ (ID둜 λŒ“κΈ€μ„ 찾을 μˆ˜κ°€ μ—†μ—ˆμŒ)

** 3. λŒ“κΈ€ μ‚­μ œ **

  • 정상 μ‚­μ œκ°€ λ˜μ§€ μ•ŠμŒ (ID둜 λŒ“κΈ€μ„ 찾을 μˆ˜κ°€ μ—†μ—ˆμŒ)

금일 톡합 ν…ŒμŠ€νŠΈ κ³Όμ •μž…λ‹ˆλ‹€.

톡합 ν…ŒμŠ€νŠΈ μˆœμ„œ

μœ μ €

1. User νšŒμ› κ°€μž…

  • null κ°’ ν˜Ήμ€ 빈 μΉΈ ν˜Ήμ€ 곡백 문자λ₯Ό μ „λ‹¬ν•˜λ©΄?
  • 같은 e-mail둜 κ°€μž… λ˜λŠ”μ§€? (μ •κ·œν‘œν˜„μ‹ μ μš©ν•˜μ—¬ email 및 password κ·œμΉ™ λ§Œλ“€μ–΄μ•Ό 함)

2. User 둜그인

3. νšŒμ› νƒˆν‡΄

4. νšŒμ› 정보 μˆ˜μ •

  • null 값을 μ „λ‹¬ν•˜λ©΄ μ–΄λ–»κ²Œ λ˜λŠ”μ§€

5. 전체 μ‚¬μš©μž 정보 쑰회

6. λ‚΄ 정보 쑰회

채널

1. 채널 생성

  • null κ°’ ν˜Ήμ€ 빈 μΉΈ ν˜Ήμ€ 곡백 문자λ₯Ό μ „λ‹¬ν•˜λ©΄?

2. 채널 μ΄ˆλŒ€ν•˜κΈ°

  • 이미 μ΄ˆλŒ€λ˜μ–΄ μžˆλŠ” μœ μ €λ₯Ό μ΄ˆλŒ€ν•˜λ©΄?

3. 채널λͺ… μˆ˜μ •

  • 채널 μ–΄λ“œλ―Όμ΄ μ•„λ‹Œ μ‚¬λžŒμ΄ 채널을 μˆ˜μ •ν•˜λ € ν•˜λ©΄?
  • null κ°’ ν˜Ήμ€ 빈 μΉΈ ν˜Ήμ€ 곡백 문자λ₯Ό μ „λ‹¬ν•˜λ©΄?

4. 채널 μ‚­μ œ

  • 채널 μ–΄λ“œλ―Όμ΄ μ•„λ‹Œ μ‚¬λžŒμ΄ 채널을 μ‚­μ œν•˜λ € ν•˜λ©΄?

5. 채널 λ‚΄ κ²Œμ‹œκΈ€ 전체 쑰회

  • νŽ˜μ΄μ§• κΈ°λŠ₯ ν…ŒμŠ€νŠΈ 해야함..

κ²Œμ‹œκΈ€

1. κ²Œμ‹œκΈ€ 생성

  • null κ°’ ν˜Ήμ€ 빈 μΉΈ ν˜Ήμ€ 곡백 문자λ₯Ό μ „λ‹¬ν•˜λ©΄?
  • 채널에 μ΄ˆλŒ€λœ μ‚¬λžŒμ΄ μ•„λ‹Œλ° κ²Œμ‹œκΈ€μ„ μ“°λ €κ³  ν•˜λ©΄?

2. κ²Œμ‹œκΈ€ μˆ˜μ •

  • null κ°’ ν˜Ήμ€ 빈 μΉΈ ν˜Ήμ€ 곡백 문자λ₯Ό μ „λ‹¬ν•˜λ©΄?
  • κ²Œμ‹œκΈ€μ˜ 주인이 μ•„λ‹Œ μ‚¬λžŒμ΄ μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄?
  • μ—†λŠ” λŒ“κΈ€μ„ μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄?

3. κ²Œμ‹œκΈ€ μ‚­μ œ

  • κ²Œμ‹œκΈ€μ˜ 주인이 μ•„λ‹Œ μ‚¬λžŒμ΄ μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?
  • μ—†λŠ” λŒ“κΈ€μ„ μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?

4. κ²Œμ‹œκΈ€ μ•„λž˜ λŒ“κΈ€ 전체 쑰회(νŽ˜μ΄μ§•)
-> 단일 κ²Œμ‹œκΈ€μ„ μ‘°νšŒν–ˆμ„ λ•Œ κ·Έ κ²Œμ‹œκΈ€ 정보와 ν•¨κ»˜ λŒ“κΈ€ 정보도 ν•¨κ»˜ λΆˆλŸ¬μ™€μ§€λŠ” 게 μžμ—°μŠ€λŸ¬μ›Œλ³΄μž„

  • νŽ˜μ΄μ§• κΈ°λŠ₯... μ•„..

λŒ“κΈ€

1. λŒ“κΈ€ 생성

  • null κ°’ ν˜Ήμ€ 빈 μΉΈ ν˜Ήμ€ 곡백 문자λ₯Ό μ „λ‹¬ν•˜λ©΄?
  • 채널에 μ΄ˆλŒ€λœ μ‚¬λžŒμ΄ μ•„λ‹Œλ° λŒ“κΈ€μ„ μ“°λ €κ³  ν•˜λ©΄?

2. λŒ“κΈ€ μˆ˜μ •

  • null κ°’ ν˜Ήμ€ 빈 μΉΈ ν˜Ήμ€ 곡백 문자λ₯Ό μ „λ‹¬ν•˜λ©΄?
  • λŒ“κΈ€μ˜ 주인이 μ•„λ‹Œ μ‚¬λžŒμ΄ μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄?
  • μ—†λŠ” λŒ“κΈ€μ„ μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄?

3. λŒ“κΈ€ μ‚­μ œ

  • λŒ“κΈ€μ˜ 주인이 μ•„λ‹Œ μ‚¬λžŒμ΄ μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?
  • μ—†λŠ” λŒ“κΈ€μ„ μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?

이λͺ¨μ§€

1. κ²Œμ‹œκΈ€μ— 이λͺ¨μ§€λ₯Ό 남기기

  • 채널에 μ΄ˆλŒ€λ˜μ§€ μ•Šμ€ μ‚¬λžŒμ΄ 이λͺ¨μ§€λ₯Ό 남기렀고 ν•˜λ©΄?

2. κ²Œμ‹œκΈ€μ— 이λͺ¨μ§€λ₯Ό μ‚­μ œν•˜κΈ°

  • 채널에 μ΄ˆλŒ€λ˜μ§€ μ•Šμ€ μ‚¬λžŒμ΄ 이λͺ¨μ§€λ₯Ό μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?
  • 이λͺ¨μ§€λ₯Ό 남기지 μ•Šμ€ μ‚¬λžŒμ΄ 이λͺ¨μ§€λ₯Ό μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?

3. λŒ“κΈ€μ— 이λͺ¨μ§€λ₯Ό 남기기

  • 채널에 μ΄ˆλŒ€λ˜μ§€ μ•Šμ€ μ‚¬λžŒμ΄ 이λͺ¨μ§€λ₯Ό 남기렀고 ν•˜λ©΄?

4. λŒ“κΈ€μ— 이λͺ¨μ§€λ₯Ό μ‚­μ œν•˜κΈ°

  • 이λͺ¨μ§€λ₯Ό 남기지 μ•Šμ€ μ‚¬λžŒμ΄ 이λͺ¨μ§€λ₯Ό μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?
  • 채널에 μ΄ˆλŒ€λ˜μ§€ μ•Šμ€ μ‚¬λžŒμ΄ 이λͺ¨μ§€λ₯Ό μ‚­μ œν•˜λ €κ³  ν•˜λ©΄?

채널 κΈ°λŠ₯ 톡합 ν…ŒμŠ€νŠΈ κ²°κ³Ό μ „λ‹¬λ“œλ¦½λ‹ˆλ‹€

1. 채널 생성

  • null 값을 μ „λ‹¬ν•˜λ©΄ 401 μ—λŸ¬κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
  • 채널 이름에 곡백이 듀어가도 μƒμ„±λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

** 2. μœ μ € 채널에 μ΄ˆλŒ€ν•˜κΈ° **

  • μ—†λŠ” 채널에 μ΄ˆλŒ€ν•˜λ €κ³  ν•˜λ©΄ 401 μ—λŸ¬κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
  • μ—†λŠ” μœ μ €λ₯Ό 채널에 μ΄ˆλŒ€ν•˜λ €κ³  ν•˜λ©΄ 401 μ—λŸ¬κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
  • λ‚˜ μžμ‹ μ΄ 채널을 λ§Œλ“€μ—ˆμ„ λ•Œ 채널에 κ°€μž…λ˜μ§€ μ•ŠλŠ” μ—λŸ¬κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

3. 채널λͺ… μˆ˜μ •

  • κΆŒν•œ 없을 λ•Œ -> 401
  • null 전달 ν•  λ•Œ -> 401
  • μ—†λŠ” 채널을 μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ -> 401

4. 채널λͺ… μ‚­μ œ

  • κΆŒν•œ 없을 λ•Œ -> 401
  • μ—†λŠ” 채널을 μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ -> 401
  • μœ μ €-채널은 μ‚­μ œ λ˜λŠ”λ° 채널은 μ‚­μ œλ˜μ§€ μ•ŠμŒ

5. νŠΉμ • 채널 쑰회

  • μ—†λŠ” 채널을 μ‘°νšŒν•˜λ €κ³  ν•  λ•Œ μ—λŸ¬

  • πŸ€”μ±„λ„ μ‘°νšŒν•˜λŠ” λ‘œμ§μ— 채널 μ΄λ¦„λ§Œ ν‘œμ‹œλ˜λ©΄ 될지

ν”„λ‘ νŠΈμ™€ κΈ°λŠ₯을 μ—°κ²°ν•˜λ˜ 도쀑 λͺ‡κ°€μ§€ λ°±μ—”λ“œμ— μˆ˜μ •μ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • 채널 μ„œλΉ„μŠ€μ— λŒ€μƒ 채널에 κ°€μž…λ˜μ–΄ μžˆλŠ” μ‚¬μš©μžμΈμ§€ κ²€μ‚¬ν•˜λŠ” λ©”μ„œλ“œκ°€ μΆ”κ°€λμŠ΅λ‹ˆλ‹€.
    (이제 Thread와 Comment에 이λͺ¨μ§€ λ°˜μ‘μ„ 남길 λ•Œλ„ κΆŒν•œμ„ μ²΄ν¬ν•©λ‹ˆλ‹€)

  • λŒ€μƒ μ±„λ„μ˜ 전체 μ“°λ ˆλ“œλ₯Ό μ½μ–΄μ˜¬ λ•Œ μ“°λ ˆλ“œμ— 남겨진 이λͺ¨μ§€ λ°˜μ‘ 정보도 μ½μ–΄μ˜΅λ‹ˆλ‹€.

  • λŒ€μƒ μ±„λ„μ˜ 전체 μ“°λ ˆλ“œλ₯Ό μ½μ–΄μ˜¬ λ•Œ 채널에 κ°€μž…λλŠ”μ§€ κ²€μ‚¬ν•©λ‹ˆλ‹€

  • λŒ€μƒ μ±„λ„μ˜ νŠΉμ • μ“°λ ˆλ“œλ₯Ό μ½μ–΄μ˜¬ λ•Œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ μœ μ €κ°€ 채널에 κ°€μž…λλŠ”μ§€ κ²€μ‚¬ν•©λ‹ˆλ‹€

  • Thread에 이λͺ¨μ§€ λ°˜μ‘μ„ λ‚¨κΈ°λŠ” api와 μ‚­μ œν•˜λŠ” apiκ°€ ν†΅ν•©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • Comment에 이λͺ¨μ§€ λ°˜μ‘μ„ λ‚¨κΈ°λŠ” api와 μ‚­μ œν•˜λŠ” apiκ°€ ν†΅ν•©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • 이λͺ¨μ§€ μ—΄κ±°ν˜• 이름이 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€ (SMILE, CRY, HEART, LIKE)

ν”„λ‘ νŠΈ κ΅¬ν˜„μ„ μœ„ν•΄ 일정 κΈ°λŠ₯μ—μ„œ 변경이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μΌμ •μ˜ λ‚΄μš©κ³Ό μ˜ˆμ •μΌμ„ λ³€κ²½ν•˜λ˜ ν•˜λ‚˜μ˜ λ©”μ†Œλ“œλ₯Ό λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” λ©”μ†Œλ“œμ™€ μ˜ˆμ •μ„ λ³€κ²½ν•˜λŠ” λ©”μ†Œλ“œ λ‘κ°œλ‘œ λΆ„λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. (μ»¨νŠΈλ‘€λŸ¬λ„ λΆ„λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.)

또, 이번 달 일정을 μ‘°νšŒν•˜λŠ” κΈ°λŠ₯κ³Ό μ™„λ£Œ 체크λ₯Ό ν•˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ³€κ²½ 쀑에 _λ ˆν¬μ§€ν† λ¦¬λ₯Ό 톡해 ID둜 Schedule 객체λ₯Ό μ‘°νšŒν•˜μ—¬ κ°€μ Έμ˜€λŠ” λΆ€λΆ„_의 μ½”λ“œκ°€ μ€‘λ³΅λ˜μ–΄ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ•„λž˜μ™€ 같은 DTOλ₯Ό λ§Œλ“€μ–΄ λ°˜ν™˜ν•˜λŠ” μ½”λ“œλ„ ν•¨μˆ˜μ˜ λ°˜ν™˜ 값을 λ³€μˆ˜μ— 받은 ν›„ λ°˜ν™˜ν•  ν•„μš” 없이 λ°”λ‘œ ν•¨μˆ˜μ˜ λ°˜ν™˜ 값을 λ°˜ν™˜ν•  수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.