'분류 전체보기' 카테고리의 글 목록 (2 Page) :: zeroOne
728x90

사이드 프로젝트를 진행중에 앱심사 거절 사례가 발생했다.

 

Hello,
Regarding Guideline 5.1.1, users should be able to save information locally without logins.
See guideline 5.1.1(v)
이렇게 안내가 왔고
 guideline 5.1.1(v) 이 가이드라인은 개인정보 보호 관련 내용입니다.

그래서 우리의 앱이 무엇이 잘못 되어 있는가
1. 회원탈퇴 기능이 정상 작동되지 않는다.
2. 로그인 계정정보를 제출해야된다(이건 개발자님이 제출하신건지 잘 모르겠네요.)

이 부분이 문제인거 같네요. 지금까지 엄한 문제만 생각했던거 같아요.
이부분 해결해보고 무엇이 문제였는지 후기 작성하겠습니다.

아래는 앱스토어 앱심사 거절 대표사례 퍼온 글입니다.


앱스토어 심사 거절 사유는 너무나 다양하여, 모든 심사 사례를 다 알려드릴 수 없는 점 양해 부탁드려요.

*애플은 연구원이 직접 검수를 다 하기 때문에 앱 컨텐츠 내에서도 문제가 발생되는 경우가 많고 어떤 사람이 심사를 맡는지에 따라 주관적인 요소가 굉장히 많이 적용됩니다.

따라서 심사 거절의 사유는 수십가지 발생될 수 있어요!

스윙투앱으로 앱제작 한 뒤, 앱스토어 업로드 대행 신청하신 분들은 심사 거절 사유에 맞는 조치사항을 알려드리구요.

정상적으로 앱 출시가 될 때까지 심사를 계속 진행해드리니 걱정하지 않으셔도 됩니다.

아래 본문을 통해 앱스토어에서 자주 발생되는 심사 사유(사례)를 확인해주세요.

 
1.앱 로그인 계정 정보

-거절사례: 로그인 계정 정보를 제출하지 않는 경우

앱에 로그인 기능이 있을 경우 반드시 테스트용 로그인 계정(아이디, 비밀번호) 제출해야 합니다.

스윙투앱으로 제작한 앱에서도 회원가입, 로그인 기능을 제공하고 있구요.

웹사이트를 연결한 웹뷰, 푸시앱에서도 로그인 기능이 있을 경우 애플에 제출한 데모계정을 제공해주셔야 합니다.

해당 계정은 애플에서 직접 로그인하여 앱의 모든 메뉴를 확인하고 검수하는데 이용되므로 실제 로그인 가능한 계정으로 제출해주셔야 하구요.

관리자 권한이 아닌 사용자 계정으로 제출해주세요.

테스트용으로 따로 가입한 뒤 제공 해주셔도 좋습니다.

이렇게 로그인 기능이 있는 앱은 반드시 앱스토어 심사시 테스트용 계정(아이디, 비밀번호)을 제출해야 합니다.

 
2. 애플 로그인 기능 셋팅

-거절사례: 애플로 로그인 기능 미제공 (소셜 로그인 제공시에만)

*해당 케이스는 웹사이트를 연결한 웹앱- 웹뷰, 푸시 앱만 해당됩니다.

웹사이트에 일반 로그인 기능 외에 소셜 간편 로그인 – 카카오톡, 페이스북, 구글, 네이버 등의 간편 로그인 기능을 넣어서 이용중인 경우가 많은데요.

이렇게 소셜 로그인을 제공하는 웹앱은 “애플로 로그인” 기능도 반드시 함께 셋팅해야 합니다.

소셜 로그인 기능을 제공하면서, 애플 로그인 기능이 없을 경우 100% 심사 거절됩니다.

따라서 앱 제출 전 웹사이트에 간편 로그인 기능을 제공하고 있다면 애플 로그인을 추가 셋팅해주셔야 합니다.

애플 로그인은 사용자분의 웹사이트에 적용하는 것이기 때문에 앱 기능과는 무관합니다.

만약 애플 로그인 기능 셋팅이 어렵다면, 심사 동안 간편 로그인 기능은 모두 제거하고 웹사이트 내 기본 로그인 기능만 제공해야 합니다.

*주의사항 : 애플에서 제공하는 표준 디자인 사용 *해당 디자인은 2022년 10월 규정된 정책입니다.

   - 해당 사이트 : https://account.apple.com/signinwithapple/button

애플 로그인 셋팅시에는 애플에서 제공하는 로그인 버튼의 표준 디자인을 확인하여 만들어주셔야 합니다.

다른 디자인을 사용하거나 표준 텍스트를 사용하지 않을 경우도 심사가 거절됩니다.

*애플 로그인 셋팅 이미지 참고1
*애플 로그인 셋팅 이미지 참고2
 
3.마케팅 또는 광고용 홍보 앱

-거절사례: 사용자들이 이용 및 참여할 수 있는 기능이 없는 경우

앱을 제작할 때 스윙투앱에서는 여러 사용자 참여형 기능을 제공하고 있는데요.

해당 기능을 적용하지 않고, 단순 정보 제공 페이지, 글과+홍보 이미지로만 나열된 페이지 등만 적용된 케이스입니다.

예시)모든 메뉴에 특정 홈페이지의 홍보 페이지 연결

앱 기능을 다양하게 적용했으나 게시판, 쇼핑몰, 채팅 등 사용자가 참여할 수 있는 기능이 없는 경우

해당 정책은 웹뷰, 푸시앱에서 앱 심사 거절 1순위 사례입니다.

웹사이트 내에 홍보 이미지, 정보 글만 나열되어 있고, 사용자가 앱에서 아무런 기능을 이용할 수 없는 경우가 많은데요.

이러한 웹사이트를 연결한 웹앱은 앱스토어 심사에서 거절될 확률이 아주 높습니다.

주의사항)푸시 기능을 넣는다고 해서 문제가 해결되는 것이 아닙니다.

게시판 기능 등으로 사용자가 글을 작성하고 댓글을 입력할 수 있는 기능 등이 필요합니다.

*뉴스나 신문 카테고리의 앱은 해당 내용과 관계없습니다.

 
4.애플 인앱(in-app) 구매 미셋팅

-거절사례: 디지털 상품 판매시 애플 인앱(in-app)을 적용하지 않음

이미지 참고) 애플 인앱 적용된 앱 화면

앱 내에서 디지털 상품을 판매할 경우, 애플 결제모듈인 인앱 결제 모듈을 셋팅해주셔야 합니다.

애플 및 구글 모두 디지털 상품에 대해서는 일반 결제 시스템을 사용할 수 없으며,

