묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결엑셀 활용하기 : EXCEL 중급 (Inflearn Original)
파워쿼리 웹스크래핑이 안돼요!
선생님 웹스크래핑을 하려고 하는데, 선생님께서 수업 중에 설명해주신 것과 다른 창이 뜨고, 거기에다 주소를 입력해서 가져오기 하려고 하는데 작업이 되지 않아요! 도와주세요~~
-
미해결스프링 핵심 원리 - 기본편
memberRepository 3개다 같은 참조값으로 나와야하는데 다른 참조값
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 다른 코드들 다 똑같이 작성했는데 memberRepository, 1, 2 모두다 다른 참조값으로 출력이 됩니다. 이렇게 되면 어디쪽에서 문제가 발생한걸까요?
-
미해결스프링부트 시큐리티 & JWT 강의
13:23 system.out 출력문이 다르게 나옵니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 내용처럼 userDetails : User(id=1, username=ssar, , 이렇게 뜨지 않고 아래와 같이 출력됩니다.userDetails : com.myproject.BasicBoard.entity.User@2c6c7d57 getDetails.getUser() authentication 출력문도 마찬가지입니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jpa 1:N insert시 트랜잭션 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Entity @Table(name = "tb_board") @NoArgsConstructor(access = AccessLevel.PUBLIC) @Getter @Setter public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "BOARD_ID", columnDefinition = "BIGINT COMMENT '게시판ID'") private Long id; @Column(name = "BOARD_NM", nullable = false, unique = true, length = 100, columnDefinition = "VARCHAR(100) COMMENT '게시판명'") private String boardNm; @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) private List<Article> articleList = new ArrayList<Article>(); @Builder private Board(Long boardId, String boardNm) { this.boardNm= boardNm; this.id = boardId; } public Board createBoard(Long boardId, String boardNm) { return Board.builder().boardId(boardId).boardNm(boardNm).build(); } public void addArticle(Article article) { this.articleList.add(article); } @Column(name="REG_ID" ,nullable=false,columnDefinition="VARCHAR(100) comment '등록자'") private String regId; @Column(name = "CREATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createdAt; @Column(name="UPD_ID" ,nullable=false,columnDefinition="VARCHAR(100) comment '등록자'") private String updId; @Column(name = "UPDATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime updatedAt; } @Entity @Table(name = "tb_article") @Builder @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ARTICLE_ID", columnDefinition = "BIGINT COMMENT '게시글ID'") private Long id; @Column(name = "ARTICLE_TITLE", columnDefinition = "VARCHAR(100) COMMENT '게시글제목'") private String title; @Column(name = "ARTICLE_CONTENT", columnDefinition = "VARCHAR(600) COMMENT '게시글내용'") private String content; @Column(name = "REG_ID", nullable = false, columnDefinition = "VARCHAR(100) comment '등록자'") private String regId; @Column(name = "CREATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createdAt; @Column(name = "UPD_ID", nullable = false, columnDefinition = "VARCHAR(100) comment '등록자'") private String updId; @Column(name = "UPDATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime updatedAt; @ManyToOne @JoinColumn(name = "BOARD_ID", nullable = false) private Board board; } @Transactional(rollbackFor = Exception.class) // 체크 예외도 롤백 public void saveArticle(Article article) { try { log.info("article",article.getTitle()); Long boardId = 13L; Board paramBoard = null; Optional<Board> rBoard = boardRepository.findById(boardId); if(rBoard.isPresent()) { paramBoard =rBoard.get(); }else { paramBoard = new Board().createBoard(boardId, "게시판"); paramBoard = boardRepository.save(paramBoard); } Article paramArticle = Article.builder() .title(article.getTitle()) .content(article.getContent()) .regId("등록자") .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) .board(paramBoard) .updId("수정자") .build(); if(paramBoard.getArticleList() == null) { List<Article> articles =new ArrayList<Article>(); articles.add(paramArticle); paramBoard.setArticleList(articles); }else { paramBoard.getArticleList().add(paramArticle); } boardRepository.save(paramBoard); }catch(Exception ex) { log.error("Error saving article", ex); throw ex; } }else { paramBoard = new Board().createBoard(boardId, "게시판"); paramBoard = boardRepository.save(paramBoard); } 여기서 save를 돌떄 org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.backend.com.entity.Board#13] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:325) ~[spring-orm-6.2.2.jar:6.2.2] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) ~[spring-orm-6.2.2.jar:6.2.2] 요런식으로 뜨는데public interface BoardRepository extends JpaRepository<Board, Long>, QuerydslPredicateExecutor<Board> { Optional<Board> findById(Long boardId); } querydsl과 jpa같이 사용하고싶어서 요렇게 셋팅하고 공부중입니다. 해본 방법boardRepository.save(paramBoard) 부분을 빼고 마지막boardRepository.save(paramBoard); 만 돌려봤지만 마찬가지 에러가 발생했었고 혹시 table 쪽에 lock이 걸려있나 싶어서 보니 lock도 없었음3. 지피티 한테 물어보니깐 @Lock(LockModeType.PESSIMISTIC_WRITE)쓰라고 해서 save쪽에 넣어봄 . 마찬가지 ..Board쪽에 @Version @Column(name = "version") private Long version;을 추가하라고 해서 추가해봐도 마찬가지 ..이유는 "Row was updated or deleted by another transaction" 오류는 동시에 여러 트랜잭션에서 동일한 데이터를 수정하거나 삭제할 때 발생할 수 있습니다. 즉, 한 트랜잭션에서 데이터를 수정하는 동안 다른 트랜잭션에서 동일한 데이터를 수정하거나 삭제했기 때문에 충돌이 발생하는 것이라는데 잘 모르겠습니다 뭐가 문제일까요 .
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
테스트 실행 시 "ClassNotFoundException" 에러
테스트 실행 시 "ClassNotFoundException" 에러 나시는 분들은 https://bit.ly/4hIOchi 이 글 한번 참고해보세요. 이 글 보고 해결했습니다.
-
미해결
JPA insert 에러 transaction 질문입니다.
import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Entity @Table(name = "tb_board") @NoArgsConstructor(access = AccessLevel.PUBLIC) @Getter @Setter public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "BOARD_ID", columnDefinition = "BIGINT COMMENT '게시판ID'") private Long id; @Column(name = "BOARD_NM", nullable = false, unique = true, length = 100, columnDefinition = "VARCHAR(100) COMMENT '게시판명'") private String boardNm; @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) private List<Article> articleList = new ArrayList<Article>(); @Builder private Board(Long boardId, String boardNm) { this.boardNm= boardNm; this.id = boardId; } public Board createBoard(Long boardId, String boardNm) { return Board.builder().boardId(boardId).boardNm(boardNm).build(); } public void addArticle(Article article) { this.articleList.add(article); } @Column(name="REG_ID" ,nullable=false,columnDefinition="VARCHAR(100) comment '등록자'") private String regId; @Column(name = "CREATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createdAt; @Column(name="UPD_ID" ,nullable=false,columnDefinition="VARCHAR(100) comment '등록자'") private String updId; @Column(name = "UPDATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime updatedAt; }@Entity @Table(name = "tb_article") @Builder @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ARTICLE_ID", columnDefinition = "BIGINT COMMENT '게시글ID'") private Long id; @Column(name = "ARTICLE_TITLE", columnDefinition = "VARCHAR(100) COMMENT '게시글제목'") private String title; @Column(name = "ARTICLE_CONTENT", columnDefinition = "VARCHAR(600) COMMENT '게시글내용'") private String content; @Column(name = "REG_ID", nullable = false, columnDefinition = "VARCHAR(100) comment '등록자'") private String regId; @Column(name = "CREATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createdAt; @Column(name = "UPD_ID", nullable = false, columnDefinition = "VARCHAR(100) comment '등록자'") private String updId; @Column(name = "UPDATED_AT", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime updatedAt; @ManyToOne @JoinColumn(name = "BOARD_ID", nullable = false) private Board board; } @Transactional(rollbackFor = Exception.class) // 체크 예외도 롤백 public void saveArticle(Article article) { try { log.info("article",article.getTitle()); Long boardId = 13L; Board paramBoard = null; Optional<Board> rBoard = boardRepository.findById(boardId); if(rBoard.isPresent()) { paramBoard =rBoard.get(); }else { paramBoard = new Board().createBoard(boardId, "게시판"); paramBoard = boardRepository.save(paramBoard); } Article paramArticle = Article.builder() .title(article.getTitle()) .content(article.getContent()) .regId("등록자") .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) .board(paramBoard) .updId("수정자") .build(); if(paramBoard.getArticleList() == null) { List<Article> articles =new ArrayList<Article>(); articles.add(paramArticle); paramBoard.setArticleList(articles); }else { paramBoard.getArticleList().add(paramArticle); } boardRepository.save(paramBoard); }catch(Exception ex) { log.error("Error saving article", ex); throw ex; } }else { paramBoard = new Board().createBoard(boardId, "게시판"); paramBoard = boardRepository.save(paramBoard); } 여기서 save를 돌떄 org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.backend.com.entity.Board#13] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:325) ~[spring-orm-6.2.2.jar:6.2.2] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) ~[spring-orm-6.2.2.jar:6.2.2] 요런식으로 뜨는데해본 방법boardRepository.save(paramBoard) 부분을 빼고 마지막boardRepository.save(paramBoard); 만 돌려봤지만 마찬가지 에러가 발생했었고 혹시 table 쪽에 lock이 걸려있나 싶어서 보니 lock도 없었음3. 지피티 한테 물어보니깐 @Lock(LockModeType.PESSIMISTIC_WRITE)쓰라고 해서 save쪽에 넣어봄 . 마찬가지 ..Board쪽에 @Version @Column(name = "version") private Long version;을 추가하라고 해서 추가해봐도 마찬가지 ..이유는 "Row was updated or deleted by another transaction" 오류는 동시에 여러 트랜잭션에서 동일한 데이터를 수정하거나 삭제할 때 발생할 수 있습니다. 즉, 한 트랜잭션에서 데이터를 수정하는 동안 다른 트랜잭션에서 동일한 데이터를 수정하거나 삭제했기 때문에 충돌이 발생하는 것이라는데 잘 모르겠습니다 뭐가 문제일까요 .public interface BoardRepository extends JpaRepository<Board, Long>, QuerydslPredicateExecutor<Board> { Optional<Board> findById(Long boardId); } querydsl과 jpa같이 사용하고싶어서 셋팅한거 입니다.
-
미해결한 입 크기로 잘라먹는 Next.js(v15)
백엔드 서버 수행시 prisma engine을 설치할수가 없습니다.
사내 환경에서 외부 인터넷은 프록시를 통해 접속 가능합니다.백엔드 서버 구축시 npm install 수행시 prisma engine을 다운로드 받을수 없다는 메시지가 나옵니다. Downloading Prisma engines for Node-API for windows [ ] 0%Error: request to https://binaries.prisma.sh/all_commits/acc0b9dd43eb689cbd20c9470515d719db10d0b0/windows/schema-engine.exe.sha256 failed, reason: 엔진을 수작업으로 다운로드 받아 참조 할수 있는 방법이 없을까요
-
해결됨Git & GitHub, 원리부터 차근차근 - 근본깃 [완성편]
cd myproject
taehyeonkoo@TaeHyeonui-MacBookPro ~ % cd myProjectcd: no such file or directory: myProjecttaehyeonkoo@TaeHyeonui-MacBookPro ~ % cd ~/데스크탑cd: no such file or directory: /Users/taehyeonkoo/데스크탑taehyeonkoo@TaeHyeonui-MacBookPro ~ % cd ~/Desktoptaehyeonkoo@TaeHyeonui-MacBookPro Desktop % cd myprojectcd: no such file or directory: myprojecttaehyeonkoo@TaeHyeonui-MacBookPro Desktop % cd projectstaehyeonkoo@TaeHyeonui-MacBookPro projects % cd myProjecttaehyeonkoo@TaeHyeonui-MacBookPro myProject % 처음 명령어 cd myProject 를 치면 바로 안나오는데 정상인가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 엔티티 관련하여 질문 드립니다.
제공 해주신 코드에서 ITEM에는 왜 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); 이거에 해당하는 코드가 없을까요?@OneToMany(mappedBy = "item", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); 이런 코드가 있어야 1대 다 관계에서 매핑과 주인관계를 결정해줄 수 있지 않나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@transactional repository or service
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@transactional을 repository가 아닌 service에 다는 이유가 궁금합니다. transaction 단위가 단순히 db와 왔다갔다하는 것이 아니라, 하나의 비지니스 로직을 의미하기 때문일까요(transaction의 개념을 잘 몰라서 헷갈리는 듯 합니다.)
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "기본편"
이벤트 처리 부분 강의 실습
강의들으면서 @keyup 이벤트가 강의 내용처럼 안먹네요. keyup이벤트는 키가 눌려졌다가 올라간뒤 실행하는 걸로 아는데요. 이상하게 실행이 안됩니다. 백스페이스나 엔터키는 또 먹습니다. 이벤트가 먼가 다르게 동작되는 느낌입니다.콘솔 상엔 에러는 없고, 그냥 abcd같은 일반키는 keyup이벤트가 안먹네요.이유가 뭘까요?
-
미해결
보통 검증이 필요한 대상은 요구사항으로 전달되나요 ?
예를 들어 "사용자가 서류를 제출하면 그에 맞는 금액을 통장으로 넣어준다" 라는 기능이 있을 때, 사용자가 서류를 제출했는지 확인 금액은 최소 1000원 이상이어야 한다. 사용자 명의의 통장이 존재하는지 확인. 등과 같은 검증 대상은 회사에선 요구사항으로 전달되나요? 프로젝트 진행할 때 개인적으로 어려운 부분이이런 검증 대상을 추출하는 것과 에러 메시지 작성하는 부분이거든요 ㅠㅠ 혹시 보편적으로 통용되는 검증 종류가 (ex 돈을 다룬다면 ~~는 꼭 검증해야한다) 따로 있는지,아니면 그냥 회사 다니면서 경험치 쌓으면서 배우면 되는건지 궁금합니다 ㅠ ㅠ
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
27분에서 헤더 파일에서 #include 이유
헤더에서 상호 참조 또는 컴파일이 오래걸리는 것을 방지하려고 class로 전방선언하여 작업하는 것으로 이해하고 따라하고있는데, 여기서는 헤더에서 클래스를 include하여 작업하는 이유는 무엇일까요?
-
해결됨QGIS 입문자 올인원 스타터팩 (이론/실습형)
라인 길이 측정 끄는 방법 문의
안녕하세요. 버퍼 반경 측정 시 '라인 길이 측정'(줄자 아이콘)을 사용하여 반경을 측정하는데, 측정 후 어떻게 끄는 건가요? esc를 클릭하거나 아이콘을 클리하는 것으로는 끄지를 못하겠네요.
-
해결됨카프카 완벽 가이드 - ksqlDB
Compact Topic에 대하여
안녕하세요 항상 좋은 강의 해주셔서 감사합니다.다름이 아니라 제가 프로젝트 중에 유저가 알림 설정한 데이터를 kafka로 받아서 시세 데이터와 조인하여알림 메세지를 생성하려고합니다. 유저 알림 데이터는 boolean값을 가진 활성화여부와 삭제라는 기능이있습니다.그래서 kafka내에서 유저 알림 데이터를 최신화하기 위해서 찾아본 결과 compact topic이라는것을 발견하였고 실습중에 있습니다만 결과가 좋지않아서 질문드립니다.sudo docker exec -it kafka-1 kafka-topics --create --bootstrap-server 192.168.56.101:29092 --topic user-alert-set --partitions 6 --replication-factor 2 --config "cleanup.policy=compact" --config "min.compaction.lag.ms=5000" --config "max.compaction.lag.ms=10000 " --config "delete.retention.ms=3000" --config "segment.ms=3000" --config "min.cleanable.dirty.ratio=0.01"이런식으로 토픽을 생성하여 실습한 결과1. Key A: value1 넣음 -> [A:value1] 2. Key A: value2 넣음 -> [A:value1, A:value2] 3. Key B: value1 넣음 -> [ A:value2, B:value1] 4. Key B: value2 넣음 -> [A:value2, B:value1, B:value2]이렇게 진행되었습니다. 삭제를 위한 tombstone메세지 또한 위와같은 형식으로 진행되었습니다.제가 이해한 바로는 같은 키의 값이 들어오면 들어온 값으로 최신화 혹은 삭제를 하는 설정으로 이해를 해서이 결과가 저는 이해가 되지않습니다. gpt한테 물어보니 로그 컴팩션은 "head"와 "tail" 두 부분으로 나뉩니다:Tail: 이미 컴팩션이 완료된 부분 (깔끔한 상태)Head: 아직 컴팩션되지 않은 활성 부분 (더티 상태)예시:1. A:value1 입력 -> [A:value1] 2. A:value2 입력 -> [A:value1, A:value2] (컴팩션 발생) -> [A:value2] // A는 tail 부분으로 이동 3. B:value1 입력 -> [A:value2, B:value1] // B는 head 부분에 위치 즉, A는 이미 컴팩션되어 tail 부분에 최신 값만 있고, B는 아직 head 부분에 있어서 컴팩션되지 않은 상태로 남아있는 것입니다.이는 정상적인 동작이며, B도 시간이 지나면 컴팩션될 것입니다.라는 답변을 받았지만 시간이 지나도 키가 B인 데이터는 여전히 두개로 남아있었습니다.혹시 이유를 아신다면 설명해주시면 감사하겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다 페치 조인 데이터 뻥튀기
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의에서 컬렉션을 페치 조인했을때 컬렉션의 요소 만큼 결과 리스트가 증가한다 하였습니다. 하지만 아래와 같이 코드를 실행했는데 결과는 한번만 출력이 됩니다.찾아보니 JPA에서 내부적으로 중복을 없애준다는데 맞는 이야기 인가요??package jpashop.jpql; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; import jakarta.persistence.Persistence; import java.util.List; public class Main { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); //트랜잭션 생성 EntityTransaction tx = em.getTransaction(); //트랜잭션 시작 tx.begin(); try { Team teamA=new Team(); teamA.setName("팀A"); em.persist(teamA); Team teamB=new Team(); teamB.setName("팀B"); em.persist(teamB); Member member1=new Member(); member1.setUsername("member1"); member1.setAge(10); member1.setTeam(teamA); em.persist(member1); Member member2=new Member(); member2.setUsername("member2"); member2.setTeam(teamA); member2.setAge(15); em.persist(member2); Member member3=new Member(); member3.setUsername("member3"); member3.setTeam(teamB); member3.setAge(20); em.persist(member3); em.flush(); em.clear(); String query="select t From Team t join fetch t.members where t.name='팀A'"; List<Team> result = em.createQuery(query, Team.class) .getResultList(); for (Team t:result){ System.out.println("member= " +t.getName()+"|members="+t.getMembers().size()); for (Member m:t.getMembers()){ System.out.println("- member ="+m); } } tx.commit(); }catch (Exception e){ e.printStackTrace(); tx.rollback(); }finally { em.close(); } emf.close(); } } String query="select t From Team t join fetch t.members";String query="select t From Team t"; 두 결과 사이즈를 찍어도 동일하게 2가 나옵니다.
-
미해결해외 빅테크 코딩 인터뷰: LeetCode 포기자의 합격 공부법
Mock Interview
마지막에 mock interview를 chatgpt를 가지고 하신것 같은데, 혹시 어떤 prompt를 사용하셨는지 공유해 주실 수 있나요?
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Redis vs Memcached
안녕하세요. 강의 잘 듣고 있습니다!현재 개인 프로젝트에 Redis를 적용해보려고 합니다.구현하려는 기능은 주식 가격 요청 API로, 동일한 주식 종목을 여러 번 호출했을 때 캐시에서 값을 가져오는 로직입니다.Redis 외에도 Memcached라는 인메모리 캐시 서버가 있는데, 이 두 가지 서버 중 어떤 기준으로 선택하는 것이 좋을지 고민입니다.기술을 선택할 때, 근거를 명확히 하는 연습을 하는 것이 중요한가요?예를 들어, Redis는 리스트, 셋, 해시, 정렬된 셋 등 다양한 데이터 구조를 지원하고, 영속성 기능도 제공하는데, 이런 이유로 Redis를 선택해야 한다고 말할 수 있을까요?제가 구현하는 기능은 단순 조회 기능이라 Memcached도 적합할 수 있을 것 같지만, 이를 다른 사람들에게 설득할 근거와 이유는 어떻게 제시하는 것이 좋을까요?
-
미해결[2024년 개정]이것이 진짜 한글자동화다[기본편]
3:53부터 막혀요
3:53 부터 막혀요...
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
12.11 오류 관련
강의 19:07까지 따라하다가 오류가 갑자기 많이 뜨는데 어디에서 잘못된 것인지 모르겠습니다...DiaryList.jsximport "./DiaryList.css"; import Button from "./Button"; import DiaryItem from "./DiaryItem"; const DiaryList=({data})=>{ return <div className="DiaryList"> <div className="menu_bar"> <select> <option value={"latest"}>Newest</option> <option value={"oldest"}>Oldest</option> </select> <Button text={"write new diary"} type={"POSITIVE"} /> </div> <div className="list_wrapper"> {data.map((item)=><DiaryItem key={item.id} {...item}/>)} </div> </div>; }; export default DiaryList;DiaryItem.jsximport {getEmotionImage} from "../util/get-emotion-image"; import Button from "./Button"; import "./DiaryItem.css"; const DiaryItem=({id,emotionId,createdDate,content})=>{ return (<div className="DiaryItem"> <div className={`img_section img_section_${emotionId}`}> <img src={getEmotionImage(emotionId)}/> </div> <div className="info_section"> <div className="created_date"> {new Date(createdDate).toLocaleDateString()}; </div> <div className="content">{content}</div> </div> <div className="button_section"> <Button text={"수정하기"} /> </div> </div> ); }; export default DiaryItem;App.jsximport './App.css' import{useReducer,useRef,createContext} from "react"; import {Routes,Route} from "react-router-dom"; import Home from "./pages/Home"; import Diary from "./pages/Diary"; import New from "./pages/New"; import Edit from "./pages/Edit"; import Notfound from "./pages/Notfound"; const mockData=[ { id:1, createdDate:new Date("2025-02-18").getTime(), emotionId:1, content:"1번 일기 내용", }, { id:2, createdDate:new Date("2025-02-17").getTime(), emotionId:2, content:"2번 일기 내용", }, { id:3, createdDate:new Date("2025-01-15").getTime(), emotionId:3, content:"3번 일기 내용", }, ]; function reducer(state,action){ switch(action.type){ case "CREATE": return [action.data,...state]; case "UPDATE": return state.map((item)=> String(item.id)===String(action.data.id) ?action.data : item ); case "DELETE": return state.filter( (item)=>String(item.id)!==String(action.id) ); default: return state; } } export const DiaryStateContext=createContext(); export const DiaryDispatchContext=createContext(); function App() { const [data,dispatch]=useReducer(reducer,mockData); const idRef=useRef(3); //새로운 일기 추가 const onCreate=(createdDate,emotionId,content)=>{ dispatch({ type:"CREATE", data:{ id: idRef.current++, createdDate, emotionId, content, }, }); }; //기존 일기 수정 const onUpdate =(id,createdDate,emotionId,content)=>{ dispatch({ type:"UPDATE", data: { id, createdDate, emotionId, content, }, }); }; //기존 일기 삭제 const onDelete=(id)=>{ dispatch({ type:"DELETE", id, }); }; return ( <> <DiaryStateContext.Provider value={data}> <DiaryDispatchContext.Provider value={{ onCreate, onUpdate, onDelete, }} > <Routes> <Route path="/" element={<Home />} /> <Route path="/new" element={<New />} /> <Route path="/diary/:id" element={<Diary />} /> <Route path="/edit/:id" element={<Edit />} /> <Route path="*" element={<Notfound />} /> </Routes> </DiaryDispatchContext.Provider> </DiaryStateContext.Provider> </> ); } export default App