ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] JPA 설정 및 연동하기
    Spring 2021. 12. 20. 11:16
    반응형

    1) JPA 사용 이유

    - 신규 컬럼이 추가되어 작업을 하게되면 수정해야 되는 부분들이 많고 반복되어 지기 때문에 

      그러한 단점들을 개선하고 효율적으로 개발하기 위한 방법들에 관심을 갖기 시작하였고 그것이 JPA(Java Persistence API)입니다.

     

    2) 장단점

    장점

    - 생산성이 뛰어나고 유지보수하기에 좋다

    - DBMS에 대한 종속성이 줄어든다.(JPA 사용이유에 대한 내용)

     

    단점

    - 복잡한 쿼리를 사용해야 할 때 불리하다.

     

     

    3) 설정하기

    - Dependency 추가

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency> 
    
    <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
    </dependency> 
    
    <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
    </dependency> 
    
    <dependency> 
      <groupId>org.projectlombok</groupId> 
      <artifactId>lombok</artifactId> 
      <optional>true</optional> 
    </dependency>

     

    - Properties 설정

    #JPA 설정
    #Dialect 설정
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
    
    # 하이버네이트가 실행하는 모든 SQL문을 콘솔로 출력해준다
    spring.jpa.properties.hibernate.show_sql=true
    
    #콘솔에 출력되는 JPA 실행 쿼리를 가독성있게 표현한다.
    spring.jpa.properties..hibernate.format_sql=true
    
    #디버깅이 용이하도록 SQL문 이외에 추가적인 정보를 출력해준다.
    spring.jpa.properties.hibernate.use_sql_comments=true

     

     

    - Entity생성 ( VO )

    @Data
    @AllArgsConstructor
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @Entity(name="users") // JPA가 관리하는 클래스, 매핑할 테이블을 해당 어노테이션을 붙인다.
    public class UserVO {
    	// 기본키(PK)을 지정하기 위함
    	@Id
    	// 자동 INCREMENT로 설정하기 위한 어노테이션
    	// GenerationType.IDENTITY는 키 생성을 데이터베이스에 위임하는 방식
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	private Long id;
    	private String name;
    	private String email;
    	private String password;
    	private String passwordSalt;
    	private String regDt;
    	private String auth;
    }
    
    // 해당 Entity(VO)는 매핑할 테이블 컬럼들을 나열해 놓은것에 맞춰 작성

     

    - Repository 생성

    @Repository
    public interface UserRepository extends JpaRepository<UserVO, Long> {
    
    	// findBy뒤에 컬럼명을 붙여주면 이를 이용한 검색들이 가능하다.
    	public List<UserVO> findById(String id);
    	
    	public List<UserVO> findByName(String id);
    	
        // 검색기능도 가능하다
    	public List<UserVO> findByNameLike(String keyword);
    	
    }

     

    - Repository Service 생성

    @Service
    public class UserRepositoryService {
    
    	@Autowired
    	private UserRepository userRepository;
    	
        // 리스트를 불러올때 사용
    	public List<UserVO> findAll() {
    		List<UserVO> users = new ArrayList<>();
    		userRepository.findAll().forEach(e -> users.add(e));
    		return users;
    	}
    	
        // 하나의 데이터만 불러올때 사용
    	public Optional<UserVO> findById(Long id){
    		Optional<UserVO> user = userRepository.findById(id);
    		return user;
    	}
    	
    }

     

    - Controller 생성

    @Slf4j
    // 제일 앞 중복 URL 적용
    @RequestMapping(value="userTest")
    @Controller
    public class UserContorller {
    	
    	@Autowired
    	UserRepositoryService userRepositoryService;
    	
        // 모든 사용자를 조회
    	@GetMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    	public ResponseEntity<List<UserVO>> getAllUser() {
    		List<UserVO> users = userRepositoryService.findAll();
    		return new ResponseEntity<List<UserVO>>(users, HttpStatus.OK);
    	}
    	
        // 한 명의 사용자만 조회
    	@GetMapping(value="/{id}",produces = { MediaType.APPLICATION_JSON_VALUE } )
    	public ResponseEntity<UserVO> getUser(@PathVariable("id") Long id) {
    		Optional<UserVO> user = userRepositoryService.findById(id);
    		return new ResponseEntity<UserVO>(user.get(), HttpStatus.OK);
    	}
    }

     

    - 동작 확인

    01
    Postman을 사용하여 확인

     

     

    감사합니다.

    반응형

    댓글

Designed by Tistory.