반응형

7일동안 과제를 마치고 이제 미니프로젝트 과제를 하게되었다. api 명세를 받아서 

api를 개발하면 되는데 지금 다 끝난시점에서 쓰는거지만 하나씩 할때마다 테이블에대해서도 고민하고 쿼리에대해서도 여러가지 생각을 해보게되는 좋은 경험이었다. 

 

[ 프로젝트 1단계 ]

SpringInitilizer로 스프링프로젝트를 생성한후에 실행해주었다.

 

웹으로 접근이 가능하게 하기위해서 spring web

Jpa를 쓰기위해서 spring Jpa

MySql 데이터베이스를 사용하기위해서 MySQL Driver

코드를 줄이고 편하게작성하기위해서 lombok을 의존성에 추가해서 프로젝트를 만들어주었다.

Dependencies추가

 

 

이제 필요한 기능명세에 따라서 기능을 만들어주겠다.

 

위의 기능을 보고 컨트롤러를 작성하기전에 DB를 먼저 생성해주었다. 

필요한 정보를보면 직원의정보 , 직원이 속한 부서 ,직원의 직급이 필요하다.

 

직원의 정보에 부서와,직급정보가 모두 포함될수도있지만 중복이 발생하기때문에 서로 분리해주었다.(정규화)

 

[직원]

직원코드, 직원 이름 , 직급(코드) , 부서(코드) , 생일 , 입사일

 

[직급]

직급코드, 직급이름

 

[부서]

부서코드, 부서이름 , 부서장(직원코드)

 

이렇게 간단하게 개념을 정리하고 테이블을 설계해주었다 코드는 기본키로설정하고

auto Increase로 자동증가하도록 해주었다. 

 

그리고 이런개념을 정리하기위해서 erd를 작성해보았다.

 

아래로가는 화살표는 이후 과제를 하면서 추가되는 테이블이다.

직급과 부서에는 해당하는 정보만 저장되도록하고 직원테이블에는 직급과 부서를 외래키로 참조하도록해서

직급의 이름과 부서의 이름을 받아올수있도록 해주었다. 

(사실 이게 제대로 정규화가 된건지는 잘모르겠다.)

이어진 선을보면 알수있는데 직급,부서 하나에 직원이 여러명 연결된 1:N관계이다.

 

이제 이 구조대로 자바코드에 DAO객체를 만들어주고 JpaRepository를 만들어주면 api를 만들 준비가 끝난다.

 

Employee(DAO)

@Entity
@Getter
@NoArgsConstructor
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "position_id")
    private Position position;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;

    private String startDate;
    private String birthDay;
}

 

@NoArgsConstructor어노테이션을 사용하면 파라미터가없는 기본생성자가 생성된다.( lombok )

EmployeeRepository(Repository)

public interface EmployeeRepository extends JpaRepository<Employee,Long> {
    Employee findByName(String name);
}

 

직원의 이름으로 값을 받아올수있는 추상메서드를 하나 작성해두었다.

 

Position(DAO)

@Entity
@NoArgsConstructor
@Getter
public class Position {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long positionId;
    private String positionName;
    @OneToMany(mappedBy = "position")
    private List<Employee> employeeList;
}

 

 

직급은 여러개의 직원정보를 가질수가있다.  (1:N)

예를 들어 직급이 대리 인데이터를 직원테이블에서조회한다고하면 김대리,이대리,박대리 가 나올수있는것이다.

그래서 직급하나가 여러개의 직원정보를 가져서 1:N관계가 되는것이다.

Jpa에서는 이런관계를 @OneToMany로풀어낼수있다.

이 기능을 이용하기위해서는 직급코드를 가지고있는

Employee클래스에서도 @ManyToOne으로 표기를 해주어야 서로 매핑이 되어서 이용이 가능하다. 

 

이 관계에는 주인이있는데 상대방을 알고있는쪽이 주인이라고 생각하면 편하다 

직원 클래스는 직급의코드를 가지고있어서 직급에대한 정보를 알고있지만 

직급 클래스는 직원에대해서 어떠한 정보도 가지고있지않다. 

 

그래서 직급클래스에는 mappedBy속성으로 관계의 주인을 명시해주고

직원 클래스에는 @JoinColumn을 사용해서 외래키인 position_id를 명시해주어야한다. - (쿼리에 들어갈 컬럼이름)

PositionRepository(Repository)

public interface PositionRepository extends JpaRepository<Position,Long> {
    Position findByPositionName(String positionName);
}

직급이름으로 조회할수있게 추상메서드를 작성해주었다.

 

Team(DAO)

@Entity
@Getter
@NoArgsConstructor
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long teamId;
    private String teamName;
    private Integer teamLeaderId;
    @OneToMany(mappedBy = "team")
    private List<Employee> employeeList;
}

 

TeamRepository(Repository)

public interface TeamRepository extends JpaRepository<Team,Long> {
    Team findByTeamName(String teamName);
}

부서이름으로 조회할수있게 추상메서드를 작성해주었다.

 

 

 

\main\resources\application.yml

spring:
  datasource:
    url: "jdbc:mysql://localhost:3308/company"
    username: "root"
    password: ""
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

리소스에 applocation으로 설정정보를 작성까지 해주었다.

 

이제 데이터베이스에 접근하기위한 준비가 모두 끝났다. 이제 API명세를 보고 필요한 기능을 하나씩 작성해보자.

반응형

+ Recent posts