애플과 구글에서 제공하는 인앱 결제 모듈을 셋팅해야 함을 정책상 공지하고 있습니다.

디지털 상품이란, 실물상품을 제외한 *구독형 제품, 이용권, 쿠폰, 컨텐츠(파일, 영상), 포인트, 캐시, 기부, 후원 등의 모든 상품을 말합니다.

이러한 상품을 앱에서 판매한다면 애플에서 인앱 결제를 요구할 경우 필수로 등록해야 하며, 응하지 않을 경우 출시가 불가합니다.

(인앱 셋팅을 안한다면 결제 기능도 모두 제거해야 합니다.)

*애플 인앱 결제 수수료는 1년 매출액이 10억 이하는 인앱 결제 수수료 15%, 10억 이상은 30% 수수료 발생됩니다.

웹앱은 사용자분의 웹사이트에 직접 탑재해주셔야 하며, 일반 프로토타입으로 제작한 앱은 스윙투앱으로 별도 개발 요청을 주시면, 개발 작업을 진행해드립니다.

앱 내부 볼륨에 따라 개발 비용은 달라집니다. 메일을 통해 별도 문의주시면 답변 드립니다.

 
5.명품 브랜드 모방 및 위조 상품 판매 앱

-거절사례: 명품 브랜드를 위조 및 모방한 위조품을 판매하는 앱 *쇼핑몰 사이트 앱 포함

명품 브랜드를 위조 및 모방하여 만든 제품을 판매하는 상품 속칭 짝퉁(레플리카, 이미테이션)이라는 불리는 상품을 판매하는 앱은 출시 불가합니다.

쇼핑몰 사이트로 만든 웹앱 역시 동일합니다.

이러한 상품을 판매하는 앱일 경우 스윙투앱은 앱스토어 등록 대행을 해드리지 않습니다.

 
6.회원탈퇴(계정삭제) 기능

-거절사례: 로그인 후 마이페이지 등에서 회원탈퇴 기능을 제공하지 않는 경우

최근 거절 사례로 많이 발생되는 내용 중 하나입니다.

로그인 기능을 제공하는 앱에서는 회원탈퇴=계정삭제 기능을 제공해야 함을 고지하고 있습니다.

*탈퇴 기능 이미지 참고

 
7.구글 플레이스토어 언급

-거절사례: 앱에 플레이스토어 홍보 이미지 혹은 문구를 기재한 경우

애플 플랫폼 외에 구글 등과 같은 타 os가 언급되지 않도록 해주셔야 합니다.

구글 이미지, 안드로이드폰 이미지, 구글플레이스토어 단어 등이 앱 컨텐츠에서 보여지지 않도록 미리 체크해주세요.

예) 구글플레이스토어에서 ‘OOO앱을 검색하세요”, “구글플레이스토어에 출시되었습니다”.. 이러한 문구도 허용되지 않습니다.

 
8. 테스트 단어 사용

-테스트, 점검중, 준비중, 데모, 베타 등 완전한 컨텐츠가 아닌 경우

테스트, 데모, 베타, test 등의 용어는 허용하지 않습니다.

테스트 앱 제출이라는 의도가 있을 경우 심사 거절됩니다

내용 제출시 완전한 내용이 제출될 수 있도록 위의 단어들은 피해주시기 바랍니다.

특히 아래와 같은 내용들 주의해주세요.

1)게시판 글 작성시 "테스트 입니다" "테스트 글 작성 "

2)오픈 예정, 준비 예정, comming soon

3)출시 예정

 
9.사용자 제작 컨텐츠 – 신고 기능

–거절사례: 게시판 기능에서 신고 기능이 제공되지 않는 경우

커뮤니티 – 게시판 작성, 댓글 작성의 기능을 제공하는 앱은 사용자 컨텐츠 정책에 따라 신고 기능을 제공해야 합니다.

*사용자 정책: 게시물 신고, 사용자 신고, 사용자 차단 해당 기능을 제공해야 합니다.

사용자 신고시 해당 글은 즉시 삭제 처리되어야 하며 신고를 받은 사용자 역시 웹에서 블락((제거)처리되어야 합니다.

스윙투앱 일반 프로토타입으로 제작한 앱에서는 게시판에 신고 기능이 기본 셋팅되어 제공되기 때문에 사용자분들이 추가적으로 해야할 것은 없습니다.

웹사이트를 연결한 웹앱- 푸시, 웹뷰앱 사용자분들은 앱에 연결한 웹사이트에 신고 기능이 있는지 확인해주세요.

신고 기능이 없다면, 위에서 안내드린 것처럼 신고/차단 기능을 모두 제공해주셔야 합니다.

*신고, 차단 기능 이미지 참고

 
10. 폐쇄형 사이트 혹은 이용제한을 둔 경우

-거절사례: 로그인을 해야 이용 가능한 경우

앱 시작시 반드시 로그인을 해야 이용 가능하며, 회원가입 메뉴가 없어서 앱에서는 회원가입을 하지 못하는 경우입니다.

이러한 케이스를 폐쇄형 앱이라고 합니다.

일반적으로 관리자가 부여한 계정으로 로그인을 하거나, 사원번호 등 회사에서 부여한 정보로 로그인을 하는 등으로 운영됩니다.

-임직원 전용, 복지몰 사이트가 대표적이구요.

-특정 사용자만 이용 가능하도록 제공하는 앱

앱스토어는 말하는 앱은 모든 사용자가 제한없이 이용가능함을 원칙으로 하고 있습니다.

따라서 이렇게 폐쇄형으로 제작된 앱은 공식 출시가 불가하구요.

test-flight 혹은 엔터프라이즈로 배포해주셔야 합니다.

-test-flight : 특정 사용자들에게만 배포하는 프로그램(앱스토어에 검색되지 않고, 등록한 사용자들만 이용)

-엔터프라이즈 : 회사 및 기업에서 진행할 수 있으며, 회사 직원들에게 공유할 수 있는 앱입니다.

특정 회사 특정 그룹 이용 용도의 경우도 동일합니다.

 
11.코로나, 원숭이 두창 등의 컨텐츠 사용(국제적인 질병 컨텐츠)

-거절사례: 코로나(COVID-19) 정보를 담은 앱 제출

앱 내에 코로나(COVID-19) 관련 언급이 있을 경우 승인이 되지 않습니다.

코로나 19 관련 컨텐츠가 있다면 모두 삭제해주시기 바랍니다.

코로나 및 원숭이두창과 같은 질병 컨텐츠는 국가에서 승인을 받은 정부기관에서만 해당 내용을 다룰 수 있도록 법으로 개편되었습니다.

앱스토어 뿐만 아니라 플레이스토어 모두 동일한 정책을 발표했으며, 정확하지 않은 무분별한 정보 남용을 막기 위해 시행되었습니다.

따라서 해당 내용의 앱은 제출이 불가하구요.

해당 내용을 다룬 앱이 아니더라도 앱 소개나 설명에 관련 컨텐츠를 기재하는 것 또한 거절될 수 있습니다.

 
12.특정 회사, 특정 그룹 이용용도

-거절사례: 회사 내부 배포용, 특정 사용자만 이용하게끔 하는 앱, 베타 테스트용으로 앱을 배포하는 경우

특정 회사의 직원들만 이용 가능한 앱은 앱스토어 공식 출시가 불가합니다.

앱스토어의 앱 출시 정책은 “앱스토어는 모든 사용자가 제한 없이 앱을 이용할 수 있어야 합니다”

따라서 앱 내용 자체가 특정 학교, 특정 회사를 주제로 하고 있거나

앱 실행시 회사직원용 번호를 입력해야 하는 등으로 입장 제한이 있는 경우가 해당됩니다.

이러한 앱은 앱스토어 공식 출시가 아닌 test-flight 혹은 엔터프라이즈로 배포해주셔야 합니다.

test-flight 이용 매뉴얼

https://wp.swing2app.co.kr/knowledgebase/appstore-testflight/

엔터프라이즈 이용 매뉴얼

https://wp.swing2app.co.kr/knowledgebase/apple-developer-enterprise/

 
13.앱 이름 – 설치 이름, 앱스토어 노출 이름 상이

-거절사례: 제작 앱 이름과 앱스토어 노출 앱 이름이 서로 다른 경우

스윙투앱에서 제작한 앱 이 과 앱스토어 신청시 제출한 앱 이름이 서로 상이할 경우입니다.

스윙투앱 앱 기본정보에 입력한 이름이 ‘앱제작 이름’으로, 핸드폰 설치시 보여지는 이름이구요.

앱스토어에 노출되는 이름은 앱스토어에서 검색했을 때 나오는 앱 이름입니다.

서로 동일하게 제출하는 것이 원칙이나, 이름에 살짝 단어를 더 추가하는 것은 괜찮아요.

예를 들어)

