묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
cascade=ALL, orphanRemoval=true 관련 질문
안녕하세요.혼자 고민하고 생각 해보다 해결이 되지 않아 문의드리러 왔습니다 ㅠㅠ해당 수업을 듣고, 사이드 프로젝트를 수행하면서 orphanRemoval을 사용해보게 되었습니다.대략적인 엔티티간의 관계는 다음과 같습니다.총 4개의 엔티티가 각각 다대일 매핑으로 이루어져 있는데요.각 엔티티의 정보는 다음과 같습니다.엔티티 A : 유저엔티티 B : 글엔티티 C : 글에 포함되는 정보엔티티 D : 엔티티 C에 포함되는 정보문제는 엔티티 B까지만 cascade=ALL, orphanRemoval=true가 적용된다는 것입니다..ㅠㅠ차이가 있다면, 엔티티 A는 유저의 정보라서, 항상 저장이 되어있는 것을 꺼내어와서 사용한다는 것이고(저장을 회원가입 로직에서만 수행합니다.), 엔티티 B, C, D는 글 작성 시 모두 새로 생성하여 사용한다는 점입니다.저는 엔티티B 삭제 로직에서, 엔티티A의 List에서 엔티티B를 remove 하면 B, C, D가 모두 삭제되는 것을 기대했는데, 전혀 삭제가 되지 않습니다 ㅠ (List에서 엔티티B가 제거는 됩니다..)오히려 엔티티A의 List에서 엔티티B을 remove하고, 추가적으로 엔티티B의 리포지토리에서 엔티티 B를 삭제해야만 비로소 삭제가 완료됩니다.기능 자체를 구현은 했지만, 이렇게 동작하는 원인을 알고싶어서, 여기저기 찾아보다가 답을 찾지 못해 이곳에 질문 글을 남기게 되었습니다 ㅠㅜ관련 코드는 아래 깃허브 리포지토리에 있습니다.엔티티 리포지토리https://github.com/SeolYoungKim/siders/tree/oauth2login/src/main/java/com/example/siderswebapp/domain삭제 로직 리포지토리https://github.com/SeolYoungKim/siders/tree/oauth2login/src/main/java/com/example/siderswebapp/service/post
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
new Integer가 좋지 않은 이유
안녕하세요 궁금한게 있어 글 남깁니다강의 7:30쯤에서 Integer.valueOf 해도 되지만 new Integer를 사용하겠다, 요즘은 new Integer가 별로 안 좋다고 한다~ 라고 말씀하셨는데요new Integer가 좋지 않은 이유가 궁금합니다 나름 열심히 구글링 해보았는데 정확한 이유를 찾지 못해 여쭤봅니다 ㅠㅠ
-
미해결배달앱 클론코딩 [with React Native]
질문있습니다!
안녕하세요 제로초님!!!본 강의에서는 백엔드 서버에서 토큰을 response body로 보내주고 프론트에서도 response body에 있는 데이터로 토큰을 가져오더라구요? 그런데 백엔드에서 쿠키로 토큰을 보내주지 않고 response body로 토큰을 보내주는게 보안상 더 위험하지는 않을까 의문점이 생겼습니다.제로초님 개정판 노드제이에스 4-5 쿠키 강의에서 17분7초에서 로그인할 때 웬만하면 쿠키를 사용하라고 하셨는데 본 강의에서 리액트네이티브에서 할 때는 쿠키를 사용하지않고 response body로 가져오는 이유에 대해서 궁금합니다! ㅎㅎ
-
해결됨외워서 끝내는 네트워크 핵심이론 - 응용
로드 밸런서와 매니저 서버?와의 관계
유튜브에 이어 인프런 강의도 너무 재밌게 듣고 있습니다!로드 밸런서가 어떤 웹 서버로 패킷을 포워딩할지 결정하는 주체라면, 이 결정은 매니저 서버가 주기적으로 실행하는 헬스 체크 상태를 로드 밸런서에 알려준 것을 기준으로 결정하게 되나요?그리고 매니저 서버가 헬스 체크 이외에도 APM 등 성능 관리자의 역할까지 수행할 수 있는 건가요?
-
해결됨팝스타 공식 뮤비 제작 & 유튜브 2천만 뷰 크리에이터의 애니메이트 X 이모티콘 클래스
여러 레이어로 배포된 상태에서 상위 레이어로 묶는 방법이 있을까요?
안녕하세요^^ 좋은 강의 잘 보고 있습니다. 강의를 듣고 혼자 시도해 보다가 문제에 봉착하여 질문 드립니다.상황을 먼저 설명 드리자면...<트릭으로 2D 얼굴을 3D처럼 보이게 하는 애니메이션 만들기>편을 듣고 미션을 수행 중이었는데요,다 만들고 난 후 마지막에 레이어에 필터를 적용해 흰색 테두리를 만드려 하다보니 문제점을 발견했습니다.장면2에서 전체 심볼을 만들고 그 안에 들어가 개별 심볼을 만든 후 레이어에 배포했어야 하는데, 이 점을 놓치고 전체 심볼을 안 만든 채 장면2에서 바로 개별 심볼 만들어 레이어 배포를 했더니 이 모든 레이어가 묶인 최상위 레이어가 없는 상태입니다. 이 상황에서 배포된 레이어를 하나로 묶는 상위 레이어를 만드는 방법이 있을까요? 없다면 흰색 테두리를 어떻게 넣는 게 좋을까요?감사합니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
diet-memo 만들기 : 데이터베이스에 쓰기가 안됩니다.
안녕하세요 선생님 .'너무 잘 보고 있어요. 질문에도 대답해주셔서 넘 감사합니다.^^질문 : 앱도 정상적으로 작동하는데 Firebase 실시간 데이터베이스에 연동이 안됩니다.(에러 메서지도 안 뜹니다.) MainActivity.ktpackage com.ipari.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.EditText 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.dataSelectBtn) var dateText="" 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}") dateText = "${year}, ${month +1}, ${dayOfMonth}" } }, year, month, date) dlg.show() } val saveBtn = mAlertDialog.findViewById<Button>(R.id.saveBtn) saveBtn?.setOnClickListener { val healthMemo = mAlertDialog.findViewById<EditText>(R.id.healthMemo)?.text.toString() val database = Firebase.database val myRef = database.getReference("myMemo") val model = DataModel(dateText, healthMemo) myRef .push() .setValue(model) } } } }Gradle fileplugins { id 'com.android.application' id 'com.google.gms.google-services' id 'kotlin-android' } android { compileSdk 33 defaultConfig { applicationId "com.ipari.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' } } dependencies { implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.6.1' 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:30.4.1') implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-auth-ktx' implementation 'com.google.firebase:firebase-database-ktx' }custom_dialog. xml<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/healthMemo" android:layout_width="match_parent" android:layout_height="60dp" android:layout_margin="20dp" android:hint="운동메모를 입력해주세요." android:background="@android:color/transparent"/> <LinearLayout android:layout_width="match_parent" android:background="#999999" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="0.5dp"/> <Button android:id="@+id/dataSelectBtn" android:text = "날짜를 선택해주세요." android:layout_margin="20dp" android:layout_width="match_parent" android:layout_height="60dp"/> <Button android:id="@+id/saveBtn" android:text = "저장하기" android:textColor="@color/black" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_width="match_parent" android:layout_height="60dp"/> </LinearLayout> _____그리고 다른 분들은 코드 올릴 때 텍스트형식이 아닌 일정한 형식으로 올리시던데 어떻게 하는건가요? ㅎㅎ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
루키스님 책 추천 해주실수있으신가요
안녕하세요 루키스님 파트1~9강까지 다 구매하여 지금 이제 파트3보고있는 수강생입니다학과도 컴공쪽이여서 나중에 게임개발자가 될려고 열심히 공부하고있습니다따로 책을보고 더 공부를하고싶어서 추천을받고싶은데자료구조, 알고리즘, 유니티 지금까지 보셨던 책중에 좋았던것들 베스트 추천해주실수있나요😊😊
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
Redis 분산락 질문
안녕하세요. 일단 좋은 강의 잘 봤습니다 :) 한 가지 궁금한 점이 있는데요. Redis의 Redisson을 사용할 때StockService의 decrease() 메서드에 Transaction 어노테이션을 걸어두면 비관적락 + 레디스의 분산락을 동시에 사용하면 오히려 기대했던 성능이 더 안나올 수도 있지 않나요?Transaction 어노테이션을 쓰려면 Mysql의 lock 기능을 쓰는게 좋을까요?저도 잘 알지못하지만 이번에 이 동시성 강의를 듣고 찾아보다가 궁금해서 질문드립니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실무에서의 ManyToMany 연관관계 (계층구조)
안녕하세요실무에서는 ManyToMany같은 관계는 절대 사용하면 안된다고 하셨습니다.Category와 비슷한 조직도 같은 것을 만들고 싶은데 실무에서는 사용하면 안된다고 하여서 구글링을 하다가 클로져 테이블에 대해서 봤는데요막상 대입시켜서 해보려니 막막하여 글을 올림니다.혹시 참고할 만한 예제같은 것이 있을 까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part3: 자료구조와 알고리즘
이 비교 연산자를 넣어주는 이유가 있나요?
bool operator<(const Pos& other)const { if (y != other.y) return y < other.y; return x < other.x; } 디버그를 해보니 Bfs함수에 parent[nextPos] = pos; 에서 들어가던데 어떤 원리로 그렇게 되는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 템플릿 사용 로직
txTemplate.executeWithoutResult((status) -> {try {//비즈니스 로직bizLogic(fromId, toId, money);} catch (SQLException e) {throw new IllegalStateException(e);} });위의 로직에서 파라미터로 status를 받는데이 status는 어디에서 받아오는건가요?이전 MemberServiceV3_1 에서는//트랜잭션 시작TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());이렇게 status를 받아와서 커밋과 롤백에 status를 사용했는데MemberServiceV3_2 에서는여러번 반복해 돌려보아도 저 status 에 대한 설명이 없어서답변 부탁드립니다.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
node 설치후 추가설치건 확인방법
powerShell 로 설치된게 제대로 설치 됬는지 확인할 방법은 없을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
중단점 삽입이 안됩니다 ㅜ
중단점 삽입이 안됩니다 ㅜnamespace Sharp ~ 를 비롯한 {} 를 넣으면오류가 생기면서 빌드가 안됩니다. 왜이러는 걸까요...삽입하려면 이 위치에는 안된다고 자꾸 뜹니다
-
미해결따라하며 배우는 리액트 테스트 [2023.11 업데이트]
답변내용에 따라 새글로 깃헙 레포 링크 공유드려요!
https://www.inflearn.com/questions/663604위 질문 드렸던 수강생입니다! 요청주신 레포지토리 링크 드려요!그런데, 강의 내용 코드를 공개 레포로 해도 되나요?문제가 된다면 비공개 레포로 초대 드리겠습니다! https://github.com/gaeundev/react-shop-test
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Transactional 어노테이션만 붙이면 에러가 뜨네요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.문제 : @Transactional 를 주석처리하면 정상적으로 회원가입이 되서 h2 DB에 입력됩니다...그런데 다시 DB데이터 삭제 하고 @Transactional 어노테이션 설정을하면 아래와같이java.lang.IllegalStateException: java.sql.SQLException: Connection is closed뜹니다.. 정상적으로 지금까지 다된거같은데 갑자기 이러네요.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
연산자 오버로딩 질문있습니다
int로 할때는 (a++)++ 후위형 증감 연산자가 안되는걸 확인했는데 그래서 연산자 오버로딩을 통한 후위형 증감 연산자를 만들었을 때도 똑같이 안될 거라고 생각했습니다. 하지만 예상과 다르게 컴파일단계에서 에러가 나지 않고 제대로 넘어가서 헷갈리네요 왜 그런건가요??
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
디스코드
아래 채널을 찾을 수 없습니다.무효화되거나 만료된 채널이라고 나옵니다.코드팩토리 디스코드https://bit.ly/3HzRzUM확인 부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품내역 조회 시 에러 발생..
안녕하세요 강의 잘 듣고 있습니다.다름이 아니라 상품주문 후 상품내역을 조회하는 과정에서 org.hibernate.LazyInitializationException: could not initialize proxy [jpabook.jpashop.domain.Item#2] - no Sessionat org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:322) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:45) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]at org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final] 이라는 에러가 발생하여 확인결과@GetMapping("/orders") public String orderList(@ModelAttribute("orderSearch") OrderSearch orderSearch, Model model) { List<Order> orders = orderService.findAll(orderSearch); model.addAttribute("orders", orders); return "order/orderList"; }해당 요청에서 <tr th:each="order : ${orders}"> <td th:text="${order.id}"></td> <td th:text="${order.member.name}"></td> <td th:text="${order.orderItems[0].item.name}"></td> <td th:text="${order.orderItems[0].orderPrice}"></td> <td th:text="${order.orderItems[0].count}"></td>orderList.html의 ${order.orderItems[0].item.name}item을 찾지 못하여 public List<Order> findAll(OrderSearch orderSearch) { String jpql = "select o From Order o join o.member m"; // String jpql = "select o From Order o join fetch o.member m join fetch o.orderItems oi join fetch oi.item i"; // 아이템 정보를 끌어오기 위해서 join fetch 사용!! boolean isFirstCondition = true;jpql에서 fetch join으로 item을 강제로 불러오니 해결됐습니다. 그런데 질답 게시판을 보니 다른분들은 해당 문제가 발생하지 않는듯 하여 무엇이 문제인지 혹시 알수 있을까 해서 질문드립니다... 강의대로 코드를 그대로 따라치진 않았고 나름대로 이것저것 바꿔가면서 코드를 작성하긴 했으나 해당 문제는 아닌것 같았습니다. https://cantcoding.tistory.com/78해당 티스토리의 글과 비슷한 유형의 문제인듯 하여 계속 생각해봤으나 배움이 아직 부족한 탓인지 원인을 잘 모르겠습니다 https://drive.google.com/file/d/1u7Jsc8jrtwNeJZ1ycPJb2RtgvX7sghG6/view?usp=sharing구글드라이브 링크입니다.
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
안녕하세요 제로초님
interface Arr<T> { forEach(callback: (aaa: T) => void): void; } const test: Arr<string> = ['hello', 'world']; console.log( 'test', test.forEach((item) => console.log('item', item)) );안녕하세요 제로초님 하나 궁금한것이 생겨서 여쭤보고싶습니다.위의 사진은 정상적으로 작동하는 코드입니다.그런데 아래 사진 같은경우는 아래 사진에 첨부한 에러 메세지가 나오고 있습니다.둘의 차이점은 함수 이름을 forEach 를 사용했을때 에러(X)아래 사진은 함수 이름을 forEachTest로 사용 한 것 뿐인데forEachTest 라는 함수는 현재 에러가 나고있는데요,해당 코드에서 forEach와 forEachTest의 차이점은 무엇인가요??제가 생각했을땐 forEach에서도 에러가 나야 하지 않을까? 였습니다.해당 내용이 이해가 되질 않아서 답변주시면 감사하겠습니다. interface Arr<T> { forEachTest(callback: (aaa: T) => void): void; } const test: Arr<string> = ['hello', 'world']; console.log( 'test', test.forEachTest((item) => console.log('item', item)) );
-
미해결실전! 스프링 데이터 JPA
트랜잭션을 서비스에서 걸어주는 게 더 좋은 방식인가요?
스프링 데이터 JPA는 repository에 걸려있지만서비스단에서 걸어주고 전파를 받아서 사용하는 방식을 쓰는게 로직에 문제가 있을 때 더 안전하지 않을까 생각되는데 제가 생각한게 맞을까요?