- Recruitment Entity 

코드 중복을 피하기 위해 @Builder와 of()를 사용했다 

@Table
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Recruitment {

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

    @Setter
    private String position;

    @Setter
    private Integer reward;

    @Setter
    private String contents;

    @Setter
    private String techInfo;

    @Builder
    public Recruitment(String position, Integer reward, String contents, String techInfo) {
        this.position = position;
        this.reward = reward;
        this.contents = contents;
        this.techInfo = techInfo;
    }

    public static Recruitment of(String position, Integer reward, String contents, String techInfo) {
        Recruitment recruitment = Recruitment.builder()
                .position(position)
                .reward(reward)
                .contents(contents)
                .techInfo(techInfo)
                .build();
        return recruitment;
    }
}

 

2. 등록 API 작성

 

- RecruitmentRepository

위치 : /domain/recruitment 

public interface RecruitmentRepository extends JpaRepository<Recruitment, Long> {
}

 

- saveRecruit()

위치 : /service/recruitment/RecruimentService

public SaveRecruitResponse saveRecruit(SaveRecruitRequest request) {
        Recruitment recruitment = Recruitment.builder()
                .position(request.getPosition())
                .reward(request.getReward())
                .contents(request.getContents())
                .techInfo(request.getTechInfo())
                .build();

        Recruitment created = recruitmentRepository.save(recruitment);

        SaveRecruitResponse response = SaveRecruitResponse.of(created);

        return response;
}

 

- saveRecruit

위치 : /web/recruitment/RecruitmentController

@PostMapping("/save")
    public ApiResponse<SaveRecruitResponse> saveRecruit(@RequestBody SaveRecruitRequest request) {
        SaveRecruitResponse response = recruitmentService.saveRecruit(request);
        return ApiResponse.success(response);
}

 

- SaveRecruitRequest

위치 : /web/recruitment/request

@Getter
public class SaveRecruitRequest {

    private String position;
    private Integer reward;
    private String contents;
    private String techInfo;

}

 

- SaveRecruitResponse

위치 : /web/recruitment/response

@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class SaveRecruitResponse {

    private Long id;
    private String position;
    private Integer reward;
    private String contents;
    private String techInfo;

    @Builder
    public SaveRecruitResponse(Long id, String position, Integer reward, String contents, String techInfo) {
        this.id = id;
        this.position = position;
        this.reward = reward;
        this.contents = contents;
        this.techInfo = techInfo;
    }

    public static SaveRecruitResponse of(Recruitment recruitment) {
        SaveRecruitResponse response = SaveRecruitResponse.builder()
                .id(recruitment.getCompany_id())
                .position(recruitment.getPosition())
                .reward(recruitment.getReward())
                .contents(recruitment.getContents())
                .techInfo(recruitment.getTechInfo())
                .build();
        return response;
    }
}

 

 

- Postman 테스트 

 

Request Body

Post http://localhost:8080/recruitment/save

  • application/json
{   
    "position" : "Backend Junior Position",
    "reward" : 1500000,
    "contents" : "wanted now hiring backend junior position",
    "techInfo" : "Python" 
}

 

Response Body

{
    "data": {
        "id": 1,
        "position": "Backend Junior Position",
        "reward": 1500000,
        "contents": "wanted now hiring backend junior position",
        "techInfo": "Python"
    }
}

 

인스타그램 광고에서 원티드에서 진행하는 백엔드 프리온보딩이 있길래 지원하려고 했다. 

지원서에 과제 수행한 깃허브를 공유해야했는데, 해당 과제는 Python/Django 또는 JS/Node.js로 진행해야 했다

현재 자바와 스프링 프레임워크만 다룰줄 알아서 지원을 못하는 건가 싶었는데 '지원을 못하더라도 해당 과제를 해보자'라고 생각하게 되었다. 이전 프로젝트에서 공부한 것 복습 겸, 일단 만들어 놓으면 나를 어필할 때 좋을 것 같았다 

그래서 오늘은 깃허브에 레포 생성하고 로컬이랑 연결한 다음, 등록/수정/삭제 API를 구현했다 

이 과정을 기록하면 좋을 것 같아 글을 써본다 

2022.08.23에 시작했고, 3시간 걸렸던 작업이었다 

 

전반적인 코드를 보면 다음을 참고하면 된다. wanted_pre_onboarding

 

1. Git & GitHub로 프로젝트 시작하기 

 

-GitHub에 wanted_pre_onboarding으로 repository 생성하기 

 

- Git이랑 Local 이랑 연결하기(?)

  • 프로젝트 파일 위치로 이동하기 
 desktop/project/project_code/wanted_pre_onboarding
  • 시작 (remote add origin 순서가 맞는지 모르겠다)
git init
git branch -m master main
git add .
git commit -m "first commit"
git remote add origin [Github Repo 주소]
git push -u origin main
  • 완료
Enumerating objects: 24, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 12 threads
Compressing objects: 100% (16/16), done.
Writing objects: 100% (24/24), 60.26 KiB | 15.07 MiB/s, done.
Total 24 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/heyazoo1007/wanted_pre_onboarding.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

 

2. 프로젝트 세팅하기 

- MySQL 연동하기 

start.spring.io에서 MySQL 의존성을 다운받은 후, application.properties에서 다음과 같이 설정하면 된다 

이후 MySQLWorkbench에서 해당 db를 생성해야하는데, 자세한 건 다음 포스트를 참고하면 된다 