-제작 앱 이름: 스윙투

-앱스토어 노출 앱 이름: 스윙투앱 - 모바일 앱제작 플랫폼

이런식으로 이름 옆에 단어를 추가하는 것은 괜찮습니다.

그런데 완전히 뜻이나 명칭이 다른 경우는 거절이 됩니다.

예를 들어)

-제작 앱 이름: 가나다교회

-앱스토어 노출 앱 이름: 서울기독교총회

이렇게 완전히 다른 이름으로 제출할 경우가 해당됩니다.

따라서 앱스토어에 출시할 앱 이름을 제작한 앱 이름과 동일하게 맞춰서 제출해주시기 바랍니다.

 
14.유명 브랜드 명칭 사용

-거절사례: 브랜드 소유자가 아닌 타 기관에서 앱을 제출하는 경우

병원, 정부기관, 학교 이름 등 기관명을 언급하는 것은 모두 브랜드 저작권 내용으로 심사에서 거절될 수 있는 확률이 높습니다.

특정 기관의 이름으로 앱 출시를 할 경우 해당 기관명으로 개발자 계정을 만들어서 등록해야 할 수 있습니다.

출시가 되도록 하기 위해서는 해당 기관명으로 된 개발자 계정으로 제출되어야 하구요. (브랜드 소유자 임을 증명)

만약 스윙투앱 계정으로 대리등록을 한다면, 스윙투앱과 해당 기관의 관계에 대해 증빙서류를 제출해야 할 수 있습니다.

스윙투앱에 앱제작 및 앱스토어 출시를 위임했다는 위임대행 계약서를 제출할 수 있구요.

해당 서류를 제출할 수 있도록 도와드립니다.

 
15. 스크린샷 이미지

–거절사례: 스크린샷 이미지 저해상도, 정책에 맞지 않는 이미지를 제출하는 경우

앱스토어 앱 등록시 아이폰용 스크린샷 이미지를 제출하게 되는데요.

이미지 제출시 해상도가 너무 낮아 이미지 퀄리티가 떨어지는 경우도 심사가 거절됩니다.

또한 아이폰용 앱 실행화면을 제출해야 하는데, 앱과는 무관한 이미지를 제출하거나&안드로이드 플랫폼이 표시되는 이미지 제출도 앱스토어 심사에서 거절됩니다.

반드시 애플에서 제공하는 이미지 정책에 맞게 스샷 이미지를 제출해야 합니다.

그외 앱스토어 심사 정책 내용은 아래 내용으로 참고해주세요.

1)온라인 카지노, 스포트 배팅, 복권 또는 현금이나 기타 상품을 상으로 제공하는 사행성 게임 등 온라인 도박을 조장하는 앱은 앱은 허용되지 않습니다. (출시 불가)

2) 술, 담배, 니코틴, 전자 담배를 판매하거나 관련 컨텐츠를 포함하는 앱은 허용되지 않습니다. (출시 불가)

3) 포르노와 같은 음란물을 포함하거나 홍보하는 앱은 허용되지 않습니다. 일반적으로 성적 만족을 주기 위한 콘텐츠는 허용되지 않습니다.(출시 불가)

4)상품권, 핸드폰 소액결제 상품화, 소액결제현금화 등의 앱은 정보통신법 및 금융법 관련하여 애플에서 금지한 앱입니다.(출시 불가)

5) 이미테이션 명품 판매, 레플리카 제품, 불법 복제 제품판매 등의 컨테츠 금지 (출시 불가)

6) 금융상품, 재무 컨설팅, 대출, 암호화폐, 바이너리 옵션을 판매하거나 관련된 상품 및 서비스를 제공하는 앱은 허용되지 않습니다.

7)저작권/지적재산권 위반: 제3자 혹은 타업체의 지적재산권을 무단 사용하는 경우. 특히 제3자의 컨텐츠, 영상을 올리고 앱에서 광고 수익을 창출하는 앱은 허용되지 않습니다.

8) *중요* 앱제작시프로토타입-웹뷰, 푸시로 제작한 앱(홈페이지 등의 웹사이트를 연결한 웹앱) 은 웹뷰앱은 심사가 들어가봐야 출시여부를 알 수 있습니다.

무조건 웹앱이라 심사가 거절되지는 않지만 이러한 사례로 출시가 안되는 앱도 있습니다._스윙투앱에서는 최대한 어필하여 앱스토어 출시를 도와드립니다.

* 본인 소유의 홈페이지 외에 다른 브랜드 소유권의 웹링크를(네이버,다음, 인스타그램..)연결해서 제작한 앱은 승인 불가합니다.

