묻고 답해요
137만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
혹시 서비스에서 관련 레포지토리말고 다른 레포지토리를 의존해서는 안되는 이유가 뭘까요???
[질문 내용]안녕하세요 강사님!! MemberService에 MemberRepository와 LogRepository를 의존하는 걸 보면서 궁금증이 생겨서 질문 드립니다! 회사에서 일 할 때,하나의 서비스에는 관련 레포지토리만 의존하고필요하다면 다른 레포지토리는 직접 의존하지 말고 서비스를 통해서 해결하라는 말을 들어서 그렇게 코드를 짜왔습니다. 만약 다른 레포지토리를 의존해야 한다면 컨트롤러에서 하라고 들었던 것 같습니다. 예를 들면 MemberService에서는 MemberRepository만 의존하고LogRepository의 메소드가 필요하다면 LogService를 의존해서 LogServerce.메소드 이런식으로 불러왔습니다. 혹시 이런 식으로 다른 레포지토리를 의존하지 말고 서비스를 의존해야 하는 이유가 무엇인지 이유를 알 수 있을까요???단순히 계층구조를 지키기 위해서 인가요???
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
EntityManager를 쓰는데, DB가 다르면 EntityManager도 2개 주입받아야 해요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]예를 들면 좀 회사의 기존 서비스에서 아예 새로운 서비스말고 기존의 서비스를 활용해서 뭔가 고객에게 제공해 주고 싶다, 하면 기존DB랑 새로 추가 해야 할 DB랑 다를 수 있잖아요.근데 EntityManager는 우리 눈에는 안보이지만, 자동으로 DataSource 주입 받잖아요.DataSource가 제가 기억하기로 말 그대로 데이터의 근원, h2 이런 것 들에 대한 연결할 수 있는 정보? 들을 얻어오는 걸로 기억을 해서, DB가 다르면 저것도 다를 수 있잖아요. 또 DB의 계정마다도 다를 것 같고.. 그러면 EntityManager가 2개 생기나요? 이번엔 같은 DB에 테이블만 다른거니 JPA 내부적으로 sql만 좀 다르게 짤거니까 상관 없어 보이지만..
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
mybatis도 ORM 기술인가요?
mybatis도 ORM 기술인데, ORM 기술 중에서도 SQL 매퍼이다. 라고 이해했는데 맞게 이해한 걸까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
BooleanExpression where 절
BooleanExpression를 querysdl where절에서 사용할 때콤마(,)를 and로 인식한다고 하셨는데 or는 어떻게 작성해야 하나요? (|)를 사용해야 할까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트 DB 방안에 대해
안녕하세요~! 혹시 테스트 DB 단은 단순히 다음과 같이 명시하여 datasource: url: jdbc:h2:mem:test;MODE=MySQL # Test 는 인메모리 사용 driver-class-name: org.h2.Driver username: sa password: 메모리 DB 를 사용하는 방법은 별로 추천하지 않으실까요? 별도의 DB 를 사용하는 것이 제일 좋은 방법일까요? 메모리 DB를 사용하는것이 빠르고 편할 것 같다고 생각헀는데, 보통 어떤 방식을 실무에서 사용하는지 궁금합니다!! 감사합니다 :) (예를 들어, ci 및 build 서버에서 Test 수행시 외부 DB 서버 내 Test 전용 DB 를 통해 Test 를 한다)
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
master, replica 구성할 때 EntityManagerFactory 빈 등록 관련 질문드립니다.
안녕하세요.강의 내용과 조금 별개의 질문일 수 있는데 마땅히 물어볼 곳이 없어 질문드리게 되었습니다.@Transactional(read-only) 로 설정했을 때, replication db 에서 조회하도록 Master, Replica 데이터 소스를 구성해보려고 하는데요,Master 와 Replica 각각의 데이터소스와 AbstractRoutingDataSource를 상속받는 routingDataSource 를 빈으로 등록 후,EntityManagerFactory 도 빈으로 등록했습니다.@Bean public EntityManagerFactory entityManagerFactory(DataSource dataSource) { LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setPackagesToScan("com.example.domain"); factory.setDataSource(dataSource); HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); factory.setJpaVendorAdapter(jpaVendorAdapter); factory.afterPropertiesSet(); return factory.getObject(); }이렇게 모두 설정하면 동작은 잘 되는데 application.yml 에 설정한 auto-ddl 이나 show_sql, form_sql 과 같은 프로퍼티 설정을 읽어오지 못하더라구요.그래서 아래와 같이 HibernateJpaVendorAdapter 에 직접 설정을 추가해줘야지 동작했습니다.HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setGenerateDdl(true); jpaVendorAdapter.setShowSql(true);그런데 이렇게 직접적으로 설정값을 넣어서 구성하면 profile 에 따라 설정 값 적용을 분리하지 못하게되는데,그럼 아래와 같이 Properties 를 직접 가져와서 설정 값에 넣어줘야하는걸까요? 이러한 방식이 맞는지 의문이 들어서 질문하게 되었습니다. HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setGenerateDdl(jpaProperties.isGenerateDdl()); jpaVendorAdapter.setShowSql(jpaProperties.isShowSql()); factory.setJpaVendorAdapter(jpaVendorAdapter);그리고 구글링 했을 때 블로그 예제들은 현업에서 정말 사용하는 구성인지 Master, replica 를 설정하는데 참고할만한 좋은 레퍼런스 있으면 추천 부탁드립니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
EntityManager 빈 자동주입
EntityManager Configuration 파일에서 선언할 때@RequiredArgsConstructor 어노테이션을 제거하셨는데 어떻게 자동주입이 된것이죠?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
RowMapper<Item> 질문있습니다.
수업에 나오는 RowMapper<Item>에 대해서 질문드립니다.RowMapper의 코드를 확인해보니@FunctionalInterface public interface RowMapper<T> { /** * Implementations must implement this method to map each row of data * in the ResultSet. This method should not call {@code next()} on * the ResultSet; it is only supposed to map values of the current row. * @param rs the ResultSet to map (pre-initialized for the current row) * @param rowNum the number of the current row * @return the result object for the current row (may be {@code null}) * @throws SQLException if an SQLException is encountered getting * column values (that is, there's no need to catch SQLException) */ @Nullable T mapRow(ResultSet rs, int rowNum) throws SQLException; }강의에서 구현한 (rs, rowNum) => T 의 메서드가 보이는데요 해당 메서드는 throws SQLException, 즉 체크 예외를 던지고있습니다. 검색해본결과 람다는 컴파일타임이 아니라 런타임에 실행되기 때문에 사용하는측에서 컴파일시점에 예외체크를 하지않아도 컴파일이 통가된다라고 보았습니다. (throws SQLException 라고 적혀있는데 컴파일타임에 체크되어야하는거 아닌가 라고 생각은 하면서) 질문그렇다면 제가 jdbc의 RowMapper를 실무에서 사용한다면 매번 체크 예외를 위한 예외처리를 매번 다 해줘야한다는 의미인가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
자바 언어에 대한 근본적인 질문...
안녕하세요. 스프링과 mybatis를 이용하여 프로젝트를 이용하여 프로젝트를 하고 있습니다.Controller.java@ApiOperation(value = "알람 정보 조회") @GetMapping("/alarm") public AlarmSearchResponseDTO alarmList( @RequestParam(required = false) String siteName, @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime startTime, @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime endTime, @RequestParam(required = false) String cameraName, @RequestParam(required = false) String accidentType, @RequestParam(required = false) String modelVersion, @RequestParam(required = false) String action, @RequestParam(required = false) String sortColumn, @RequestParam(required = false) String sortType, @RequestParam(required = false) Integer pageNum, @RequestParam(required = false) Integer pageSize { AlarmSearchConditionDTO alarmSearchConditionDTO = AlarmSearchConditionDTO.builder() .siteName(siteName) .cameraName(cameraName) .startTime(startTime) .endTime(endTime) .cameraName(cameraName) .accidentType(accidentType) .modelVersion(modelVersion) .action(action) .sortColumn(sortColumn) .sortType(sortType) .pageNum(pageNum) .pageSize(pageSize) .build(); return aiBoxService.selectAlarmInfo(alarmSearchConditionDTO); } AlarmSearConditionDTO.java@Data @NoArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) public class AlarmSearchConditionDTO extends requestPaging { @ApiModelProperty(notes = "현장명", example = "현장명") private String siteName; @ApiModelProperty(notes = "발생 일시", example = "발생 일시") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime startTime; @ApiModelProperty(notes = "종료 일시", example = "종료 일시") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime endTime; @ApiModelProperty(notes = "카메라번호", example = "카메라 번호") private String cameraName; @ApiModelProperty(notes = "안전사고 유형", example = "안전사고 유형") private String accidentType; @ApiModelProperty(notes = "모델버전", example = "알람 코드") private String modelVersion; @ApiModelProperty(notes = "요청 사항", example = "요청 사항") private String action; @ApiModelProperty(notes = "정렬 기준", example = "정렬 기준") private String sortColumn; @ApiModelProperty(notes = "정렬 기준", example = "정렬 기준") private String sortType; @ApiModelProperty(notes = "페이징", example = "페이징") private requestPaging paging; @Builder public AlarmSearchConditionDTO(String siteName, LocalDateTime startTime, LocalDateTime endTime, String cameraName, String accidentType, String modelVersion, String action, String sortColumn, String sortType, Integer pageNum, Integer pageSize) { //pageNum, pageSize -> Integer this.siteName = siteName; this.startTime = startTime; this.endTime = endTime; this.cameraName = cameraName; this.accidentType = accidentType; this.modelVersion = modelVersion; this.action = action; this.sortColumn = sortColumn; this.sortType = sortType; if (pageNum != null && pageNum > 0) { this.paging = new requestPaging(pageNum, pageSize); // Both pageNum and pageSize provided, use them. } else if (pageSize != null && pageSize > 0) { this.paging = new requestPaging(null, pageSize); // pageSize provided, use it. } else { this.paging = new requestPaging(); // Default values. } }requestPaging.java@Data @Slf4j public class requestPaging { // pageNum, pageSize -> Integer private Integer pageNum; private Integer pageSize; private int totalPageCnt; public requestPaging() { this.pageNum = 1; this.pageSize = 30; } // pageNum, pageSize -> Integer public requestPaging(Integer pageNum, Integer pageSize) { // this.pageNum = (pageNum != null && pageNum > 0) ? pageNum : 1; // pageNum이 null이거나 0 이하일 경우 1을 기본값으로 사용 // this.pageSize = (pageSize != null && pageSize > 0 && pageSize <= 100) ? pageSize : 30; // pageSize가 null이거나 0 이하 또는 100을 초과할 경우 30을 기본값으로 사용 this.pageNum = (pageNum > 0) ? pageNum : 1; this.pageSize = (pageSize > 0 && pageSize <= 100) ? pageSize : 30; // } public int getStartPage() { return (pageNum-1) * pageSize; } public void setPage(int page) { this.pageNum = (page < 1) ? 1 : page; } public void setPerPageNum(int perPageNum){ if(perPageNum <= 0 || perPageNum > 100){ this.pageSize= 30; return; } this.pageSize = perPageNum; } public int setTotalPageNum(int totalCnt){ int total=0; if((totalCnt%pageSize)==0)total=totalCnt/pageSize; else total = (totalCnt / pageSize) + 1; return total; } public int getTotalPageCnt(){ return totalPageCnt; } }Service.javapublic AlarmSearchResponseDTO selectAlarmInfo(AlarmSearchConditionDTO alarmSearchConditionDTO) { AlarmSearchResponseDTO alarmSearchResponseDTO = new AlarmSearchResponseDTO(); List<AlarmSearchDAO> searchList = null; log.info("{}", alarmSearchConditionDTO); try { searchList = (List<AlarmSearchDAO>) alarmRecordMapper.selectAlarmInfo(alarmSearchConditionDTO); } catch (NullPointerException e) { // 조회건수 0 -> 빈리스트 리턴 } int totalCnt = alarmRecordMapper.countAlarmInfo(alarmSearchConditionDTO); Pagination paging = new Pagination(); paging.setPageNum(alarmSearchConditionDTO.getPageNum()); paging.setPageSize(alarmSearchConditionDTO.getPageSize()); paging.setOrderColumn(alarmSearchConditionDTO.getSortColumn()); paging.setOrderType(alarmSearchConditionDTO.getSortType()); paging.setTotalCnt(totalCnt); paging.setTotalPageCnt(alarmSearchConditionDTO.setTotalPageNum(totalCnt)); alarmSearchResponseDTO.setPagination(paging); alarmSearchResponseDTO.setResult(searchList); return alarmSearchResponseDTO; }제가 myBatis 사용을 위해 검색 조건 DTO안에 requestPaging이란 페이징 을 위한 객체를 만들어서 사용을 하고 싶습니다.컨트롤러에서 get호출을 받으면 받고 난 뒤 빌더를 이용하여 DTO에 세팅을 하면 아래의 데이터가 나옵니다.AlarmSearchConditionDTO(siteName=null, startTime=null, endTime=null, cameraName=Camera A, accidentType=null, modelVersion=null, action=null, sortColumn=eventTime, sortType=null,paging=requestPaging(pageNum=7, pageSize=3, totalPageCnt=0)) 여기까지는 페이징 처리를 위한 변수들이 정상적으로 들어갔습니다. mapper에서 parameterType="AlarmSearchConditionDTO" 로 사용하여 검색 조건과 페이징 처리를 모두 하려고 합니다. mapper에서 #{startPage} 과 같은 타입은parameterType.get~() 메서드를 사용하여 뽑는 것으로 알고 있습니다.하지만 그 후 데이터베이스 조회 페이징 처리를 위해 아래의 두가지 변수를 이용하여 mapper에서 처리를 하려하는데alarmSearchConditionDTO.getStartPage() alarmSearchConditionDTO.getPageSize()DTO 자체를 로그 찍어서 확인을 하면 pageNum과 pageSize 가 받아온 값으로 잘 저장이 되는데,DTO.get() 변수를 사용해서 값을 확인하면 requestPaging 클래스의 생성자의 디폴트 값이 호출되어 1과 30이 나옵니다.public requestPaging() { this.pageNum = 1; this.pageSize = 30; } 계속 고민하다가 모르겠어서 질문드립니다.. 도와주세요 ㅠㅠ
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
controller에 @Transactional은 안되나요?
강의를 다 보고 따로 찾아보니 @Transactional은 controller가 아닌 service에서 사용해야되고 controller에서 사용하게 되면 트랜잭션이 적용이 안된다고 하길래 직접 해봤습니다. controller의 메소드에 @Transactional을 붙여서 로직을 실행시켜보니 변경감지가 일어나서 update 쿼리가 날라가는 것을 확인하였는데 이러면 트랜잭션을 통해서 변경감지가 일어난 것 아닌가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 매니저 두개 사용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]실무에서 트랜잭션 매니저를 두개 이상 사용하는 경우가 많나요?기본적으로 스프링부트가 빈에 트랜잭션 매니저를 등록해주는데그거 말고 다른 트랜잭션 매니저를 사용해야하는 경우들은 어떤 경우들이 있을까요 ?검색 해보니 데이터베이스를 나눌 때 두개이상을 등록하는데맞을까요? 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
실제 서비스 구현과 DB
안녕하세요! 강사님 ㅎㅎ컴퓨터 공학 전공자이고 졸업 후 취준을 하고 있습니다 ㅎㅎ지금까지는 NEST.JS, EXPRESS.JS로 웹서비스 REST API 개발 프로젝트 경험이 있습니닷스프링과 스프링부트는 강사님의 커리큘럼을 꾸준히 따라오며 곧 MVC2편이 끝납니다 ㅎㅎ 1. 이어서 DB1,2편까지만 듣고도 REST API 기반 서비스를 구현 할 수 있을까요? JPA 로드맵을 사서 듣고 나야 서비스 구현을 할 수 있는 정도가 되는건지 궁금합니닷!(JPA 로드맵을 들으면 좀 더 실무에 가까운 퀄리티 높은 서비스를 만들 수 있는건지, 아니면 아예 들어야만 서비스 구현의 기본 역량을 갖출 수 있는건지 궁금합니닷)혹은 야생형으로 DB1,2편을 생략하고 JPA로드맵을 먼저 들어가도 고생돼도 할만할지 궁금합니다 프로젝트를 하면서 공부 하고 싶은데 DB 설계가 안되면 프로그램 설계가 막막하니.. 여쭤보게 됐습니다 답변 부탁 드립니닷!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
의존관계 주입
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]헷갈려서 질문 남깁니다.JpaConfig 를 통해 @Bean 등록 한다JpaConfig Class 에 있는 EntityManager 는 스트링부트가 자동적으로 Bean 등록을 해주기 때문에의존관계 주입을 통해 사용이 가능하다.new JpaRepository(em) 을 통해 의존관계 주입 JpaRepository에서의 EntityManager em 은 JpaConfig에서 ItemRepository 를 @Bean 등록할 때매개변수로 받은 것을 사용제가 이해하고 있는 흐름이 맞나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 부트 3.1.3버전 CGLIB
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.스프링 부트 3.1.3버전 CGLIB스프링 부트 3.1.3버전으로 해당 강의를 따라가던 중 proxyCheck() 테스트의 로그가 CGLIB$$0이 출력됩니다. 테스트는 성공하였지만 영한님처럼 프록시 객체의 해시코드가 16진수로 이루어진 값이 아니라 0이 나옵니다. 혹시 몰라서 부트를 2.7.14로 다운그레이드 했더니 영한님과 비슷하게 16진수의 해시코드가 나오더라구요. 혹시 스프링부트3 버전 이상부터 프록시 객체의 해시코드 값이 변경된 걸까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
DB2 - 9.스프링 트랜잭션 이해 - 트랜잭션 적용 확인 강의 관련 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]트랜잭션이 실제 적용되고 있는지 확인하는 방법에서 TxApplyBasicTest 코드 짤때요 BasicService 프록시 객체가 스프링빈으로 자동등록되는데 왜 굳이 @TestConfiguration 에서 BasicService를 수동으로 빈 등록을 하는건가요?? 안해도 되는거 아닌가요?어차피 프록시 객체가 등록되어있어서 @Autowired로 의존관계 주입받을 수 있지 않나요??
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Slf4j
@Slf4j 롬복을 이용하여 log값을 출력할때,맨 위 클래스에 작성하고 사용하지 않고 클래스 위에 각각 @Slf4j를 작성하는 이유는 무엇인지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
TxBasicTest
TxBasicTest에서proxyCheck에서 테스트를 돌리면 에러가 나옵니다기대값은 true인데 false가 나온다고합니다. package hello.springtx.apply; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.transaction.support.TransactionSynchronizationManager; import static org.assertj.core.api.Assertions.assertThat; @Slf4j @SpringBootTest public class TxBasicTest { @Autowired BasicService basicService; @Test void proxyCheck(){ log.info("aop class={}", basicService.getClass()); assertThat(AopUtils.isAopProxy(basicService)).isTrue(); } @TestConfiguration static class TxApplyBasicConfig{ @Bean BasicService basicService(){ return new BasicService(); } } @Slf4j static class BasicService{ public void tx(){ log.info("call tx"); boolean txActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("tx active={}", txActive); } public void nonTx(){ log.info("call nonTx"); boolean txActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("nonTx active={}", txActive); } } }
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Invalid bound statement
mybatis 작성을 다하고 test를 돌리는데 에러가 발생합니다. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): hello.itemservice.repository.mybatis.ItemMapper.save 제가 작성한 코드에 문제가 있는지하고 pdf를 복사해서 돌려보아도 계속 에러가 발생합니다..
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
finditems() 에러
'테스트 - 스프링 부트와 임베디드 모드' 수강 중에 ItemRepositoryTest를 h2를 모두 끄고 동작시켰는데강사님처럼 모두 성공을 뜨지 않고 finditems()에서 에러가 납니다.강의자료 초반에 데이터베이스에서 데이터가 보관되어 있어서 그렇다고 들었는데어떻게 해결해야하나요?? h2는 접속 종료한 상태입니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
IncorrectResultSizeDataAccessException
'JdbcTemplate 적용1- 기본' 강의에서 findById()를 설명하실때,'결과가 없을경우'는 catch로 예외처리를 해주시는데'둘 이상일 경우' IncorrectResultSizeDataAccessException에 대해서는 왜 catch문으로 예외처리를 하지 않는것인지 궁금합니다.