[현장실습] 3주차 기록

오영선·2024년 1월 29일

실습

목록 보기
4/12
post-thumbnail

벌써 3주차!!

1일차 : 2024-01-29 월

상세

☑️ 코드 리뷰 하기
☑️ api 문서 작성
☑️ 업무 분담하기(새로오신 분)

코드 리뷰 하기

  • demo 보여드리기
  • 필요 기능, 필요없는 기능 정리하기
    - 회원가입, 로그아웃 필요X
    • 메인버전의 릴리즈 노트 수정시 DB반영하도록
    • apk 파일 삭제 잘 되는지 확인

메인버전의 릴리즈 노트 수정시 DB반영하기

  • 반영 완료
  • apk 업로드 시, 버전-릴리즈 반대로 되는 에러도 발견, 해결완료

[키오스크 등록] 초기화 버전 릴리즈노트 경로 에러

  • 키오스크 등록시에 초기화 폴더로 [kioskType/zero] 가 생성된다.
    이때 releaseNote.txt는 따로 생성하지 않는데, 이 때문에 키오스크 타입 상세(Detail) 조회시 파일 목록대로 릴리즈 노트를 읽으려해 문제가 생긴다.
  • 해결방안
  1. zero 폴더 생성시 릴리즈 노트 생성
  2. zero 폴더를 아예 생성하지 않는다. (DB에만 반영)
  • 회의 후, 후자를 택하여 적용
  • Detail 조회시 릴리즈 노트가 없는 경우 예외를 던지지 않도록 수정
  • 릴리즈 노트를 읽어오는getReleaseNote에서, FileNotFoundException 잡을 시 해당 파일이 없다고 판단, "" 빈 스트링 제공

회의

  • [보안] 로그인 횟수 제한 > 이슈 생성

2일차 : 2024-01-30 화

상세

☑️ 프로젝트 api화 하기 (타임리프 제거)
☑️ api 문서 작성
☑️ CS 스터디 - 데이터베이스
☑️ 오전 요청사항 처리
☑️ BaseTime Entity - 시간 포맷 변경
☑️ 쉘스크립트 작성

프로젝트 api화 하기 (타임리프 제거)

<오전>
참고 - Response 커스텀 객체화하기

  • 타임리프 제거 후, 자꾸 컨트롤러에서 view를 내놓으라는 에러를 던졌음.

제일 중요한 Controller -> RestController변경

챗지피티 :
@Controller와 @RestController의 차이점은 주로 반환하는 값에 있습니다.
@Controller

  • View를 반환하는 컨트롤러로 사용됩니다.
    메서드에서 반환하는 값은 View의 이름이며, Spring MVC는 이를 찾아서 반환합니다.
@Controller
public class MyController {
    @GetMapping("/example")
    public String example() {
        return "exampleView"; // 이 부분은 실제 View의 이름입니다.
    }
}

@RestController

  • JSON이나 XML과 같은 데이터를 반환하는 API 컨트롤러로 사용됩니다.
    메서드에서 반환하는 값은 HTTP 응답의 본문(Body)에 직접적으로 들어갑니다. 주로 객체나 데이터를 JSON으로 변환해서 전송합니다.
@RestController
public class MyRestController {
    @GetMapping("/api/example")
    public String example() {
        return "This is an example response"; // 이 부분은 직접 응답 본문에 들어갑니다.
    }
}

주의: @RestController를 사용하면 기본적으로 모든 메서드의 리턴값은 @ResponseBody 어노테이션이 적용된 것으로 간주됩니다. 이는 메서드에서 반환하는 값을 HTTP 응답 본문으로 사용한다는 의미입니다.

  • 때문에 별도로 @ResponseBody를 추가할 필요는 없습니다.

오전 요청사항 처리

  • 키오스크 리스트 api
    [GET] /kiosk_update/admin/kiosk/info
아이디
타입
패키지
릴리즈
최신버전(name)
수정시간