* 모바일웹이 아닌 PC버전 웹은 거절됩니다. 웹사이트는 반드시 모바일웹으로 연결해야 합니다.

*사용자 참여 기능이 없이 홍보, 단순 마케팅, 정보만을 제공하는 웹뷰앱은 심사시 거절될 확률이 높습니다.

* 스토어 출시가 거절되어도 앱스토어 등록작업을 한 앱에 대해서는 이용권 및 업로드 티켓 비용이 환불이 되지 않으니 반드시 유념해주시기 바랍니다.

9) 내부 사용 목적의 앱 : 회사 내부에서만 사용되거나(회사 직원들만 이용), 특정 사용자만 이용하게끔 하는 앱은 앱스토어 출시 불가합니다.

10) 앱에서 필요한 기능을 사용하지 않는 앱 : 외부 웹링크(URL)만 연결하거나 앱의 컨텐츠가 없는 앱들은 앱 기능을 사용하지 않는다고 판단하여 애플에서 승인하지 않습니다.

11) 개인정보 수집: 앱에서 필요하지 않은 사용자의 성별, 연락처, 주소를 묻는 경우입니다. (회원가입시 해당 정보들이 앱 이용에 필요하지 않은 경우 심사 거절됩니다)

12) 실물상품을 제외한 상품 판매 – 디지털제품, 기부,후원,구독 등은 애플 인앱 결제모듈을 탑재해야 합니다.(일반 카드 결제 등의 전자결제모듈 이용불가)

애플에서 인앱 결제를 요구할 경우 필수로 등록해야 하며, 응하지 않을 경우 출시가 불가합니다.(인앱 셋팅을 안한다면 결제 기능도 모두 제거해야 함)

*애플 결제 정책 보러가기 (1년 매출액이 10억 이하는 인앱 결제 수수료 15%, 10억 이상은 30% 수수료 발생)

https://developer.apple.com/app-store/review/guidelines/#in-app-purchase

웹앱은 사용자분의 웹사이트에 직접 탑재해주셔야 하며, 일반 프로토타입으로 제작한 앱은 스윙투앱 개발로 작업해드릴 수 있으나 앱 내부 볼륨에 따라 개발 비용은 달라집니다.

상담 후 비용 안내가 가능합니다.

앱스토어 앱 제출시 참고해주세요.

감사합니다.

 

출처 : https://documentation.swing2app.co.kr/knowledgebase/appstore/reject

728x90

'기획' 카테고리의 다른 글

[서비스 정책서] 개인정보 보호지침  (1) 2024.10.20
서비스 기획 약관작성에 대하여  (0) 2024.10.16
앱 버전 관리  (0) 2024.09.10
728x90

javascript String 객체의 length 프로퍼티는 문자열의 길이를 의미한다. 일반적으로 '안녕하세요', 'hi'와 같이 한글이나 영어 문자열의 length 값은 눈에 보이는 글자 수 그대로 각각 5와 2가 될 것이라고 생각할 수 있다.
그러나 이모지 🥰와 태국어 ค์는 어떨까?
특이하게도 글자 수는 1개이지만 length 값은 2를 반환한다.
javascript에서 문자열을 어떻게 처리하길래 글자에 따라 다른 length 값을 갖는지 간단히 정리해 보려고 한다.

 

문자 인코딩

컴퓨터는 오직 0과 1만 인식한다. 사람이 사용하는 언어나 문자를 이해할 수 없으므로 컴퓨터에 문자를 표현하기 위해선 문자를 0과 1로 변환하는 과정이 필요하다. 각 글자마다 숫자를 대응하고 이를 컴퓨터가 이해하는 0과 1의 이진법으로 변환하는 위 작업을 인코딩(Encoding)이라고 한다.

문자열 세트(Character Set)

인코딩은 약속에 의해 이뤄진다. 예를 들어 ‘A는 65, B는 66, C는 67에 대응되도록 한다.’ 와 같이 글자 별로 대응할 숫자를 정한 뒤 컴퓨터는 이 규칙을 따라 문자를 화면에 처리한다. 이처럼 컴퓨터에서 처리할 글자들을 정하고 각 글자마다 대응하는 숫자를 지정해 체계화 시킨 방식을 문자열 세트(Character Set)라고 한다. 어떠한 문자열 세트를 사용하냐에 따라 컴퓨터가 처리할 수 있는 문자가 달라지고 해당 문자가 대응되는 숫자도 달라진다.

HTML의 <head> 태그를 보면 아래와 같이 meta 태그의 charset=”UTF-8” 속성을 볼 수 있는데, 해당 HTML을 인코딩할 때 사용할 문자열 세트를 지정하는 부분이다.

<html>
  <head>
      <meta charaset="UTF-8">
      <title></title>
  </head>
</html>

유니코드(Unicode)

초창기 컴퓨터는 알파벳, 숫자 그리고 몇 개의 특수문자만 숫자로 매칭하는 아스키 코드(ASCII) 문자열 세트를 적용하였다. 그러나 컴퓨터를 사용하는 국가가 점점 늘어나고, 아스키 코드로는 영어 이외의 다른 문자를 컴퓨터에 표현할 수 없자 언어 별 다양한 문자열 세트가 등장하였다.(한글 또한 예전에는 주로 EUC-KR 방식을 사용해 인코딩을 했다.)
문자마다 각기 다른 문자열 세트를 사용하다보니 서로 다른 언어 간 글자가 화면에서 깨져보이는 일이 발생했고, 이를 통합하고자 전 세계 언어를 대응할 수 있는 문자열 세트를 만들었는데 이것이 바로 유니코드(Unicode)다.

유니코드는 다양한 인코딩 방식을 가지고 있다. 즉 문자를 이진수로 저장할 때 몇 개의 자리수를 사용하느냐에 따라 UTF-8, UTF-16, UTF-32 등의 방식으로 구분된다. UTF-8 인코딩 방식을 가장 흔하게 사용하며 javascript는 UTF-16 방식을 사용한다.

javascript에서 문자열 길이

MDN에서는 String.length 를 아래와 같이 설명한다.

length 속성은 UTF-16 코드 유닛을 기준으로 문자열의 길이를 나타냅니다.

코드 유닛(Code Unit)이란 문자열 인코딩 방식에서 하나의 문자를 구성하는 가장 최소 비트 단위를 의미한다. UTF-16 인코딩 방식은 하나의 문자에 16비트의 이진수를 최소 단위로 사용하여 표현한다. 즉 String.length값이 1인 인 문자는 UTF-16 인코딩 방식으로 16비트의 길이를, String.length값이 2인 문자는 32비트의 길이를 가지고 있다는 의미이다.

Surrogate Pair

