inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

174만명의 커뮤니티!! 함께 토론해봐요.

2-K BOJ 3474 추가아이디어 공유 (교수 현우) + python

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

추가아이디어 - 그리디 min으로 5와 2횟수 비교할 필요없이 5가 최솟값을 보장 while문으로 계속해서 나누는방법 for 문으로 5 25 125로 나우는방법이아닌 5로 나눈값을 계속해서 나누는 형태(중간에 나눈값은 따로 더함) C++ http://boj.kr/9f743d2fbc00459bba06f2559896e037 #include<bits/stdc++.h> using namespace std; int n, a; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for(int i = 0; i < n; i++){ cin >> a; int ret5 = 0; for(int j = 5; j <= a; j *= 5){ ret5 += a / j; } cout << ret5 << "\n"; } return 0; } python ( while 적용 ) http://boj.kr/c031aa4a62fd4690b2d17271266f87c6 import sys input = sys.stdin.readline for _ in range(int(input())): a = int(input()) ret = 0 while a >= 5: a //= 5 ret += a print(ret)

  • 코테 준비 같이 해요!
  • C++
BH J 댓글 1 좋아요 1 조회수 570

PDF에서 Movie 모달에서 트레일러 보여주기 강의는 없는건가요??

해결됨

따라하며 배우는 리액트 A-Z[19버전 반영]

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. PDF에는 있길래 혹시 이 부분은 없어진건가요??

  • react
  • redux
  • typescript
  • tdd
  • Next.js
oridori2705 댓글 1 좋아요 0 조회수 266

3 tire, 깃 허브 주소

미해결

스프링 프레임워크는 내 손에 [스프2탄]

스프2탄은 깃허브 주소가 따로 없을까요? 3 tire 구조에서 mapper -> service -> controller 이렇게 거꾸로 코딩을 하는 이유가 뭔지 궁금합니다. 나중에 따로 프로젝트를 하거나 실무에서 코딩을 할 때도 거꾸로 코딩을 하나요?

  • Spring Security
  • MVC
  • jquery
  • spring
  • JPA
공부하는 별이 댓글 4 좋아요 0 조회수 601

리얼타임 데이터베이스 앱 연결 문제

미해결

[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)

