저고데

[Spring Boot 실전]1. Spring과 MySQL 연동 및 의존성 관리법 본문

Spring Boot 실전

[Spring Boot 실전]1. Spring과 MySQL 연동 및 의존성 관리법

진철 2024. 1. 4. 16:11
728x90
반응형

지난 시간에는 게시글 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을 어떻게 연동하는지를 알고 의존성 주입은 어떻게 하는지에 대해서 알아보았다.

아직 의존성을 관리하는 게 왜 중요한지는 느끼지 못했지만 좋은 코드를 작성하기 위해서는 처음부터 습관을 잘 들여놓는 것이 좋을 듯하다.

728x90
반응형