국비/Project-3 채용박람회

2023.07.17 118일차 Team Project - 2 채용박람회

춘핑이 2023. 7. 30. 11:13

118일차

1. 입사지원 이전

입사지원 기능 자체는 Create기능이기 때문에 특별한 것은 없다. formdata를 받아와서 파일은 s3에 데이터는 db에 저장한다.
그러나 입사지원 버튼을 클릭시 날짜가 지났다면 신청이 안되어야하고
예비인원보다 지원자수가 많으면 안되니 그 수가 동일해지면 더이상 신청 못하게 해주어야한다.

날짜를 비교하는 방법은 다양하다.

1.1 compareTo

String타입으로 저장해두었기 때문에 먼저 문자열 비교를 할 수도 있다.

비교해서 0 1 -1 값을 돌려받아 조건에 따라서 값을 처리하는것이다.

참조
https://mine-it-record.tistory.com/133

1.2 날짜비교

결과적으로는 자바의 LocalDate를 사용해서 비교했다.

public Map<String, Object> beforeApplyCheck(Integer postingId, Authentication authentication) {
    boolean loginCheck = authentication != null;
    boolean countCheck = false;
    boolean dateCheck = false;

    Posting posting = postingMapper.getPostViewDetailByPostingId(postingId);

    int applicationCount = posting.getApplicationCount();
    int spareCount = posting.getSpareCount();
    String endDate = posting.getEndDate();

    if (spareCount > applicationCount) {
        countCheck = true;
    }

    LocalDate now = LocalDate.now();
    LocalDate endDateLocal = LocalDate.parse(endDate, DateTimeFormatter.ISO_DATE);
    if (now.isBefore(endDateLocal)) {
        dateCheck = true;
    }

    return Map.of("loginCheck", loginCheck, "dateCheck", dateCheck, "countCheck", countCheck);
}

위의 코드에서는 java.time.LocalDate를 사용하여 날짜를 비교한다.
현재 날짜를 얻기 위해 LocalDate.now()를 사용하고 LocalDate.parse()를 사용하여 endDate 문자열을 LocalDate로 변환한다.
이후 isBefore()를 사용하여 현재 날짜가 endDate보다 이전인지를 확인한다.

반환되는 Map은 체크 결과인 loginCheck, dateCheck, countCheck를 키로 갖고 해당 결과를 값으로 가지게 된다.

이 코드를 사용하면 beforeApplyCheck() 메소드에서 날짜 비교를 정확하게 수행하고 체크 결과를 반환할 수 있다.

ISO_DATE는 java.time.format.DateTimeFormatter 클래스에서 제공하는 날짜 포맷 중 하나이다.

ISO 8601 국제 표준에 따라 날짜를 표현하는 형식을 지정할 때 사용된다.
ISO 8601은 날짜와 시간에 대한 표기법을 표준화하는 국제 표준이다.

ISO_DATE 형식은 날짜를 yyyy-MM-dd 형식으로 표현한다.
여기서 yyyy는 4자리 연도, MM은 2자리 월, dd는 2자리 일을 나타낸다.

예를 들어, "2023-07-17"은 ISO_DATE 형식에 따라 표현된 날짜이다.
실제로 데이터도 위와 같은 방식으로 저장되어 있다.

Java의 java.time.LocalDate 클래스와 함께 사용하여 문자열을 LocalDate 객체로 변환하거나 LocalDate 객체를 문자열로 변환할 때 ISO_DATE 포맷을 사용할 수 있다.

다음은 ISO_DATE 형식을 사용하여 문자열과 LocalDate 객체를 변환하는 예시이다.

public class Main {
    public static void main(String[] args) {
        // 문자열을 LocalDate 객체로 변환
        String dateString = "2023-07-17";
        LocalDate date = LocalDate.parse(dateString, DateTimeFormatter.ISO_DATE);
        System.out.println(date);

        // LocalDate 객체를 문자열로 변환
        LocalDate currentDate = LocalDate.now();
        String formattedDate = currentDate.format(DateTimeFormatter.ISO_DATE);
        System.out.println(formattedDate);
    }
}

위의 예시에서는 LocalDate.parse() 메소드를 사용하여 문자열을 LocalDate 객체로 변환하고
format() 메소드를 사용하여 LocalDate 객체를 문자열로 변환한다.
이 때 DateTimeFormatter.ISO_DATE를 사용하여 ISO_DATE 형식을 지정한다.

2. 입사지원

2.1 view ajax

날짜와 사람수를 비교해서 적합하다고 판단이 되면 입사지원버튼을 누를 수 있다.
이부분에서 새로운 창으로 이동하는 것 보다 창만 띄워서 간단하게 지원하도록 하고 싶었다.
안될 경우 토스트로 값을 보여주고 아닐경우 자바스크립트로 window.open을 사용해서 열게 된다.

const applicationBtn = document.querySelector("#application-btn");

applicationBtn.addEventListener("click", function () {
    const url = window.location.href;
    const postingId = url.substring(url.lastIndexOf("/") + 1);
    const titleInput = document.querySelector("#title");
    const title = titleInput.innerHTML;

    console.log(title);
    fetch(`/api/user/posting/application/${postingId}`)
        .then(response => response.json())
        .then(data => {
            let dateCheck = data.dateCheck;
            let countCheck = data.countCheck;

            if (dateCheck && countCheck) {
                const Url = `/user/posting/application?postingId=${postingId}&title=${title}`
                window.open(Url, '_blank', 'width=1000,height=700');
            } else if (dateCheck !== true) {
                toastBody.innerHTML = "입사 지원 가능 날짜가 지났습니다!!";
                toastBootstrap.show();
            } else if (countCheck !== true) {
                toastBody.innerHTML = "지원가능한 수가 초과하였습니다!!";
                toastBootstrap.show();
            }
        })
        .catch(error => {
            toastBody.innerHTML = "로그인 후 이용해주세요!";
            toastBootstrap.show();
        });
}

'_blank'는 window.open() 함수의 두 번째 매개변수인 target의 값으로 사용된다.
이 값은 새 창의 이름을 나타낸다.

'_blank'는 새 창을 열 때 새로운 이름을 할당하는 것을 의미한다.
이 이름은 새 창을 식별하는 역할을 한다.
즉, 'width=1000,height=700'과 같은 창 속성들을 수정하거나 창을 조작할 때 이 이름을 사용하여 창을 지정할 수 있다.

'_blank' 값을 사용하면 window.open() 함수는 매번 새로운 이름을 할당하여 창을 연다.
다른 값을 사용하면 해당 값으로 명시된 이름을 가진 창을 열거나, 이미 있는 창을 대상으로 열게 된다.

예를 들어, '_blank'를 사용하면 매번 새로운 창이 열리지만, 'myWindow'와 같은 이름을 사용하면 항상 동일한 이름의 창이 열리게 된다.

2023.07.30

시간이 가면갈수록 느끼는 것이지만 서버쪽 코드를 다루는 것은 복잡하지 않다 거의 데이터를 주고받는 일만 한다.
문제는 뷰쪽을 만들고 디자인을 하고 그런쪽인 것 같다.