묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
PageResponseDTO 질문이 있습니다.
package com.example.backend.mallapi.dto; import lombok.Builder; import lombok.Data; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @Data public class PageResponseDTO<E> { private List<E> dtoList; private List<Integer> pageNumList; private PageRequestDTO pageRequestDTO; private boolean prev, next; private int totalCount, prevPage, nextPage, totalPage, current; @Builder(builderMethodName = "withAll") public PageResponseDTO(List<E> dtoList, PageRequestDTO pageRequestDTO, long totalCount) { this.dtoList = dtoList; this.pageRequestDTO = pageRequestDTO; this.totalCount = (int)totalCount; int end = (int)(Math.ceil( pageRequestDTO.getPage() / 10.0 )) * 10; int start = end - 9; int last = (int)(Math.ceil((totalCount/(double)pageRequestDTO.getSize()))); end = end > last ? last: end; this.prev = start > 1;//1보다 크면 참 밑에 if문 실행. this.next = totalCount > end * pageRequestDTO.getSize(); this.pageNumList = IntStream.rangeClosed(start,end).boxed().collect(Collectors.toList()); // start부터 end까지 연속된 숫자 스트림(IntStream)을 생성 // rangeClosed(a, b): a부터 b까지 포함 // IntStream은 기본형 int 스트림이기 때문에, // 객체형 리스트(List<Integer>)로 변환하기 위해 .boxed()를 사용. // 스트림을 리스트로 변환하는 역할 if(prev) { this.prevPage = start -1; } if(next) { this.nextPage = end + 1; } this.totalPage = this.pageNumList.size(); this.current = pageRequestDTO.getPage(); } }위에 코드를 옆에처럼 디버깅할려면(https://www.youtube.com/watch?v=OHrLRg150As )즉 step over로 사용도 하면서 한 줄 한 줄 씩 어떻게 실행되는 지 보고 싶은데 아래와 같이 에러가 나옵니다.혹시 스프링부트를 사용하면 디버거 모드가 활성화가 안되나요? 아래 사진을 보시면 38번째 줄에 브레이크 포인트 표시 해놨고 우측 상단에 디버그 모드도 실행되어있는데 중앙에 네모박스처럼 step over 모드가 비활성화 되어있습니다. 한 줄 한줄씩 디버깅을 할려면 어떻게 해야하는지 궁금합니다.
-
미해결실전! 스프링 부트와 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 활용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의 개념을 잘 몰라서 헷갈리는 듯 합니다.)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링컨테이너에 대해서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]스프링컨테이너는 그러면 단순히 브라우저에서 받은 요청을 컨트롤러에 매핑시켜주어 스프링컨테이너에 등록되어 있는 빈? 이라는 것과 매칭 시켜 존재한다면 viewResolver에 연결시켜 화면을 띄워주고 없다면 오류를 발생시켜 주는 역할인가요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
@AuthenticationPrincipal AccountDto 관련
실제로 UserDetails를 구현하고 있는 건 "AccountContext" 이지 "AccountDTO"가 아니기 때문에, @AuthenticationPrincipal AccountDto accountDto를 하면 null이 반환될 수 있지 않나요?그래서 차라리 @AuthenticationPrincipal AccountContext accountContext를 해서 if (accountContext != null) { model.addAttribute("username", accountContext.getUsername()); } else { model.addAttribute("username", "비회원");}이렇게 하는게 더욱 올바른 방법이 아닌가요?
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
질문있습니다
채팅과 관련된 API를 설계할 때 보면 Controller 레이어에서 @AuthenticationPrincipal 파라미터를 사용해서 사용자의 정보를 가지고 오는 것이 아닌 Service 레이어에서 SecurityContextHoler를 통해 사용자의 정보를 가지고 오는데 이는 웹소켓 같은 경우에는 Header에 JWT 토큰 정보를 담을 수 없기 때문이다라고 이해하면 될까요??
-
미해결실전! 스프링 데이터 JPA
JUnit4, JUnit5 충돌 문제
강의 : 스프링 데이터 JPA와 DB 설정, 동작확인7분 20초환경설정시에//JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } 를 추가하라고 하셔서 추가했는데,이 강의에서는 Junit5로 설정하라고 하셔서요.. 그럼 import할때 오류가 나는데 어떻게 해야할까요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
product image
안녕하세요 강의를 기반으로 작업을 하다 궁금한점이 생겨서 product - modify에서 사진을 모두 삭제하고 저장을 해두거나product - register에서 사진이 없는상태로 저장을 해두면 @Query("select p, pi from Product p left join p.imageList pi where pi.ord = 0 and p.delFlag = false ") Page<Object[]> selectList(Pageable pageable);ProductRepository에서 selectList 쿼리부분의 ord = 0인 설정만 만 호출하게 되버리는데 이때 이미지리스트 테이블에서 이미 ord가 없는 게시물은조회가 되지 않습니다..ord가 이미 없는 게시물은 delFlag가 false임에도 조회가 되지않습니다... 강의 목표는 아마도 default.jpeg 가 나와야 정상인거같은데 어떻게 해야 좋을까요 ?처음엔 서비스에서 imageStr이 없으니 imageStr을 강제로 default.jpeg로 설정해봤지만 어차피 조회되지 않아서 의미가 없었습니다.쿼리를 수정해봐야 할까요 ..??
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
요청/응답 DTO 관련 문의
안녕하세요, dto 관련 문의드립니다. 요청/응답 DTO를 왜 static으로 만드나요?이전 데이터가 유지되지 않나요?? 매번 객체를 만들면 안되나요? @Getter @Setter public static class AccountWithdrawReqDto { @NotNull @Digits(integer = 4, fraction = 4) private Long number; @NotNull @Digits(integer = 4, fraction = 4) private Long password; @NotNull private Long amount; @NotEmpty @Pattern(regexp = "^(WITHDRAW)$") private String transactionType; }//ATM -> 계좌 @Transactional public AccountWithdrawRespDto 계좌출금(AccountWithdrawReqDto accountWithdrawReqDto, Long userId) { //1. 0원 체크 if (accountWithdrawReqDto.getAmount() <= 0L) throw new CustomApiException("0원 이하의 금액을 출금할 수 없습니다."); //2. 출금 계좌 확인 Account withdrawAccountPS = accountRepository.findByNumber(accountWithdrawReqDto.getNumber()) .orElseThrow(() -> new CustomApiException("계좌를 찾을 수 없습니다.")); //3. 본인 확인 withdrawAccountPS.checkOwner(userId); //4. 패스워드 확인 withdrawAccountPS.checkPassword(accountWithdrawReqDto.getPassword()); //5. 출금계좌 잔액 확인 // withdrawAccountPS.checkBalance(accountWithdrawReqDto.getAmount()); //6. 출금 (잔액 확인이 누락되면 안되므로 출금 메소드에 녹인다!) withdrawAccountPS.withdraw(accountWithdrawReqDto.getAmount()); //7. 거래 내역 Transaction transaction = Transaction.builder() .withdrawAccount(withdrawAccountPS) .depositAccount(null) .withdrawAccountBalance(withdrawAccountPS.getBalance()) .depositAccountBalance(null) .amount(accountWithdrawReqDto.getAmount()) .sender(withdrawAccountPS.getNumber().toString()) .receiver("ATM") .transactionType(TransactionEnum.WITHDRAW) .build(); Transaction transactionPS = transactionRepository.save(transaction); return new AccountWithdrawRespDto(withdrawAccountPS, transactionPS); }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Memberrepository 클리어할때
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.왜 새로운 객체(MemoryMemberRepository memberRepository = new MemoryMemberRepository();)를 써서 clear을 하죠?? 멤버서비스를 통해 join한 멤버리포지토리랑 새로만든 멤버리포지토리가 달라서 clear안되는 거 아닌가요?? 결과적으로 클리어 되기는 했어요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest 실행시 오류가 발생합니다
https://drive.google.com/file/d/1xCfH-VjJWp4I252km26K5kFyBZNY3ZaS/view?usp=sharingjunit4는 assertThat을 지원하지 않는다고 하여 junit5로 하고 실행하였더니 h2데이터베이스 연결문제가 발생하는 것 같습니다. h2는 정상적으로 설치하여 잘 작동됩니다. 어디가 문제일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계의 관점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 회원-주문 관계에서 하나의 회원은 여러 주문을 할수있어서 1:N이라 하셨는데 서버 관점에서 보면 여러 회원이 존재하기 때문에 N:M으로 설계해야 하지 않을까요??고객 한명당 트랜잭션 관점으로 설계를 해야하는건지 기준이 따로 있는지 궁금합니다..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
fail() 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.fail(); 부분에서 오류가 뜨고 이텔릭체로 바뀌지 않습니다. 왜 그런가요?package hello.hello_spring.service; import hello.hello_spring.domain.Member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; class MemberServiceTest { MemberService memberService = new MemberService(); // 테스트케이스에서는 메서드명 한글로 적어도 된다 @Test void 회원가입() { // given Member member = new Member(); member.setName("hello"); // when long saveId = memberService.join(member); // then(검증) Member findMember = memberService.findOne(saveId).get(); assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test // 예외처리(테스트케이스에서는 정상적으로 작동하는거도 좋지만 예외 처리가 더 중요하다) public void 중복_회원_예외() { // given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); try { memberService.join(member2); fail(); } catch (IllegalStateException e) { } // then } @Test void findMembers() { } @Test void findOne() { } }
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
logout 후에 login 페이지 이동은 어디서 시켜주는건가요?
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요.location.href = /api/logout 를 통해스프링 시큐리티로 logout 보내고 세션 삭제한 뒤 브라우저를 보면 login?logout이 찍힌걸 확인 할 수 있는데login으로 어디서 보내준건지 헷갈립니다..
-
미해결스프링 부트 - 핵심 원리와 활용
저만 강의 이상한가요;;
앞부분이 강사님 싱크랑 하나도 안 맞는데...?화면이랑 음성내용이랑도 안 맞구요..................ㅜㅜ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
조회 시 Entity를 뿌리는 것 아닌가요 ?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]view 계층과 주고 받을 때는 dto로 주고 받아야 하니 들어올 때 form을 사용했는데, 지금처럼 em.createQuery("select i from Item i", Item.class).getResultList(); 이런 repo 코드를 정제없이 그대로 return 해주는 경우 Entity를 직접 전달하고 있는 것 아닌가요 ??잘못 이해하고 있는 부분에 대해 짚어주시면 감사하겠습니다.만약 잘 이해하고 있고, 예제라서 이렇게 처리한 것이라면, 정제하는 과정이 서비스 단에서 일어나는게 좋을까요 ? 컨트롤러 단에서 일어나는게 좋을까요 ?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
무한 스크롤 쿼리 질문 있습니다.
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요.select * from article where board_id = 1 order by article_id desc limit 30;해당 쿼리에서 강사님은 Extra에 null인데 제가 실행하면 using where가 나오네요.using filesort는 안나오는데 크게 상관 없는 부분일까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP 활용에 대하여 질문 드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. AOP는 핵심 로직이 아닌 부가적인 로직을 처리할 때 주로 사용한다고 알고있습니다. 보통 많이 사용하는 경우는 로그추적, 트랜잭션 등이 있다고 하셨는데 권한을 체크할 때도 사용할 수 있나요?만약 사용자들은 방을 생성해서 그 방안의 참여자들만 글을 쓸 수 있을 때, 이 유저가 참여자인지 확인하는 로직이 필요하다면 이 로직을 AOP를 활용하여 작성해도 되는지 궁금합니다. 여러 메서드들에서 사용하기 때문에 공통 관심사라는 생각이 들긴 합니다. 직접 서비스단에서 매번 확인하면 중복 코드가 발생할 것 같아서 AOP를 활용하고 싶은데 이런 경우도 사용이 가능한지 궁금해 질문남깁니다. 감사합니다!