일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 리눅스
- Python
- 백엔드
- 자바
- 스프링부트
- 카카오
- springboot
- DPDK
- 네트워크
- 파이썬
- 스프링
- Linux
- programmers
- 쿠버네티스
- 프로그래머스 #카카오 #IT #코딩테스트
- 코딩테스트
- C
- 프로그래머스
- docker
- 엘라스틱서치
- 개발자
- 알고리즘
- Java
- Spring
- IT
- 운영체제
- 도커
- Elasticsearch
- 캐시
- Kakao
- Today
- Total
저고데
[Spring Boot 실전]1. Spring과 MySQL 연동 및 의존성 관리법 본문
지난 시간에는 게시글 Article 도메인과 레포지토리 인터페이스까지 작성해보았다.
이번 시간에는 Spring과 MySQL을 연동해보자.
MySQL 연동
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'mysql:mysql-connector-java:8.0.28'
우선 build.gradle 파일에 다음과 같은 의존성을 추가하여, JPA와 MySQL을 추가해준다.
implementation 'mysql:mysql-connector-java'과 같이 버전을 추가하지 않으면, application.properties에서 오류가 발생하니 유의하자.
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:<포트 번호>/<DB명>
spring.datasource.username=<아이디>
spring.datasource.password=<비밀번호>
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
그리고 application.properties에 꺽쇠 괄호로 표시된 부분을 알맞게 채워서 작성을 하면 된다.
마지막으로 JPA 기술을 활용하여 매핑을 시켜줄 것이기 때문에 도메인 Article class 위에 @Entity로 어노테이션을 붙여주면 준비는 끝이다.
다음으로 실행을 하면
다음과 같은 실행화면이 뜨며 자동생성된 SQL 문법으로 Article 도메인의 변수에 맞게 table이 생성된 것을 알 수가 있다.
여기서 Hibernate라는 것을 볼 수 있다.
이는 java 언어를 위한 ORM(객체-관계 매핑) 프레임워크 중 하나이다.
java의 객체와 DB의 테이블을 자동으로 매핑시켜주는 아주 편리한 기능 중 하나이다.
Repository 메서드
추상 메서드로만 이루어진 Repository 인터페이스를 implements하여 메서드를 만들어보자.
이 때, Entity인 도메인 Article 정보를 이용하기 때문에 EntityManager를 호출한다.
EntityManager를 의존성 주입을 위해, 생성자를 호출하고 각각의 메서드를 알맞게 작성하면 된다.
그리고 의존성 주입을 위해 @Repository 어노테이션을 붙여준다.
@Repository
public class JpaArticleRepository implements ArticleRepository{
private final EntityManager em;
public JpaArticleRepository(EntityManager em) {
this.em = em;
}
@Override
public Article save(Article article) {
em.persist(article);
return article;
}
// .. 이하 중략 ..
@Override
public List<Article> findAll() {
return em.createQuery("select a from Article a", Article.class)
.getResultList();
}
}
Service 생성하기
앞서 0장의 비즈니스 모델에서 언급했듯이, 대부분의 웹 어플리케이션은 "컨트롤러 -> 서비스 -> 레포지토리" 순으로 작동된다.
현재 도메인과 레포지토리를 생성하였으니, 먼저 Service를 만들어보자.
Service가 Repository를 불러주기 때문에 Repository를 선언하고 의존성 주입을 위해서 생성자를 선언한다.
또한 본인이 다른 도메인에서 사용될 수 있으니 @Service 어노테이션을 붙여서 의존성을 주입해준다.
아직 Service가 할 일이 게시글을 생성했을 때, 모든 게시글을 조회했을 때, 특정 게시글을 조회했을 때의 기능 밖에 없기 때문에 3개의 메서드에 대한 기능을 레포지토리를 통해 생성한다.
이 때, 도메인 Article에 대한 정보가 바뀔 수도 있으니 @Transcational 어노테이션을 붙어준다.
@Service
@Transactional
public class ArticleService {
private final ArticleRepository articleRepository;
@Autowired
public ArticleService(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}
public Long create(Article article) {
articleRepository.save(article);
return article.getId();
}
public List<Article> findArticles() {
return articleRepository.findAll();
}
public Optional<Article> findOne(Long id) {
return articleRepository.findById(id);
}
}
의존성 주입방법(DI : Dependency Injection)
마지막으로 의존성 주입방법에 대해서 알아보자
의존성 주입방법은 크게 세 가지가 있다.
1. 생성자 주입 : @Autowired 어노테이션을 사용한다.
어노테이션 밑에 생성자를 두어 의존성을 주입할 수 있다.
생성자 호출 시점에 1번만 호출되며 불변객체로 유지된다. 또한 생성자가 1개인 경우 @Autowired를 생략할 수 있다.
2. 수정자 주입 : setter를 통해 주입한다.
컴파일 이후에도 변경 가능성이 있기 때문에 선택, 변경 가능성이 있는 의존관계에 사용된다.
3. 필드 주입 : 필드에 바로 주입하는 방법이다.
생성자와 달리 변수 앞에 @Autowired 어노테이션을 사용한다.
코드가 간결해지지만 외부에서 변경이 불가능하다.
DI프레임워크가 없으면 아무 것도 할 수 없다. (근데 이걸 제일 많이 쓴다고 한다. 편해서 그런가?)
의존성 주입을 한 클래스로 관리하기
앞서 ArticleService와 JpaRepository에서 의존성을 위해서 각각 @Service, @Repository 어노테이션을 붙인 것을 확인할 수 있었다.
하지만 해당 생성자 주입 방법은 각각 따로 의존성을 관리하기 때문에 관리가 힘들어진다는 단점이 존재한다.
따라서 spring container에 하나만 등록하여, 공용으로 같이 쓰는 클래스를 만들 것이다.
앞서 @Service, @Repository 어노테이션을 제거한다.
SpringConfig라는 별도의 클래스를 생성하자.
SpringConfig class 그 자체도 java에 의해 관리되어야하기 때문에 @Autowired 어노테이션을 작성한다.
그리고 ArticleService와 JpaRepository는 spring container에 의해 관리되기 위해서는 Bean 등록이 필요하기에 @Bean 어노테이션을 달아준다.
@Configuration
public class SpringConfig {
private EntityManager em;
@Autowired
public SpringConfig(EntityManager em) {
this.em = em;
}
@Bean
public ArticleRepository articleRepository() {
return new JpaArticleRepository(em);
}
@Bean
public ArticleService articleService() {
return new ArticleService(articleRepository());
}
}
오늘은 DB 중 하나인 MySQL과 Spring을 어떻게 연동하는지를 알고 의존성 주입은 어떻게 하는지에 대해서 알아보았다.
아직 의존성을 관리하는 게 왜 중요한지는 느끼지 못했지만 좋은 코드를 작성하기 위해서는 처음부터 습관을 잘 들여놓는 것이 좋을 듯하다.
'Spring Boot 실전' 카테고리의 다른 글
[Spring Boot 실전]5. AWS EC2와 RDS (0) | 2024.01.16 |
---|---|
[Spring Boot 실전]4. 게시판에 Delete 기능을 추가하자. (1) | 2024.01.07 |
[Spring Boot 실전]3. 게시판에 Update 기능을 추가하자 (1) | 2024.01.06 |
[Spring Boot 실전]2. 본격적으로 RESTful API를 사용하여, Create와 Read 기능을 구현해보자! (1) | 2024.01.05 |
[Spring Boot 실전]0. 간단한 게시판을 만들어보자! (0) | 2024.01.03 |