월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
빈 초기화 시 트랜잭션 적용
안녕하세요,강의 내용 중, "@PostConstruct 메서드에 트랜잭션을 적용할 수 없는 이유는 빈의 초기화 코드가 먼저 실행되고 나서 트랜잭션 AOP가 적용되기 때문"이라는 부분에 대한 질문입니다.테스트 메서드에 추가적인 로깅을 해보니 ApplicationContext 속 Hello 빈이 프록시 객체임을 확인할 수 있었습니다. 그런데 이처럼 컨테이너에 프록시 객체로 등록되었다는 것은 이미 해당 빈의 초기화 시점에 @Transactional 어노테이션을 인식했기 때문인 것으로 이해했습니다. 그렇다면 초기화 시점에 해당 빈이 트랜잭션 적용 대상이라는 것을 알고있다는 것인데, 어째서 트랜잭션 AOP가 작동하지 못하는 건가요?컨테이너에 프록시 객체로 등록되는 것과, 실제 트랜잭션 AOP 적용은 별개의 문제인건지 궁금하네요
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
spring-mybatis 이미지 업로드 관련 NullPointerException 에러
안녕하세요!수업 듣다가 Mybatis로 이미지 업로드 해보려는데, 실패해서요 조언 좀 듣고 싶습니다.아래 코드에서 fileData.setFilePath가 Null 값으로 나오는데 왜그런걸까요 ? ㅠㅠjava.lang.NullPointerException: nullcom.restapi.bin.service.FileUploadDownloadService.uploadImageToFileSystem(FileUploadDownloadService.java:29) ~[main/:na]@Data public class FileData { private Long id; private String name; private String fileType; private String filePath; public FileData(Long id, String name, String fileType, String filePath) { this.id = id; this.name = name; this.fileType = fileType; this.filePath = filePath; } }@Service @Slf4j public class FileUploadDownloadService { @Autowired private FileDataMapper mapper; private static FileData fileData; private final String FOLDER_PATH = "/Users/david/Downloads/image/"; public String uploadImageToFileSystem(MultipartFile file) throws IOException { String filePath = FOLDER_PATH + file.getOriginalFilename(); log.info("file Path={}", filePath); fileData.setFilePath(filePath); fileData.setName(file.getOriginalFilename()); fileData.setFileType(file.getContentType()); log.info("fileData={}", fileData); mapper.insert(fileData); log.info("fileData={}/{}/{}", fileData.getFileType(), fileData.getName(), fileData.getFilePath()); file.transferTo(new File(filePath)); return null; } public byte[] downloadImageFromFileSystem(String fileName) throws IOException { Optional<FileData> dbImageData = mapper.findByFile(fileName); //이미지가 저장된 파일을 가져옴 > 바이트배열로 변환 > 서비스에서 다시 반환하여 얻음 String filePath = dbImageData.get().getFilePath(); byte[] images = Files.readAllBytes(new File(filePath).toPath()); return images; } }
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
JdbcTemplate 단건 숫자조회 관련 문의
안녕하세요, 강의 잘 듣고 있습니다.다름이 아니라 섹션2 - JdbcTemplate 정리의 단건조회 - 숫자조회 부분에서 int rowCount = jdbcTemplate.queryForObject("select count(*) from t_actor", Integer.class);부분에서 NamedParameterJdbcTemplate의 queryForObject에는 위처럼 SQL문과 자료형만 넣는 메서드를 찾을 수 없었고 중간에 Collections.emptyMap()을 넣거나, 아니면 query 메서드를 사용해야 하는 것으로 보이는데이 부분은 NamedParameterJdbcTemplate에서는 그대로 사용할 수 없고 그냥 JdbcTemplate을 사용할 때만 실행가능한 코드인건지 궁금합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
default와 protected 접근 제한자 @Transactional 적용
안녕하세요! 항상 좋은 강의 감사드립니다. 선생님의 강의를 보며 코드를 따라치는데, protected와 default 접근제한자가 붙어있는 경우에도 @Transactional이 적용되어 조금 찾아보았습니다. ProxyTransactionManagementConfiguration에서다음과 같이 스프링 6.0 부터는 protected와 default 메서드에도 @Tx가 적용되도록 바뀌었다는것을 알게되어 말씀드립니다.관련 커밋 링크도 함께 남기겠습니다.https://github.com/spring-projects/spring-framework/commit/37bebeaaaf294ef350ec646604124b5b78c6e690 스프링부트 강의도 너무 기대하고 있습니다.항상 좋은 강의 감사합니다!
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
JdbcTemplateItemRepositoryV1 질문
안녕하세요. 강의 너무 잘 듣고 있습니다.JdbcTemplateItemRepositoryV1 코드를 분석하다가궁금한 점이 생겨서 질문을 드리게 되었습니다.save 메서드에서 connection 부분인데요.전체 코드를 봐도 connection 이라는게 보이지 않는데저렇게 매개변수로 넣고 connection.prepareStatement가 호출되는 것이 잘 이해가 안되서 질문드립니다 ㅠㅠ추가적으로 itemRowMapper()의 rs, rowNum도 어떻게나와서 호출이 되는지 궁금합니다..!@Override public Item save(Item item) { String sql = "insert into item(item_name, price, quantity) values (?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); template.update(connection -> { //자동 증가 키 PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); ps.setString(1, item.getItemName()); ps.setInt(2, item.getPrice()); ps.setInt(3, item.getQuantity()); return ps; }, keyHolder); long key = keyHolder.getKey().longValue(); item.setId(key); return item; } private RowMapper<Item> itemRowMapper() { return ((rs, rowNum) -> { Item item = new Item(); item.setId(rs.getLong("id")); item.setItemName(rs.getString("item_name")); item.setPrice(rs.getInt("price")); item.setQuantity(rs.getInt("quantity")); return item; }); }
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
service에서 proxyservice를 주입받을 순 없을까요?
[질문 내용]@Transactional 적용시proxyservice -> service 이렇게 되는데.service에서 this.method()와 같이, proxyservice를 거치지 않고 호출된 메서드들이 문제가 된다면.service에서 proxyservice.method()로 호출하면 안될까요? 이와 같은 호출을 위해 service에서 proxyservice를 주입받구요. private final Proxy<service> proxyservice = proxyUtil.getInstance().get(); 뭐 이런거 없을까요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 내부 호출 문제
프록시 내부 호출 강의를 들으면서 "그러면 클래스단에 @Transactional을 사용해서 모든 메서드에 트랜잭션을 적용하면 애초에 이런 문제가 발생 안하지 않나?" 라는 생각이 들었습니다.혹시 이런 방법은 좋지 않은 방법인가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
임베디드 모드에서 Spring이 database를 선택하는 과정
Spring 공식 문서를 보면Spring Boot can auto-configure embedded H2, HSQL, and Derby databases. You need not provide any connection URLs. You need only include a build dependency to the embedded database that you want to use.You need a dependency on spring-jdbc for an embedded database to be auto-configured. In this example, it is pulled in transitively through spring-boot-starter-data-jpa.라고 나와있습니다.저는 현재 프로젝트의 경우build dependency= build.gradledependency on spring-jdbc= implementation 'org.springframework.boot:spring-boot-starter-jdbc' (build.gradle)라고 생각하는데, 이것이 맞는 내용인지 궁금합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
마이바티스와 트랜잭션
"마이바티스 스프링 연동 모듈이 많은 부분을 자동으로 설정해주는데, 데이터베이스 커넥션, 트랜잭션과 관련된 기능도 마이바티스와 함께 연동하고, 동기화해준다."이 말이 DB 1편에서 트랜잭션을 적용하기위해 서비스 단에 @Transactional 어노테이션을 붙인것 처럼 마이바티스도 똑같은 방법으로 트랜잭션 적용이 가능하게끔 지원해준다 이런 의미 인가요?
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
[JPA] save할 때 @ManyToOne 필드가 null로 나옵니다.
안녕하세요! 강의를 통해 JPA를 접하게 되어 간단한 프로젝트를 진행하고 있습니다.프로젝트 진행 중 에러가 발생하여 질문드리고자 합니다! 아래는 답변 엔티티 코드입니다.public class Answer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(columnDefinition = "TEXT") private String content; @ManyToOn private Question question; //fk private LocalDateTime createAt; private LocalDateTime modifyAt; }보시는 것처럼 답변 엔티티에는 질문 엔티티(Question)가 fk로 설정되어 있습니다. 이 연관관계에서 이전까지는 아무런 문제없이 answer.save(..., ..., question, ..., ...); 을 하면 정상작동을 했지만, 갑자기 다시 기능을 실행하니 아래의 에러가 발생했습니다. JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violationhibernater 쿼리를 확인하니 fk 필드가 null로 찍혔습니다. 위 에러와 쿼리를 보고 fk 필드에서 오류가 난 것을 알게 되어 확실한 이유 없이 @ManyToOne(fetch = fetchType.LAZY)로 수정하니 제대로 동작했습니다.지연 로딩을 사용해야 한다는 말을 듣고 수정하긴 했지만 아직도 왜 해당 에러가 발생했는지는 모르겠습니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
JdbcTemplate 동적쿼리 관련
JdbcTemplate 동적쿼리 문제 강의를 듣다보니조건이 여러개인경우 조건값의 유무에 따라 where, and를 넣어야 하는 상황을 고려해야 한다고 강사님이 말씀해 주셨습니다.검색조건이 없는 문장을"select id, item_name, price, quantity from item where(1=1)"위와 같이 작성하고조건의 값이 있는지 여부만 판단하여 동적쿼리를 작성하면 되지 않을까요?예제인 findAll()의 조건 상품명, 최대가격이면 2번만 판단하면 될 것 같습니다.감사합니다.
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
@ModelAttribute("itemSearch") ItemSearchCond itemSearch이부분에서 질문이있어요
[질문 내용]여기에 질문 내용을 남겨주세요.@ModelAttribute안에 ("itemSearch")을 넣어 준이유가 뭘까요?? @ModelAttribute ItemSearchCond itemSearch으로 수정해서 돌려보니 오류가 발생하더라고요
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
강의의 롤백 커밋 기준에 대해 추가로 궁금한 점이 있습니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이전 강의 예외와 트랜잭션 커밋, 롤백 - 기본에서 예외 발생시 트랜잭션 내부에서 예외를 처리하지 못하고, 트랜잭션 범위 밖으로 예외를 던지면,스프링은 기본적으로언체크 예외 = 롤백체크 예외 = 커밋 한다고 배웠습니다.그리고 본 강의 활용에서 체크 예외와 언체크 예외를 통해 커밋과 롤백이 되는 것을 확인할 수 있었는데요.여기서 제가 궁금한 것은 일단 언체크 예외도 명시적으로 던지지 않아도 catch 해서 처리할 수 있다고 알고 있습니다.그러면 스프링이 언체크 예외를 롤백시키는 기준이 트랜잭션 내에서 언체크 예외를 처리하지 못하고 범위 밖으로 던졌을 때에만 롤백하는 것인가요?즉, 해당 트랜잭션 내에서 언체크 예외를 잡아서 처리하면 트랜잭션 범위 밖으로 언체크 예외가 던져졌기 않았기 때문에 해당 트랜잭션이 롤백되지 않고 커밋 되나요?예를 들어 아래의 코드와 같이 트랜잭션은 OrderService의 order() 메서드에서 실행되고, couponService를 통해 주문한 고객에게 쿠폰을 1개 우선 발행한 뒤에, 해당 트랜잭션 내에서 orderRepository.save 를 통해 DB에 주문이 저장됩니다.(주문을 먼저 완료하고 쿠폰을 발행 해야겠지만 제 질문 상황의 명확성을 위해 예시를 이렇게 했습니다.)하지만 orderRepository.save()메서드 실행 도중 DB에 문제가 생겨 Order가 DB에 정상적으로 저장이 되지 않아 Exception이 발생하였고 (언체크 예외) 해당 예외를 잡아서 처리했습니다. 그러면 해당 트랜잭션 밖으로 던져지는 예외는 존재하지 않으며 정상흐름대로 동작합니다. 이 경우 해당 트랜잭션은 롤백되는 것인가요 아니면 커밋되는 것인가요? 1번 질문에서 정상 흐름으로 바뀌었기 때문에 커밋이 된다고 하면,만약 RuntimeException을 잡아 체크 예외로 변경해서 해당 트랜잭션 범위 밖으로 던질 경우도 동일하게 커밋이 되는건가요?@Transactional public void order(Order order) { couponService.giveCoupon(order.getUserId)); try { orderRepository.save(order); } catch (RuntimeException e) { // Exception을 잡아서 처리하는 로직 } }
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 관련해서 질문 있습니다.
안녕하세요 유익한 강의 잘 듣고 있습니다! 트랜잭션 관련해서 질문 있습니다.[질문 1]만약 아래와 같은 코드가 있다고 했을 때JdbcTemplate jdbcTemplate = new JdbcTemplate(targetDataSource); PlatformTransactionManager transactionManager = new DataSourceTransactionManager(targetDataSource); DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(definition); boolean isRollback = false; //100개의 테이블 리스트를 순회 for (String table : tableList) { try { String query = "임의의 쿼리"; jdbcTemplate.execute(query); } catch (Exception e) { log.error(e.getMessage()); isRollback = true; } } if (isRollback) transactionManager.rollback(status); else transactionManager.commit(status); 100개의 테이블을 순회해서 어떠한 쿼리를 실행해보고 싶은데, 100개의 쿼리 중 하나의 쿼리라도 실패하는 순간 그 뒤의 쿼리들은 전부 오류가 떨어집니다.오류 내용은 아래와 같습니다."오류: 현재 트랜잭션은 중지되었습니다. 이 트랜잭션을 종료하기 전까지는 모든 명령이 무시될 것입니다."제가 생각하기로는 앞선 쿼리에서 오류가나서 트랜잭션이 롤백되었으니 나머지 쿼리를 실행해보지 않아도 롤백되기 때문에 실행해보지 않고 무시하겠다는 의미 같은데...저는 오류가 나더라도 우선 100개의 쿼리는 잘 돌아가고 마지막에 rollback처리를 하고 싶은데 방법이 있을까요? (오류가 100개의 쿼리 각각 어떠한 오류로 인한 실패인지 확인하고 싶기 때문입니다.) [ 질문 2]rollbackFor 옵션을 애노테이션 옵션말고 코드로 설정할 수 있나요?마치 propagation 옵션을 아래와 같이 설정한 것처럼 코드로 설정할 수 있나요?definition.setPropagationBehavior(PROPAGATION_REQUIRES_NEW);
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
master 와 slave 에 관해 궁금한점이 있어서 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Transaction annotation 이 없을 경우에는 mysql8.0 connector 에서도 기본적으로 master db 로 조회하는 건가요?! 혹시 그런 설정을 어디서 확인 할 수 있는지도 궁금합니다 ㅎ
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
Junit Test DI 방식 질문드립니다.
강의에서 보시면 영한님께서 OrderService와 OrderRepository를 주입 받을 때 @Autowired를 사용하시는데요.이걸 @RequiredArgsConstructor를 사용하여 생성자 주입응로 하면 에러가 터지더라구요. org.junit.jupiter.api.extension.ParameterResolutionExceptionTest 환경에서는 @Autowired로 주입을 받아야 하는것인가요?
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis에서 달력으로 값을 입력받아서 같은날자인경우에만 조회되는기능을 구형하고 싶은데요
[질문 내용]여기에 질문 내용을 남겨주세요.구글 드라이브 링크 남겨드릴게요 https://drive.google.com/file/d/1AAlbQl-kz6sLso42eTYpwH4Fy0iNkRjg/view?usp=share_link
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis로 삭제기능을 구현하고 싶은데 잘안되네요
[질문 내용]여기에 질문 내용을 남겨주세요.코드 사진으로 남겨드릴게요매퍼부분xml부분컨트롤러부분서비스부분코드 구글드라이브로 올려드릴게요https://drive.google.com/file/d/1bkLQfbfNO8_xXUT0MyDm7dfWxpwhybc1/view?usp=share_link
- 미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션1, 트랜잭션2가 다른 커넥션을 사용하는 이유
트랜잭션1, 트랜잭션2가 같은 커넥션을 사용하게 구현할 수도 있을 것 같은데요, 다른 커넥션을 사용하는 이유는 OSIV처럼 커넥션을 오래 유지하면 커넥션이 모자를 수 있기 때문에 다른 커넥션을 사용하도록 히카리에 구현되어 있는건가요??
- 해결됨스프링 DB 2편 - 데이터 접근 활용 기술
질문이요
[질문 내용]like문을 사용하는 방법이 인테넷에서 검색해보니 여러방법이 있더라고요 강의에서 사용한 가장위에있는mysql방법말고 다른방법을 사용해도 가능한가요?