https://heyazoo1007.tistory.com/509

spring.profiles.include=real-db
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57InnoDBDialect
spring.session.store-type=jdbc

# Mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/onboarding?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=password

# JPA
spring.jpa.hibernate.ddl-auto=create
spring.jpa.generate-ddl-auto=true
spring.jpa.show_sql = true

# Logging
logging.level.org.springframework.web=DEBUG

 

- /common/ApiResponse.Class 작성하기 

통일된 응답을 해야하는데, 코드를 일일이 적는 것보다 클래스로 처리하는게 더 효율적이다 

data의 타입이 General Type이라 어떤 타입이 와도 수용가능하다 

이전 프로젝트에서는 statusCode와 statusMessage를 같이 넣었고, errorCode도 구현했는데 

이번엔 간단하게 구현했다. 필요하면 위의 것들 추가할 생각이다 

@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ApiResponse<T> {

    public static final ApiResponse<String> SUCCESS = success(null);

    private T data;

    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(data);
    }
}

'개인프로젝트 > 과제' 카테고리의 다른 글

5-2. 채용공고 검색 API (가산점 요소)  (0) 2022.08.25
5-1. 채용공고 목록 API  (0) 2022.08.24
4. 삭제 API  (0) 2022.08.23
3. 수정 API  (0) 2022.08.23
2. 등록 API 생성  (0) 2022.08.23

1. 테이블 설정하기 

설정해야할 테이블 종류는 다음과 같다. 총 두가지이다

 

-JPA가 사용될 엔티티 테이블

해당 테이블은 Application에서 서버 실행하면 콘솔창에 출력되는 내용을 복사하면된다

내용이 길어서 다 담지는 못했지만, 'Hibernate:' 옆 부분을 복사하면된다 

복사한 내용은 MySQL workbench로 가서  rds와 연결된 db에붙여넣고 테이블을 생성하면된다. 

-> 이부분을 실행하려면 워크벤치와 rds를 연결해야하는데, 하는 방법은 다음 링크를 참고하면 된다

https://scshim.tistory.com/218

-스프링 세션이 사용될 테이블 

해당 테이블 정보는 맥북 기준 cmd+shift+o(알파벳)을 누르고 shcema-sql.sql을 검색해서 나오는 파일에서 확인할 수 있다.

위 테이블과 같은 방법으로 복사해서 mysql에 붙여넣고 테이블을 생성하면된다

 

2. 프로젝트 설정

-build.gradle에 의존성 추가하기 

 

-main/resource 패키지에 application-real.properties 파일 생성 후 내용 추가하기

 

3. EC2 설정

-app 디렉토리에 application-real-db.properties 파일 생성 

이 파일을 생성하는 이유는 RDS도 보안되어야 할 대상이므로 EC2 서버에 직접 설정 파일을 생성해야하기 때문이다

생성 후 내용 추가하기

 

4. deploy.sh 수정 후 실행

 

deploy.sh 마지막 부분을 수정하고

./deploy.sh 명령어로 실행하고 nohup.out 파일을 확인해서 다음이 보이면 성공이다.

 

위 단계까지 마치면 배포가 완료되었다. 

ec2 서버의 도메인을 찾아서 들어가면 내가 배포한 사이트를 확인할 수 있다

 

 

이제 ec2에 배포를 할건데 배포할 때 사용하는 명령어이 많아서 일일이 작성하는 불편함을 줄이기 위해 쉘스크립트에 정리해서 실행해볼 것이다

 

실행 전에 배포가 무엇인지, 쉘 스크립트가 무엇인지 알아보자

배포: 작성한 코드를 실제 서버에 반영하는 것이다

쉘스크립트: .sh를 확장자로 가진 파일을 말한다

 

1. ~/app/step1 디렉토리에 deploy.sh 파일을 생성한다 

여기서는 vim이라는 GUI가 아닌 환경에서 사용할 수 있는 편집 도구를 사용한다. 

파일에 들어가서 'i'를 누르면 파일에 내용 추가가 가능하고, 작성을 완료 했다면 esc키를 누른다.

저장후 파일을 나가야하므로 :wq 를 입력하고 엔터를 치면 파일을 나온다

 

더 자세한 vim 사용 방법은 다음 링크를 참조하면 된다. http://bit.ly/2Q3BpvZ 

2. deploy.sh 내용 

3. 스크립트에 실행권한 추가하기

확인해보면 deploy.sh 파일이 생성된 것을 확인할 수 있다

4. 스크립트 실행하기

5. 이후 nohup.out 파일 열기

deploy.sh 실행 후 vim nohup.out 명령어를 입력하면 된다

 

nohup.out 파일에는 실행되는 애플리케이션에서 출력되는 모든 내용을 가지고 있다

처음 실행시 nohup.out 파일에 APPLICATION FAILED TO START가 나오는데 그 부분은 github에 application-oauth.properties가 없기 때문이다. 이 문제를 해결하기 위해서는 다음 단계를 수행하면 된다 

6. app 디렉토리에 application-oauth.properties 파일 생성

파일 생성후 로컬 main/resources에 있는 application-oauth.properties의 내용을 복사해서 붙이면 된다

7. deploy.sh 하단 부분 수정 

 

수정 후 deploy.sh를 수행하면 kill되는 문제가 발생한다.

이거를 해결하는 방법은 다음 링크에 있으므로 참고하면 된다 

https://heyazoo1007.tistory.com/197

+ Recent posts