MemberApiController의 saveMemberV2()에서 @Valid에 의해 검증 오류가 발생한 경우에도 오류에 대한 api를 내려줘야 하잖아요. 이때에도 오류가 없는 경우와 마찬가지로 CreateMemberResponse를 반환해야 하는 건가요? 검증 오류가 발생했을 때 api를 어떻게 전달해야하는지를 잘 모르겠습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] MemoryMemberRepository 클래스에는 생성자가 없는데 어떻게 스프링 컨테이너에 등록이 되는거죠? 그리고 MemberRepository의 구현체가 몇가지 더 있는 경우 MemberService의 생성자 파라미터에는 어떤 구현체가 들어가나요?
클래스 객체 사용 X 클래스 객체 사용 O 먼저 결론적으로 말씀드리면 제품의 정보를 일일이 정의한 것과 클래스 객체를 통해 코드를 작성한 것의 차이를 잘 모르겠습니다. 제가 챕터 7의 1번째 강의를 중에서 블랙박스의 정보는 이보다 실제로 많기 때문에 이 모든 것을 일일이 정의한다면 코드가 방대해 진다고 들었습니다. 그런데 제가 실습하고 나서 코드를 살펴보니 클래스 객체에 대한 필요성을 느끼지 못하였습니다. 알려주신다면 감사하겠습니다.
@Override public synchronized void put(String data) { while (queue.size() == max) { log("[put] 큐가 가득 참, 생산자 대기"); try { wait(); // RUNNABLE -> WAITING, 락 반납 log("[put] 생산자 깨어남"); } catch (InterruptedException e) { throw new RuntimeException(e); } } queue.offer(data); log("[put] 생산자 데이터 저장, notify() 호출"); notify(); // 대기 스레드, WAIT -> BLOCKED } 생산자 스레드가 먼저 실행되면 마지막 스레드는 wait() 호출 후 스레드 대기 집합에서 관리 되는걸로 이해했습니다. 이 상태에서 소비자 스레드가 실행되면 데이터를 처리하고 마지막에 notify()를 호출하면 스레드 대기 집합에서 관리 되던 생산자 스레드가 깨어날텐대 여기서 wait(); 바로 다음 코드를 실행하지 않고 바로 BLOCKED 상태가 되는건가요? BLOCKED 상태에 있다가 소비자 스레드가 락을 반납 했을때 BLOCKED 상태가 풀리면서 wait() 바로 다음 코드를 실행한다고 이해하면 될까요?
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 영상 기준 4:46초쯤에 void 메서드는 return이 생략되어도 자바 컴파일러가 마지막줄에 넣어준다고 하셨는데 .class로 컴파일된 파일을 확인해보니 반대로 적어두었던 return도 생략이 되어있습니다. 자바 버전이 올라가면서 바뀐걸까요 아니면 컴파일된 파일이 아닌 파일을 실행 시에 return이 추가가 되는건가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. // flush 자동 호출 commit, query int resultCnt = em.createQuery("update Member m set m.age = 20") .executeUpdate(); Member findMember = em.find(Member.class, member1.getId()); System.out.println("findMember.getAge() = " + findMember.getAge()); 이 부분을 보시면 영한님의 12분 코드와 같잖아요? 이때 Member findMember = em.find(Member.class, member1.getId()); 의 findember를 출력할 때, 영속성 컨텍스트 때문에 update문의 age가 20인 것이 반영이 안 돼야 하는데 제 환경에서는 반영이 되는 걸로 나옵니다..! 정리하면, em.clear() 를 하지 않았을 때는 age가 0이 나와야 하지만, em.clear() 를 하지 않았음에도 불구하고 age가 20이 나옵니다 물론 아래처럼 member의 age 초기값을 0으로 지정해줬습니다 Member member1 = new Member(); member1.setUsername("회원1"); member1.setAge(0); member1.changeTeam(teamA); em.persist(member1); 이유가 무엇일까요??
문자열 함수 수업에서 어떤 함수는 print("endswith?:",str_o2.endswith("s")) 뒤에 점을 찍고 나타내고 어떤 함수는 print("sorted:",sorted(str_o1)) 와 같이 점(.)을 찍지 않고 나타내는데 차이점을 설명 해주셔야죠 ㅜㅜㅜ ㅜㅜㅜ 차이점이 뭘까요...? ㅠ 함수마다 구조 다 다르니까 외워야하면 그런거라고라도 말을 해주세요 ...
저의 경우에는, Unable to load class 'org.gradle.api.plugins.MavenPlugin'. This is an unexpected error. Please file a bug containing the idea.log file. 오류의 이유와 gradlew build failed 빌드에 실패하는 이유가 동일했습니다. 해결 방법 아래 주소에 적어두었으니, 참고하세요 ! 💡 https://blog.naver.com/bkmij/223594375357 도움이 되었으면 좋겠습니다. 모두 남은 학습 열심히 화이팅하세요 : ) ! ☺ ☺ https://www.inflearn.com/community/questions/1333084/build-gradle-%EA%B4%80%EB%A0%A8-%EC%98%A4%EB%A5%98-unable-to-load-class-x27-org-gradle-api-plugins-mavenplugin?srsltid=AfmBOopJ4VA4YBT1JxsR3YjKEGdr1qYs0Y1QQgxTYQcBfdS2WYsBTeqa ↑댓글을 참고하여 해결하였습니다.
안녕하세요 실무에서 자바, 스프링부트 를 하게된 프론트엔드 개발자입니다. 급히 자바, 스프링을 막듣고있는데 로드맵을 물론 다들으면좋겟지만 너무많고, 실무에서 사용이필요해서 혹시 꼭들어야한다면 몇가지 추려서 추천해주실강의들이있나요 ? 지금 자바 입문, 기본, 중급1 듣고있습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] result에 할당후 실행 하는 코드가 없는데 바로 pay.pay 가 실행되는 원리를 모르겠습니다.. 아니면 원래 할당과 실행이 동시에 일어나는건가요?
안녕하세요. 강의를 들으며 자동화를 진행하고 있는데, 한 가지 질문이 있습니다. 저는 특정 문서가 아니라 여러 다른 문서에서 사용자의 정보를 자동으로 입력하는 코드를 작성하고 싶습니다. 예를 들어, 자주 입력하는 항목인 이름, 성별, 전화번호를 딕셔너리에 저장하고, 서로 다른 양식의 문서를 불러왔을 때 해당 항목이 존재하면 입력란의 오른쪽이나 아래쪽 공백을 확인하여 자동으로 채워 넣기를 희망합니다. 이런 작업이 기술적으로 가능한지 궁금하며 가능하다면 어떻게 하는것이 좋을지 조언을 구하고 싶습니다. 감사합니다.
11장 팔로잉 기능 구현에서는 팔로잉 하는 목록 페이지 팔로우 하고 있지 않는 목록 페이지 두 가지를 구현하였습니다. 이를 기반으로 인스타그램처럼 프로필을 카드기반으로 꾸미고 10-12 에서 구현한 무한 스크롤을 적용하였습니다. 프로필 페이지에서 구현한 프로필 카드를 목록에서 재활용하여 반복을 줄이고자 했습니다. 대부분의 기능은 구현하였습니다만, 강의의 내용만으로는 스스로 해결하기 힘든 점들이 있어 질문글을 파란색으로 남깁니다. 우선, 팔로잉 목록과 언팔로인 목록을 나눈 경우 언팔로잉 목록에서 내가 팔로잉 한지 모르고 검색한 경우 유저 목록이 검색되지 않는 불편함이 존재할 수 있습니다. 물론 인스타 그램의 경우 강사님께서 구현한 것처럼 탭을 나누어서 구현하였으니 이는 문제가 아닐 수 있습니다. 그러나 하기의 사진은 정확한 예시는 아닐 수 있으나 내 팔로워들 중 내 팔로잉 여부를 확인할 수 있는 페이지를 구현하고 싶습니다. 인스타 팔로워 페이지 인스타 팔로잉 페이지 따라서 팔로우하지 않는 목록 페이지를 유저 목록들이 모두 나열되면서 눈으로 팔로우 여부를 확인할 수 있는 페이지로 구현하고자 합니다. 하기는 현재 구현한 목록 페이지의 일부 입니다. 개인 프로필 페이지에서는 팔로잉 버튼 대신 edit 버튼이 활성화 됩니다. 해당 페이지를 구현하기 위해 11장에서 구현한 두 함수를 generic ListView를 상속받은 class 기반 뷰로 구현하였습니다. # views.py @method_decorator(login_required_hx, name="dispatch") class DiscoverListView(ListView): model = User paginate_by = 12 context_object_name="user_list" def get_queryset(self): qs = User.objects.all() user: User = self.request.user follow_relation = self.kwargs.get("follow_relation", False) # url로 부터 받는 인자 match follow_relation: case "following": qs = user.following_user_set.all() case "followed": qs = user.followed_user_set.all() # qs = User.objects.exclude(id__in=user.following_user_set.all()) qs = qs.exclude(id__in=[user.pk]).select_related("profile").prefetch_related("follower_user_set", "following_user_set") query = self.request.GET.get("query", "").strip() if query: qs = qs.filter( Q(username__icontains=query) | Q(full_name__icontains=query) | Q(email__icontains=query) ) return qs.order_by("username") def get_template_names(self) -> list[str]: # htmx로 요청이 들어오면 검색바 등 불필요한 위 아래 내용 제거 후 내용만 업데이트 if self.request.htmx: template_name = "accounts/_user_list.html" else: template_name = "accounts/user_list.html" return [template_name] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # is_follwer 는 html에서 follow 버튼을 구분하기 위한 인자 # context['is_follower'] = True if self.kwargs.get("follow_relation", False)=="following" else False qs = self.get_queryset() follow_dict = { q.username:self.request.user.is_follower(q) for q in qs } context['follow_dict'] = follow_dict query = self.request.GET.get("query", "").strip() context['query']=query return context 여기서 .prefetch_related("follower_user_set", "following_user_set") 을 통해 모델에서 구현한 팔로워와 팔로잉 유저 수를 불러오는 property를 templates에서 호출할 때 N+1 문제를 해결하고자 하였습니다. <!-- _user_profile_card.html --> {% load static %} <div class="card" style="border-radius: 15px;"> <div class="card-body p-4"> <div class="d-flex"> <div class="flex-shrink-0"> {% if user.profile.avatar %} <img src="{{user.profile.avatar.url}}" alt="{{user}}'s avatar" class="img-fluid" style="width: 180px; border-radius: 10px;"> {% else %} <img src="{% static 'images/profile-icon-design-free-vector.jpg' %}" alt="{{user}}'s avatar" class="img-fluid" style="width: 180px; border-radius: 10px;"> {% endif %} </div> <div class="flex-grow-1 ms-3"> <h5 class="mb-1" style="display:inline">{{ user.full_name }} </h5> {% if user.profile.team %} <h6 class="text-muted" style="display:inline">{{ user.profile.team }}</h6> {% endif %} <p class="mb-1 pb-1">{{ user.email }}</p> <div class="d-flex justify-content-start rounded-3 p-2 mb-2 bg-body-tertiary"> <div> <p class="small text-muted mb-1">Data</p> <p class="mb-0">TDA</p> </div> <div class="px-3"> <p class="small text-muted mb-1">Followers</p> <p class="mb-0">{{user.follower_count}}</p> </div> <div> <p class="small text-muted mb-1">Following</p> <p class="mb-0">{{user.following_count}}</p> </div> </div> <div class="d-flex pt-1"> {% if request.user == user %} <a href="{% url 'accounts:profile_edit' %}" class="btn btn-outline-primary btn-sm"> <i class="bi bi-pencil-square"></i> 프로필 수정 </a> {% else %} {% comment %} {% include "accounts/_user_follow.html" with username=user.username%} {% endcomment %} {% include "accounts/_user_follow.html" with is_follower=follow_dict.user.username username=user.username%} {% endif %} </div> </div> </div> </div> </div> 프로필 카드 내에서 팔로워와 팔로잉 수를 보여주기 위해 접근한 제 방식이 맞는지가 궁금합니다. models.py 에서 구현한 follower_count 또는 following_count 를 template에서 호출하는 방식이 일반적인 접근 방식인가요? 그 다음 제가 위에서 구현하고자 한 유저별 팔로우 여부를 get_context_data 에서 follow_dict 라는 변수명으로 저장하여 하기와 같이 template에 넘겨주었습니다. <!--user_follow.html--> {% include "core/_messages_as_event.html" %} {% load keyvalue %} {% if follow_dict|keyvalue:username %} <a href="#" hx-post="{% url 'accounts:user_unfollow' username %}" hx-swap="outerHTML" class="btn btn-sm btn-primary"> <i class="bi bi-person-check-fill"></i> 팔로잉 중 </a> {% else %} <a href="#" hx-post="{% url 'accounts:user_follow' username %}" hx-swap="outerHTML" class="btn btn-sm btn-secondary"> <i class="bi bi-person-add"></i> 팔로잉 하기 </a> {% endif %} dictionary 키 값으로 변수를 입력하는 것이 django template에서 지원되지 않기 때문에 하기의 함수를 등록하여 활용하였습니다. register = template.Library() @register.filter def keyvalue(dict, key): return dict[key] 결과물은 구현한 페이지처럼 잘 보여지지만, 두 가지 문제가 존재합니다. 확실치 않지만 하기의 코드에서 N+1 오류가 발생하는 것으로 보입니다. follow_dict = { q.username:self.request.user.is_follower(q) for q in qs } 팔로잉 혹은 언팔로잉 요청 시 500 서버 에러가 발생합니다. 아마도 follow_dict가 요청 시에 업데이트 되지 않아 발생하는 오류로 보입니다. 이러한 점 때문에 인스타그램에서도 따로 탭을 두어서 관리하는가 싶기도 합니다만 이를 해결할 방법이 있을까요? 어렵다면 팔로워 목록에서 내가 팔로잉 하는지 여부를 표기하는 인스타그램 페이지는 어떻게 구현해야 할까요?