UTF-16 인코딩 방식은 기본적으로 16비트 내에서 문자를 표현하지만, 전 세계의 모든 문자를 16비트만으로 표현하기엔 역부족이었다. 따라서 기본 코드유닛인 16비트에 16비트 한 단위를 추가하여 32비트로 문자를 표현하는 방식이 사용되었는데, 2개의 코드 유닛을 사용하여 문자를 표현하는 방식을 Surrogate Pair (써로게이트 페어)라고 한다. 위에서 살펴본 🥰와 같은 emoji는 써로게이트 페어 방식으로 인코딩되는 가장 대표적인 문자이다.

Surrogate Pair 방식 외에 특정 조합형 문자들 또한 2개 이상의 코드 유닛으로 표현되기도 한다. 위에서 살펴본 태국어 ค์가 그 예이다.

Grapheme

그럼 코드 유닛 단위가 아닌 사람이 인지하는 문자 그대로의 길이는 어떻게 알 수 있을까?
사람이 인지하는 문자 단위를 Grapheme(문자소)라고 한다. javascript의 Intl.Segmenter 생성자를 이용하면 지정한 locale에 맞춰 grapheme 단위로 문자를 추출해 길이를 얻을 수 있다.

const text = '🏳️‍⚧️🏳️‍🌈👩🏾‍❤️‍👨🏻';
console.log(text.length); // 24

const segmentLength = Array.from(new Intl.Segmenter().segment(text)).length;
console.log(segmentLength); // 3

locale을 태국어로 하는 경우

const text = 'ค์';
const segmenterTh = new Intl.Segmenter('th', { granularity: 'grapheme' });

const segmentLength = Array.from(segmenterTh.segment(text)).length;
console.log(segmentLength); // 1

Int.Segmenter에 대한 자세한 설명은 MDN에서 확인할 수 있다.

 

 

 

출처 

https://jjnooys.medium.com/javascript-%EA%B8%80%EC%9E%90-%EC%88%98-00edc022efbe

728x90
728x90

10월 9일은 한글날로 여러분 모두 쉬는 아주 기쁜날이죠~?
한글날을 맞이해서 토스에서 이벤트를 하는데요.

 

바로 틀린그림찾기 입니다.

5단계로 되어있는데요. 정말 기가막힙니다.

 

 

 

이게 2단계이고

아래사진이 3단계입니다.

어찌어찌 했다해도

4단계부터는 진짜 하라는건지 말라는건지

놀리는건지 진짜 좋은날 열이너무 받네요.

 

그냥 토스앱 삭제하러 가야겠습니다..소비자 기만어플

728x90
728x90

서비스 정책서 작성중 비밀번호 생성규칙 안내 사이트를 발견하여 올립니다.

 

한국보건산업진흥원에서 제공하는 안내 사항입니다

 

https://www.khidi.or.kr/includes/password.jsp#:~:text=%EC%98%81%EB%8C%80%EB%AC%B8%EC%9E%90(A~Z%2C,%EC%9E%90%20%EC%9D%B4%EC%83%81%EC%9C%BC%EB%A1%9C%20%EC%9E%85%EB%A0%A5%ED%95%A9%EB%8B%88%EB%8B%A4.&text=%EC%83%9D%EC%84%B1%ED%95%9C%20%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8%EC%97%90%2012345678,%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8F%84%EB%A1%9D%20%ED%95

 

한국보건산업진흥원 비밀번호 생성규칙 안내

 

www.khidi.or.kr

 

9%EB%8B%88%EB%8B%A4.

728x90
728x90

매일 todo 리스트 만들던중

간단하게 요일 이랑 오늘날짜를 좀 적어보려고 만들어봤씁니다.

 

텍스트랑 날짜를 같이 사용할경우 셀의 서식 때문에 아래와같이 오류가 나는데요 그래서 text함수로 날짜를 텍스트로 바꿔줘야한답니다.

 

그리고 수식에서 줄바꿈(엔터)는 char(10)함수랍니다.

생각보다 간단한데 오래걸리네요!

 

728x90
728x90

API

 

Application : 고유한 기능을 가진 모든 소프트웨어

Programming

Interface : 두 애플리케이션 간의 서비스 계약

 

즉 소프트웨어간 상호작용 하도록 하는 중개자라고 할수있습니다.

기능을 개발할때 직접 개발하지 않고 미리 제공된 기능을 호출하여 사용할 수 있도록 설계된 인터페이스입니다.

728x90
728x90

4.2.1의 의미를 알아보자


 

가장 먼저 나오는 숫자는 

 

주 (Major) 역할을 합니다

 

기존 버전과 호환 되지 않으면서 대규모 업데이트를 의미한다고 합니다! 

 

4.2.1 의 버전은 그동안 4번의 대규모 업데이트를 진행했다는 것을 알 수 있습니다! 

 

그리고 버전 up 을 하는 경우 뒤 숫자들은 0으로 초기화 합니다!

 

 

그 다음 두번째 나오는 숫자는 

 

부 Minor 입니다

 

기존 버전과 호환은 되지만 새로운 기능이 추가되는 경우 해 당 숫자가 증가됩니다! 

 

4.2.1 의 버전에서 는 총 두번에 새로운 기능이 추가 되었다는 것을 알 수 있습니다! 

 

 

마지막으로 나오는 숫자는 

 

수 Patch 입니다

 

보통 버그를 수정하거나 여러 오류들을 수정하고 배포할 때 해당 숫자가 증가합니다! 

 

 

728x90
728x90
UPDATE menu set parent_id = (select * from (select id from menu a where code='STATISTICS' and role = 'ADMIN') as a) where (code = 'STATISTICS_SETTING' and role = 'ADMIN');

이런식으로 감싸줘야 update문에서 사용할수 있다.
이유는 잘 모르겠네요..
아시는분은 댓글달아주세요~

728x90
728x90

프론트엔드 관리자 페이지 작업을 하고있는데 

현재 서비스 가입자가 1100명에 육박하고있다.

 

급격하게 늘어나는 숫자에 일에 치여서 교통사고로 사망하기 직전이긴하지만

관리자페이지가 열리는데 10초는 걸리니 문제해결을 안 할 수 가 있 나?? 

휴가나 떠나고싶다~~~~~~(정신나갔습니다)

 


네 정신차리고

현재 user테이블말고 따로 만든 view 구성입니다.

다른테이블에서 가져올 컬럼들을 전부 join해서 성능이 저하된걸로 확인하고 있습니다.

