728x90
나만의 메모장 프로젝트 - 트러블슈팅로그인 vs 게스트 세션 관리문제로그인한 사용자와 로그인하지 않은 사용자를 모두 지원해야 하는 게 목표였는데,세션에서 사용자 정보를 꺼내는 방식을 고민하게 되었다.해결로그인 시: session.setAttribute("loginMemberId", loginMember.getId());게스트 진입 시: session.setAttribute("guestId", UUID.randomUUID().toString());메모 저장 시: 두 값 중 존재하는 값을 기준으로 writerId 식별 후 저장 유효성 검사 메시지 미출력문제@NotBlank 등 유효성 검사가 동작했지만, 타임리프에서 메시지가 보이지 않았다.해결@GetMapping 에서도 @ModelAttribute 를 사용..
트랜잭션 옵션value, transactionManager기본으로 등록된 트랜잭션 매니저를 사용할 때는 생략하면 되지만,사용하는 트랜잭션 매니저가 둘 이상이라면 트랜잭션 매니저의 이름을 지정하여 구분해야 한다.public class TxService { @Transactional(value = "memberTxManager") public void member() {...} @Transactional("orderTxManager") public void order() {...}} rollbackFor / noRollbackFor체크 예외가 발생하면 커밋되지만, 추가로 예외를 지정하면 해당 예외를 롤백할 수 있다.@Transactional(rollbackFor = Exception.class)E..
Querydsl 소개- 동적 쿼리 문제를 완벽하게 해결한다.- 쿼리 문장에 오타가 있어도 컴파일 시점에 오류를 막을 수 있다.- 메서드 추출을 통해 코드를 재사용할 수 있다. 초기 설정build.gradle 파일에 다음 설정을 추가해 준다.implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:$ {dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakar..
스프링 데이터 JPA 소개- JPA 를 편리하게 사용하도록 도와주는 프레임워크이다.- 리파지토리의 구현 클래스 없이 인터페이스만으로 개발이 가능하다.- 기본 CRUD 기능과 페이지 기능도 자동 제공된다.- 쿼리 메서드 기능을 제공한다.- 동적 SQL 을 해결하기 어렵다. 초기 설정build.gradle 파일에 다음 설정을 추가해 준다.implementation 'org.springframework.boot:spring-boot-starter-data-jpa'(JPA 라이브러리에 JDBC 라이브러리도 함께 포함되어 있기 때문에, JDBC 의존관계를 제거해도 된다.) `main` 과 `test` 의 application.properties 에 다음 설정을 추가해 준다.logging.level.org.hibe..
JPA 소개- SQL, 데이터 중심의 설계에서 객체 중심의 설계로 전환할 수 있다.- 기존의 반복 코드, 기본적인 SQL 문도 JPA 가 직접 만들어 실행한다.- PK 기반이 아닌 SQL 문은 직접 작성해야 한다.- 동적 SQL 을 해결하기 어렵다.- EntityManger 을 주입받아 동작한다.- JPA 를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다. > 참고 - 스프링 부트가 JPA 설정에 따라 EntityMangerFactory 를 생성하고, 이를 통해 EntityManager 를 스프링에 주입할 수 있도록 해준다. 초기 설정build.gradle 파일에 다음 설정을 추가해 준다.implementation 'org.springframework.boot:spring-boot-starter..
MyBatis 소개- JdbcTemplate 보다 많은 기능을 제공하는 SQL Mapper 중 하나이다.- SQL 을 XML 로 편리하게 작성할 수 있다.- 동적 쿼리를 편리하게 작성할 수 있다. // JdbcTemplate 동적 쿼리String sql = "select id, item_name, price, quantity from item";if (StringUtils.hasText(itemName) || maxPrice != null) { sql += " where";}boolean andFlag = false;if (StringUtils.hasText(itemName)) { sql += " item_name like concat('%',:itemName,'%')"; andFlag = true..
스프링 통합 테스트 애노테이션`@SpringBootTest` : 스프링 컨테이너와 테스트를 함께 실행한다. : @SpringBootApplication 을 찾아 설정으로 사용한다.`@Transactional` : 테스트를 완료한 뒤 항상 rollback 하여 DB에 반영되지 않도록 한다.`@Commit` : @Transactional 이라도 commit 하여 DB에 저장된다. : @Rollback(false) 와 같은 기능이다.데이터베이스 연동하여 테스트하기테스트의 중요한 원칙- `테스트는 다른 테스트와 격리해야 한다.`- `테스트는 반복해서 실행할 수 있어야 한다.` 1. 테스트 데이터베이스 별도 운영하기로컬의 서버 데이터베이스에서 테스트를 실행하면, 테스트의 실행 결과가 서버 데이터베이스에 반..
스프링 JdbcTemplate- 순수 Jdbc 설정과 같다.- SQL Mapper 중 하나이다- Jdbc API에서 본 반복 코드 대부분을 제거한다.- 커넥션 획득/종료, 커넥션 동기화, 스프링 예외 변환기 실행 등 반복 작업을 대신 처리해 준다.- DataSource 를 주입받아 JdbcTemplate를 생성하여 사용한다.- SQL 문을 직접 작성해야 한다. - 동적 SQL 을 해결하기 어렵다. > 참고- Insert 문은 데이터 추가라는 단순한 작업이므로, 테이블 이름과 칼럼-값 정보로 SQL을 생성하기 쉽다.따라서 Spring 이 자동화하기 위해 SimpleJdbcInsert 같은 유틸리티를 제공한다. 그렇지만 Select 는 조건, 그룹화, 정렬, 조인 등 형태가 다양하므로 자동화하기 어려워서 직..