안녕하세요 복치님 질문마다 답변들 감사드립니다! 저번에도 이 부분에서 아무리 해도 안되서 처음부터 다시 했었거든요! 처음부터 다시 해봐도 같은 문제여서 질문드립니다 저장하기 버튼을 아무리 눌러도 이렇게 화면에 변화가 없는데 뭐가 문제인지 잘 모르겠습니다 도와주세요 <build.gradle> plugins { id 'com.android.application' id 'kotlin-android' } android { compileSdk 33 defaultConfig { applicationId "com.example.diet_memo" minSdk 21 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } apply plugin: 'com.google.gms.google-services' dependencies { implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.6.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation platform('com.google.firebase:firebase-bom:31.0.1') implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-auth-ktx' implementation 'com.google.firebase:firebase-database-ktx' } <MainActivity> package com.example.diet_memo import android.app.DatePickerDialog import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.widget.Button import android.widget.DatePicker import android.widget.ImageView import androidx.appcompat.app.AlertDialog import com.google.firebase.database.ktx.database import com.google.firebase.ktx.Firebase import java.util.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val writeButton = findViewById<ImageView>(R.id.writeBtn) writeButton.setOnClickListener { val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null) val mBuilder = AlertDialog.Builder(this) .setView(mDialogView) .setTitle("운동 메모 다이얼로그") val mAlertDialog = mBuilder.show() val DateSelectBtn = mAlertDialog.findViewById<Button>(R.id.dateSelectBtn) DateSelectBtn?.setOnClickListener { val today = GregorianCalendar() val year : Int = today.get(Calendar.YEAR) val month : Int = today.get(Calendar.MONTH) val date : Int = today.get(Calendar.DATE) val dlg = DatePickerDialog(this, object : DatePickerDialog.OnDateSetListener { override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int ) { Log.d("MAIN", "${year}, ${month + 1}, ${dayOfMonth}") DateSelectBtn.setText("${year}, ${month + 1}, ${dayOfMonth}") } },year,month,date) dlg.show() } val saveBtn = mAlertDialog.findViewById<Button>(R.id.saveBtn) saveBtn?.setOnClickListener { val database = Firebase.database val myRef = database.getReference("message") myRef.setValue("Hello, World!") } } }

  • firebase
  • android
  • kotlin
안현정 댓글 2 좋아요 0 조회수 871

[실습 7-4, 7-5, 7-6] MySQL, MSSQL, Oracle union based 공격 실습 강의 이후 상세보기에서 순차적 데이터 호출 실습 질문

해결됨

모의해킹 실무자가 알려주는, SQL Injection 공격 기법과 시큐어 코딩 : PART 1

1) 실습 7-4 MySQL에서 상세보기 메뉴에서 순차적으로 데이터를 호출하기 위해 limit 절을 활용하였습니다. [실습 쿼리문] http://localhost/board/mysql/view.php?idx=7 and 1=2 union select null,schema_name,null,null,null,null,null from information_schema.schemata limit 2,1%23 [쿼리문 실행 결과] 1. 상세보기 page의 Title 컬럼에 login_example 을 확인 할 수 있었습니다. 2. limit 3,1을 하면 상세보기 page의 Title 컬럼에 mysql을 확인 할 수 있었습니다. 2) 실습 7-5 MSSQL에서 상세보기 메뉴에서 순차적으로 데이터를 호출하기 위해 not in과 서브쿼리문을 이용하였습니다. [실습쿼리문] http://localhost/board/mssql/view.php?idx=6 and 1=2 union all select null,name,null,null,null,null,null from master.sys.databases where name not in(select top 0 name from sysdatabases)-- [쿼리문 실행 결과] 1. 상세보기 page의 Title 컬럼에 master 를 확인 할 수 있었습니다. 2. 서브쿼리의 top 0 대신 top 1으로 숫자를 올리면 tempdb라는 2번째 데이터베이스 이름을 확인 할 수 있었습니다. 3) 실습 7-6 Oracle에서 상세보기 메뉴에서 순차적으로 데이터를 호출하기 위해 rownum과 서브쿼리 기능을 이용했습니다. [실습쿼리문] http://localhost/board/oracle/view.php?idx=61 and 1=2 union all select null,table_name,null,null,null,null,null from(select rownum r, table_name from all_tables)tb where tb.r=2-- [쿼리문 실행결과] 1. 상세보기 page의 Title 컬럼에 SYSTEM_PRIVILEGE_MAP 두번재 table이름이 나온 것을 확인 할 수 있습니다. 질문1)강의 종료 후 제가 제대로 과제를 수행한건지 궁금합니다. 추가적으로 더 확인해 봐야 할 것이 있을 까요? 질문2) MSSQL에서 order by 정렬 기능이나 row_number()함수를 이용해서 순차적으로 출력하는 쿼리문을 만들 수 있을까요?(섹션 4에서 MSSQL에서 순차정렬이 가능한 여러 방법의 내용 처럼) --> 저는 아무리 생각해도 적절한 쿼리문이 떠오르지 않아서 질문드립니다.

  • 웹해킹
  • 모의해킹
  • 크리핵티브
  • sqlinjection
  • 인젝션
고광우 댓글 1 좋아요 1 조회수 338

서버 연결 질문입니다.

미해결

배달앱 클론코딩 [with React Native]

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 연결은 되었는데 아래와 같은 에러들이 나면서 회원가입이 되지 않습니다. 백엔드 서버를 삭제하고 다시 깔아도 똑같은 오류가 납니다. 어떻게 해결해야 할지 모르겠어서 질문 남깁니다.

  • react-native
박성민 댓글 1 좋아요 0 조회수 341

JPQL Cursor Pagination

미해결

JPQL을 활용한 커서 페이지네이션 관련해서 질문드릴려고 합니다. @GetMapping("/items") @ResponseBody public List<Item> findAllItemOrderByItemOrderASC(@RequestParam(value = "order", defaultValue = "0") Long itemOrder, @RequestParam(value = "size", defaultValue = "2") Integer size) { String jpql = "select i from Book i where i.id > :itemOrder order by i.id"; return em.createQuery(jpql, Item.class) .setParameter("itemOrder", itemOrder) .setMaxResults(size) .getResultList(); } 클라이언트에서 마지막 커서 값으로 itemOrder를 준다는 가정하에 이 코드는 문제가 없을까요? setMaxResults가 쿼리가 얻을 수 있는 결과를 제한하는 역할을 하길래 QueryDSL 말고도 JPQL을 통해 쉽게 커서 페이지네이션이 구현 가능할까해서 질문드립니다. 일대다 같은 경우는 물론 적용하지 못하겠지만 batchSize 옵션을 통해 커서 페이지네이션 조회용으로 쓸 수 있을 것 같습니다.. 예시니까 엔티티를 반환했고 레파지토리도 제외했습니다. 포스트맨을 활용하여 사용한 결과는 문제가 없었는데 이렇게 간단히 사용해도 될까요?

chinggin 댓글 0 좋아요 0 조회수 410

입력을 할때...질문이 있습니다.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

0:40 과 같이 today로 입력했을때, 저는 todayDecoration과 todayTextStyle 두 개만 나오는데, isTodayHighlighted는 is를 쳐야 나옵니다. 아무래도 검색 설정이 강사님과는 조금 다른 것 같습니다. 평소에도 조금씩 불편을 느끼고 있었는데, 특정 키워드만 쳐도 꼭 첫머리가 아닌, 해당 단어가 중간에 있어도 찾고자 하는 것이 나오게 하려면 어느 세팅을 건드려야 하는지 도와주시면 감사드리겠습니당.

  • Flutter
  • 클론코딩
bubble gun 댓글 1 좋아요 0 조회수 192

7-A 질문

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

http://boj.kr/a80f8148b5c64f2b92e8dd8f09216ae2 재귀를 사용하지 않고 문제를 풀었고, 함수 dp의 값을 초기에 -1로 초기화해서 불가능한 방문의 경우에는 dp값이 -1로 유지되기 때문에 문제가 발생하지 않도록 코드를 짰는데 94%에서 오답처리가 됩니다. 어떤 부분이 문제인지 알고 싶습니다. 7-a 올려주신 코드에서 int& ref 를 사용하셨는데 레퍼런스를 사용하지 않고 int ref를 사용하니 시간초과가 뜨는 것을 확인할 수 있었습니다. 여기서 레퍼런스를 사용하는 이유와 어떤 상황에서 레퍼런스를 사용해야 하는지 궁금합니다. 감사합니다.

  • 코테 준비 같이 해요!
  • C++
hwangik0401 댓글 2 좋아요 0 조회수 472

App.tsx 파일 npm run dev시 브라우저에 렌더링 안되는 현상 질문 드립니다!

미해결

Slack 클론 코딩[실시간 채팅 with React]

질문들 다 찾아보고, 설정파일도 밀어보고, 에디터와 브라우저도 종료했다가 다 꺼보고 여러방면으로 시도해봤는데 브라우저에 렌더링이 되지 않아서 질문드립니다. App.tsx의 내용이 터미널에서 npm run dev로 구동시 화면에 렌더링 되지 않습니다.. 뭐가 잘못됐을까요? 폴더 구조입니다. App.tsx 코드 부분입니다. client.tsx 코드 부분입니다. index.html 코드 부분입니다. npm run dev시 터미널 창입니다. Eun-Ng 🔥  ~/Documents/vscodeWorkspace/studying/slack_clone/front   main  npm run dev > sleact-ts-front@1.0.0 dev > webpack serve --env development <w> [webpack-dev-server] "hot: true" automatically applies HMR plugin, you don't have to add it manually to your webpack configuration. <i> [webpack-dev-server] [HPM] Proxy created: /api/ -> http://localhost:3095 <i> [webpack-dev-server] Project is running at: <i> [webpack-dev-server] Loopback: http://localhost:3090/ <i> [webpack-dev-server] On Your Network (IPv4): http://192.168.0.12:3090/ <i> [webpack-dev-server] On Your Network (IPv6): http://[fe80::1]:3090/ <i> [webpack-dev-server] Content not from webpack is served from '/Users/eun-ng/Documents/vscodeWorkspace/studying/slack_clone/front' directory <i> [webpack-dev-server] 404s will fallback to '/index.html' @babel/preset-env: `DEBUG` option Using targets: { "chrome": "106" } Using modules transform: auto Using plugins: syntax-class-static-block syntax-private-property-in-object syntax-class-properties syntax-numeric-separator syntax-nullish-coalescing-operator syntax-optional-chaining syntax-json-strings syntax-optional-catch-binding syntax-async-generators syntax-object-rest-spread syntax-dynamic-import proposal-export-namespace-from { } syntax-top-level-await Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set. asset app.js 1.55 MiB [emitted] (name: app) runtime modules 27.9 KiB 13 modules modules by path ./node_modules/ 1.37 MiB 89 modules ./client.tsx 2.85 KiB [built] [code generated] ./layouts/App.tsx 2.76 KiB [built] [code generated] sleact (webpack 5.74.0) compiled successfully in 1504 ms 브라우저 구동 화면입니다.

  • babel
  • react
  • 웹팩
  • Socket.io
  • typescript
  • 클론코딩
Eun-Ng 댓글 1 좋아요 0 조회수 607

redux toolkit을 사용할 땐 HYDRATE를 어떻게 설정해줘야 하나요?

미해결

[리뉴얼] React로 NodeBird SNS 만들기

리덕스 툴킷으로 강의 실습을 따라가고 있는데 HYDRATE 설정을 리덕스 툴킷으로는 어떻게 해야하나요? next-redux-wrapper 공식문서를 봐도 어떻게 써야 할지 감이 도통 안잡혀서 질문드립니다.

  • Next.js
  • redux
  • react
  • nodejs
  • express
bs k 댓글 1 좋아요 0 조회수 909

multer랑 프론트랑 결합하는 과정에서 질문있습니다.

미해결

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

안녕하세요 영상을 보다가 프론트랑 결합해서 작은 프로젝트를 만들어 보고있습니다. multer를 적용하고 프론트와 결합하는 과정에서 이미지를 선택하면 콘솔에 지속적으로 500에러가 발생해서 찾아보고 시도했으나 방법을 찾지못해 질문드립니다. 백엔드 + 프론트 = Node - v18.7.0 프론트 주요 라이브러리 버전 = React-18.2.0, Next = 12.3.1, TypeScript = 4.8.4 백엔드의 경우 타입스크립트 미 사용중입니다. 백엔드랑 프론트는 별도의 프로젝트로 만들어서 따로 관리중이며 프론트는 리덕스나 리코일 같은 별도 상태관리 라이브러리 미사용중입니다. 백엔드 에러메시지 TypeError: Cannot read properties of undefined (reading 'filename') at /Users/Desktop/Temp-toyProject-Backend/Routes/TempPost.js:31:39 이며 해당 부분에서 이 부분이 문제가 되는게 아닐까? 하는 부분은 다음과 같습니다. const upload = multer({ storage: multer.diskStorage({ destination(req, file, cb) { cb(null, 'uploads/'); }, filename(req, file, cb) { <<<< ????? const ext = path.extname(file.originalname); cb(null, path.basename(file.originalname, ext) + Date.now() + ext); }, }), limits: { fileSize: 5 * 1024 * 1024 }, }); router.post('/img', upload.single('img'), (req, res) => { res.json({ url: `/img/${req.body.file.filename}` }); // <<< 에러가 나오는 31줄 }); multer를 사용한 부분은 강사님의 영상에서 별도로 제작하신 미들웨어 등 몇가지 빼고는 그대로 가지고왔습니다. 2.백엔드와 결합되는 프론트 코드 const [content, setContent] = useState("") const [img, setImage] = useState<File>() const onChangeTitle = useCallback((e: React.ChangeEvent<HTMLInputElement>) => { setContent(e.target.value) },[]) const onChanges = useCallback((e:React.ChangeEvent<HTMLInputElement>) => { e.preventDefault() const formData = new FormData() formData.append('img', img) axios.post('http://localhost:8005/temppost/img', formData, { // <<< 백엔드 코드의 부분 headers: { 'Content-type': 'multipart/form-data' }, }) .then((res) => { console.log(res.data) }) .catch((error) => { console.error(error) }) },[img]) const onSubmit = useCallback((e:any) => { e.preventDefault() axios.post('http://localhost:8005/temppost', { headers: { 'Content-type': 'multipart/form-data' }, img , content : content }) .then((res) => { console.log(res.data) }) .catch((error) => { console.error(error) }) },[img,content]) return ( <form encType="multipart/form-data" > // 이미지와 content를 입력받고 보내는 부분 <input type="file" name="img" onChange={onChanges} /> <input name="content" type="text" onChange={onChangeTitle} /> <input type="submit" onClick={onSubmit}/> </form> ) 프론트쪽의 경우 다른걸 참고하긴 했는대 이미지와 관련된 state는 타입을 저렇게 <File>로 줘도 될까요? 항상 영상 잘 보고 있습니다 감사합니다..

  • mongodb
  • nodejs
  • mysql
  • Sequelize
한상일 댓글 1 좋아요 0 조회수 566

ConfigMap 관련 질문

해결됨

그림으로 배우는 쿠버네티스(v1.35)

[질문 전 답변] 1. 강의에서 다룬 내용과 관련된 질문인가요? [예] 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예] 3. 질문 잘하기 법을 읽어보셨나요? [예] (https://www.inflearn.com/blogs/1719) 4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. [질문 하기] 안녕하세요 좋은강의 잘 듣고있습니다. ConfigMap 관련해서 질문드리겠습니다. 하나의 컨테이너가 두개의 다른 ConfigMap을 바라볼 수있나요? 만약 가능하다면 두 ConfigMap이 같은 key이름을 들고 있으면 구별하는 방법이 있을까요?

  • docker
  • kubernetes
dlsgur2845 댓글 1 좋아요 0 조회수 324

코드질문

미해결

공공데이터로 파이썬 데이터 분석 시작하기

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님 위에 글을 없애기 위해서 h =df_last['평당분양가격'].hist(bins=10) 를 쓰셨다고 하셨는데 이것은 단순히 변수지정한 것 아닌가요? 왜 그래프가 나오게 되는 건가요?

  • python
  • numpy
  • pandas
댓글 1 좋아요 0 조회수 186

@Validated @Valid의 차이

해결됨

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

[질문 내용] 안녕하세요. 강의 너무 잘 보고 있습니다. 한 번 다 보고 나서 다시 복습중인데, 좀 더 깊게 공부하려고 보니까 이해가 안 되는 부분이 생겨서 질문 드립니다..ㅠㅠ @Valid는 Controller가 호출되기 전 ArgumentResolver에서 인자를 생성할 때 WebDataBinder에 의해 검증 과정 중에 참조되는 어노테이션이라 Controller에서만 사용 가능하고, @Validated는 Spring에서 AOP기술을 적용하도록 하는 어노테이션이라서 스프링 Bean으로 등록되는 모든 객체에 적용이 가능하다는 글을 보았습니다. 그런데 ArumentResolver 소스코드를 살짝 봤더니 @Validated와 @Valid를 모두 처리할 수 있도록 되어 있는 것 같더라구요. @Validated를 사용해서 AOP가 적용되면 어차피 AOP기술에 의해 핸들러가 호출될 때 따로 검증 과정이 일어날텐데, @Validated를 WebDataBinder가 처리할 수 있게 해 놓으면 검증이 두 번 일어나게 되는 거 아닌가요? 그리고 영상에 @Validated를 핸들러 메소드의 인자에 사용하셨는데, 이건 클래스에 @Validated를 붙이고 핸들러 메소드에 @Valid를 붙인 것과 똑같이 동작하나요? 너무 복잡해서 어렵네요 ㅠㅠ

  • spring
  • MVC
공부용 댓글 1 좋아요 1 조회수 512

django.contrib.auth.forms.UserChangeForm 질문드립니다.

미해결

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

안녕하세요! 선생님 강의를 들으면서 장고로 게시판을 만들어 보고 있는데, 유저 모델을 수정(프로필 수정 기능)하는 뷰를 만들면서 UserChangeForm을 사용하고 있습니다. 이때 데이터베이스에 저장된 모델의 필드명은 변경하지 않고, 폼 화면에서 username 대신 id라고 화면에 나올 수 있도록 하려면 어떻게 해야할까요? 장고 깃헙보면서 손대봤는데 안되서 질문드립니다. 감사합니다/ class CustomUserChangeForm(UserChangeForm): class Meta(UserChangeForm.Meta): model = get_user_model() fields = ['username', 'first_name', 'last_name', 'email']

  • django
  • docker
  • python
  • react
Grid 댓글 3 좋아요 0 조회수 564

다중 주문 상품의 변경

미해결

안녕하세요. 선생님의 조언 하나를 듣고 싶어서 글을 남깁니다.! 이는 여러 주문 상품에 관한 질문입니다. 코드리뷰에 관한 부분은 아니고 제가 생각하는 절차적인 부분에서 조언을 얻고싶습니다. 일단 주문을 전체 취소하지 않고 주문 내역 중 일부 상품을 삭제하고 상품을 등록하는 부분에 대해 고민을 하고 있습니다. 클라이언트에서 주문 상품에 대한 정보를 새롭게 전달해 주었을 때 이를 단순히 기존 Order에서 setOrderItem으로 저장하면 연관관계의 주인이 아니기 때문에 어떠한 변경도 없습니다. 그래서 기존 Order를 가져온 이후 getOrderItems()를 통해 삭제 및 등록을 진행했습니다. //given Order order = em.find(Order.class, 4L); List<OrderItem> orderItems = order.getOrderItems(); List<Long> newOrderLineItemId = Arrays.asList(9L); //when //삭제 List<OrderItem> removeOrderLine = orderItems.stream() .filter(orderItem -> !newOrderLineItemId.contains(orderItem.getItem().getId())) .collect(Collectors.toList()); orderItems.removeIf(removeOrderLine::contains); //등록 newOrderLineItemId.forEach( itemId -> { Item item = em.find(Item.class, itemId); OrderItem orderItem = OrderItem.createOrderItem(item, 10000, 2); orderItems.add(orderItem); }); 이러면 Order와 OrderItems 둘 다 영속 상태이기 때문에 변경 감지를 통해 OrderItems insert문이 전송되는 것 까지는 확인을 했습니다. 하지만 기존의 존재하던 상품의 삭제에 따라 OrderItems에 delete문을 전송하는 것은 확인하지 못했습니다. 그래서 뭘 놓쳤을까 고민하던 차 삭제되어야 할 OrderItems는 여전히 Order를 참조하고 있다는게 문제 같았습니다. removeOrderLine.forEach(orderItem -> { orderItem.setOrder(null); }); 다음 코드를 넣고 실행했더니 다음과 같은 결과가 나왔습니다. insert into order_item (count, item_id, order_id, order_price, order_item_id) values (?, ?, ?, ?, ?) 2022-10-29 20:09:00.704 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [INTEGER] - [2] 2022-10-29 20:09:00.704 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [BIGINT] - [9] 2022-10-29 20:09:00.704 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [BIGINT] - [null] 2022-10-29 20:09:00.704 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [INTEGER] - [10000] 2022-10-29 20:09:00.704 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [BIGINT] - [15] 2022-10-29 20:09:00.705 DEBUG 7104 --- [ Test worker] org.hibernate.SQL : update order_item set count=?, item_id=?, order_id=?, order_price=? where order_item_id=? 2022-10-29 20:09:00.705 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [INTEGER] - [1] 2022-10-29 20:09:00.705 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [BIGINT] - [2] 2022-10-29 20:09:00.705 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [BIGINT] - [null] 2022-10-29 20:09:00.705 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [INTEGER] - [10000] 2022-10-29 20:09:00.705 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [BIGINT] - [6] 2022-10-29 20:09:00.705 DEBUG 7104 --- [ Test worker] org.hibernate.SQL : update order_item set count=?, item_id=?, order_id=?, order_price=? where order_item_id=? 2022-10-29 20:09:00.706 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [INTEGER] - [2] 2022-10-29 20:09:00.706 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [BIGINT] - [3] 2022-10-29 20:09:00.706 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [BIGINT] - [null] 2022-10-29 20:09:00.706 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [INTEGER] - [20000] 2022-10-29 20:09:00.706 TRACE 7104 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [BIGINT] - [7] 아! 주입되는 값에대해 정리해드리면 다음과 같습니다. 클라이언트에서는 최종 변경된 아이템 ID 리스트만 넘어왔다고 가정했습니다. 이에 따르면 ORDER_ITEM_ID PK 6, 7인 값은 FK인 ORDER_ID 4는 정상적으로 NULL로 업데이트를 했습니다. 이 과정에서 하이버네이트는 삭제가 아닌 참조를 지웠기 때문에 삭제가 아닌 null로 업데이트 하는 것이 맞는 판단이라고 정답을 내렸습니다. delete문이 나가도록 하고 싶어서 옵션을 추가했습니다. @OneToMany(mappedBy = "order", cascade = CascadeType.ALL , orphanRemoval = true) private List<OrderItem> orderItems = new ArrayList<>(); 하지만 막힌 부분이 존재합니다. 초기 insert문에 order_id값이 존재하지않습니다! 그래서 찾아보니 createOrderItem() 메서드에서 새로운 객체를 생성했기 때문이라고 판단했습니다. 아 새롭게 추가되는 것은 비 영속상태였는데 이를 놓쳤습니다. 이를 통해 원하는 던 바를 이루었습니다. 여기서 제가 조언을 얻고 싶은 부분은 정말 이 과정이 정답인가에 대해서입니다. orderItems.setOrder(null) 말고 다른 방법은 없을까? 이는 OrderItems에 대한 변경인데 Order를 통해 처리하는 것이 맞는가? 처음부터 OrderID를 통해 OrderItem들을 가져와 수정하는게 맞지 않을까? 내가 생각한 절차에서 문제가 될만한 부분은 없는 것인가? 등등.. 저에게 하나의 팁, 조언을 부탁 드리고 싶습니다. 긴 글 봐주셔서 감사합니다.

chinggin 댓글 0 좋아요 0 조회수 191

anaconda 설치방법(윈도우) 영상 1분 30초 문의

미해결

[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)

안녕하세요! anaconda 설치방법(윈도우) 영상 1분 30초에서 All users를 선택하셨는데 제가 실수로 Just Me를 클릭하고 다운로드를 받았습니다. 이대로 그냥 사용해도 괜찮을지 문의드립니다.

  • 웹-크롤링
  • python
zxd753 댓글 1 좋아요 0 조회수 421

회귀분석 강의 누락 문의

미해결

[2026 개정판] 빅데이터분석기사 실기 (with Python)

안녕하세요 강의 수강 중 이상한 점이 있어 문의합니다 Part4. 회귀분석 강의에서 이상치가 포함된 경우 테스트 예측이 부정확함을 확인하였고, 다음 수업에 이상치 제어하여 학습 진행하는 내용을 진행한다고 하셨습니다. 그런데 다음 수업으로 넘어가면 릿지 라쏘 규제 내용이 진행됩니다. 혹시 강의 업로드가 누락된 것이 있는지 확인 부탁드립니다 - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  • bigdata
윤장현 댓글 2 좋아요 0 조회수 300

인기 태그

인프런 TOP Writers

주간 인기글