설명중에 @Version 필드를 낙관적 락에서 이용할 수 있어가지고~ 라고 하셧는데 실제 돌려보니 비관적락 2에도 DB 업데이트가 되었습니다. AI 에게 물어보니 @Version 어노테이션이 붙은 필드는 JPA 사용시 @Lock 어노테이션 사용여부 상관없이 업데이트가 된다고 합니다. 혹 다른 qna 에도 같은 내용이 있는지 확인은 모두 안해 보았습니다. ======================== 응, 같은 엔터티 row에 실제 UPDATE 가 나가면 @Version 필드는 증가한다고 보면 돼. 락 방식이 낙관적이든 비관적이든 핵심은 이거야. @Version private Long version; 이 필드가 있는 엔터티가 dirty checking으로 변경 감지 되고, flush/commit 때 UPDATE 대상이 되면 JPA/Hibernate가 version 값을 같이 갱신해. ========================
안녕하세요. 우선 좋은 강의 제작해주신 토비님께 항상 감사하고 있어요. 이제 배운지 1년된 왕초보입니당.. 혼자 배워보면서 개인 프로젝트를 만들고 있는데 JPA를 사용하고 있어요. 제가 궁금한 것이... N+1 관련한 문제입니다. 아 일단 프로젝트 주제는 복식부기 가계부에요. @Entity ... public class Journal extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "ledger_id", nullable = false, updatable = false) @OnDelete(action = OnDeleteAction.CASCADE) private Ledger ledger; ... @OneToMany(mappedBy = "journal", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) private List<EntryLine> entries = new ArrayList<>(2); ... public EntryLine getEntryLine(EntrySide side) { switch (side) { case CREDIT : this.entries.stream().filter(line -> line.isCredit()).findFirst() .orElseThrow(...); case DEBIT : this.entries.stream().filter(line -> line.isDebit()).findFirst() .orElseThrow(...); default : throw new ... } } ... // Service에서 저장되기 전에 호출 public void validateSavable() { ... validateJournalSave(); } private void validateJournalSave() { AccountType debit = getEntryLine(EntrySide.DEBIT).getAccountType(); AccountType credit = getEntryLine(EntrySide.CREDIT).getAccountType(); if(!this.transactionType.isValidPlacement(debit, credit)) { throw new ... } } } Journal Class에서 EntryLine List에 접근하고 있어요. 그리고 EntryLine Class는 이렇게 생겼어요. @Entity ... public class EntryLine extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "journal_id", nullable = false, updatable = false) private Journal journal; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "account_id", nullable = false) private Account account; ... // private package 접근제어자 사용 // Account는 Category를 참조중이에요. AccountType getAccountType() { return this.account.getCategory().getAccountType(); } } 거래가 저장되기 전에 Journal : validateJournalSave() 에서 this.transactionType에 따라 차변과 대변에 올바르게 위치하고 있는지 검사한 후 저장하고 있는데 이것을 생성과 수정할 때 두 곳에서 사용하고 있어요. Ledger에 5개 Category가 있고, Account는 그 Category를 참조하고 Category에서만 AccountType이 있어요. Journal이 각 EntryLine의 AccountType을 얻기 위해 Journal -> EntryLine -> Account -> Category -> getAccountType() 이렇게 흘러가네요. 이렇게 접근해도 설계상 괜찮은걸까요? Journal을 저장할때는 @Query 사용해서 Fetch Join으로 필요한 Account를 가져오고 있는 상황이에요. Journal이라는 엔티티가 비즈니스 로직 수행을 위해서 다른 엔티티의 필드까지 깊게 참조?? 가져오도록 설계하는게 옳은건지 모르겠어요.
안녕하세요. 강사님! 서브에이전트 기초: 코드 리뷰 서브 에이전트 강의 를 들으면서 /agents 명령어를 통해 코드리뷰와 관련된 서브에이전트 1개를 생성 했습니다. 그 결과 강사님의 강의 내용과 동일하게 .claude/agents/code-reviewer.md 가 생성되었고, 그 이후에 프롬포트를 작성할때 해당 에이전트를 사용해서 전체 코드 리뷰를 진행했습니다. 근데 그 이후에 .claude 디렉토리 하위에 사진과같이 agent-memory/code-reviewer 가 생성되고, 그 하위에 4가지의 md파일이 생성 되었는데요. (1) 해당 파일이 원래 생성되는게 정상인건가요? 현재 시점 기준에서요!! (2) 또한 해당 파일은 굳이 github에 안올려도 되겠죠? (.gitignore) 뭔가 docs를 한번 더 보다가 아래와 같은 내용이 있던데(새로 추가가된건진 잘 모르겠습니다,,) , (3) 저런 맥락이면 CLAUDE.md 에 약간 이런식으로 넣어놓은다음 그 다음에 다시 에이전트를 호출 하는 방식이 올바른 방향성일까요? ## Subagent 가이드 (를 만든 후) ### code-reviewer 에이전트 에이전트는 다음을 따르세요: 1. 작업 시작 전 `.claude/agent-memory/code-reviewer/` 확인 2. 새로운 패턴/이슈 발견 시 메모리 업데이트 3. 작업 완료 후 발견사항 저장 매 리뷰마다: - 해결된 이슈는 known_issues.md에서 제거 - 새로운 패턴은 code_patterns.md에 추가 - 아키텍처 변화는 project_overview.md 업데이트
안녕하세요 선생님, 강의 잘 듣고있습니다! 다름이 아니라, 설정 문제인지 현 시점 VSCode 내에서는 오류가 저렇게 많이 표시가 됩니다ㅜ 동작과는 상관없어 그냥 사용중이었는데 앞으로도 계속 저러면 너무 불편할거 같습니다. 해결 방법이 없을까요? 아래는 setting.json 내용입니다.. { "workbench.startupEditor": "none", "editor.formatOnSave": true, "workbench.iconTheme": "material-icon-theme", "js/ts.validate.enabled": true, "editor.defaultFormatter": "esbenp.prettier-vscode", "js/ts.implicitProjectConfig.checkJs": true, "workbench.colorTheme": "Dark Modern", "editor.fontSize": 14, "workbench.secondarySideBar.defaultVisibility": "hidden", "terminal.integrated.fontSize": 14, "window.zoomLevel": 1, } 확인 한 번 부탁드리겠습니다..!