select `u`.`id`                                                     AS `id`,
       `u`.`name`                                                   AS `name`,
       `u`.`nickname`                                               AS `nick_name`,
       `u`.`status`                                                 AS `status`,
       `u`.`mobile`                                                 AS `mobile`,
       (select `code`.`code_value`
        from `code`
        where (`code`.`id` = `u`.`sex_id`)) AS `sex_code`,
       `u`.`address`                                                AS `address`,
       `u`.`detail_address`                                         AS `address_detail`,
       `u`.`held_mileage`                                           AS `held_mileage`,
       `u`.`held_point`                                             AS `held_point`,
       `u`.`sex_id`                                                 AS `sex_id`,
       `u`.`birthday`                                               AS `birth_day`,
       `doc`.`url`                                                  AS `impaired_url`,
       `u`.`create_datetime`                                        AS `create_datetime`,
       `u`.`modify_datetime`                                        AS `modify_datetime`,
       `u`.`deleted_datetime`                                       AS `deleted_datetime`,
       `token`.`requester_device`                                   AS `requester_device`,
       `token`.`created_at`                                         AS `created_at`
from (((`user` `u` join `user_connector` `uc` on ((`u`.`id` = `uc`.`user_id`))) left join `pingong`.`user_docs` `doc` on ((`u`.`id` = `doc`.`user_id`)))
         left join (select `user_access_token`.`id`               AS `id`,
                           `user_access_token`.`user_id`          AS `user_id`,
                           `user_access_token`.`requester_device` AS `requester_device`,
                           `user_access_token`.`created_at`       AS `created_at`
                    from `user_access_token`
                    where `user_access_token`.`id` in
                          (select max(`user_access_token`.`id`)
                           from `user_access_token`
                           group by `user_access_token`.`user_id`)) `token`
                   on ((`u`.`id` = `token`.`user_id`)))
group by `u`.`id`;

 

그래서 view에서 조회하지않고 service단에서 각각 테이블에서 조회하는 방식으로 작업 진행예정입니다.

그런데 궁금한건 그렇게 바꿨을때 몇명의 데이터까지 커버가 가능하냐는건또 궁금하네요

 

728x90
728x90

데이터 테이블 컬럼을 2줄로 고정되게 바꾸고 싶었는데
정말 많이 찾아봤지만 css 수정하는 방식밖에 없었다.

그런데 정말 황당하게도 너무 쉬운방법이 있었다...

 

 


그냥 culumnsDefine에

{
  targets: 2,
  className: 'aa',
  width: 200,
  responsivePriority: 1,
  render : function (data, type, full, meta) {
    return full['aa'] + ' ' + full['bb'] + '<br/>' + full['cc'] + ' ' + full['dd'];
  }
},

br 태그 넣어주면 됐다...

내시간

728x90
728x90

datatable 몇일째 수정중인데...

이게 찾아도 자료가 잘 안나온다...

몇일동안 구글링해본결과 

 

https://datatables.net/extensions/buttons/examples

여기 공식도큐먼트인듯한데 여기서 

example 찾아서 해야 할듯 하다.

그런데 코드가 하다말아놔가지고 찾기가 증말 힘들다..

 

 


간단하게 

원하는 컬럼만 export하는부분은

 

{
  extend: 'excel',
  text: feather.icons['file'].toSvg({class: 'font-small-4 mr-50'}) + 'Excel',
  className: 'dropdown-item',
  exportOptions: {
    columns: ':not(.actions, .control, .homeData, .awayData)',
  }
},

이렇게 exportOptions에 not 을 넣어주면 된다 .

not안에는 

 

{
  targets: 2,
  className: 'homeData',
  render : function (data, type, full, meta) {
    return full['homeAlleyName'] + ' / ' + full['homelaneCount'];
  }
},

컬럼에 지정해준 className 을 넣어주면 된다.

 

728x90
728x90

기획이 나오기전 화면 작업을 하는데 ajax 통신을 이용하기 때문에

db없이 화면 을 구성하려면 임시 테이블이 필요했다.

 

우여곡절 끝에 찾은 방법이다.

생각보다 간단!

