묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find 시 쿼리문 2번 수행
답변 없으셔서 다시 남깁니다. 영속성 컨텍스트 2 강의의 약 7분 쯤 em.find를 2번하게 되어도 1차캐시 조회에 의해 쿼리문이 한번만 출력된다고 하셨는데저는 2번 출력되네요.. 문제가 뭘까요 https://drive.google.com/drive/folders/1rLlWTlGVWyFRoL-HXbvyWREnpHBC7OBe?usp=sharing 추가로 질문이 하나 더 있는데강의에서는 JPAMain 자바 파일의 try문을 수행하면 db에 바로 저장이 되는데저는 저장이 안됩니다.이것도 한번 확인 부탁드립니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K
다른분들의 답변, 교안을 봐도 이해가 가지 않아서 질문드립니다.if(mid)ret.insert(ret.begin() + ret.size() / 2, mid); 위 부분에서 ret.begin()이 들어가야하는 이유를 모르겠습니다.교안을 보면 insert(위치, 문자열)이라고 되어있으니까 insert(ret.size()/2 , mid)라고 하면 되지 않나요?왜 ret.begin()을 빼면 오류가 나는지다른 분들의 답변을 봐도, 오래 고민을 해봐도 도무지 이해가 가지 않아 답답한 마음에 질문드립니다ㅠㅠ
-
미해결ESXi 가상 인프라 구축과 보안 솔루션을 활용한 이상징후 탐지 모니터링
exsi 설치시 오류
베어메탈 실습을 준비를 위해 노트북에 설치하는데 이 오류는 일체형 랜카드가 인식이 안되는 오류라고 하는데 해결 방법 부탁드립니다 구글링해서 되는 방법을 시도해봤는데 혹시 와이파이 연결로 하면 안되고 랜 케이블 사서 직접 연결 해야하나요?
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
Bfs 강의 도입이 시급합니다!!
강의가 너무 좋네요~~ bfs 강의도 올려주실 계획 없나요~~~ (언어는 c++ 어떨지 조심스럽게 말씀드려봅니다 ㅎㅎ)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http요청 데이터 부분
강의를 듣던 중에 http 요청 데이터 부분에 총 3가지 방법이 있다고 들었습니다. 그런데 그냥 http api를 사용해서 get,post,put 등등 http message body 방법만으로 웹 애플리케이션을 구현하면 문제가 있을까요? 굳이 get-쿼리파라미터/ post-html form 이 두가지 방법도 알아야하는지 궁금합니다!
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
서버 배포시 문의드려요..
안녕하세요.장고로해서 우분투 서버에 배포중인데요. 셀레니움 이용시크롬과 크롬 웹 드라이버가 서버 컴퓨터에 깔려있어야하는 걸까요,클라이언트 컴퓨터에 깔려있어야 하는걸까요? 아래와 같이 옵션 뭘 설정하라는데.. chrome_options.binary_location = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" chrome_driver_binary = "/usr/local/bin/chromedriver" 혹시 아시면 답변 부탁드려요.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
서버 ip를 모르는 경우
클라이언트가 소켓열어서 tcp통신을 하려고 할 때아예 서버와 연결된적이 없어 서버 ip를 모르는 경우에는 어떻게 하나요>??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part6: 웹 서버
CounterState 질문입니다.
순수한 궁금증으로 여쭤뵙습니다.혹시 해당 cs를 구현하지않고 private static int currentCount를 사용한다면 유저마다 보이는 currentCounter가 다를까요? 아니면 공통적으로 서버가 닫히기전까지 모든 유저가 동일한 숫자가 보일까요?
-
미해결스프링 핵심 원리 - 기본편
생성자 주입 문의
[질문 내용]안녕하세요. 생성자 주입을 권장한다는 말씀을 듣고 의문이 생겨 문의드립니다.만약 개발 도중 생성자 필드가 추가가 된다면 해당 생성자 부분 코드를 건드리게 될텐데, 그에 따라 해당 생성자를 사용했던 코드들이 전부 오류가 날 것이고 변경이 필요할 것 같습니다.해당 사항이 발생하더라도 생성자 주입 방식을 제일 권장하시는 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
지연 로딩 관련 에러 발생합니다.
기존 강의에다가 JWT token + security 를 적용하여 프로젝트를 하고 있는데 , failed to lazily initialize a collection of role: study.wonyshop.user.entity.User.orders, could not initialize proxy - no Session 오류가 발생합니다. 원인을 찾아보니 이 오류는 지연로딩된 컬렉션을 사용하는 도중에 세션이 종료되어서 발생하는 문제입니다. User 엔티티에서 orders 컬렉션을 지연로딩으로 설정하였기 때문에 실제로 컬렉션에 접근할 때 데이터베이스 연결이 필요하며 세션이 닫힌 상태에서는 접근할 수 없습니다.package study.wonyshop.user.entity; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import study.wonyshop.common.TimeStamped; import study.wonyshop.delivery.Address; import study.wonyshop.order.entity.Order; //import study.wonyshop.order.entity.Order; @Entity @Table(name = "USERS") //테이블 user 예약어 있어서 사용할 수 없음) @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class User extends TimeStamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id", nullable = false) private Long id; @Column(nullable = false, unique = true) private String email; @Column(nullable = false, unique = true) private String nickname; @Column(nullable = false) private String password; @Column(nullable = false) private Address address; @Setter private String profileImage; @Column(nullable = false) @Enumerated(value = EnumType.STRING) private UserRoleEnum role; @Column(nullable = false, unique = true) private String phoneNumber; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Order> orders = new ArrayList<>(); //todo 즉시로딩 필요함 -> fetch 조인 생각 할것 /** * 결제 수단은 포인트로 가능 ! 하다는 가정 */ @Column(nullable = false) private int point = 1000; // 기본 가입 포인트 private Boolean inUser; // 추후 휴면계정 관리 할때 사용 하기 위함 @Builder public User(String email, String nickname, String password, Address address, String profileImage, UserRoleEnum role, String phoneNumber) { this.email = email; this.nickname = nickname; this.password = password; this.address = address; this.profileImage = profileImage; this.role = role; this.phoneNumber = phoneNumber; } // admin , seller 용 @Builder public User(String email, String nickname, String password, Address address, String profileImage, UserRoleEnum role, String phoneNumber, int point) { this.email = email; this.nickname = nickname; this.password = password; this.address = address; this.profileImage = profileImage; this.role = role; this.phoneNumber = phoneNumber; this.point = point; } /** * 소비자가 -> 셀러 에게 지불 * * @param totalPrice */ public void payForOrder(int totalPrice) { int restPoint = this.point - totalPrice; if (restPoint < 0) { throw new IllegalArgumentException("포인트가 부족합니다. 포인트 충전 후 다시 이용해 주세요."); } this.point = restPoint; } /** * 셀러가 판매해서 받은 돈 * @param totalPrice */ public void receivePayment(int totalPrice) { this.point += totalPrice; } /** * 취소 시 환불 * @param refundPayment */ public void refundPayment(int refundPayment){ this.point -= refundPayment; } }package study.wonyshop.order.entity; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import study.wonyshop.common.TimeStamped; import study.wonyshop.delivery.Delivery; import study.wonyshop.delivery.DeliveryStatus; import study.wonyshop.orderItem.OrderItem; import study.wonyshop.user.entity.User; @Entity @Table(name = "ORDERS") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order extends TimeStamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id", nullable = false) private Long id; @ManyToOne(fetch = FetchType.LAZY) //연관관계 주인 @JoinColumn(name = "user_id") private User user; // 주문자 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; //배송정보 @Enumerated(EnumType.STRING) private OrderStatus status; //ORDER, CANCEL private LocalDateTime orderDate;// 주문 날짜 @Builder public Order(User user, Delivery delivery, OrderStatus status, LocalDateTime orderDate) { this.user = user; this.delivery = delivery; this.status = status; this.orderDate = orderDate; } //--- 양방향 연관관계 편의 메서드 ------// 편의메서드는 컨트롤 하는 쪽에 만들어주면 됨 // 다 쪽이 연관관계 주인으로 값 의 변경사항은 주인쪽에서 함 // 다 쪽 : 일의 값은 set 으로 저장 // 일 쪽 : 리스트(다) 를 조회하여 add // order : user = m :1 public void setUser(User user) { this.user = user; user.getOrders().add(this); } //이때 이것을 호출 하기전에 세션이 종료되어 에러 발생 //order : orderItem = 1: m public void addOrderItem(OrderItem orderItem) { this.orderItems.add(orderItem); orderItem.setOrder(this); } // order : delivery = 1: 1 public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } public void setOrderDate(LocalDateTime orderDate) { this.orderDate = orderDate; } public void setStatus(OrderStatus status) { this.status = status; } //===== 생성 메서드 =====// //OrderItem... orderItems에서 ...은 가변 인자를 선언하는 부분입니다. 이는 OrderItem 타입의 인자를 0개 이상 받을 수 있다는 의미입니다. //Order order = createOrder(user, delivery, item1, item2); public static Order createOrder(User user, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setUser(user); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } //--- 비지니스 로직 -------// /** * 주문취소 */ public void cancel(){ if(delivery.getDeliveryStatus() == DeliveryStatus.COMP ) { throw new IllegalStateException(" 이미 배송이 완료된 상품은 취소가 불가능 합니다. "); //Non-cancellable product } this.setStatus(OrderStatus.CANCEL); // 주문 상품을 다 취소 시켜야함 for(OrderItem orderItem : orderItems){ orderItem.cancel(); } } //=== 조회 로직 =====// /** * 전체 주문 가격 조회 */ public int getTotalPrice(){ int totalPrice = 0; for(OrderItem orderItem :orderItems){ totalPrice += orderItem.getTotalPrice(); } return totalPrice; } } @PostMapping("") public OrderResponse orderItem(@AuthenticationPrincipal UserDetailsImpl userDetails , @RequestBody OrderRequest orderRequest) { Long itemId = orderRequest.getItemId(); int quantity = orderRequest.getQuantity(); return orderService.orderItem(userDetails.getUser(), itemId, quantity); }@Service @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; private final ItemRepository itemRepository; private final UserRepository userRepository; private final DeliveryRepository deliveryRepository; @Transactional public OrderResponse orderItem(User user, Long itemId, int quantity) { Item findItem = itemRepository.findById(itemId).orElseThrow( () -> new CustomException(ExceptionStatus.NOT_EXIST) ); //userRepository.findByIdWithOrders(user.getId()); //배송 생성 Delivery delivery = new Delivery(user.getAddress(), DeliveryStatus.READY); // 주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(findItem, findItem.getPrice(), quantity); // 주문생성 Order order = Order.createOrder(user, delivery, orderItem); deliveryRepository.save(delivery); userRepository.save(user); orderRepository.save(order); return new OrderResponse(order); }}이 상태에서 //userRepository.findByIdWithOrders(user.getId());이 주석 된 부분에 이처럼 user 객체를 가져올때 오더와 함께 가져오는 페치조인을 사용해봤지만 이번 엔 user가 null 값이라는 에러가 납니다. ㅠㅠㅠ 아무리 머리를 굴려도 ㅠㅠㅠㅠㅠ 해결이 안되네용 ㅠㅠㅠ 페치조인 코드 는 아래와 같이 작성했습니다. public interface OrderRepository extends JpaRepository<Order,Long> { @Query("select u from User u join fetch u.orders WHERE u.id = :userId") User findByIdWithOrders(@Param("userId")Long id); } 해결방법은 FetchType.EAGER이걸 적용하면 되는데 eager 적용하지 않고 하는 방법 없을까요 ㅠㅠ @OneToMany(mappedBy = "user", cascade = CascadeType.ALL,Fetch = FetchType.EAGER orphanRemoval = true) private List<Order> orders = new ArrayList<>();
-
미해결모바일 웹 퍼블리싱 포트폴리오 with Figma
단위 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님강의 듣고 있다가 문득 궁금한게 생겨 문의 남깁니다.강의시 rem,vw 단위가 아닌 px단위로 퍼블리싱이 진행되는걸까요?보통 모바일웹은 px보다는 rem이나 vw 단위를 주로 사용한다는 이야기를 들은적이 있어서 질문 남깁니다.답변미리감사합니다
-
미해결타입스크립트 입문 - 기초부터 실전까지
프로젝트 실행
html 파일에서 Open with Live Server 하면 동작이 안하는데 따로 모 실행해 줘야 되나요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-G cmp 함수 질문
bool cmp(pair<int,int> a, pair<int, int> b){ if(a.first == b.first){ return mp_first[a.second] < mp_first[b.second]; } return a.first > b.first; }안녕하세요 강의 잘 듣고 있습니다.교안과 모범 답안의 cmp함수의 매개변수로 pair<int,int>가 그대로 들어가는데요?https://www.geeksforgeeks.org/sorting-a-map-by-value-in-c-stl/이 링크를 보면 cmp의 매개변수로 &을 붙여서 레퍼런스를 넘기는데레퍼런스를 넘기던 값을 넘기던 상관없는건가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
자유게시판 로그인일때 (비로그인 유저아닐때)
강사님 안녕하세요, 혹시 밑에 질문했는데 제가 잘못 말을 전달한것 같아서요비로그인일때는 피그마에서 작성자, 비밀번호를 입력하게 나타나는데로그인일때는 작성자, 비밀번호를 입력 못하게 나타나더라고여 근데 playground 가보면 파라미터를 받는곳을 보면 user 정보를 받는 파라미터가 없더라구요그래서 fetchBoard를 들어가서 user정보를 가져와도 null값이 나옵니다.그럼 피그마에 있는 저거는 로그인유저도 비로그인유저 화면으로 만들어야하나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
annotation 강의
현재 로드맵을 따라 mvc1편을 절반정도 수강했는데 뒤로 가면@, annotation에 대한 설명해주시는 강의도 있나요??
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링부트 임베디드 모드 테스트 시 커밋
안녕하세요 강사님좋은 강의 감사드리고 해당 질문이 다소 답답하게 느껴지실 수도 있을 것 같아 죄송하지만 강의 실습하는 도중 궁금한 점이 생겨 질문 남깁니다.테스트할 때 임베디드 모드 DB를 사용하게 되면@Commit 어노테이션을 달더라도 실제 db 테이블에 데이터가 저장되지는 않더라고요실제 db가 아닌 임베이드 db를 사용해서 그런 것이라면 임베디드 모드 db를 사용할 때는 애플리케이션이 종료되면 임베디드 모드로 동작하는 H2 데이터베이스도 함께 종료되고, 데이터도 모두 사라진다고 강의 자료에도 써있는데 그러면 @Commit 어노테이션이 무의미하게 되는 것인가요?제가 아래의 동일한 테스트를 여러번 돌릴 때마다 DB데이터가 다 사라지는 것 같더라고요(테스트 할 때는 로그로 데이터 개수를 찍어봤습니다)그럼 각 테스트 단위마다 새로운 임베디드 모드의 DB가 종료되고 다시 새롭게 생성되는 건가요?확인 후 답변 주시면 정말 감사드리겠습니다..!!
-
해결됨홍정모의 따라하며 배우는 C언어
5-6. 괄호에 대한 질문
안녕하세요. 연산자의 우선순위에 대해 설명하실 때 강의에서 말하는 ()는 operator가 아니라 primary expression이라고 하셨습니다.강의의 ()는 operator가 아닌데, 어떻게 연산자 우선순위를 설명할 때 포함될 수 있는지 모르겠습니다. 늘 좋은 강의, 답변 감사합니다.
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
createAsyncThunk 진행 순서
제가 이번에 loadPosts를 createAsyncThunk로 구현하면서 createAsyncThunk의 진행 순서가 궁금해서 질문 드립니index.js useEffect(() => { console.log("dipathch hi"); dispatch(loadPosts(10)); }, [dispatch]);reducers/post.js export const loadPosts = createAsyncThunk(LOAD_POST, async (data) => { trottle(); return data; }); const trottle = () => listenerMiddleware.startListening({ type: LOAD_POST, effect: async (action, listenerApi) => { listenerApi.unsubscribe(); console.log("Original state ", listenerApi.getOriginalState()); await listenerApi.delay(5000); console.log("Current state ", listenerApi.getState()); listenerApi.subscribe(); }, }); const postSlice = createSlice({ name: "post", initialState, extraReducers: (builder) => builder .addCase([HYDRATE], (state, action) => ({ ...state, ...action.payload.post, })) // loadPosts .addCase(loadPosts.pending, (state, action) => { state.loadPostsLoading = true; state.loadPostsDone = false; }) .addCase(loadPosts.fulfilled, (state, action) => { action.payload = generateDummpyPost(action.payload); state.mainPosts = action.payload.concat(state.mainPosts); state.hasMorePost = state.mainPosts.length < 50; state.loadPostsLoading = false; state.loadPostsDone = true; }) .addCase(loadPosts.rejected, (state, action) => { state.loadPostsLoading = false; state.loadPostsError = action.error; }) .addDefaultCase((state) => state), });제가 하나하나 console.log를 찍어서 확인한 진행 순서를 얘기해 드리겠습니다일단 화면을 처음 랜더링할때 index.js에서 dispatch가 제일 먼저 실행됩니다 그리고 post.js로 넘어와서 loadPost.pending -> loadPosts.fulfilled ->loadPosts = createAsyncThunk(LOAD_POST) 이 순서대로 진행이 됩니다 그래서 loadPosts.fulfilled에 generateDummpyPost()함수를 작성한 것입니다그래서 마지막에 createAsyncThunk가 실행이 되니 return이 필요없지 않나? 라는 생각에 return을 지워봤더니 post가 하나만 작성되고 그 이후는 작성되지 않았습니다제가 궁금한 부분은 세개입니다createAsyncThunk의 정확한 진행순서가 궁금합니다generateDummpyPost()함수를 저렇게 작성하는게 맞는지 궁금합니다https://blog.logrocket.com/redux-toolkits-new-listener-middleware-vs-redux-saga/ 에서 Throttling관련 얘기가 있어서 똑같이 따라 해봤는데 쓰로틀링을 createAsyncThunk에 장착하는 방법을 잘 모르겠습니다 쓰로틀링이 없어도 윈도우 이밴트로 요청이 한번에 많이 오는 현상은 없지만 그래도 궁금해서 질문 드립니다
-
미해결리눅스 IPC 프로그래밍 - 이론과 실습
수업 관련 질문
안녕하세요 IPC 프로그래밍에서 Live Programming(pipe) 수업을 듣는 도중 make 파일이 명령어가 실행되지 않는데 선행되어야 하는 작업이 있을까요?환경은 Vmware CentOS 7.9 2개입니다.
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
가변인자 강의 내용 중 코드가 출력이 안됩니다ㅠ
def profile(name, age, *language): print("이름 : {0}\t나이: {1}\t" .format(name, age), end=" ") for lang in language: print(lang, end=" ") print() profile("유재석", 20, "Python", "Java", "C", "C++", "C#", "Javascript") profile("김태호", 25, "kotlin", "Swift") 강의 내용 그대로 하였는데 "IndentationError: unindent does not match any outer indentation level" 라는 말이 뜨고요. 출력창에서는 "print()" 이 부분이 빨간 줄로 되어 있어요ㅠ오류의 원인을 아실까요,,