묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
UserLoanHistory Entity
id를 할 때는 Entity에서 자료형 Long을 쓰고, user_id는 자료형 long을 쓰는데 왜 두 개 다른것을 쓰나요? 특별한 이유가 있을까요??
-
해결됨백엔드 애플리케이션 성능 테스트하기
강사님 강의를 듣고 실제 프로젝트에서 제가 만든 API에 대해 성능 테스트를 진행하고 성능 개선을 해봤습니다.
안녕하세요 강사님!강사님의 백엔드 애플리케이션 성능 테스트하기와 백엔드 애플리케이션 성능 개선하기 - 기초편 강의를 듣고 실제 프로젝트에서 제가 만든 API에 대해 성능 테스트를 진행하고 성능 개선을 해봤습니다. 아래는 제가 과정을 진행하면서 겪었던 이슈와 고민을 블로그 글로 적었습니다.우선 강사님 덕분에 성능 개선을 잘 할 수 있어서 감사했습니다.블로그 글을 쓰면서 든 생각은 여기서 더 개선 시킬점은 없을까? 좀 더 고민 해볼만한 부분은 없을까? 내가 정말 이 기술들을 알고 적용한게 맞는걸까? 라는 생각이 들었습니다.개발에 정답은 없지만 그래도 좋은 방향은 있다고 생각해서 최근에 제가 쓴 글을 다시 보면서 어떤 부분에 대해 고민하면 좋고 고치면 좋을까 라는 생각을 하고 있습니다.혹시 강사님께서 제 글을 보시고 만약 면접관이시라면 어떤식으로 질문이 들어올 수 있을지 특히 꼬리 질문에 대해 얘기를 해주실 수 있을까요 해주신 내용을 바탕으로 깊게 고민 해보고 나중에 면접 대비도 하고 싶습니다.
-
해결됨실습으로 배우는 선착순 이벤트 시스템
강사님 강의를 듣고 실제 프로젝트에서 이벤트 응모 시스템을 만들어 봤습니다.
안녕하세요 강사님!강사님의 동시성 이슈와 선착순 이벤트 시스템 강의를 듣고 실제 프로젝트에서 이벤트 응모 시스템을 만들어 봤습니다. 아래는 제가 해당 이벤트 응모 시스템을 만들면서 겪었던 이슈와 고민을 블로그 글로 적었습니다.우선 강사님 덕분에 프로젝트 잘 끝낼 수 있어서 감사했습니다.블로그 글을 쓰면서 든 생각은 여기서 더 개선 시킬점은 없을까? 좀 더 고민 해볼만한 부분은 없을까? 라는 생각이 들었습니다.개발에 정답은 없지만 그래도 좋은 방향은 있다고 생각해서 최근에 제가 쓴 글을 다시 보면서 어떤 부분을 고치면 좋을까 라는 생각을 하고 있습니다.혹시 강사님께서 제 글을 보시고 만약 면접관이시라면 어떤식으로 질문이 들어올 수 있을지 특히 꼬리 질문에 대해 얘기를 해주실 수 있을까요 해주신 내용을 바탕으로 깊게 고민을 해보고 면접 대비도 하고 싶습니다.
-
미해결실무 중심! FE 입문자를 위한 React
2-6 구구단 배열 넣어서 출력시 질문
강사님께서 map으로 출력하시던데 2-4 반복문 강의처럼 배열로 넣어서 출력을 해보고싶었는데 출력이 세로로만 나오거나 가로로만 한줄로 나오던데 줄바꿈을 어떻게 줘야하는건지 궁금해서 작성해봅니다.
-
해결됨[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
안녕하세요. SetDamage() null 오류
SetDamage부분에서 계소 null이 나는데요. 어떤 부분을 확인해야 할까요? NullReferenceException: Object reference not set to an instance of an objectHero.SetDamage () (at Assets/02.Scripts/Player/Hero.cs:170)Bullet.Update () (at Assets/02.Scripts/Player/Bullet.cs:34)
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
Render Texture 관련 문의 강의와 다르게나와요.
아무리 강의를 돌려봐도 강의영상 3:17에는 위와 같은 느낌이었는데 강의영상 4:31 영상 렌더 텍스쳐 적용 후부터 이미지가 써클의 모양이랑 크기가 달라 보이는게 이해가 안됩니다... 부모 오브젝트부터 초 단위로 끊어서 봤었는데 보여지는 써클 사이즈가 도저히 이해가 안됩니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
html 소스코드 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]소스코드는 도대체 어디서 가지고 오시는거일까요???
-
미해결더 개발자, 인터뷰 가이드
혹시 미국은 설 연휴때 어떻게 보내시나요
이런 질문도 괜찮은가요 새해 복 많이 받으시길 바랍니다 ❤
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
서버 응답관련 질문
안녕하세요, 조교님 30강 강의를 들으면서 문제가 발생해 질문을 남기게 되었습니다. 이 전까지는 정상적으로 작동하였는데 "책 등록" 기능이 제대로 동작하지 않습니다. 코드에는 문제가 없어 보이고, 서버는 정상 동작합니다. 책 등록에서 저장 버튼을 누르면 위와 같은 메시지가 뜨는 상황인데, 혹시 해결방법을 아실까요?
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
주피터노트북 코드로 한글파일 열수 없다고 나오는데.....
주피터노트북으로 코딩시.hwp.open("파일명.hwp")를 실행해도 화일이 없다고 열리지 안네요.........분명 해당경로에 그 파일이 존재하는데도 불구하구요... 강의 듣다가 느낀점.코딩프로그램 사용법이 더 어려워요.파이참으로 했다가 주피터로 하기도 하고.....
-
해결됨실전! Redis 활용
안녕하세요 Pub/sub과 분산 락에 대해 질문이 있습니다.
안녕하세요 강사님 우선 아래 질문한 내용에 대해 구글에서 이것저것 찾아보고 GPT도 다 돌려봤는데 도저히 이해가 안가서 강사님께 여쭤봅니다.강의에서 분산 락과 Pub/Sub 개념을 복습한 후, 이전에 Redisson을 사용해 구현했던 분산 락 로직을 정리하고 있습니다. 그 과정에서 RedissonLock 클래스의 tryLock 메서드를 살펴보다가 PublishSubscribe 클래스의 subscribe 메서드까지 코드를 따라가게 되었습니다.이와 관련하여 다음 몇 가지 질문이 생겼습니다:PublishSubscribe 클래스의 subscribe 메서드를 보면 세마포어를 사용하는데, 여기서 세마포어의 역할이 무엇인지 잘 이해가 되지 않습니다. 왜 이 시점에서 세마포어를 사용하는 건가요?CompletableFuture<RedissonLockEntry> subscribeFuture = subscribe(threadId); 코드에서 threadId로 무언가를 구독합니다. 정확히 무엇을 구독하는지 잘 모르겠습니다. 구독 대상과 구독의 목적이 무엇인지 궁금합니다.tryLock 메서드의 아래쪽 코드를 보면 while (true)로 락을 반복적으로 시도하는 모습이 마치 스핀락처럼 보입니다. 저는 Redisson의 분산 락이 Lettuce의 스핀락과는 다르다고 생각했는데, 실제 구현을 보니 스핀락과 비슷한 방식으로 동작한다고 봐도 될까요?RedissonLock 클래스의 tryLock 메서드 @Override public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException { long time = unit.toMillis(waitTime); long current = System.currentTimeMillis(); long threadId = Thread.currentThread().getId(); Long ttl = tryAcquire(waitTime, leaseTime, unit, threadId); // lock acquired if (ttl == null) { return true; } time -= System.currentTimeMillis() - current; if (time <= 0) { acquireFailed(waitTime, unit, threadId); return false; } current = System.currentTimeMillis(); CompletableFuture<RedissonLockEntry> subscribeFuture = subscribe(threadId); try { subscribeFuture.get(time, TimeUnit.MILLISECONDS); } catch (TimeoutException e) { if (!subscribeFuture.cancel(false)) { subscribeFuture.whenComplete((res, ex) -> { if (ex == null) { unsubscribe(res, threadId); } }); } acquireFailed(waitTime, unit, threadId); return false; } catch (ExecutionException e) { acquireFailed(waitTime, unit, threadId); return false; } try { time -= System.currentTimeMillis() - current; if (time <= 0) { acquireFailed(waitTime, unit, threadId); return false; } while (true) { long currentTime = System.currentTimeMillis(); ttl = tryAcquire(waitTime, leaseTime, unit, threadId); // lock acquired if (ttl == null) { return true; } time -= System.currentTimeMillis() - currentTime; if (time <= 0) { acquireFailed(waitTime, unit, threadId); return false; } // waiting for message currentTime = System.currentTimeMillis(); if (ttl >= 0 && ttl < time) { commandExecutor.getNow(subscribeFuture).getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS); } else { commandExecutor.getNow(subscribeFuture).getLatch().tryAcquire(time, TimeUnit.MILLISECONDS); } time -= System.currentTimeMillis() - currentTime; if (time <= 0) { acquireFailed(waitTime, unit, threadId); return false; } } } finally { unsubscribe(commandExecutor.getNow(subscribeFuture), threadId); } // return get(tryLockAsync(waitTime, leaseTime, unit)); }PublishSubscribe 클래스/** * Copyright (c) 2013-2022 Nikita Koksharov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.redisson.pubsub; import org.redisson.PubSubEntry; import org.redisson.client.BaseRedisPubSubListener; import org.redisson.client.ChannelName; import org.redisson.client.RedisPubSubListener; import org.redisson.client.codec.LongCodec; import org.redisson.client.protocol.pubsub.PubSubType; import org.redisson.misc.AsyncSemaphore; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * * @author Nikita Koksharov * */ abstract class PublishSubscribe<E extends PubSubEntry<E>> { private final ConcurrentMap<String, E> entries = new ConcurrentHashMap<>(); private final PublishSubscribeService service; PublishSubscribe(PublishSubscribeService service) { super(); this.service = service; } public void unsubscribe(E entry, String entryName, String channelName) { AsyncSemaphore semaphore = service.getSemaphore(new ChannelName(channelName)); semaphore.acquire().thenAccept(c -> { if (entry.release() == 0) { entries.remove(entryName); service.unsubscribe(PubSubType.UNSUBSCRIBE, new ChannelName(channelName)) .whenComplete((r, e) -> { semaphore.release(); }); } else { semaphore.release(); } }); } public void timeout(CompletableFuture<?> promise) { service.timeout(promise); } public void timeout(CompletableFuture<?> promise, long timeout) { service.timeout(promise, timeout); } public CompletableFuture<E> subscribe(String entryName, String channelName) { AsyncSemaphore semaphore = service.getSemaphore(new ChannelName(channelName)); CompletableFuture<E> newPromise = new CompletableFuture<>(); semaphore.acquire().thenAccept(c -> { if (newPromise.isDone()) { semaphore.release(); return; } E entry = entries.get(entryName); if (entry != null) { entry.acquire(); semaphore.release(); entry.getPromise().whenComplete((r, e) -> { if (e != null) { newPromise.completeExceptionally(e); return; } newPromise.complete(r); }); return; } E value = createEntry(newPromise); value.acquire(); E oldValue = entries.putIfAbsent(entryName, value); if (oldValue != null) { oldValue.acquire(); semaphore.release(); oldValue.getPromise().whenComplete((r, e) -> { if (e != null) { newPromise.completeExceptionally(e); return; } newPromise.complete(r); }); return; } RedisPubSubListener<Object> listener = createListener(channelName, value); CompletableFuture<PubSubConnectionEntry> s = service.subscribeNoTimeout(LongCodec.INSTANCE, channelName, semaphore, listener); newPromise.whenComplete((r, e) -> { if (e != null) { s.completeExceptionally(e); } }); s.whenComplete((r, e) -> { if (e != null) { value.getPromise().completeExceptionally(e); return; } value.getPromise().complete(value); }); }); return newPromise; } protected abstract E createEntry(CompletableFuture<E> newPromise); protected abstract void onMessage(E value, Long message); private RedisPubSubListener<Object> createListener(String channelName, E value) { RedisPubSubListener<Object> listener = new BaseRedisPubSubListener() { @Override public void onMessage(CharSequence channel, Object message) { if (!channelName.equals(channel.toString())) { return; } PublishSubscribe.this.onMessage(value, (Long) message); } }; return listener; } } 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
remove(), equals()
[질문 내용]왜 remove() 메소드를 사용하기 위해서 equals() 메소드를 Address와 AdressEntity 메소드에 재정의해야 하나요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
'문제: 짝수 출력' 관련 질문
[질문 내용]'문제풀이 1'의 2번 문제인 '짝수' 출력 관해서 질문 드립니다.강사님이 작성해준 코드와 제가 작성한 내용이 조금 달라서요..!결과값이 동일하긴 한데, 이렇게 진행해도 문제없나요?저는 num 변수만 선언했거든요..package loop.ex; public class WhileEx2 { public static void main(String[] args) { int num = 1; while (num <= 10) { System.out.println(num * 2); num++; } } } package loop.ex; public class ForEx2 { public static void main(String[] args) { for (int num = 1; num <= 10; num++) { System.out.println(num * 2); } } }
-
해결됨Windows 소켓 프로그래밍 입문에서 고성능 서버까지!
TCP 의도적 장애 테스트 질문
안녕하세요 선생님.질문하기 전 우선 좋은 강의 촬영해주셔서 너무 감사드립니다. 공부에 많은 도움이 되고 있습니다.저는 의도적으로 장애 상항을 만들고 Wireshark로 확인해보며 공부 중인데 이해가 가지 않는 상황이 존재하여 사진과 함께 여쭤봅니다. 우선 간략하게 테스트 환경을 공유드리겠습니다.루프백 통신,Server Port: 7777,Client Port: 65066,Netsh interface tcp set global autotuninglevel=disabled 으로 WindowSize Auto Tuning 비활성화Client는 recv 함수 호출 전 브레이크 포인트 걸고 Server가 132,000 데이터를 send 하는 상황입니다.3-way handshake 상황에서 클라이언트가 Win = 65495로 공유받았고, ①에서 서버는 Len = 65495 만큼 데이터를 송신하고 있습니다. 클라이언트는 ACK로 Win =65495를 보내고 있는데, 클라이언트가 Recv를 하고 있지 않기 때문에 Win = 0으로 와야될 것 같은데… 이 부분이 어떤 것 때문에 이렇게 오는 지 이해가 어려워 여쭤봅니다. 혹시나 os에서 내부 TCP 버퍼 크기를 자동으로 조정했는지 확인해보기 위하여 getsockopt으로 RCV_BUF를 확인해본 결과 65536으로 따로 변경하거나 그런 것은 확인하지 못했습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
메모리초과 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요! 제가 처음에 풀 때 map을 사용해서 위치, 누적경로를 담아 풀이했는데 메모리가 초과되었다고 합니다. 지레짐작으로는 경로를 계속 복사하는 과정에서 vector<int> tmp = path; // 기존 경로 복사 메모리가 누적되는거 같은데, 처음부터 이 방법이 메모리 초과이겠다..!라고 판단하는 방법이 있을까요? 아래는 제 코드입니다#include <iostream> #include <vector> #include <queue> #include <unordered_map> #include <algorithm> using namespace std; const int MAX = 100000; const int MIN = 0; int visited[MAX + 4]; struct Pair { int loc; // 현재 위치 vector<int> path; // 누적 경로 Pair(int l, vector<int> p) : loc(l), path(p) {} }; int main() { int n, m; cin >> n >> m; unordered_map<int, vector<int>> map; queue<Pair> q; vector<int> fPath; fPath.push_back(n); q.push(Pair(n, fPath)); visited[n] = 1; map[n] = fPath; while (!q.empty()) { Pair p = q.front(); q.pop(); int here = p.loc; vector<int> path = p.path; if (here == m) { break; } for (int there : {here + 1, here - 1, here * 2}) { if (there >= MIN && there <= MAX) { if (visited[there] == 0) { visited[there] = visited[here] + 1; vector<int> tmp = path; // 기존 경로 복사 tmp.push_back(there); q.push(Pair(there, tmp)); map[there] = tmp; } } } } if (n == m) { cout << 0 << endl; } else { cout << visited[m] - 1 << endl; } for (int p : map[m]) { cout << p << " "; } return 0; }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA 프록시 객체 AccessType.FIELD에서 getId 시 초기화?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하십니까 선생님! 질문 제목을 보고 얘는 왜 이 질문을 여기에 올렸을까라고 의아해하실 수도 있는데, 사실 제가 영한님 스프링 관련 강의는 다 사서 열심히 보고 있는데(정말 도움 많이 받고 있습니다. 항상 정말 잘 듣고 있습니다!!) JPA는 영한님이 쓰신 JPA 책을 사서 보고 있습니다! 그런데 프록시 객체 파트를 읽어보던 도중 이해가 되지 않는 부분이 있어 질문을 쓰고 싶은데 JPA 쪽에 질문으로 쓰려고 해도 강의를 산 사람만 작성할 수 있어 부득이하게 여기에서 질문하게 되었습니다 죄송합니다 ㅜㅜㅜ 다름이 아니라 지금 JPA의 프록시 객체 파트를 공부하고 있습니다. 그런데 294P의 8.1.2 프록시와 식별자 부분에서 엔티티를 em.getReference, 즉 프록시로 조회할 때 엔티티 접근 방식을 AccessType.PROPERTY로 설정한 경우 getId를 호출해도 프록시를 초기화하지 않는다고 하셨습니다. 그래서 직접 한번 코드를 작성해보았습니다. 우선 AccessType.PROPERTY 방식부터 적용해보았습니다. PROPERTY와 FIELD 두 방식 모두 실험 전 create 옵션으로 Parent 객체 하나를 만들어두고 후에 none으로 바꾸어 진행했습니다. Parent 객체 생성 코드Parent parent = new Parent(); parent.setId(1L); parent.setName("parent1"); em.persist(parent); Parent.java@Entity @Setter @Getter @Access(AccessType.PROPERTY) public class Parent { private Long id; private String name; @Id public Long getId() { return id; } }JpaMain.javapublic static void main(String[] args) { EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); Parent foundParent = em.getReference(Parent.class, 1L); System.out.println(foundParent.getClass()); System.out.println(foundParent.getId()); System.out.println(foundParent.getName()); tx.commit(); em.close(); emf.close(); }해당 코드를 실행시켰을 때이렇게 나온걸 보니 확실히 getId 후에 getName 조회시 프록시 객체를 초기화(select 구문 실행)을 했다는 것을 알 수 있었습니다. 그런데 AccessType.FIELD로 조회하면 getId 를 할때에도 프록시 객체를 초기화한다고 하여 아래와 같이 Parent.java의 코드를 다시 작성하여 JpaMain.java를 실행해보았습니다. Parent.java@Entity @Setter @Getter @Access(AccessType.FIELD) public class Parent { @Id private Long id; private String name; }제 예상으로는 getId 실행시 프록시 객체를 초기화 한다고 하셨으니 실제 출력에는 Parent의 getId()가 실행되기 전에 select 문이 실행되어야 할 것이라고 예상하였습니다. 하지만위와 같이 getId()에는 프록시 객체를 초기화하지 않는 것처럼 보여지는 출력이 나왔습니다.책에서는 AccessType.FIELD 사용시 getId()를 호출하면 JPA는 getId()가 id만 조회하는 메소드인지 다른 필드까지 활용해서 어떤 일을 하는 메소드인지 알지 못하므로 프록시 객체를 초기화한다고 나와있는데 왜 이런 결과가 나온 것일까요? 제가 잘못 이해하고 있는 것이 있을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
AddressEntity 수정 2
[질문 내용]AddressEntity에 equals()와 hashCode() 메소드 재정의 ADDRESS 테이블에 2개의 값이 저장된다. 그리고 저장된 첫번째 값의 "new1"을 지우고 "new3"을 추가한다. 이렇게 했을 때 추가는 되었지만 삭제가 동작이 잘 되지 않았습니다. DB 쿼리문은 update 쿼리가 나간 상태입니다. 어떻게 해야 좋을지 막막하네요..제가 어디 빠트린 부분이 있을까요?
-
해결됨코딩없이 언리얼 엔진5로 VR 콘텐츠 개발하기
언리얼로 만든 파일의 이동방법 관련해 질문 드립니다.
안녕하세요. 저는 유니티로만 VR 작업을 해보다가 이번에 강의를 통해 언리얼로 작업 첫도전을 하는 사람인데요. 첫번째 강의를 통해 기기를 연결하고 언리얼 내부의 공간을 체험하는 것을 해봤는데 기존에 익숙한 방향컨트롤을 이용한 이동방법이 아닌, 갈 곳을 선택해서 이동하는 방식인 것을 확인했습니다. 기존에 이런 형식의 이동방식에 대한 거부감을 갖고 있었던지라 혹시 언리얼엔진으로 작업을 하면 이렇게만 이동이 가능한지 궁금해 질문 드립니다. (현재 3가 배송중이라 오큘2를 쓰고 있습니다)
-
해결됨코딩테스트 [ ALL IN ONE ]
노션공유가 안된듯 합니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. icopyx@gmail.com확인 부탁 드립니다.
-
해결됨비전공자도 이해할 수 있는 DB 설계 입문/실전
주문 정보 : 배송 정보의 관계에 대해 질문드립니다.
주문할 때마다 배송 정보를 새로 입력하기 때문에 주문 정보 : 배송 정보 = 1 : 1인 건 이해했습니다. 그런데 만약 주문할 때마다 배송 정보를 기본적으로 새로 입력하기는 하지만, 이전에 사용했었던 배송지를 다시 불러오는 기능이 있고, 기본 배송지를 설정하는 기능도 있다고 하면이런 경우에도 여전히 1 : 1이라고 생각하면 될까요? 관계는 동일하고 불러오거나 기본 배송지 기능은 그냥 코드로 구현하면 되는 걸까요?