"code": 200,
  "message": "",
  "result": {
    "content": [
      {
        "kioskType": "now",
        "version": "d",
        "packageName": "now",
        "releaseNote": "d",
        "modifiedAt": "2024-01-29T17:37:21"
      },
      {
        "kioskType": "version",
        "version": "release",
        "packageName": "release",
        "releaseNote": "version3",
        "modifiedAt": "2024-01-29T15:34:24"
      },
  • 키오스크 Detail api
    [GET] /kiosk_update/admin/kioskinfo/{kioskType}
버전명
릴리즈
apk 경로 //<a태그>용 url 반환하는apk 존재
kiosk_id
키오스크 타입

// 20240130121812
// http://localhost:8080/kiosk_update/admin/kiosk/info/now

{
  "code": 200,
  "message": "",
  "result": {
    "kioskInfo": {
      "modifiedAt": "2024-01-29T17:37:21",
      "kioskInfoId": 28,
      "kioskType": "now",
      "version": "d",
      "packageName": "now",
      "releaseNote": "d"
    },
    "versionInfos": [
      {
        "filename": "d",
        "releaseNote": "d"
      },
      {
        "filename": "werwer",
        "releaseNote": "erewer"
      }
    ]
  }
}
  • 사업자 리스트 api
사업자번호
키오스크 타입 
bussiness_id
code": 200,
  "message": "",
  "result": {
    "content": [
      {
        "businessInfoId": 8,
        "businessNumber": "8080808080",
        "kioskType": ""
      }
    ],
    "pageable": {
      "sort": {
        "empty": true,
        "sorted": false,
        "unsorted": true
      },
      "offset": 0,
      "pageNumber": 0,
      "pageSize": 10,
      "paged": true,
      "unpaged": false
    },

BaseTime Entity - 시간 포맷 변경

  • 기존사항
    시간 포맷으로 JsonFormat 사용. 그러나 적용 안됨
    때문에 디폴트값 "modifiedAt": "2024-01-29T17:45:31"으로 표현

  • 변경사항
    시간 포맷 yyyy-MM-dd HH:mm:ss 으로 변경 후
    재배포

(json전달을 위해 필요한 Jsacson의) JsonFormat
Response (서버 -> 클라이언트) 로 전달할 때에는 @JsonFormat 을 사용,
Request(클라이언트 -> 서버)로 전달할 때는 @DateTimeFormat 을 사용한다.
출처 : https://footprint-of-nawin.tistory.com/68

=> 결국 @DateTimeFormat 안됨. 직접 format형식 지정

modifiedAt = this.modifiedAt?
	.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))

쉘스크립트 작성

clean - build - .war생성 및 ROOT.war로 이름 변경

echo "@@@@ build artifacts start : @@@@"
echo "===> wrapper : " 
#참고로 여기서 에러난다면 직접 wrapper, build후 다시 실행
./gradlew wrapper 
echo "===> build : "
./gradlew build -x test
# 만약 artifacts 디렉토리가 존재하지 않는다면 생성
echo "===> mkdir ROOT : "
mkdir -p out/artifacts/ROOT
echo "===> copy ROOT.war : "
echo "===> build artifacts st : "
cp build\libs\KioskUpdateApi-1.0.1.war out\artifacts\ROOT\ROOT.war
echo "===> build artifacts success : "
echo "@@@sleep 10 sec, but mean nothing@@@"
sleep 10

ftp 연결 - ROOT.war 파일 업로드 ( 작동안됨 )

LOCAL=out/artifacts/ROOT
#ftp 접속하려는 호스트, 유저명, 비밀번호
HOST={HOST}
USER={USER}
PASS={PASSWORD}
# 로컬로 가져오고 싶은 파일명과 파일이 있는 디렉토리 경로
DIR=tomcat/webapps-javaee
FILE=out/artifacts/ROOT/ROOT.war
echo "접속합니다"
#ftp에 접속
ftp -inv $HOST << sess
quote opts utf8 on
prompt
user $USER $PASS
cd $DIR
put $FILE
bye
sess
echo "접속종료"

git bash나 터미널에 한줄씩 입력하면 잘되는데 upload.sh를 실행하면 안된다

오후에는 5시간동안 쉘스크립트만 쓰고 있었더니 머리가 터질것같다🤯🤯🤯
챗지피티랑 열심히 고민했는데..잘안된다.... 결국 ftp랑 ssh는 수동으로 해야할듯 ㅠㅠㅠ!!!!

3일차 : 2024-01-31 수

상세

☑️POST 메서드 api화
☑️ 현장실습 제출 서류 작성
☑️ 소마 1번 항목 쓰기
☑️ 엠로 1번 쓰기
밀린 현장실습 후기쓰기
포트폴리오 한장만들기(현장실습꺼)

POST 메서드 api화

feat : [POST] createKioskInfo api화 #10
feat : [POST] updateKioskInfo api화 #10
feat : [POST] createBusinessInfo api화 #10
feat : [POST] updateBusinessInfo api화 #10
refactor : upload Apk 함수 에러 처리 코드 리팩토링 #10

아주 금방 끝냄 ㅎㅎ
api문서 적기 귀찮지만 점심먹기 전까지 끝내본다->완

현장실습 서류 쓰기

귀찮지만.. 오전에 할일을 어느정도 끝내서 오후에 여유롭게 작성완료!!

프론트 코드 리뷰

  • 간단하게만 문구변경 요청

로그인페이지

  • 로그인화면 띄우기 : formLogin 주소랑, login.html에서 보내는 action주소 일치시키기
  • @Controller에서 .html 명시해주기
  • 왜인지 spring 서버에서 /static/은 왜인지 경로로 인식하지 않았음

스프링부트는 static 폴더가 기본 경로로 지정이 되어있기 때문에 static 밑의 경로만 써주면 됩니다.
또한 위에 나와있는 디렉토리에 있는 정적 웹 리소스를 자동으로 추가한다고 합니다

https://wonin.tistory.com/470

4일차 : 2024-02-01 목


일도 없다..
돈도없고..

상세

☑️ api 문서 안쓴거 찾아서 쓰기
☑️ api화 안끝난거 찾기
☑️ 엠로 2번쓰기
☑️ 소마 2번 쓰기
[보안] 로그인 횟수 제한

[보안] 로그인 횟수 제한


failureHandler를 등록할때 고생했는데..ㅠㅠㅠ 자바 문법을 코틀린으로 번역하다 타입지정을 nullable안해줘서 계속 에러가 났었다.....ㅠ
겨우해결하고,
이메일 발송은 내일하기로!

0개의 댓글