묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결코딩으로 학습하는 GoF의 디자인 패턴
스프링 시큐리티 WebSecurityConfigurerAdapter deprecated 대체 코드
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 책임 연쇄 패턴에서 스프링 시큐리티 예제코드 중에 WebSecurityConfigurerAdapter를 사용하는 코드가 있는데, 최신 버전을 사용하는 경우에 deprecated되어 사용하지 못하는 듯 합니다. < 대체코드 >@Configuration @EnableWebSecurity public class SecurityConfig { /** * WebSecurityConfigurerAdapter가 Spring Security 5.7.0-M2부터 deprecated 됨. * component-based security configuration으로의 사용자 전환 격려 위함. * 따라서 아래와 같이 bean으로 등록하여 사용. */ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth.anyRequest().permitAll()); return http.build(); } } 이 경우, 기존 코드를 위의 코드로 작성하시면 됩니다. : )
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
Module not found: Can't resolve '@/styles/Home.module.css' 에러
https://nextjs.org/docs/messages/module-not-found wait - compiling... error - ./pages/_app.js:1:0 Module not found: Can't resolve '@/styles/globals.css' > 1 | import "@/styles/globals.css"; 2 | 3 | export default function App({ Component, pageProps }) { 4 | return <Component {...pageProps} />;안녕하세요 강사님 !섹션 23 example 리액트 세상 강의 중 yarn dev를 입력하면 위와 같은 에러가 확인됩니다. _app.js 파일에서 global.css를 불러오는 부분 @/styles/global.css 을 상대적인 주소로 가져올 수 있도록// import "@/styles/globals.css"; import "../styles/globals.css"; export default function App({ Component, pageProps }) { return <Component {...pageProps} />; }위와 같이 변경해봐도 동일한 에러가 발생합니다.global.css 파일을 삭제해봐도 에러가 발생합니다.이상태에서 index.js 파일에서 주석 처리한 부분을 지우게 되면 아래와 같은 에러가 확인됩니다.// index.js import Head from "next/head"; import Image from "next/image"; // import styles from "@/styles/Home.module.css"; 제가 다운받은 버전은 package.json 파일에서 아래와 같이 확인할 수 있습니다.{ "name": "class", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", "next": "12.1.0", "react": "17.0.2", "react-dom": "17.0.2" } } 강사님 파일에서는 저와 다른 부분이 확인되는데 제가 빼먹은게 있는건지, 새로 다운받아야 하는 것이 있는 걸까요? 버전 차이인 걸까요? 이유가 뭘까요..?@emotion/client @next/font // 제 파일에는 없고 강사님 파일에서 확인되는 부분 그리고 해당 수업 중 질문이 있는데요,yarn add 기능 또는 npm install 기능 명령어로 설치 시, 각각 다른 파일에 기록이 된다고 하셨는데요강사님께서 package-lock.json 파일을 삭제 하셨는데, 혹시 파일을 삭제하신 이유가가급적 yarn.lock 파일로 통일하기 위함이 맞을까요? package-lock.json 과 yarn.lock 파일은 서로 다르게 기록이 되어있지 않은가요? 파일이 초기에 생성된 시점이라 한개의 파일을 삭제해도 무방한건지 이와 관련해 궁금합니다.
-
해결됨스프링부트 시큐리티 & JWT 강의
PrincipalDetails, PrincipalDetailsService에 대한 질문
PrincipalDetails시큐리티가 /login을 낚아채서 로그인을 진행시킨다.PrincipalDetailsService시큐리티 설정에서 loginProcessingUrl("/login") 처리 이게 view를 리턴하는 방식에서는 formLogin을 처리해줘서 이렇게 여기서 작성하면 controller에서 기능을 구현하지 않아도 login을 시큐리티가 알아서 해주는 걸로 알고 있는데요.그러면 REST API 방식일때는 SecurityConfig에 formLogin.disable()로 처리하는 걸로 알고 있는데 그러면 PrincipalDetails, PrincipalDetailsService은 REST 방식에서는 작성하지 않는건가요? 근데 그러면 의문이 저 2개의 클래스를 생성하지 않으면@Data public class PrincipalDetails implements UserDetails, OAuth2User { private User user; private Map<String, Object> attributes; // 일반 로그인 public PrincipalDetails(User user) { this.user = user; } // Oauth 로그인 public PrincipalDetails(User user, Map<String, Object> attributes) { this.user = user; this.attributes = attributes; } // 해당 User의 권한을 리턴하는 곳 @Override public Collection<? extends GrantedAuthority> getAuthorities() { Collection<GrantedAuthority> collection = new ArrayList<>(); collection.add(new GrantedAuthority() { @Override public String getAuthority() { return user.getRole(); } }); return collection; } // 사용자의 패스워드를 반환 @Override public String getPassword() { return user.getPassword(); } @Override public String getUsername() { return user.getEmail(); } // 계정 만료 여부 반환 @Override public boolean isAccountNonExpired() { // 만료되었는지 확인하는 로직 // true = 만료되지 않음 return true; } // 계정 잠금 여부 반환 @Override public boolean isAccountNonLocked() { // true = 잠금되지 않음 return true; } // 패스워드의 만료 여부 반환 @Override public boolean isCredentialsNonExpired() { // 패스워드가 만료되었는지 확인하는 로직 // true = 만료되지 않음 return true; } // 계정 사용 가능 여부 반환 @Override public boolean isEnabled() { // 계정이 사용 가능한지 확인하는 로직 // true = 사용 가능 return true; } @Override public Map<String, Object> getAttributes() { return attributes; } @Override public String getName() { return null; } } 여기서 UserDtails, OAuth2User을 상속받아서 Override하는 부분은 어떻게 구현하나요?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
수정 시 전체 수정되는 오류 OTL
복습하면서 강의를 보지 않고 저 혼자 다시 만들어보고 있는 중입니다. 그래서 드래그 라이브러리나 React.memo 같은 기능은 우선 차치하고 CRUD 기능만 해보려고 하는데요.edit을 위한 💬 버튼을 누를 경우 다른 할 일들도 editing... 으로 전체 수정되는 오류가 있습니다 ㅠㅠ 어디가 꼬였는지 알 수 없어 몇 시간 째 헤매고 있는데, 어느 부분이 문제인지 알 수 있을까요? Lists 컴포넌트에서 문제가 발생하고 있습니다. App.jsimport React, { useState } from "react"; import Form from "./components/Form"; import Lists from "./components/Lists"; function App() { const today = new Date(); const month = today.getMonth() + 1; const day = today.getDate(); const [value, setValue] = useState(""); const [todoData, setTodoData] = useState([]); const handleSubmit = (event) => { event.preventDefault(); let newTodo = { id: Date.now(), title: value, done: false, }; setTodoData([...todoData, newTodo]); setValue(""); }; const handleClear = () => { setTodoData([]); }; return ( <div className="flex justify-center items-center min-h-screen w-screen bg-purple-100"> <div className="w-full lg:max-w-lg lg:max-w-3/4 p-6 m-4 bg-white rounded shadow"> <div className="flex justify-between pb-2"> <h1> 📌 {month}월 {day}일 오늘의 할 일 </h1> <button onClick={handleClear}>🧹 전체 삭제</button> </div> <Lists todoData={todoData} setTodoData={setTodoData} /> <Form handleSubmit={handleSubmit} value={value} setValue={setValue} /> </div> </div> ); } export default App; Lists.jsimport React, { useState } from "react"; const Lists = ({ todoData, setTodoData, title, id }) => { const [isEditing, setIsEditing] = useState(false); const [editedTitle, setEditedTitle] = useState(title); const handleDelete = (id) => { let newTodoData = todoData.filter((data) => data.id !== id); setTodoData(newTodoData); }; const handleDone = (id) => { let newTodoData = todoData.map((data) => { if (data.id === id) { data.done = !data.done; } return data; }); setTodoData(newTodoData); }; if (isEditing) { return <div>Editing...</div>; } else { return ( <div> {todoData.map((data) => ( <div className="flex py-2 my-2 justify-between items-center border rounded bg-purple-50" key={data.id} > <div className="mr-2 p-2"> <input className="mr-2" type="checkbox" defaultChecked={data.done} onChange={() => handleDone(data.id)} ></input> <span className={data.done ? "line-through" : undefined}> {data.title} </span> </div> <div className="pr-2"> <button className="mr-2" onClick={() => setIsEditing(true)}> 💬 //오류 발생 </button> <button className="mr-2" onClick={() => handleDelete(id)}> ❌ </button> </div> </div> ))} </div> ); } }; export default Lists; Form.jsimport React from "react"; const Form = ({ handleSubmit, value, setValue }) => { const handleChange = (event) => { setValue(event.target.value); }; return ( <div> <form className="flex justify-between pt-2" onSubmit={handleSubmit}> <input className="p-2 mr-2 border-2 rounded shadow w-full" type="text" placeholder="할 일을 입력하세요" value={value} onChange={handleChange} /> <input className="p-2 border-2 rounded bg-purple-200 text-white hover:bg-purple-300" type="submit" value="입력" /> </form> </div> ); }; export default Form;
-
미해결ChatGPT AI챗봇의 기본 활용법
영상 오류
유튜브 연결이 안되나요?
-
미해결처음 만난 리액트(React)
unmount 질문있습니다.
5:36 부분에setState 를 활용해서 notifications에 들어있던 내용을 지워야만 unmount가 되던데왜 그런건가요??render() 부분에서 더 이상 출력?할 만한 내용이 없다고 판단해서 unmount가 되는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 매니저 프록시 역할
안녕하세요! 질문 좀 드리려고 합니다엔티티 매니저 프록시는 프록시를 싱글톤으로 주입해서 동시성 문제를 해결하고 실제 엔티티 매니저 인스턴스를 ThreadLocal로 관리하는 역할 정도로 생각해도 괜찮을까요?추가적으로 실제 엔티티 매니저는 @Transactional을 사용하면 JpaTransactionManager에서 생성이 되는데 @Transactional을 사용하지 않으면 처음 엔티티 매니저를 사용할 때 생성이 되나요?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
"모의고사2" 질문
선생님!!궁금한 점을 질문드리면 항상 빠른 답변 드리시는 점에 감사드립니다."모의고사2" 관련하여 궁금한점을 질문드립니다.평가지표가 f1 인데, f1도 점수가 높은 경우 성능이 좋은건가요? 만약 하이퍼파라미터 투닝을 할 경우 f1 점수가 높게 나오는 것으로 test 데이터를 에측해서 csv 화일을 작성해야 하는 건지요?'모의고사2'를 시험환경에서 연습하는데, 랜덤포레스트는 큰 문제 없이 진행되었는데, xgboost 모델로 할 경우 진행이 안되고 에러가 발생합니다.이유가 무엇이고 어떻게 수정해야 하는지요?
-
미해결예제로 배우는 딥러닝 자연어 처리 입문 NLP with TensorFlow - RNN부터 BERT까지
소스코드 실행 시 에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.from nltk.util import pad_sequence from nltk.util import bigrams from nltk.util import ngrams from nltk.util import everygrams from nltk.lm.preprocessing import pad_both_ends from nltk.lm.preprocessing import flatten위 구문 실행 시, 아래와 같은 에러가 뜹니다.------------------------------------------------------------------------ --------------------------------------------------------------------------- ImportError Traceback (most recent call last) <ipython-input-5-db6c290979e8> in <cell line: 5>() 3 from nltk.util import ngrams 4 from nltk.util import everygrams ----> 5 from nltk.lm.preprocessing import pad_both_ends 6 from nltk.lm.preprocessing import flatten /usr/local/lib/python3.10/dist-packages/nltk/lm/counter.py in <module> 13 from __future__ import unicode_literals 14 ---> 15 from collections import Sequence, defaultdict 16 17 from six import string_types ImportError: cannot import name 'Sequence' from 'collections' (/usr/lib/python3.10/collections/__init__.py) --------------------------------------------------------------------------- NOTE: If your import is failing due to a missing package, you can manually install dependencies using either !pip or !apt. To view examples of installing some common dependencies, click the "Open Examples" button below. ---------------------------------------------------------------------------
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
17버전 18버전
리액트 17버전은 섹션 4~21리액트 18버전은 섹션 23~끝까지 맞나요??17버전 수강중에 있는데 건너뛰고 18버전부터 다시 세팅하고 해야되나요?
-
미해결실전! Querydsl
내가 쓴 SpringBoot 2.7 에서의 queryDsl 설정 방법.
다른 블로그 참고하여 강의에 맞게 설정을 조금 수정하였습니다.새롭게 강의 듣는 분들의 시간을 아낄 수 있을까 싶어 공유드립니다.장점QEntity 생성 경로가 강의와 같습니다.src/main 하위가 아닌 generated 하위에만 QEntity 가 생성 되어 git ignore설정을 따로 해주지 않아도 됩니다.저도 이 강의의 이 회차를 듣고 알아본 것이기 때문에 QEntity 가 잘 생성되어 Run이 잘되는 것만 확인했지 다른 것까지 모두 테스트 해보진 못했습니다. compileQueryDsl 동작 없이 Application Run 하시면 되겠습니다.아래 설정의 잘못된점이 있다면 댓글 달아주시면 모두에게 도움이 될 것 같습니다.내 블로그 : https://elastinn.tistory.com/11블로그 광고해도 되나 모르겠습니다.감사합니다.plugins { id 'java' id 'org.springframework.boot' version '2.7.12' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' // queryDSL 설정 implementation "com.querydsl:querydsl-jpa" implementation "com.querydsl:querydsl-core" implementation "com.querydsl:querydsl-collections" annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정 annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드 annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드 runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" // java source set 에 querydsl QClass 위치 추가 sourceSets { main.java.srcDirs += [ querydslDir ] } // gradle clean 시에 QClass 디렉토리 삭제 clean { delete file(querydslDir) } //querydsl 추가 끝
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
antd 임포트 이후 에러입니다
import { UpCircleOutlined } from "@ant-design/icons"; import styled from '@emotion/styled' import { MouseEvent } from "react"; import { useState } from "react"; const MyIcon = styled(UpCircleOutlined)` color: red; font-size: 130px; ` export default function LibaryIconPage(): JSX.Element { const [ count, setCount] = useState(0) const onClickDelete = (event: MouseEvent<HTMLDivElement>): void => { console.log(event.currentTarget.id) setCount(count + 1) console.log(count) } return ( <div id="삭제" onClick={onClickDelete}> <MyIcon />; </div> ) } MyIcon에서 위와 같은 오류가 뜹니다!
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
section27 quiz 질문입니다.
알려주신데로 한거 같은데반응이 성공적이지 않았다 400 상태 코드를 받았다고 alert창에 뜨는데.. 어떤게 문제 인지 잘 모르겠네요 ㅠㅠ 네트워크 페이로드를 보면 다 잘 들어간거같은데...페이로드랑 코드입니다.{operationName: "createProduct",…}operationName: "createProduct"query: "mutation createProduct($seller: String, $createProductInput: CreateProductInput!) {\n createProduct(seller: $seller, createProductInput: $createProductInput) {\n id\n _typename\n }\n}"variables: {seller: "김갑수", createProductInput: {pName: "안경", contents: "멋진 안경", price: "15000"}}createProductInput: {pName: "안경", contents: "멋진 안경", price: "15000"}contents: "멋진 안경"pName: "안경"price: "15000"seller: "김갑수"import { gql, useMutation } from "@apollo/client"; import { useState } from "react"; const CREATE_PRODUCT = gql` mutation createProduct( $seller: String $createProductInput: CreateProductInput! ) { createProduct(seller: $seller, createProductInput: $createProductInput) { _id } } `; export default function Boards_05_quiz() { //js const [seller, setSeller] = useState(""); const [pName, setPname] = useState(""); const [contents, setContents] = useState(""); const [price, setPrice] = useState(""); const [createProduct] = useMutation(CREATE_PRODUCT); const onChangeSeller = (event) => { setSeller(event.target.value); }; const onChangePname = (event) => { setPname(event.target.value); }; const onChangeContents = (event) => { setContents(event.target.value); }; const onChangePrice = (event) => { setPrice(event.target.value); }; const onClickHandler = async () => { try { const result = await createProduct({ variables: { seller, createProductInput: { pName, contents, price, }, }, }); console.log(result); } catch (error) { alert(error.message); } }; return ( //html <div> <input type="text" placeholder="판매자명을 입력해주세요" onChange={onChangeSeller} ></input> <input type="text" placeholder="상품명을 입력해주세요" onChange={onChangePname} ></input> <input type="text" placeholder="삼품내용을 입력해주세요" onChange={onChangeContents} ></input> <input type="text" placeholder="상품가격을 입력해주세요" onChange={onChangePrice} ></input> <button onClick={onClickHandler}>상품등록</button> </div> ); }
-
미해결스프링 핵심 원리 - 고급편
하위 에러를 상위로 던진 후 나온 로그 보는 법
어느 강의인지가 기억이 안나서 문의드립니다! 기억나는 내용은 3단계(가장 하위)에서 익셉션 발생 시켜서 2단계에서 해당 익셉션을 받은 다음 다시 1단계로 던져서 나온 로그 보는 법에 대한 강의였던 걸로 기억합니다.
-
해결됨데브옵스(DevOps)를 위한 쿠버네티스 마스터
cni 설치시 에러 발생
virtualbox 에서 온프레미스 환경에서 클러스터 구축하는데 오류가 발생하는 원인이 무엇인가요?강의의 내용처럼 순차적으로 실행하다가 cilium install 하는 곳에서 에러가 발생하면서 에드온이 적용이 잘 안되는 것 같습니다.환경 구성은 virtualbox-7.0.8에서 ubuntu-22.04.2-live-server-amd64.iso를 사용해서 가상머신 두 대를 생성하였습니다. nat network를 사용해서 인프라 환경을 구축하였고 ping을 통해서 게스트 os 간 통신이 정상적으로 작동하는 것을 확인했습니다.swapoff 수행netfilter 관련 설정 수행kubeadm 버전은 1.27.2와 1.26.5 버전을 사용해서 시도했으나 두 버전 같은 현상을 보이고 있었습니다.간헐적으로 kubectl get nodes 명령 정상 수행되거나 오류가 발생하는 경우가 발생해서 마스터 노드의 쿠버네티스 컴포넌트(컨테이너) 들이 정상적으로 running 상태인지 확인을 해보니 컴포넌트들이 지속적으로 running 상태가 아니라 exited 상태가 되고 다시 재시작하는 것을 확인하였습니다.kubectl 명령이 수행되지 않는 경우는 kube-proxy가 exited 상태로만 존재하는 경우 작동이 되지 않았습니다. 그래서 인증서 문제가 아니라 컴포넌트들이 다운되어서 재 역할을 하지 못해서 cni 도 설치가 안된다고 판단했는데 왜 이런지 해결할 수가 없네요. 어떻게 해야 이 오류를 해결할 수 있나요? crictl log [container-id] 조회 결과api-proxy container error logetcd container error logkube-controller-manager error log
-
해결됨Vue3 완벽 마스터: 기초부터 실전까지 - "기본편"
Non-Props를 어떤상황에 쓰면 좋을지 궁금합니다.
강의에서는 컴포넌트 태그에 클릭 이벤트를 주셨는데특정한 컴포넌트에 대해 다른 스타일이나 이벤트를 주고싶을때 사용하면 좋을까요..?보통 왠만하면 emit또는 클래스, 스타일바인딩을 줘서 해결하는 경우가 많은데 이렇게 활용하는거 보니 또 새로운 느낌이네요..
-
미해결스프링 시큐리티 OAuth2
강의에 사용하는 keycloak 커넥션 에러 질문드립니다
안녕하세요.강의 수강중 잘 이용해왔던 키클록이갑자기 에러가나서 테스트를 못하고있습니다재설치도 해보았는데 똑같더라구요. ㅠㅠ해당 에러 질문드립니다..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1012 - 반례를 모르겠습니다. JAVA
안녕하세요. 큰돌님 강의 잘 보고있습니다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { static int[][] board; static boolean[][] visited; static int[] dy = {-1, 0, 1, 0}; static int[] dx = {0, 1, 0, -1}; static int yLen; static int xLen; static int cnt; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); while (n-- > 0) { int[] given = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); if (given[2] == 1) { sb.append(1).append(System.lineSeparator()); continue; } board = new int[given[0]][given[1]]; visited = new boolean[given[0]][given[1]]; yLen = given[0]; xLen = given[1]; for (int i = 0; i < given[2]; i++) { String[] numStr = br.readLine().split(" "); int y = Integer.parseInt(numStr[0]); int x = Integer.parseInt(numStr[1]); board[y][x] = 1; } for (int i = 0; i < yLen; i++) { for (int j = 0; j < xLen; j++) { if (!visited[i][j] && board[i][j] == 1) { dfs(i, j); cnt++; } } } sb.append(cnt).append(System.lineSeparator()); } System.out.print(sb.substring(0, sb.length() - 1)); } public static void dfs(int y, int x) { visited[y][x] = true; for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= yLen || nx < 0 || nx >= xLen) continue; if (visited[ny][nx] || board[ny][nx] == 0) continue; dfs(ny, nx); } } }위 코드를 실행하면 12%, ArrayIndexOutOfBounds가 발생하는데 어떤 부분인지 알 수 있을까요?
-
미해결실전! Querydsl
양방향 연관관계 편의메서드 작성시
QueryDSL 강의 예제 모델에서 , @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username, int age, Team team) { this.username = username; this.age = age; if (team != null) { changeTeam(team); } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); 이 부분에서 public void changeTeam(Team team) { this.team.getMembers().remove(this); this.team = team; team.getMembers().add(this);아래와 같이 해당 팀의 멤버 삭제도 해줘야 하는것 아닌가요? public void changeTeam(Team team){ if(this.team != null) { // this.team이 null이 아니면 이 member객체는 team이 있음을 의미 this.team.getMembers().remove(this); // 해당 팀의 멤버에서 삭제 } this.team = team; team.getMembers().add(this); }
-
미해결스프링 부트 개념과 활용
mongo shell 명령어 대체 mongo -> mongosh
https://www.mongodb.com/docs/manual/release-notes/6.0-compatibility/#legacy-mongo-shell-removedmongo 명령어가 mongodb 6.0이상부터 mongosh 명령어로 대체되었습니다학습하시는분들 참고하세용~