묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Dtype의 종류에 따라 쿼리 조건을 다르게 넣고 싶습니다.
안녕하세요 영한님. 강의 정말 잘 듣고 있습니다. 강의 내용을 토대로 Plan과 Todo 엔티티를 사용하는 일정 관리 웹사이트를 만들고 있습니다. 상속 관계와 관련된 문제가 발생하여 도움을 얻을 수 있을까 해서 질문 남겨봅니다. [엔티티 구조] Plan 엔티티는 startDate 변수를 가지고 있습니다. PlanRegular와 PlanTerm 엔티티는 Plan의 자식으로 Plan을 상속받습니다. PlanRegular는 Plan을 단순히 상속받기만 하고 PlanTerm은 Plan을 상속받은 뒤 endDate라는 필드를 따로 가집니다. 이렇게 만든 이유는 기간이 있는 일정(term)과 없는 일정(regular)을 표현하기 위해서입니다. 상속 전략은 @Inheritance(strategy = InheritanceType.JOINED) 를 사용하고 있습니다. Dtype을 객체에서 사용하기 위해서 dtype 변수를 읽기 전용으로 추가했습니다. Plan 엔티티와 Todo 엔티티는 일대 다 연관관계를 형성하고 있습니다. planId를 외래 키로 사용합니다. [질문 내용] 저는 Todo를 날짜별로 조회할 때 미리 Plan의 Dtype으로 regular인지 term인지를 판단하고 그에 따라 쿼리 조건을 달리 하고 싶습니다. 예를 들어 Todo를 2021년 12월 9일로 조회할 경우 매핑된 Plan이 regular인 경우 endDate가 없기 때문에 startDate가 2021년 12월 9일 이전인지 확인하고 매핑된 Plan이 term인 경우 startDate와 endDate 사이에 2021년 12월 9일이 있는지 확인합니다. public List<Todo> getTodoByPlanIdAndDate_Regular(Plan plan, LocalDate date) { if (plan.getDtype() == "regular") { /*regular일 경우 startDate 조건만 걸기*/ return em.createQuery("select o from Todo o where o.plan.dtype = :dtype and o.plan.id =:planId and o.plan.startDate <= :date") .setParameter("date", date) .setParameter("planId", plan.getId()) .setParameter("dtype", plan.getDtype()) .getResultList(); } else { /*term일 경우 startDate, endDate 조건 둘 다 걸기*/ return em.createQuery("select o from Todo o where o.plan.dtype = :dtype and o.plan.id =:planId and o.plan.startDate <= :date and o.plan.endDate >= :date") .setParameter("date", date) .setParameter("planId", plan.getId()) .setParameter("dtype", plan.getDtype()) .getResultList(); }} 코드로 표현하면 이런 식이 될 것 같습니다. 그런데 문제는 regular일 때 조건은 잘 걸리는데 term일 때 조건이 안 걸린다는 것입니다. endDate를 resolve할 수 없다고 뜹니다. 저 코드에서는 o.plan.endDate로 조건을 걸었는데 부모인 Plan에는 endDate가 없어서 그런 것 같습니다. Todo의 연관관계는 부모인 Plan으로 걸려 있기 때문에 자식인 PlanRegular나 PlanTerm으로 조회할 수도 없습니다. 이 문제를 해결하기 위해 Todo도 regular와 term으로 분리하고 모든 Todo 관련 메서드를 regular와 term을 따로 처리하도록 하는...그런 방법을 생각해 봤습니다. 하지만 중복되는 코드가 너무 많아지기도 하고 Plan과 다르게 Todo는 regular와 term이 다르게 가지고 있는 변수가 없어서(Plan의 endDate처럼) 상속을 적용하기는 적합하지 않을 것 같습니다. 이 문제를 해결할 수 있는 방법이 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
안녕하세요. 서버개념
안녕하세요. 본계정으로 유니티 1강을 수강중이고 타 계정으로 핵심계정인 7 ,9, 11강을 수강하고 서버 공부를 하고 있습니다. 감사합니다. 그러다 궁금한 점이 생겼는데요. 제 질의에 개념이 많이 부족할 수도 있습니다. 1. 선생님 강의에서 개발하는 프로그램이 웹서버 개발이랑 많이 다른가요? 제가 알아본 웹서버는 아파치같은 것을 이용하는 것이고, 웹서버를 이용하는 목적 중에 하나가 클라이언트가 db에 데이터를 요청할 때 웹서버가 중간에서 검증을 해주는 것이라고 들었습니다. 그리고 위와 같은 웹서버도 선생님께서 만든 c# 서버 프로그램처럼 움직임 동기화도 가능하다고 하는데, 어떻게 다른지 궁금합니다. 2. 그리고, 웹서버가 웹서버라 불리면, 선생님의 c# 서버도 그냥 흔히 c# 서버라고 불리나요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결견고한 JS 소프트웨어 만들기
jasmine 3 버전 실행시 randomized with seed 가 뭔지 궁금합니다.
안녕하세요 강의 정말 잘 듣고 있습니다. 저는 Jasmine 3 버전을 사용해서 테스트에 사용하고 있는데요?스팩 러너를 실행하고 나면 결과 화면에 randomized with seed 92414 이런 내용의 메시지가 출력됩니다. 아무리 검색해봐도 그냥 의사난수생성 이란 정도의 내용만 나오고 있는데 혹시 어떤 의미인지 여쭐수 있을까요?? 감사합니다 :)
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
vue-til-serve 관련 질문이 있습니다.
Vuejs 끝장내기 강좌를 보고 있습니다. vue-til-serve 프로젝트가 npm i express로 설치 했을때와 구조가 조금 다른것 같은데, npm으로 express 내려받고 소스코드를 직접 수정 하신건지 여쭤봅니다.
-
미해결파이썬(Python)으로 데이터 기반 주식 퀀트 투자하기 Part1
에러해결방법
아래 for in 구문을 돌리는데 이런 경고가 나옵니다. 퍼포먼스를 높이면서 이런 경고문을 안 나오게 하려면 어떤 방식으로 짜는 게 좋을까요? for indicator in tqdm(indicators_Value): df_팩터정규화[f"{indicator}_Yield"] = df_팩터정규화[indicator] / df_팩터정규화["시가총액"] | 0/238 [00:00<?, ?it/s]<ipython-input-2-9bd50d5ff602>:64: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()` df_팩터정규화[f"{indicator}_Yield"] = df_팩터정규화[indicator] / df_팩터정규화["시가총액"]
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
설치오류
설치 부분에서 오류가 많네요. gui로 했다가 안되어서 터미널로 했는데도 저기서 거의 12시간동안 멈춰있습니다. 2021.2 버전이구요 vi 편집에서 마지막 0으로 바꾸는것까지 했구요 답답하네요.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
안녕하세요 :) 스웨거 관련 질문이 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 :) 강의해 주신 내용을 기반으로 소켓을 이용한 실 서비스를 구현해 보고 있는데요. 다름이 아니라 소켓 부하 테스트를 해보니 처리 못하는 요청 건수가 많아, NodeJS에서 기본적으로 제공해 주는 프로파일링을 해보았고, 그 결과 스웨거 프레임워크가 상당히 많은 CPU 리소스를 잡고 있는 것을 확인했습니다. (물론 사용 중인 AWS EC2의 사양이 낮기도 합니다.) 강의 중에 스웨거 다소 무겁다고 하셨었는데.. 실제로 체감해 보니, 스웨거가 왜 이렇게 많은 CPU를 차지하는 지, 그리고 강사님께서는 왜 무겁다고 하셨는 지 근본적인 원인이 궁금해졌습니다! 스웨거 단점을 인터넷에 찾아보니 무겁다는 측면에 대해서는 크게 언급이 없어 여기에 질문을 남깁니다! 최대한 기술적인 측면에서 답변을 해주시면 정말 감사하겠습니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
JobQueue 질문 드립니다.
안녕하세요. 1. Room이 JobSerializer를 상속받게 변경된 이후 멀티쓰레드 환경에 따른 여러가지 실행순서 경우의 수를 신경써 줘야 되서 안전하게 사용하기 위해서는 많이 복잡해 지는 것 같습니다. 실질적으로 모든 경우의 수를 매번 신경쓰며 사용하기엔 무리가 있는 것 같습니다. JobSerializer를 안전하게 사용할 수 있는 팁이나 노하우가 있을까요. 2. JobSerializer는 여러개의 쓰레드 중 하나의 쓰레드에서만 실행되는 것이 보장되어야 할 것 같은데요. 이것을 보장할 수 있는 방법이 있을까요. 또 다른 A라는 JobSerializer로 들어가야할 Job이 B라는 JobSerializer로 들어가는 상황을 방지하거나 잡아낼 수 있는 방법이 있을까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
플로이드 워셜 경로 탐색 질문
안녕하세요 선생님 코딩 테스트를 처음 준비 하는데 선생님의 강의를 몰랐다면 정말 큰 일 날 뻔 했습니다. 뛰어난 강의력 덕분에 기초 개념을 잡아가고 있습니다. 감사하단 말씀을 드리고 싶습니다. 다름이 아니라, 플로이드 워셜 알고리즘 강의를 듣고 직접 코드를 짜다가 경로 출력도 한번 해봐야겠다는 생각이 들었습니다. 소스 코드 폴더에 혹시 경로 출력 코드가 있을까 찾아봤는데 파일이 있긴 있는데 공백이었습니다. 공백으로 놔두신 이유가 있으실건데, 경로 출력까지는 불필요하다는 의도이신가요? 만일 불필요하다면, 굳이 하지 않겠습니다. 그래도, 코드 파일이 있다면 업로드 해주시면 감사하겠습니다. 그리고 마지막으로 여쭤보고 싶은게 백준은 알고리즘 대회 준비하는 친구들이 이용하는 사이트라 백준까지는 필요없고 릿코드를 풀어라는 글을 인터넷에서 본 적 있는데 어떻게 생각하시는지 궁금합니다. 감사합니다. 또, 추가적인 강의는 없는지도 궁금합니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
컨트롤 URI를 쓰는 유즈케이스에 대해 질문드립니다.
강의 내용에서 문서+컬렉션으로 최대한 해결해보지만, 한계가 존재할것이고 이걸 컨트롤 URI로 구현해준다고 이해했습니다. /members/ 가 존재한다면, 여기서 더 디테일한 부분을 고려했을 때 필요한 기능들에 대해 컨트롤 URI를 구현해주는 것일까요? 예를 들면 /members/{id}/delete, /members/{id}/read 디테일한 부분을 체크해줄때 컨트롤 URI를 쓰는것일까요? 감사합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
React -> Next.js 전환
제로초님 안녕하세요 강의 너무 잘 보고 있습니다 ^^ 현재 React로 작성 Project가 있는데[프론트(React)/백엔드(Node, Express, MySQL)] 함수형이 아닌 클래스형 컴포넌트루요, 이 경우 Next.js로 마이그레이션 하는데 많은 작업이 필요한가요 ? 정보검색을 해보니 Link태그라던지 React-Router에서 Next에서 기본적으로 제공하는 Router(Page폴더 및 레이아웃 사용) 변경하는 것 말고는 큰 작업은 없는 것 같아서요 !
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
React.createRef 사용중 Next.js가 createRef 인식을 못하는데 뭐가 문제일까요.. ??
기존에 React로 개발한 프로젝트를 Next.js로 전환하려고 강좌를 보고 있습니다. 본 강좌와 관련이 없는 질문이라면 죄송하지만, 아무리 구글 검색을 해봐도 답을 얻지 못해 도움을 구해보고자 이렇게 질문드립니다. 너무 바쁘실텐데 도움 주시면 정말 감사하겠습니다 우선 오류는 다음과 같습니다. 아래는 제 코드이구요, Ref를 선언하는 부분에서 Next.js가 Ref를 인식하지 못하는 것 같습니다.
-
미해결언리얼 엔진4 입문 (C++ 기반)
OwnerComp.GetAIOwner()->GetPawn() 가 널을 반환 합니다.
해당 강의를 들으면서 DrawDebugSphere가 안되어서 디버깅을 해봤는데 아래 처럼 컨트롤러는 잡히는데 Pawn이 null이 뜹니다. 원인을 알 수 있을까요? ㅜㅜ 이전에 커뮤니티에 올린 질문과 유사한 방향 같습니다 ㅠㅠ 혹시 몰라 AI컨트롤러에서도 폰을 직접 세팅해줬는데도 동작을 안합니다 ㅠ
-
미해결스프링 핵심 원리 - 기본편
빈이 여러개일 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. FixDiscountPolicy와 RateDiscountPolicy가 빈으로 등록되어있을때 DiscountPolicy에 의존하는 OrderService에서는 DiscountPolicy Bean이 2개이기때문에 하나의 빈을 선택하기위해 @Qualifier를 사용 할 수 있는데요. 그럼 결국 구체화에 의존을 하게되고, OrderService의 할인정책이 새로운 정책(NewDiscountPolicy)으로 변경되면 OrderService의 Qualifier 대상 Bean이 변경되어야하므로 OCP, DIP가 깨진다고보면될까요?? 의견 부탁드립니다. 감사합니다!
-
미해결수학으로부터 인류를 자유롭게 하라(기초대수학편)
Proper supersets의 cardinality
안녕하세요. 강의 잘 듣고 있습니다. 수강중에 질문이 있는데요. 11:14 의 Proper supersets의 cardinality가 A ) B -> |A| > |B| 가 되어야 하는게 맞나요?
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
바운딩 박스가 한 사람에게 여러개 잡히는 경우
선생님 안녕하세요, 선생님덕에 어렵게만 느껴지던 cv를 조금씩 배우고 있어서 정말 감사드립니다. 제가 mask rcnn이나 mmdetection을 통한 segmentation을 다른 이미지를 넣어서 해봤는데요, 2모델 다 한 사람만 있는 여러 사진들에서 한 사람에 대해 서너개의 바운딩박스가 생기더라고요. (다 사람으로 예측하긴 하는데 accuracy는 갈수록 낮아지게 생깁니다.) 한명이 앞에 있고, 뒤에 또 사람이 겹쳐져 있는거다 이런 식으로 인식한 걸까요? 이런게 이례적인 경우인가요? 일반적인 경우라면 어떻게 하면 더 나은 결과가 나올 수 있을까요? 그냥 threshold를 높이면 되는 걸까요? 사진에 나오는 사람이 대체적으로 한명이고, 사람을 찾는 거라면 range(1)로만 하면 되는 걸까요? 그럼 자동으로 가장 accuracy가 높은거 하나만 나오는 건가요?
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
광고상품 제외하기에서 아예 제외하고 나머지만 출력하려면 어떻게 해야하나요?
광고상품 제외하기에서 if len(link.select('span.ad-badge-text')) > 0: print("광고상품입니다.") 로 하셨는데 이렇게 하면 결과물 출력시 광고상품은 광고상품이라고 표시되서 나오는데 혹시 무시하고 아예 출력을 안하려면 어떻게 해야하나요? 결과물에 광고가 아닌 상품들만 출력하고 싶을때의 경우도 알려주시면 감사드리겠습니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
안녕하세요 ! 질문이 있습니다.
강의 영상에 마지막 콘솔에서 나오는 로그들중에 {data : {...}, status:201, statusText:"Created", headers: {...}, config: {...}, ... } 등 이렇게 여러 파라미터들이 나오는데 저는 데이터 형태가 이렇게 나오더라고요 혹시 제가 놓친 부분이 있나 해서요 ...
-
미해결홍정모의 따라하며 배우는 C++
부모클래스의 생성자 initializer_list 질문
#include <iostream> #include <cmath> #include <limits> #include <iomanip> #include <bitset> #include <string> #include <cstdint> #include <random> #include <cstddef> #include <array> #include <tuple> #include <cassert> //#include <assert.h> #include <algorithm> #include <vector> #include <chrono> #include <initializer_list> using namespace std; template <typename T, int size> class TemplateArrBase { protected: int m_length; T* m_arr; public: TemplateArrBase(const int& value = 0) : m_length(value) { m_arr = new T[value]; } TemplateArrBase(const initializer_list<T>& list) { resetArr(list.size()); int count = 0; for (const auto& element : list) { m_arr[count] = element; count++; } } T& operator [](const int& index) const { assert(index < m_length); assert(index >= 0); return m_arr[index]; } template<typename T> T sum() const { T sum = 0; for (int i = 0; i < m_length; i++) { sum += m_arr[i]; } return sum; } //1. const int operator +(const TemplateArrBase& ref) const { return this->m_length + ref.m_length; } //3. const int operator +(const int &num) const { return m_length + num; } //2. friend const int operator+(int num, const TemplateArrBase& ref) { return num + ref.m_length; } friend ostream& operator <<(ostream& out, const TemplateArrBase& over) { for (int i = 0; i < over.m_length; i++) { out.operator<<(over.m_arr[i]) << " "; } cout << endl; return out; } //template <typename T> void setArr(const initializer_list<T>& arr) { resetArr(arr.size()); int count = 0; for (const auto& element : arr) { m_arr[count] = element; count++; } } void operator = (const initializer_list<T>& list) { resetArr(list.size()); int count = 0; for (const auto& element : list) { m_arr[count] = element; count++; } } void resetArr(const int& size) { delete[] m_arr; m_arr = new T[size]; if (m_arr == nullptr) { assert(m_arr != nullptr); } m_length = size; } void print() { for (int i = 0; i < m_length; i++) { cout << m_arr[i] << " "; } cout << endl; } //friend const int operator+(const over& ref, const over& ref2) //{ // return ref.value + ref2.value; //} }; template<typename T, int size> class TemplateArr : public TemplateArrBase<T, size> { }; template<int size> class TemplateArr<bool, size> : public TemplateArrBase<bool, size> { public: void losingTicket() { } }; template<int size> class TemplateArr<char, size> : public TemplateArrBase<char, size> { public: void print() {// protected 로 선언했는데 그냥 m_length 라고 쓰면 에러뜨는 이유가 템플릿이라서 그런가요? for (int i = 0; i < TemplateArrBase<char,size>::m_length; i++) { cout << TemplateArrBase<char, size>::m_arr[i]; } cout << endl; } }; class A { public: A() { cout << "A" << endl; } }; class B : public A { public: B() { cout << "B" << endl; } void test() {} }; int main() { TemplateArrBase<int,0> over = {1,2,3,4,5}; over = { 1,2,3 }; over[1] = 32; cout << over << endl; TemplateArr<bool,10> over2; over2.losingTicket(); cout << over.sum<int>() << endl; over.print(); TemplateArrBase<char,0> over3 = { 'e','r' }; cout << over3 << endl; over3.print(); TemplateArr<char, 0> over4 = { 'a','b'}; // 에러뜨는 이유를 모르겠습니다 over4.print(); } 안녕하세요 위의 코드에 주석친것처럼 질문이 2가지가 있는데요 첫째가 템플릿이라서 상속받은 클래스들이 부모클래스의 멤버변수를 못찾는것인지에 대한 거랑 두번째로 아래 오류코드처럼 모클래스로는 initializer list 가 정상적으로 작동되는데 자식클래스로 초기화했을때는 왜 저런 에러가 뜨는지 모르겠습니다. 그래서 배열을 한개만 넣어서 초기화하면 정상작동은 하는데 문제가 문자들이 garbage 값들이 나옵니다. 모클래스 생성자도 상속받은건데 머가 문제인지 모르겠네요 ㅠㅠ
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
마지막 이메일 확인 페이지가 안뜹니다
controll 테스트부분에서 notnull에 emailchecktoken에 문제가 없고 가입까지 하고난뒤 check-email-token 값을 복사하여 실행하면 빈화면이 뜹니다 그냥 흰화면만 나오고 f12눌러서 확인하면 <plaintext 문서의 문자 인코딩이 선언되어 있지 않습니다.문서에 US ASCII 외의 문자가 포함되어 있는 경우, 브라우저의 설정에 따라서 글자가 깨질 수 있습니다. 파일 문자 인코딩은 전송 프로토콜로 선언되어 문자 인코딩을 지정하는 바이트 오더 마크가 파일에 사용되어야 합니다.> 이런 오류메시지만 나옵니다. 방법을 찾아보려고 검색도 해봤는데 해결이 안되네요 일단 checked-email <!DOCTYPE html><html lang="en" xmlns:th="http://www.thymeleaf.org"><head> <meta charset="UTF-8"> <title>StudyOlle</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <style> .container{ max-width: 100%; } </style></head><body class="bg-light"> <nav class="navbar navbar-expand-sm navbar-dark bg-dark"> <a class="navbar-brand" href="/" th:href="@{/}"> <img src="/images/logo_sm.png" width="30" height="30"> </a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item"> <form th:action="@{/search/study}" class="form-inline" method="get"> <input class="form-control mr-sm-2" name="keyword" type="search" placeholder="스터디 찾기" aria-label="Search" /> </form> </li> </ul> <ul class="navbar-nav justify-content-end"> <li class="nav-item"> <a class="nav-link" href="#" th:href="@{/login}">로그인</a> </li> <li class="nav-item"> <a class="nav-link" href="#" th:href="@{/sign-up}">가입</a> </li> </ul>> </div> </nav> <div class="py-5 text-center" th:if="${error}"> <p class="lead">스터디올래 이메일 확인</p> <div class="alert alert-danger" role="alert"> 이메일 확인 링크가 정확하지 않습니다. </div> </div> <div class="py-5 text-center" th:if="${error == null}"> <p class="lead">스터디올래 이메일 확인</p> <h2> 이메일을 확인했습니다. <span th:text="${numberOfUser}">10</span>번째 회원, <span th:text="${nickname}">백기선</span>님 가입을 축하합니다. </h2> <small class="text-info">이제부터 가입할 때 사용한 이메일 또는 닉네임과 패스트워드로 로그인 할 수 있습니다.</small> </div></body></html> controller @Controller@RequiredArgsConstructorpublic class AccountController { private final AccountRepository accountRepository; private final SignUpFormValidator signUpFormValidator; private final AccountService accountService; @InitBinder("signUpForm") public void initBinder(WebDataBinder webDataBinder) { webDataBinder.addValidators(signUpFormValidator); } @GetMapping("/sign-up") public String signUpForm(Model model) { model.addAttribute(new SignUpForm()); return "account/sign-up"; } @PostMapping("/sign-up") public String signUpSubmit(@Valid SignUpForm signUpForm, Errors errors) { if (errors.hasErrors()) { return "account/sign-up"; } accountService.processNewAccount(signUpForm); //TODO 회원 가입 처리 return "redirect:/"; } @GetMapping("/check-email-token") public String checkEmailToken(String token, String email, Model model) { Account account = accountRepository.findByEmail(email); String view = "account/checked-email"; if (account == null) { model.addAttribute("error", "wrong.email"); return view; } if (!account.getEmailCheckToken().equals(token)) { model.addAttribute("error", "wrong.token"); return view; } account.setEmailVerified(true); account.setJoinedAt(LocalDateTime.now()); model.addAttribute("numberOfUser", accountRepository.count()); model.addAttribute("nickname", account.getNickname()); return view; }} service @Service@RequiredArgsConstructorpublic class AccountService { private final AccountRepository accountRepository; private final JavaMailSender javaMailSender; private final PasswordEncoder passwordEncoder; @Transactional public void processNewAccount(SignUpForm signUpForm) { Account newAccount = saveNewAccount(signUpForm); newAccount.generateEmailCheckToken(); sendSignUpConfirmEmail(newAccount); } private Account saveNewAccount(@Valid SignUpForm signUpForm) { Account account = Account.builder() .email(signUpForm.getEmail()) .nickname(signUpForm.getNickname()) .password(passwordEncoder.encode(signUpForm.getPassword())) //인코딩해야됨됨 .studyCrateByWeb(true) .studyEnrollmentByWeb(true) .studyUpdateByWeb(true) .build(); return accountRepository.save(account); } private void sendSignUpConfirmEmail(Account newAccount) { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo(newAccount.getEmail()); mailMessage.setSubject("스터디 올래, 회원 가입 인증"); mailMessage.setText("/check-email-token?token="+ newAccount.getEmailCheckToken() +"&email="+ newAccount.getEmail()); javaMailSender.send(mailMessage); }}입니다어디가 문제일까요? 실행화면 git junepro/studyolle1 입니다