if (dataTable.length) {
  var dt_basic = dataTable.DataTable({
    "searching": false,
    ajax: './static/app-assets/data/pingong_test_data.json',
    columns: [
      {data: 'responsive_id'},
      {data: 'id'},
      {data: 'nickName'},
      {data: 'number'},
      {data: 'period'},
      {data: 'status'},
      {data: ''}
    ],

 

{
  "data": [
    {
      "responsive_id": "",
      "id": 1,
      "nickName": "제로원",
      "number": "1차",
      "period": "2022.04.01 ~ 2022.05.01",
      "status": 1
    },
    {
      "responsive_id": "",
      "id": 2,
      "nickName": "제로투",
      "number": "1차",
      "period": "2022.04.01 ~ 2022.05.01",
      "status": 1
    }
  ]
}

ajax 경로에 json 파일 이렇게 만들어 주면 된다.

728x90
728x90

동기 - 다른 스레드에서 작업하도록 시킨후, 끝나길 기다렸다가 다음 작업을 하는것

비동기 - 다른 스레드에서 작업하도록 시킨후, 끝나길 안기다리고 다음작업 하는것

 

직렬 - 다른 스레드 하나에서 처리하는것

동시처리 - 다른 스레드 여러개로 분산하는것 

 

왜 직렬처리가 필요할까 ? -> 순서대로 해야되는 일도 있음

 

ajax (Asynchrous javascript and xml)

http 는 화면의 일부만 바꿀수 없다. (화면전체가 껌뻑이며 바뀐다.)

=> 일부만 바꾸고싶을때(데이터) ajax 사용

 

-xmlhttprequest() 함수 쓰기떄문에 xml

비동기이기때문에 요청하면 응답이 바로옴 (빈값) 나중에 콜백 함수로 값 던져준다.

 

참고영상  

https://www.youtube.com/watch?v=zRJOte7TaPw

728x90

'개발 > cs' 카테고리의 다른 글

[cs] 스레드,코어  (0) 2022.04.04
[java]객체 클래스 인스턴스 메서드  (0) 2022.03.14
728x90

코어는 일하는 녀석이 몇명인가 하는건데

싱글코어/하이퍼스레딩 테크놀로지/듀얼코어/쿼드코어/옥타코어

 식으로 발전을해왔다.

하이퍼스레딩 테크놀리지가 인텔에서 싱글코어를 스레드 2개로 나눠서 코어가 두개인척한것.

 

즉 4코어 8스레드는

8명이 일하는 것과 같다.

 

그래서 프로그램이 멀티코어 최적화 코딩이 되었는가를 알아야한다고함.

 

 

 

참고영상

https://www.youtube.com/watch?v=_dhLLWJNhwY

728x90

'개발 > cs' 카테고리의 다른 글

[cs] 동기 비동기 통신 ajax  (0) 2022.04.04
[java]객체 클래스 인스턴스 메서드  (0) 2022.03.14
728x90

js사용중 의문점이 생겼다.

return 문을 사용하면 어느 범위까지 탈출을 하는것일까

 

참고한 자료에따르면

1. break

 -switch문 / 반복문에서 중괄호를 빠져나오게 함.

 

2. return

 -함수에서 빠져나오게 함.

 -그 아래 코드는 실행하지 않음.

 

3.exit

 -main함수가 아닌 곳에서도 프로그램을 종료시킴 

 -main함수에서 return 0한 것과 동일

 -exit(0) 정상적인 종료

  exit(1) 비정상적인 종료 (에러가 발생함을 보여줌)

 

이렇게 된다면 return; 만 했을때는 메서드 하나에서만 나가야 되는데 예제를 보면

위 코드를 실행했을때 '함수안' 만 실행되고 if문밖의 모든 함수가 실행되지 않는다.

이 문제는 더 알아봐야할듯 하다...

728x90
728x90

스트림에서

entryset - 해당맵의 key, value 를 모두가져오는것

keySet - 해당맵의 key 만 가져오는것

728x90
728x90

접근제어자를 사용하는 이유!

- 객체가 가진 고유의 멤버 변수값들이 외부에서 잘못 변경되는 것을 막기 위해서. 즉 실수를 줄이기위한 의도.

 

public > protected > default > private

 

l  public : 접근을 제한이 없음

l  protected : 동일한 패키지 내에 존재하거나, 파생클래스에서만 접근 가능(상속)

l  default : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근이 가능

l  private : 자기 자신의 클래스 내에서만 접근이 가능

 

자세한 예시는 아래링크 참조

 

https://mainia.tistory.com/5574

728x90

'개발 > JAVA' 카테고리의 다른 글

[JAVA] stream entrySet, keySet  (0) 2022.03.25
[JAVA] :: 더블콜론  (0) 2022.02.24
[JAVA] 날짜,시간 비교- Date, LocalDateTime 차이  (0) 2022.02.10
728x90

먼저 객체란 메서드의 집합이다. 

그리고 객체와 객체(변수, 메서드)를 어떻게 모임으로 grouping 해서 프로그래밍할것인가를 고민하는것이 객체지향형 프로그래밍이다.  (반대로는 절차지향 1.2.3 순으로 )

 

클레스와 인스턴스를 통해 객체를 만들수 있다.

이 클래스와 인스턴스를 사용함에 있어 중복되는 코드를 제거하기위해 메서드를 사용한다. 

 


인스턴스(instance)는 클래스를 new 명령문으로 메모리에 생성한 객체이다. 설계도를 통해 독립적인 객체를 만든 것이다(실체화).

 

즉, 우리가 프로그래밍으로 표현하려는 실체는 객체이고, 이러한 실체를 추상화한 설계도는 클래스이며, 클래스를 인스턴스화하여 객체가 생성되는 것이다.

 

 

이제 코드로 클래스와 인스턴스를 알아보자

class User { // User -> 클래스
	private id;
    private name;
    
    User(int id, String name){
    	this.id = id;
        this.name = name;
    }
    
    public void SayHello() {
    	System.out.println("hello");
    }
}

public class cal() {
	public static void main(String[] args) {
    	User user1 = new User(1,"김공일"); // user1 -> 인스턴스
    }
}

user가 클래스고 user를 실체화한 user1 이 인스턴스다

728x90

'개발 > cs' 카테고리의 다른 글

[cs] 동기 비동기 통신 ajax  (0) 2022.04.04
[cs] 스레드,코어  (0) 2022.04.04
728x90

순서도 (flow chart) 란 알고리즘을 표현하기 위한 가장 기본적인 표현형식.

그러나 우리나라의 대부분의 프로그래머들은 순서도를 머리속으로만 대충 생각하고 코딩한다고 하네요.

회사에서도 원래 순서도 없이 작업하다가 2차개발을 들어가면서 작성하라고 업무지시가 내려와서 

알아보고 작성했습니다.

 

우선 iso에서 표준을 정해놨기때문에 정해진 규칙대로 작성하시면 되겠습니다.

자세한 사항은 참고 링크를 통해 공유하겠습니다.

 

http://www.haangul.com/bbs/board.php?bo_table=flow_chart&wr_id=2

728x90
728x90

git-flow 브랜치 전략을 사용하고있기 때문에 develop에 작업하지않고 feature 브랜치에 작업하는데 맨날 까먹고

develop브랜치에 작업을해서 지웠다가 다시 브랜치 따서 옮기고 있었다...

오늘은 작업량이 좀 많기도하고

이 지긋지긋한 노가다에서 벗어나고자 구글링을 하니까 역시나 방법이 있었다..(그리고 생각보다 간단)

 

git stash push
git checkout -b 브랜치
git stash pop

 

이렇게만 해주면 된다는 사실 ...  

 

 

 

728x90
728x90

자바로 검색필터를 이용해 날짜를 검색하는 코드 작성.

            return LocalDateTime.now().minus(Period.ofDays(1));
            return LocalDateTime.now().minus(Period.ofWeeks(1));
            return LocalDateTime.now().minus(Period.ofYears(1));

LocalDateTime 과 Period를 이용해 오늘날짜에서 하루이내, 일주일이내, 일년이내를 검색하도록 구현

728x90
728x90

 

  • 더블콜론이란
    정식명칭은 메소드  참조 표현식(method reference expression) 으로 자바 8 이상부터 사용가능한 람다식이다.
  •  
  • 사용방법 : [인스턴스] :: [메소드] (스태틱 메소드인 경우 인스턴스 대신 클래스 이름으로 사용가능)
  •  
  •  
public class DoubleColon {
        public String addNim(String x) {
            return x + "고객님";
        }
    
        public void main(String[] args) {
            List<String> names = Arrays.asList("김공일","제로원");
            
            DoubleColon dc = new DoubleColon();
            
            names.stream().map(x -> dc.addNim(x)).forEach(System.out::println);
            names.stream().map(dc::addNim).forEach(System.out::println);
            
        }
    }

 

결과 :

김공일 

제로원

728x90
728x90

view 에서 컬럼을 조인하기가 어려워서 

querydsl에서  문자열을 합치려고 해서 알아봤다.

 

.optionalAnd(fetchRequest.getGameMember(), () -> VIEW.homeTeamCount.concat("vs").concat(VIEW.awayTeamCount).eq(fetchRequest.getGameMember()))

이런식으로 concat 을 사용해서 문자열병합이 가능하다.

728x90
728x90

에이작스를 사용해 데이터 테이블을 만들고 검색기능을 사용할때 

 

검색버튼을 클릭시 

function search() {
  $('.dt_game_with_btn_table.table').DataTable().ajax.reload(null, true);
}

에이작스를 리로드하여

data: function (d) {
  let data = {
    "page": parseInt(d.start / d.length),
    "size": d.length,
    "sort": columnsDefine[d.order[0].column].column,
    "direction": d.order[0].dir.toUpperCase(),
    "keyword": d.search.value,
    "gameMode": $("#gameMode").val(),
    "gameMethod": $("#gameMethod").val(),
    "start": makeStartDate($("#endAt").val()),
    "end": makeEndDate($("#endAt").val()),
    "homeAlleyName": $("#homeAlleyName").val(),
    "awayAlleyName": $("#awayAlleyName").val(),
    "status": $("#status").val(),
    "gameMemberNumber":$("#gameMemberNumber").val()
  };

 

 

검색데이터를 서버로 보내준다 .

 

여기서 리로드에 옵션이있는데 

function search() {
  $('.dt_game_with_btn_table.table').DataTable().ajax.reload(null, true);
}

reload(callback, resetpage); 을줄수가 있는데

앞에 callback은 잘모르겠다 null값이 디폴트이니 주고   뒤에 resetpage의경우 default가 true이고 검색시 무조건 1페이지로 이동한다.

false로 되어있을경우 어떻게 되는지 살펴보자

 

12번페이지까지있는 데이터가있다고 할때 12번페이지에서 검색옵션을 3번페이지까지 있는 필터를 설정하고 검색하면 여전히 12번페이지에 머물르고 있어 데이터가 없다고 오류가 발생한다.

그러나 truer값을 주면 검색시 무조건 1페이지로 이동하여 문제 해결~!

 

참고:

https://datatables.net/reference/api/ajax.reload()

728x90
728x90

에이작스를 이용해서 데이터테이블을 만들고 그안에 데이터를 뿌려주는데 

아래와 같이 테이블이 이쁘지가 않게 나왔습니다.

데이터가 가운데 정렬도 되어있지않고 시간도 너무 이쁘지가 않네요.

먼저 가운데 정렬을 하는법은 

$('.dt_game_with_btn_table.table').css("text-align", "center");

이렇게 css속성을 center 로 보내주시면 됩니다.

그러면 이렇게 테이블이 깔끔하게 가운데 정렬이 됩니다!

그리고 필요한 컬럼은 width 를 정의해주셔서 2라인으로 만들어주시거나 넓이를 조절해 주시면 됩니다 .

728x90
728x90

날짜 관련 데이터를 매핑하다가 이걸 String 으로 해야할지 ,Date으로해야할지 LocalDateTime 으로 해야할지 궁금해졌다.

 

우선 String이나 Long 으로 받아도 데이터 매핑은 가능하다 하지만 데이터가 

2022-02-09 14:43:45.990000

이런식으로 들어가 있으면 데이터를 다시 조작해야하는 굉장히 골치가아픈일이 발생한다.

 

그래서 Date이나 LocalDateTime을 이용해야 하는데 

두가지가 무슨차이인지 조금 의문이었다.

 

 

결론적으로

Date,Calrendar 클래스 사용시의문제점

  • 월값이 0부터 시작한다 (1월 ->0)
  • 다른 언어와 달리 기본날짜, 시간 클래스가 불변객체가 아니다
  • private final 로 지정해둔 Date을 사용하는등 방어복사기법이 필요하다.
  • 특정 시간대의 날짜를 생성하거나, 년/월/일을 통한 날짜연산을 위해서는 Date클래스와 Calenmdar클래스를 함께 사용해야한다.
  • 중간 객체를 사용하는것 자체도 불편하며 Calendar객체의 생산비용이 비싼편이다.
  • 이외에도 여러 상수 필드를 사용하여 잘못된 입력에도 오류가 발생하지 않는등의 불편함이 있다.

 

이런 많은 문제가 있다고한다 .

그렇기 때문에 자바 8부터 출시된 java.time(joda.time) 을 이용하면 된다. 

728x90

'개발 > JAVA' 카테고리의 다른 글

[JAVA] stream entrySet, keySet  (0) 2022.03.25
[JAVA] public private 접근제어자 간단한설명  (0) 2022.03.18
[JAVA] :: 더블콜론  (0) 2022.02.24
728x90

간만에 프로젝트 오류가 발생했다.

갑자기 발생해서 당황했는데
빈생성 못할때 

gradle clean 하고 다시 build 해주면 된다...

 

 

728x90
728x90

유효성검사는 view단에서 할수있고 controller단에서 할수 있다.

이번에 정리할 것은 그중에서 view단에서 jquery.validate.min.js를 이용하여 유효성검사하는 방법이다.

 

먼저 라이브러리를 추가해준다.

<script th:src="@{/static/app-assets/vendors/js/forms/validation/jquery.validate.min.js}"></script>

 

다음 html에서 유효성검사를 할 구역을 설정해준다.

<form>
	<div class="form-validate">
    	<input type="text" class="form-control" id="subject" name="subject" required/>
	</div>
</form>

 

그리고 js파일에서 validate을 설정해준다.

$('.form-validate').validate({
	rules: {
    	name: required : true
    },
    messages : {
    	subject: "필수 입력 값입니다."
    },
    submitHandler:function () {
    	save();
    }
  })

이렇게 유효성검사가 가능하다

728x90
728x90

 

자바 코딩을 하다보면 Getter, Setter, Constructor 등 매번 반복적인 코딩을 하게되는데 롬복은 이러한 수고를 획기적으로 줄여줄수 있는 자바 개발 라이브러리이다.

@AllArgsConstructor

  • 클래스의 모든 필드에 대한 생성자를 자동으로 생성해준다.(파라미터를 모두 포함한다)
  • 멤버 변수의 순서를 바꾸면 기존 생성자의 파라미터 순서가 바뀐다.
@Data
@AllArgsConstructor
public class User {
	private String name;
	private String contact;
	private String address;
}

// User(String, String, String); 생성자가 만들어진다.

 

@Builder

  • 객체내의 필드를 골라서 생성할 수 있다. (멤버필드가 많을때 유용하다.)

@NoArgsConstructor

  • 기본 생성자를 생성해준다.
  • User user= new User();

 

 

그렇다면 어떨때 사용하면 될까

 기본 생성자는

클래스에 생성자가 하나도없을때 기본으로 생성된다.

그러나 @AllArgsConstructor 를 사용했을때

기본생성자가 생성되지않으므로

이렇게 멤버필드 전부가있는 생성자와 기본생성자 둘다 선언하고 싶을때

@NoArgsConstructor를 같이 사용해주면 된다.

 

 

 

 

 

참고 자료

https://youtu.be/JouPeMHj3Po

728x90

+ Recent posts