174만명의 커뮤니티!! 함께 토론해봐요.
미해결
스프링 DB 2편 - 데이터 접근 활용 기술
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의 영상을 따라하다가 똑같은 에러를 만났는데 확인해보니 잘못된 타입을 imort해서 발생한 에러였습니다. import할 때 querydsl에서 제공하는 BooleanExpression이 아닌 ibatis에서 제공하는 BooleanExpression으로 import해서 생기는 문제인 것 같습니다.
박승민
2022-06-25T17:49:52.429Z
댓글 1
좋아요 1
조회수 503
해결됨
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의에서 보면 쿼리가 한번 나가는데 저는 두번이 나갑니다 ㅠㅠ http://localhost:8080/api/v3/simple-orders 호출 2022-06-26 01:02:45.805 DEBUG 5062 --- [nio-8080-exec-6] org.hibernate.SQL : select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id Hibernate: select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id 전체 코드 Order 엔티티 package jpabook.jpashop.domain.entity ; import lombok. Getter ; import lombok. Setter ; import javax.persistence.* ; import java.time.LocalDateTime ; import java.util.ArrayList ; import java.util.List ; @Entity @Table (name = "orders" ) @Getter @Setter public class Order { @Id @GeneratedValue @Column (name = "order_id" ) private Long id ; @ManyToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "member_id" ) private Member member ; @OneToMany (mappedBy = "order" , cascade = CascadeType. ALL ) private List<OrderItem> orderItems = new ArrayList<>() ; @OneToOne (fetch = FetchType. LAZY , cascade = CascadeType. ALL ) @JoinColumn (name = "delivery_id" ) private Delivery delivery ; private final LocalDateTime orderDate = LocalDateTime. now () ; @Enumerated (EnumType. STRING ) private OrderStatus status ; //== 연관관계 메서드 ==// public void setMember (Member member) { this . member = member ; member.getOrders().add( this ) ; } public void addOrderItem (OrderItem orderItem) { orderItems .add(orderItem) ; orderItem.setOrder( this ) ; } public void setDelivery (Delivery delivery) { this . delivery = delivery ; delivery.setOrder( this ) ; } //== 생성 메서드 ==// public static Order createOrder (Member member , Delivery delivery , OrderItem... orderItems) { Order order = new Order() ; order.setMember(member) ; order.setDelivery(delivery) ; for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem) ; } order.setStatus(OrderStatus. ORDER ) ; return order ; } //== 비즈니스 로직 ==/ /** * 주문 취소 */ public void cancel () { if ( delivery .getStatus() == DeliveryStatus. COMP ) { throw new IllegalStateException( " 이미 배송완료된 상품은 취소가 불가능합니다 ." ) ; } this .setStatus(OrderStatus. CANCEL ) ; for (OrderItem orderItem : orderItems ) { orderItem.cancel() ; } } //== 조회 로직 ==// /** * 전체 주문 가격 조회 */ public int getTotalPrice () { return orderItems .stream().mapToInt(OrderItem::getTotalPrice).sum() ; } } controller package jpabook.jpashop.api ; import jpabook.jpashop.domain.entity.Address ; import jpabook.jpashop.domain.entity.Order ; import jpabook.jpashop.domain.entity.OrderStatus ; import jpabook.jpashop.domain.repository.OrderRepository ; import jpabook.jpashop.domain.repository.OrderSearch ; import lombok. Data ; import lombok. RequiredArgsConstructor ; import lombok.extern.slf4j. Slf4j ; import org.springframework.web.bind.annotation. GetMapping ; import org.springframework.web.bind.annotation. RestController ; import java.time.LocalDateTime ; import java.util.List ; import java.util.stream.Collectors ; /** * xToOne(ManyToOne, OneToOne) * Order * Order -> Member * Order -> Delivery */ @Slf4j @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository ; @GetMapping ( "/api/v1/simple-orders" ) public List<Order> ordersV1 () { List<Order> all = orderRepository .findAllByString( new OrderSearch()) ; all.stream().forEach(o -> { o.getMember().getName() ; // Lazy 강제 초기화 o.getDelivery().getAddress() ; // Lazy 강제 초기화 }) ; return all ; } @GetMapping ( "/api/v2/simple-orders" ) public List<SimpleOrderDto> ordersV2 () { List<Order> orders = orderRepository .findAllByString( new OrderSearch()) ; return orders.stream() .map(SimpleOrderDto:: new ) .collect(Collectors. toList ()) ; } @GetMapping ( "/api/v3/simple-orders" ) public List<SimpleOrderDto> ordersV3 () { List<Order> orders = orderRepository .findAllWithMemberDelivery( new OrderSearch()) ; return orders.stream() .map(SimpleOrderDto:: new ) .collect(Collectors. toList ()) ; } @Data static class SimpleOrderDto { private Long orderId ; private String name ; private LocalDateTime orderDate ; private OrderStatus orderStatus ; private Address address ; public SimpleOrderDto (Order order) { orderId = order.getId() ; name = order.getMember().getName() ; orderDate = order.getOrderDate() ; orderStatus = order.getStatus() ; this . address = order.getDelivery().getAddress() ; } } } repository package jpabook.jpashop.domain.repository ; import org.springframework.stereotype. Repository ; import org.springframework.util.StringUtils ; import javax.persistence.EntityManager ; import javax.persistence.TypedQuery ; import javax.persistence.criteria.* ; import java.util.ArrayList ; import java.util.List ; import jpabook.jpashop.domain.entity.Order ; @Repository public class OrderRepository { private final EntityManager em ; public OrderRepository (EntityManager em) { this . em = em ; } public void save (Order order) { em .persist(order) ; } public Order findOne (Long id) { return em .find(Order. class, id) ; } public List<Order> findAllByString (OrderSearch orderSearch) { String jpql = " select o from Order o join o.member m " ; boolean isFirstCondition = true; // 주문 상태 검색 if (orderSearch.getOrderStatus() != null ) { if (isFirstCondition) { jpql += " where " ; isFirstCondition = false; } else { jpql += " and " ; } jpql += " o.status = :status " ; } // 회원 이름 검색 if (StringUtils. hasText (orderSearch.getMemberName())) { if (isFirstCondition) { jpql += " where " ; isFirstCondition = false; } else { jpql += " and " ; } jpql += " m.name like :name " ; } TypedQuery<Order> query = em .createQuery(jpql , Order. class ) .setMaxResults( 1000 ) ; if (orderSearch.getOrderStatus() != null ) { query = query.setParameter( "status" , orderSearch.getOrderStatus()) ; } if (StringUtils. hasText (orderSearch.getMemberName())) { query = query.setParameter( "name" , orderSearch.getMemberName()) ; } return query.getResultList() ; } /** * JPA Criteria */ public List<Order> findAllByCriteria (OrderSearch orderSearch) { CriteriaBuilder cb = em .getCriteriaBuilder() ; CriteriaQuery<Order> cq = cb.createQuery(Order. class ) ; Root<Order> o = cq.from(Order. class ) ; Join<Object , Object> m = o.join( "member" , JoinType. INNER ) ; List<Predicate> criteria = new ArrayList<>() ; // 주문 상태 검색 if (orderSearch.getOrderStatus() != null ) { Predicate status = cb.equal(o.get( "status" ) , orderSearch.getOrderStatus()) ; criteria.add(status) ; } // 회원 이름 검색 if (StringUtils. hasText (orderSearch.getMemberName())) { Predicate name = cb.like(m.<String>get( "name" ) , orderSearch.getMemberName()) ; criteria.add(name) ; } cq.where(cb.and(criteria.toArray( new Predicate[criteria.size()]))) ; TypedQuery<Order> query = em .createQuery(cq).setMaxResults( 1000 ) ; return query.getResultList() ; } public List<Order> findAllWithMemberDelivery (OrderSearch orderSearch) { return em .createQuery( " select o from Order o join fetch o.member m join fetch o.delivery d " , Order. class ) .getResultList() ; } }
질문 spring spring-boot java JPA
닉네임
2022-06-25T16:06:12.106Z
댓글 1
좋아요 0
조회수 836
미해결
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Address 필드가 Response 시 빈 객체로 나옵니다. [ { "orderId" : 4 , "name" : "userA" , "orderDate" : "2022-06-26T00:43:08.07663" , "orderStatus" : "ORDER" , "address" : {} }, { "orderId" : 11 , "name" : "userB" , "orderDate" : "2022-06-26T00:43:08.155045" , "orderStatus" : "ORDER" , "address" : {} } ] log를 찍어 봤는데 아래와 같이 dto에 address는 잘 들어가있습니다. 2022-06-26 00:43:11.618 INFO 4953 --- [nio-8080-exec-2] j.jpashop.api.OrderSimpleApiController : dto address = Address(city=서울, street=1, zipcode=1111) 2022-06-26 00:43:11.618 INFO 4953 --- [nio-8080-exec-2] j.jpashop.api.OrderSimpleApiController : dto address = Address(city=진주, street=2, zipcode=2222) 뭐가 문제일까요 ㅠㅠㅠ 전체코드 package jpabook.jpashop.api ; import jpabook.jpashop.domain.entity.Address ; import jpabook.jpashop.domain.entity.Order ; import jpabook.jpashop.domain.entity.OrderStatus ; import jpabook.jpashop.domain.repository.OrderRepository ; import jpabook.jpashop.domain.repository.OrderSearch ; import lombok. Data ; import lombok. RequiredArgsConstructor ; import lombok.extern.slf4j. Slf4j ; import org.springframework.web.bind.annotation. GetMapping ; import org.springframework.web.bind.annotation. RestController ; import java.time.LocalDateTime ; import java.util.List ; import java.util.stream.Collectors ; /** * xToOne(ManyToOne, OneToOne) * Order * Order -> Member * Order -> Delivery */ @Slf4j @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository ; @GetMapping ( "/api/v1/simple-orders" ) public List<Order> ordersV1 () { List<Order> all = orderRepository .findAllByString( new OrderSearch()) ; all.stream().forEach(o -> { o.getMember().getName() ; // Lazy 강제 초기화 o.getDelivery().getAddress() ; // Lazy 강제 초기화 }) ; return all ; } @GetMapping ( "/api/v2/simple-orders" ) public List<SimpleOrderDto> ordersV2 () { List<Order> orders = orderRepository .findAllByString( new OrderSearch()) ; List<SimpleOrderDto> result = orders.stream() .map(SimpleOrderDto:: new ) .collect(Collectors. toList ()) ; result.forEach(dto -> log .info( "dto address = {}" , dto.getAddress())) ; return result ; } @Data static class SimpleOrderDto { private Long orderId ; private String name ; private LocalDateTime orderDate ; private OrderStatus orderStatus ; private Address address ; public SimpleOrderDto (Order order) { orderId = order.getId() ; name = order.getMember().getName() ; orderDate = order.getOrderDate() ; orderStatus = order.getStatus() ; address = order.getDelivery().getAddress() ; } } }
질문 spring-boot java JPA spring
닉네임
2022-06-25T15:46:04.611Z
댓글 1
좋아요 1
조회수 464
미해결
10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
cd /usr/local/include mkdir bits cd bits vi stdc++.h m1 맥북에어 사용중인데 brew install gcc 설치 교안대로 include 폴더에서 bits폴더를 만드려고하니 아래와같이 에러가 나는데 혹시 해결방법이 무엇인지 궁금합니다; no such file or directory: /usr/local/include 제 경우 gcc -v로 확인시 아래와같습니다 (/Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk/usr/include/ 경로 안에서 교안 내용 적용하고 g++ -std=c++14 -Wall a.cpp -o test.out ./test.out 하면 정상적으로 출력되긴합니다;) Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk/usr/include/c++/4.2.1 Apple clang version 13.0.0 (clang-1300.0.27.3) Target: arm64-apple-darwin21.4.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
AjaAja
2022-06-25T15:31:32.425Z
댓글 2
좋아요 0
조회수 1115
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ModelView mv = adapter.handle(request , response , handler) 실제로 adapter.handle에서 response를 사용하지 않는데 인자로 넘기는 이유가 있나요??
seongchan hwang
2022-06-25T15:09:53.045Z
댓글 1
좋아요 0
조회수 292
미해결
자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
if(x === '+') stack.push(lt + rt); else if(x === '-') stack.push(lt - rt); else if(x === '*') stack.push(lt * rt); else if(x === '/') stack.push(lt / rt); 이렇게 연산자 별로 조건문을 나눠서 푸시하셨는데 eval 을 사용해도 크게 상관없나요? stack . push ( eval ( lt + x + rt ));
dkxmrhe1
2022-06-25T14:33:54.705Z
댓글 1
좋아요 1
조회수 225
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
밑에 질문답을 봤는데 살짝 이해가 안가서 질문남깁니다. BindingResult 는 Model에 자동으로 포함된다. 라고 하셨는데 그러면 넘어갈때 Model안에 item객체랑 bindingResult가 같이 담겨서 보내지는 건가요
alrnr3521
2022-06-25T14:17:09.020Z
댓글 1
좋아요 1
조회수 291
미해결
[개념부터 실습까지] 추천 시스템 입문편
안녕하세요 강의 너무 잘 들었습니다!! 강의를 듣고 궁금한 점이 있습니다 궁금한 점은 현업에서도 이와 유사한 프로세스로 진행되나요? 그리고 선형 모델 말고 트리기반이라던가(xgb lgm cbm) 뉴럴넷을 사용했을 때 모든 사용자에 대해 각각의 모델을 따로 만들어서 진행 해야할 것 같은데 너무 오래걸리거나 그런 문제는 없나요?
현업 pandas 모델링 머신러닝 배워볼래요? scikit-learn 추천-시스템 seaborn
장승민
2022-06-25T14:13:44.718Z
댓글 1
좋아요 1
조회수 294
미해결
10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
int t, n; string a, b; int main(){ int m; ... } 컴파일 후 실행해보니, 메인 함수 안에서는 쓰레기 값이 들어가고 메인 함수밖에서는 항상 0이나 공백으로 초기화되어있는 것 같아서요. 혹시 왜 그런건지 알 수 있나요? 감사합니다.
ryumirr1
2022-06-25T14:00:43.499Z
댓글 2
좋아요 0
조회수 468
미해결
10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
i nt a [ 1004 ] , b [ 100004 ] ; 예를 들어 이렇게 되어있는 배열이 있다고 하면 a라는 배열은 1000 * 4바이트의 크기를 가지게 되죠? [출처] [알고리즘 강의] 1주차. 복잡도, 재귀함수, 누적합, 구현 | 작성자 큰돌 이처럼 배열 선언을 4로 끝내는 이유가 있나요? 저 위의 설명은 1004 * 4바이트가 되어야하는게 아닌가요? int는 4바이트 정수이고 1004의 요소를 선언한 것이므로.. 끝의 4가 C++에서는 특별한 의미가 있나요? 감사합니다.
ryumirr1
2022-06-25T13:57:48.231Z
댓글 1
좋아요 0
조회수 225
미해결
쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]
웹 크롤링 관련해서 강의 너무 잘해주셔서 감사합니다! 다름이 아니라 웹이 아니라 앱크롤링은 대략 어떤 과정을 거쳐 진행하게되나요? 앱크롤링은 자료가 그렇게 많지는 않은 것 같아서 힌트를 얻을 수 있을까해서 질문드립니다. 감사합니다~!
scrapy 웹-크롤링 selenium bigdata
이승현
2022-06-25T13:56:25.953Z
댓글 1
좋아요 0
조회수 265
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 강의 진행하며 다른 클래스들은 자동완성 기능이 잘 되었으나 Member만 reflect import만 나타나는데 무슨 문제일까요 public class로 설정해두고 패키지도 다른 패키지와 동일하게 만들어서 별다른 차이가 없는데 딱 Member만 안되네요
import spring java spring-boot MVC
박재민
2022-06-25T13:54:03.443Z
댓글 1
좋아요 0
조회수 298
미해결
- 이렇게 코드를 작성하는데, age 이하 if age< 12부터 오류가 나오는데, 논리적으로 보면 들여쓰기를 하나 안 하나 똑 같이 작동이 되어야 할 거 같은데 들여쓰기를 하니까 오류가 나오네요, age = int~ 이하 부터 if문 들여쓰기 하면 왜 안 되는지 좀 설명 부탁드릴 수 있을까요.
문정윤
2022-06-25T13:47:38.929Z
댓글 0
좋아요 0
조회수 228
미해결
ARM Cortex-M 프로세서 프로그래밍
안녕하세요 ARM cortex-M 강의와 freeRTOS 강의를 수강 하고 있는 학생입니다. 두 강의 에서 F429 보드와 F103 보드가 모두 지원되고 있다고 들었습니다. 그렇다면 두 보드 중 하나만 선택해서 두 강의를 수강하고 싶은데 어떤 보드를 추천하시나요?? 이유도 같이 알려주시면 감사하겠습니다!
cortex arm-architecture 임베디드
규철
2022-06-25T13:43:17.712Z
댓글 1
좋아요 1
조회수 337
미해결
[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
네이버 페이지가 열리는 것까지는 되는데 그 후에 쇼핑탭을 클릭하기 위해서 find_element_by_css_selector함수를 이용하니 사진과 같은 에러가 뜹니다. 혹시 관련이 있을까 싶어 셀레니움 설치 시 오류메세지가 뜬 것도 함께 첨부합니다! ERROR: conda 4.12.0 requires ruamel_yaml_conda>=0.11.14, which is not installed. ERROR: requests 2.24.0 has requirement urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1, but you'll have urllib3 1.26.9 which is incompatible. Installing collected packages: h11, wsproto, async-generator, sniffio, outcome, trio, trio-websocket, urllib3, selenium Attempting uninstall: urllib3 Found existing installation: urllib3 1.25.9 Uninstalling urllib3-1.25.9: Successfully uninstalled urllib3-1.25.9 Successfully installed async-generator-1.10 h11-0.13.0 outcome-1.2.0 selenium-4.3.0 sniffio-1.2.0 trio-0.21.0 trio-websocket-0.9.2 urllib3-1.26.9 wsproto-1.1.0
ljmean0327
2022-06-25T13:39:20.316Z
댓글 1
좋아요 1
조회수 658
미해결
설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
안녕하세요! 실습을 위한 보드를 선택하려고 하는데 기존에 Arty-A7 100T 보드가 있어서 이를 사용해도 괜찮은지 궁금합니다~! :-)
2022-06-25T13:35:52.104Z
댓글 1
좋아요 1
조회수 341
미해결
[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
context랑 requireContext() 다르게 쓸 때가 있던데 무슨 차이인가요?
정승준[재학 / 컴퓨터공학부]
2022-06-25T13:23:00.319Z
댓글 1
좋아요 0
조회수 212
미해결
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
<div> <label for ="itemName" th :text ="#{label.item.itemName}" > 상품명 </label> <input type ="text" id ="itemName" th :field ="*{itemName}" th :errorclass ="field-error" class ="form-control" placeholder =" 이름을 입력하세요 " > <div class ="field-error" th :errors ="*{itemName}" > 상품명 오류 </div> </div> 여기에서 궁금한게 th :field ="*{itemName}"이거는 모델에 담긴 item의 itemName이고 th :errors ="*{ itemName }" 이거는 바인딩리절트에 담긴 에러 item의 itemName이라고 보면 되나요? 그리고 필드네임이 맞춰져있어서 쓸 수 있다는 강사님의 말이 th:field와 th:errors의 변수이름이 같다는 걸 의미하는건가요?
alrnr3521
2022-06-25T13:14:43.243Z
댓글 1
좋아요 6
조회수 950
미해결
운영체제 공룡책 강의
안녕하세요 교수님 좋은 강의 만들어주셔서 감사합니다. 자바 모니터 관련해서 궁금한게 있어 찾아보다가 이해가 잘안되어서 질문을 올려봅니다.. 자바에서 모든 객체는 모니터를 하나씩 가지고, 객체의 맴버변수에 스레드간 경합 없이 접근하기 위해서 synchronized 키워드를 사용해서 간접적으로 모니터를 사용하는것으로 이해했습니다. synchronized 를 매서드를 통해서 사용하는 경우 synchronized 매서드 안에서 임계구역에 접근 전에 위해 monitor에 있는 acquire을 호출해주고, 임계구역 연산 이후 release를 해주는것으로 알고있습니다. 이때 acquire안에서는 “조건변수(conditional variable)“의 wait을 호출해서 현재 임계구역에 있는 스레드의 작업이 끝날 때 까지 기다리고, release안에서는 “조건변수“의 signal을 호출해서 임계구역내에 작업을 끝마치고 대기큐에 있는 스레드를 깨워주는 것으로 이해했습니다. 여기서 질문이 있는데 조건변수(conditional variable)는 이 모니터가 속한 객체의 멤버변수 개수만큼 생기는걸까요? 아니면 synchronized 키워드의 개수만큼 조건변수가 생기는걸까요? (아니라면 멤버변수가 여러개면 각각 다르게 스레드의 대기큐를 만들어줘야 할것같은데 어떤식으로 처리되는지 궁금합니다) 공룡책 개정판 10의 307페이지에서 모니터안에 x, y 조건과 연관된 큐가 각각 부여되는거같은데, 여기서 x와 y는 어떤기준으로 만들어지는지 궁금합니다.
moniter conditionvariable 동시성 synchronized 운영체제 모니터 뮤텍스 세마포어
valentin123
2022-06-25T13:04:16.359Z
댓글 1
좋아요 0
조회수 712
미해결
수학으로부터 인류를 자유롭게 하라(기초대수학편)
커뮤니티는 답변 운영 안하시나요?
JH Sim
2022-06-25T12:56:38.867Z
댓글 0
좋아요 0
조회수 424