[Java] Intellij로 Angular + Spring Boot + Docker 구성하기(2)

2 분 소요

Intellij Enterprise 기능으로 Frontend/Backend/Docker를 구성해보자.

Angular + Spring Boot + Mysql(Docker)

해보고 싶은 것.

DB를 도커로 실행하고, Backend로 연결하면 Frontend-Backend-DB Imange 연결을 완성한다.

Mysql

Folder/File 구성

아래와 같이 File과 Folder를 구성한다.

image

mysql_data

Docker는 기본적으로 데이터를 지우기 때문에, Host에 저장할 역활로 만든 Folder다. 해당 폴더는 Git과 연동되면 안되기 때문에 .gitignore에 아래와 같이 설정한다.

mysql_data/*

Dockerfile

DB Docker 이미지를 실행하기 위한 데이터다. 사용자는 scott, 사용할 DB는 myapp을 사용할 예정이다.

FROM mysql:5.7

ENV MYSQL_USER=scott
ENV MYSQL_PASSWORD=123456
ENV MYSQL_ROOT_PASSWORD=123456
ENV MYSQL_DATABASE=myapp
ENV MYSQL_PORT=3306

VOLUME ./mysql_data:/var/lib/mysql

EXPOSE 3306

ADD ./my.cnf /etc/mysql/conf.d/my.cnf

my.cnf

Mysql의 서버 설정을 위한 파일이다.

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8

Intellij 에서 Docker실행.

사실 명령어나 Docker Window 프로그램으로 실행해도 상관없지만, 이번에는 Intellij 에서 실행해보자.

Docker 실행 설정

Run Configuration을 실행하자

image

데이터 실행

여기서 중요한 점은 port를 꼭 Mapping해야 한다.

image

아래와 같이 실행결과가 나타난다.

image

재실행 시…

재 실행하려면 아래를 클릭하면 된다.

image

Backend-DB 연결

Spring JPA와 DB를 연결한다.

application.properties

DB 연결 정보를 Backend로 설정한다.

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myapp?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=scott
spring.datasource.password=123456


# SQL문장을 콘솔에 출력한다.
spring.jpa.show-sql=true

# DDL 을 생성하는 설정
spring.jpa.generate-ddl=true

# MySQL
spring.jpa.database=mysql

# MySQL 방언 설정
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

Domain 생성

Board

@Entity
@Getter
@Table(name = "board")
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long boardId;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_name")
    private AccountUser user;

    @Column(name = "message")
    private String message;

    @CreationTimestamp
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime creationDate;

    @UpdateTimestamp
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastUpdateDate;


    public Board() {
    }

    @Builder
    public Board(AccountUser user, String message) {
        this.user = user;
        this.message = message;
    }

    @Override
    public String toString() {
        return "Board{" +
                "boardId=" + boardId +
                ", user=" + user.getUserName() +
                ", message='" + message + '\'' +
                ", creationDate=" + creationDate +
                ", lastUpdateDate=" + lastUpdateDate +
                '}';
    }
}

AccountUser

@Entity
@Getter
@Table(name = "fnd_user")
public class AccountUser {
    @Id
    @Column(name = "user_name")
    private String userName;

    @Column(name = "password")
    @JsonIgnore
    private String password;

    @OneToMany(mappedBy = "user")
    @JsonIgnore
    private List<Board> boardList;

    public AccountUser() {
    }

    @Builder
    public AccountUser(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    @Override
    public String toString() {
        return "AccountUser{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

TestController 추가.

@RestController
@Slf4j
@RequiredArgsConstructor
public class TestController {

    private final AccountUserRepository userRepository;
    private final BoardRepository boardRepository;

    @GetMapping(value = "/api/hello")
    public String helloWorld() {
        log.info("hello world is coming");
        return "hello world";
    }

    @PostMapping(value = {"/api/user/loginProcess"}, produces = MediaType.APPLICATION_JSON_VALUE)
    public LoginDto loginProcess(@RequestBody LoginDto loginDto) {
       ....
    }

    @PostMapping(value = {"/api/user/register"}, produces = MediaType.APPLICATION_JSON_VALUE)
    public void registerUser(@RequestBody LoginDto loginDto) {
       ...
    }


    @PostMapping("/api/board/register")
    public void registerBoard(@RequestBody BoardDto boardDto) {
        ...
    }

    @GetMapping(value = "/api/board/user={userName}", produces = MediaType.APPLICATION_JSON_VALUE)
    public List<Board> getBoardListByUserName(@PathVariable("userName") String userName) {
        ...
    }

    @GetMapping(value = "/api/board/")
    public List<Board> getBoardList()  {
        ...
    }

    @Getter
    private static class LoginDto{
        private String userName;
        private String password;

        public LoginDto() {
        }

        public LoginDto(String userName, String password) {
            this.userName = userName;
            this.password = password;
        }
    }

    @Getter
    private static class BoardDto{
        private String userName;
        private String message;

        public BoardDto() {
        }
    }

}