묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실습으로 손에 잡히는 SQLD의 정석(2과목)
55번 문제 질문이요
55번문제에 1번 보기는 중복때문에 안된다고 하셨는데 2번 보기도 중복이 존재 할 수 있는거 아닌가요?
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
nextjs 프리패칭
2.4) 프리페칭 강의 6분 44초 경의 화면입니다next js 같은 경우 유저가 이동할 가능성이 있는 페이지의 js bundle파일을 미리 서버로 부터 받아온다고 하셨는데만약 초기화면에서 링크 태그를 통해 페이지 이동이 일어나게 된다면1) 서버로부터 수화되기 전 html 파일을 받아와서 화면에 렌더링2) 프리페칭 받아온 js파일로 수화과정3) 상호 인터렉션 가능제가 이해한 과정이 이게 맞을 까요??만약 그렇다면 페이지 이동 시 html 파일은 서버로부터 기본적으로 매 번 불러오는 걸까요?🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨질문 하시기 전에 꼭 확인해주세요- 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다)- 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다)- 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢)질문 하실때 꼭 확인하세요- 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X)- 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지)- 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우)- 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요- 강의의 몇 분 몇 초 관련 질문인지 알려주세요!- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향 @OneToOne 조회에 대해 질문 있습니다.
@Entity public class Delivery { @Id @Column(name = "delivery_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(fetch = FetchType.LAZY, mappedBy = "delivery") private Order order; private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus status; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public DeliveryStatus getStatus() { return status; } public void setStatus(DeliveryStatus status) { this.status = status; } }@Entity @Table(name = "orders") public class Order { @Id @Column(name = "order_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Delivery getDelivery() { return delivery; } public void setDelivery(Delivery delivery) { this.delivery = delivery; } public LocalDateTime getOrderDate() { return orderDate; } public void setOrderDate(LocalDateTime orderDate) { this.orderDate = orderDate; } public OrderStatus getStatus() { return status; } public void setStatus(OrderStatus status) { this.status = status; } }public class Test2 { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); Delivery delivery = new Delivery(); delivery.setStatus(DeliveryStatus.READY); delivery.setAddress(new Address("city", "street", "zipcode")); em.persist(delivery); Order order = new Order(); order.setOrderDate(LocalDateTime.now()); order.setStatus(OrderStatus.ORDER); order.setDelivery(delivery); em.persist(order); // Order 에 fetch = FetchType.LAZY 설정 , delivery 실제 값 사용 { em.flush(); em.clear(); Order findOrder = em.find(Order.class, order.getId()); Delivery findDelivery = findOrder.getDelivery(); System.out.println("findDelivery : " + findDelivery.getStatus()); } tx.commit(); }finally { em.close(); } } }실행결과Hibernate: /* insert for com.mycom.myapp.ex.Delivery */insert into Delivery (city, street, zipcode, status) values (?, ?, ?, ?) Hibernate: /* insert for com.mycom.myapp.ex.Order */insert into orders (delivery_id, orderDate, status) values (?, ?, ?) Hibernate: select o1_0.order_id, o1_0.delivery_id, o1_0.orderDate, o1_0.status from orders o1_0 where o1_0.order_id=? Hibernate: select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from Delivery d1_0 where d1_0.delivery_id=? Hibernate: select o1_0.order_id, o1_0.delivery_id, o1_0.orderDate, o1_0.status from orders o1_0 where o1_0.delivery_id=? findDelivery : READY 강의에서 진행한 Order와 Delivery를 가지고 조회 테스트를 해봤습니다. 우선 Order와 Delivery를 양방향으로 OneToOne 관계를 설정했습니다. 그리고 둘다 각각 지연로딩으로 설정했습니다.em.flush(); em.clear(); Order findOrder = em.find(Order.class, order.getId()); Delivery findDelivery = findOrder.getDelivery(); System.out.println("findDelivery : " + findDelivery.getStatus());그리고 이 부분에 대해 아래와 같이 이해를 했습니다.맨처음 em.find()를 해서 Order에 대해 DB에 select문을 보냅니다. 이때 delivery와는 지연로딩이므로 추가 select가 발생하지 않습니다. 그리고 findDelivery.getStatus()); 에서 delivery의 실제 값을 사용하므로 이때 delviery에 대한 select문이 발생합니다. 정리하면 처음에는 order에 대한 select문 그리고 실제 delevery 값을 사용할때 delivery에 대한 select문 해서 총 두번의 select문이 발생할꺼라고 예상을 했습니다.근데 실제 실행결과를 보니 총 세번의 select문이 발생했습니다. 실행결과에서 첫번째 select문과 두번째 select문이 출력된거는 이해가 되는데 마지막 select문은 왜 발생했는지 모르겠습니다.
-
미해결
예제(2) 엑셀 파일이 안 읽어집니다..
package springbatch.batch.job.file; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.database.JpaItemWriter; import org.springframework.batch.item.database.builder.JpaItemWriterBuilder; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import springbatch.batch.chunk.processor.FileItemProcessor; import springbatch.batch.domain.Product; import springbatch.batch.domain.ProductVO; import javax.persistence.EntityManagerFactory; @Configuration @RequiredArgsConstructor public class FileJobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; private final EntityManagerFactory entityManagerFactory; @Bean public Job fileJob() { return jobBuilderFactory.get("fileJob") .start(fileStep1()) .build(); } @Bean public Step fileStep1() { return stepBuilderFactory.get("fileStep1") .<ProductVO, Product>chunk(10) .reader(fileItemReader(null)) .processor(fileItemProcessor()) .writer(fileItemWriter()) .build(); } @Bean @StepScope public FlatFileItemReader<ProductVO> fileItemReader(@Value("#{jobParameters['requestDate']}") String requestDate) { return new FlatFileItemReaderBuilder<ProductVO>() .name("flatFile") .resource(new ClassPathResource("product_" + requestDate +".csv")) .fieldSetMapper(new BeanWrapperFieldSetMapper<>()) .targetType(ProductVO.class) .linesToSkip(1) .delimited().delimiter(",") .names("id","name","price","type") .build(); } @Bean public ItemProcessor<ProductVO, Product> fileItemProcessor() { return new FileItemProcessor(); } @Bean public JpaItemWriter<Product> fileItemWriter() { return new JpaItemWriterBuilder<Product>() .entityManagerFactory(entityManagerFactory) .usePersist(true) .build(); } }application.ymlspring: profiles: active: mysql jpa: hibernate: ddl-auto: update database-platform: org.hibernate.dialect.MySQL5InnoDBDialect show-sql: true open-in-view: false properties: hibernate.format_sql: true --- spring: config: activate: on-profile: mysql datasource: hikari: jdbc-url: jdbc:mysql://localhost:3306/springbatch?useUnicode=true&character_set_server=utf8mb4 username: root password: ---- driver-class-name: com.mysql.cj.jdbc.Driver batch: job: names: ${job.name:NONE} enabled: false jdbc: initialize-schema: always pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>spring-batch</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-batch</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-batch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> <version>2.5.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>2.4.4</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>9.0.0</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>5.3.7</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.20</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> 잘 작성한거 같은데, 디버그 중단점 걸어놓아도 안걸러지네요ㅠㅠ 원인을 모르겠습니다..requestDate 부분이랑 fileItemReader이 동작을 안하는거 같습니다.
-
해결됨김영한의 실전 자바 - 기본편
상속 관계가 있는 인스턴스 생성시 메모리 구조가 궁금합니다.
[질문 내용]부모 클래스 Parent와 해당 클래스를 상속 받는 Child 클래스가 있다면 Parent 클래스의 인스턴스를 생성하면 해당 클래스를 상속받는 모든 자식 클래스도 같이 생성되는 것인가요?일전에 배우기로는 인스턴스 생성시 해당 인스턴스의 부모와 자식이 모두 같은 참조값 내부에 생성된다고 배웠습니다.혹시 자식 인스턴스를 생성했을 때만 부모가 모두 생성된다와 같은 사항이 있는건지 아니면 말 그대로 상속 관계에 있는 모든 인스턴스가 생성 되는건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest 실행함에 있어 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]application.ymlspring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show-sql: true format_sql: true logging.level: org.hibernate.SQL: debug # org.hibernate.type:trace org.hibernate.orm.jdbc.bind: tracebuild.gradleplugins { id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } group = 'jpabook' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") { } test { useJUnitPlatform() }MemberRepositoryTest.javapackage jpabook.jpashop; import jpabook.jpashop.Entity.Member; import jpabook.jpashop.Repository.MemberRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(SpringExtension.class) @SpringBootTest class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memberA"); //when Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); //then assertThat(findMember.getId()).isEqualTo(member.getId()); assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); System.out.println("findMember == member: " + (findMember == member)); } }테스트 실행 시 No matching tests found in any candidate test task. Requested tests: Test pattern jpabook.jpashop.Repository.MemberRepositoryTest in task :test* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.8/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 1s4 actionable tasks: 1 executed, 3 up-to-date오류가 발생합니다.
-
미해결초보자를 위한 IT 인프라의 이해
VLAN과 L3 스위치
안녕하세요. 강의 잘 듣고 있습니다.VLAN은 이더넷이라서 서로 다른 이더넷 네트워크, 서로 다른 브로드캐스트 이더넷 네트워크와의 트래픽을 넘기기 위해서 L3 스위치가 필요하다. 라고 말씀하셨는데 이더넷은 L2 계층인데 L3 스위치가 필요하다는 말씀이 이해가 안되서요.어떻게 이해하는게 좋을까요??
-
미해결
@RestControllerAdvice 전역 예외 클래스 관련 질문
안녕하세요 김영한님의 강의를 들으며 많은 지식을 얻고, 꾸준히 실력을 키워나가고 있는 주니어 백엔드 개발자입니다!개발 도중에, 전역 예외 클래스 관련 질문이 생겨 질문 드립니다. 현재 @RestControllerAdvice 어노테이션이 있는 전역 예외 클래스 중 일부 코드입니다.@ExceptionHandler(PersistenceException.class) public ResponseEntity<Object> handlePersistenceException(Exception ex, WebRequest request) { log.debug("handlePersistenceException : {}", ex.getMessage(), ex); // return ResponseEntity 로직 } @ExceptionHandler(Exception.class) public ResponseEntity<Object> handleAllException(Exception ex, WebRequest request) { log.debug("handleException : {}", ex.getMessage(), ex); // return ResponseEntity 로직 } */ 개발한 api를 테스트할 때, 비즈니스 로직단에서 로직을 수행하다 PersistenceException이 발생하면, 당연히, 둘 중 더 구체적인 예외인 @ExceptionHandler(PersistenceException.class)의 메소드가 동작해야한다고 생각을 했는데 최상단 예외인 @ExceptionHandler(Exception.class)이 붙은 메소드를 전체 주석 처리할 때에만 @ExceptionHandler(PersistenceException.class)의 메소드가 호출되어서 동작하고, @ExceptionHandler(Exception.class)의 주석을 다시 해제하면 @ExceptionHandler(Exception.class)의 메소드가 호출되어서 동작합니다.. 저는 @ExceptionHandler(Exception.class)에 주석이 있건, 없건 더 구체적인 예외가 우선순위로 호출되어야한다고 생각했는데.. 제가 잘못 생각한 부분이 있을까요? 아니면 혹시 구체적인 예외가 우선순위로 동작하는 건 맞으나 제가 놓친 부분이 있는 걸까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-G 와 백준 컴파일러에 대한 질문이 있습니다
https://www.acmicpc.net/source/82778585해당 풀이를 통해 정답을 맞혔는데요몇 가지 조건에 따라 오답과 정답이 나뉘는 현상이 있어서 이와 관련하여 강사님 의견을 여쭙고 싶습니다const int MAX 를 선언할 때 정수 크기에 따라 백준에 입력했을 때 결과가 다르게 나옵니다크게 차이나게 입력한 것은 아니고요200,000 이랑 200,002 를 입력해봤는데 200,002 은 정답이고, 200,000 은 오답으로 나오네요그리고 int n, k; 와 int visited[MAX], cnt[MAX]; 이 두 라인을 서로 변경했을 시 또 결과가 다르게 나옵니다int n, k; 를 나중에 선언해야 정답으로 나오더라구요그런데 int n, k; 를 먼저 선언해도 되는 경우가 있습니다int visited[MAX], cnt[MAX]; 이 부분에 MAX 뒤에 정수를 더해주면 int n, k; 를 먼저 선언해도 되었습니다아무리 고민해도 짐작 가는 부분이 없는데 강사님의 의견을 듣고 싶습니다
-
미해결설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
cs_server mismatch
1. 질문 챕터] :[FPGA 1장] 어렵다고 겁내지말고, 따라해보자 (FPGA 전체 Flow 경험). 13분 45초[2. 질문 내용] : cs_server mismatch오류로인한 auto connect 에러[3. 시도했던 내용, 그렇게 생각하는 이유] : 아마 Vivado 프로그램은 2024.1.1 버전이고 cs_server은 2024.2.0 버전이여서 버전 오류가 발생했다고 하는 것 같습니다. 이에 AMD사이트에서 검색한 결과set_param labtools.override_cs_server_version_check 1 코드를 Vivado_init.tcl 파일 안에 넣으라는데C:\Users\Gavin\AppData\Roaming\Xilinx\Vivado위와같은 경로에 있다는 해당 파일을C:\Users\user\AppData\Roaming\Xilinx\Vivado이렇게 경로를 다 따라 갔는데 못찾고있다는게 첫번째 문제입니다! 여기에서 Vivado_init.tcl파일을 어떻게 찾을지가 첫번째 질문입니다.두번째로 이 방법은 cs_server의 버전 확인을 무시하도록 설정하는 방식으로, 엄밀히 말하면 근본적인 해결책은 아니기에 cs_server와 Vivado 간의 완전한 호환성을 보장하지 않으며, 다른 문제가 발생할 수 있다는 경고를 봤는데 문제가없을지와 혹시 더 좋은 해결책이 있을 지 여쭤보고싶습니다.
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
오타 제보드려요!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]교안 "8. 생산자 소비자 문제 1" - 12 page - 3번째 줄"임계 영역은 synchronized를 영역을 뜻한다."-> "임계 영역은 synchronized를 적용한 영역을 뜻한다.""적용한"이 빠져서 다음 업데이트 때 반영되면 좋을 것 같아 남깁니다.좋은 강의 항상 감사드립니다 영한님! :)
-
미해결
다커 문의드립니다.
오늘 처음 장고를 접하고 있습니다.섹션 2에서 다커 환경설정이 있습니다.다커가 나와 장고 익히기가 어렵게 느껴져 질문 드립니다. 섹션 2의 "[Optional] 다커(Docker)를 사용한 Django 환경 만들기", "[Optional] 다커 환경 Window에서 설치하기" 를 반드시 따라해야 하는건지, Optional 단어처럼 다커 사용안해도 될까요? 다커 사용하지 않고 따라 해보고 싶습니다. 2. 섹션 2의 세번째 강의 "[Django Project(프로젝트) 만들어보기"는 다커를 사용하고 있습니까? 3. 다커 사용하지 않아도 될 경우, 장고 설치는 어떻게 합니까? 초보라,, 답변 부탁드립니다.
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
Flat type에서 ReadonlyArray 타입을 사용하는 이유?
FlatArray 타입에서 recur 를 할때, Arr extends Array가 아닌 Arr extends ReadonlyArray 로 한 이유가 궁금합니다. 그냥, Readonly array라는것을 다른 사람에게 명시하는 정도의 사용일까요?type FlatArray<Arr, Depth extends number> = { done: Arr; recur: Arr extends ReadonlyArray<infer InnerArr> ? FlatArray<InnerArr, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]> : Arr; }[Depth extends -1 ? "done" : "recur"];
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-Q 질문있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.go 함수에서 계속 탐색을 하다가 처음으로 1을 만나면 그 좌표를 넣고 멈추게 되면 가장자리에 있는 모든 1의 좌표가 v에 담기는게 아니라 그냥 처음으로 만난 좌표 1개만 v에 담기게 되는거 아닌가요? 어떻게 go 함수가 지울 모든 치즈 좌표가 담기게 되는지 이해가 안 됩니다..ㅜ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
java.lang.NullPointerException: Cannot invoke "java.util.Optional.ifPresent(java.util.function.Consumer)" because the return value of "..."is null
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 회원테스트 기술 부분을 학습하고있는데 테스트케이스 오류가 났습니다 어떻게 해결해야할지 몰라 질문글을 적었습니다아래는 테스트 코드입니다import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; class MemberServiceTest { MemberRepository memberRepository = new MemoryMemberRepository(); MemberService memberService = new MemberService(); //테스트는 과감하게 한글로 작성 가능 //테스트할땐 given,when,then 틀 사용 @Test void 회원가입() { //given Member member = new Member(); member.setName("hello"); //when Long saveId = memberService.join(member); //then Member findMember = memberService.findOne(saveId).get(); org.assertj.core.api.Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test void findMembers() { } @Test void findOne() { } }그리고 MemberService코드입니다package hello.hello_spring.service; import hello.hello_spring.domain.Member; import hello.hello_spring.repository.MemberRepository; import hello.hello_spring.repository.MemoryMemberRepository; import java.util.List; import java.util.Optional; public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); /*회원가입*/ public Long join(Member member){ validateDuplicateMember(member); //중복회원검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member){ memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalArgumentException("이미 존재하는 회원입니다"); }); } /*전체회원 조회*/ public List<Member> findMembers() { return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId){ return memberRepository.findById(memberId); } }아래는 오류 메시지 입니다java.lang.NullPointerException: Cannot invoke "java.util.Optional.ifPresent(java.util.function.Consumer)" because the return value of "hello.hello_spring.repository.MemberRepository.findByName(String)" is nullat hello.hello_spring.service.MemberService.validateDuplicateMember(MemberService.java:22)at hello.hello_spring.service.MemberService.join(MemberService.java:15)at hello.hello_spring.service.MemberServiceTest.회원가입(MemberServiceTest.java:24)at java.base/java.lang.reflect.Method.invoke(Method.java:568)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)Process finished with exit code -1 어떻게 해결하면 좋을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
order.cancel();의 더티체킹에 대해 질문 있습니다.
@Entity @Getter @Setter @DiscriminatorColumn(name = "dtype") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public abstract class Item { @Id @Column(name = "item_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List<Category> categories = new ArrayList<>(); //== 비즈니스 로직 ==// public void addStock(int quantity) { this.stockQuantity += quantity; } public void removeStock(int quantity) { int restStock = this.stockQuantity - quantity; if (restStock < 0) { throw new NotEnoughStockException("need more stock"); } this.stockQuantity = restStock; } }@Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class OrderItem { @Id @Column(name = "order_item_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Item item; private int orderPrice; private int count; //==생성 메서드==// public static OrderItem createOrderItem(Item item, int orderPrice, int count) { OrderItem orderItem = new OrderItem(); orderItem.setItem(item); orderItem.setOrderPrice(orderPrice); orderItem.setCount(count); item.removeStock(count); return orderItem; } //==비즈니스 로직==// /* * 재고 수량을 복구한다. * */ public void cancel() { getItem().addStock(count); } //==조회 로직==// public int getTotalPrice() { return getOrderPrice() * getCount(); } }@Entity @Getter @Setter @Table(name = "orders") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @Column(name = "order_id") @GeneratedValue(strategy = GenerationType.IDENTITY) 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 LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; //== 연관관계 메서드 ==// public void addMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void addDelivery(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); order.setOrderDate(LocalDateTime.now()); 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() { int totalPrice = 0; for (OrderItem orderItem : orderItems) { totalPrice += orderItem.getTotalPrice(); } return totalPrice; } }@Service @Transactional(readOnly = true) @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; private final MemberRepository memberRepository; private final ItemRepository itemRepository; // 주문 @Transactional public Long order(Long memberId, Long itemId, int count) { // 엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); // 배송정보 생성 Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); // 주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count); // 주문 생성 Order order = Order.createOrder(member, delivery, orderItem); // 주문 저장 orderRepository.save(order); return order.getId(); } // 취소 @Transactional public void cancelOrder(Long orderId) { Order order = orderRepository.findOne(orderId); order.cancel(); } // 검색 // public List<Order> findOrders() { // return orderRepository.f // } }OrderService에서 cancelOrder()을 할 경우 @Transactional에 의해 자동으로 트랜잭션을 시작하고 커밋을 보내고 커밋을 보낼때 플러시가 발생하고 더티체킹이 발생해 직업 update를 안해도 알아서 update 쿼리가 날라가는 부분에 대해서는 이해를 했습니다.궁금한 부분은 현재 Order order = orderRepository.findOne(orderId); 를 통해 order 엔티티만 조회 했으니 영속성 컨텍스트에는 order 엔티티만 존재하므로 Item 엔티티는 영속성 컨텍스트에 없는데 어떻게 더티체킹에 들어갈까가 저의 의문입니다.이 부분에 대해서 아래와 같이 생각해봤는데 맞게 생각한건지 궁금합니다. 잘못된 부분에 대해서 알려주시면 감사하겠습니다.order.cancel();의 cancel() 메서드를 보면 orderItem.cancel(); 부분이 존재한다.orderItem.cancel() 의 cancel() 메서드를 보면 getItem().addStock(count); 부분이 존재한다.여기서 getItem()을 사용해서 (현재 Order와 OrderItem은 지연로딩 관계) 실제 orderItem 값을 사용하므로 DB에서 orderItem 엔티티를 조회해서 영속성 컨텍스트에 저장한다.다시 orderItem.cancel() 의 cancel() 메서드에서 addStock(count) 메서드를 들어가 보면 Item의 addStock() 메서드로 이동한다. 여기서 this.stockQuantity += quantity; 를 통해 Item의 실제 값을 사용하므로 Item 엔티티도 DB에서 조회해서 영속성 컨텍스트에 저장한다.결과적으로 OrderService의 cancelOrder() 메서드에서 order.cancel();가 호출되면 Item과 OrderItem 엔티티도 영속성 컨텍스트에 저장되서 더티체킹 범위에 들어가게 된다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러매핑
이전에 V5예시에서 URL에 대한 핸들러 매핑은 객체가 된것을 확인할 수 있습니다 @Controller public class SpringMemberFormControllerV1 { @RequestMapping("/springmvc/v1/members/new-form") public ModelAndView process() { return new ModelAndView("new-form"); . } }이후 스프링 MVC에서 RequestMappingHandlerMapping은 스프링 중에서 @RequestMapping또는 @Controller가 클래스 레밸에 붙어 있는 경우에 매핑 정보로 인식한다라고 하셨는데 그렇다면 URL 정보가 스프링빈(객체)로 매핑되는것이 핸들러 매핑이 되는 것인가요?? @RequestMapping이 클래스 단위가 아니라 메서드 단위에 적용된다는 것은 핸들러 어뎁터조회, 핸들러 어뎁터 실행이 끝나고 실제 핸들러가 실행되는 부분이라고 이해했습니다..
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
세션1이 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다는 의미
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 아래는 강의 자료에 있는 내용입니다.------------------------------------------세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터 를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다.------------------------------------------ money=10000인 상태에서 세션1이 money를 5000으로 바꾼다고 하더라도 커밋을 하지 않는다면, 세션2가 보고 있는 money는 여전히 10000인 거고 10000에 접근하는 거 맞나요? 그렇다면 세션1이 롤백을 하더라도 세션2은 기존 10000을 수정하고 있는 거니 잘못된 데이터를 수정하는 건 아니지 않나요? 위에 굵게 표시한 부분 어떤 의미인지 궁금합니다. 아니면 위에 있는 설명은 커밋되지 않는 데이터에 접근하는 경우라고 가정하는 건가요?
-
미해결
백엔드 개발자에게 가장 우선시되는 능력은?
자바언어를 중심으로 백엔드 개발자로 취직을 목표로 잡고자합니다. 현재 국비지원을 이수중이면 자바로 코딩테스트를 풀던 중 한계가 느껴져 이 사이트를 찾게되었는데 백엔드 개발자는 자바, sql, https , 자바 스프링부트 배울게 너무 많아 어느것을 중심으로 학습을 수강해야할지 궁금합니다
-
미해결김영한의 실전 자바 - 중급 2편
강의 질문
안녕하세요. 김영한 선생님 모든 강의중에서 재귀함수에 대해서 다뤄주시는 곳이 있을까요 ?